diff --git a/.github/images/README.md b/.github/images/README.md new file mode 100644 index 00000000000..a3c0c24ade3 --- /dev/null +++ b/.github/images/README.md @@ -0,0 +1,8 @@ +# Attributions + +## Badges +`built-with-resentment.svg` and `contains-technical-debt.svg` were originally sourced from https://forthebadge.com/, with the repository located at https://github.com/BraveUX/for-the-badge. `made-in-byond.gif` is a user-generated modification of one of these badges provided by this service. + +## Comics + +Both comics are sourced from https://www.monkeyuser.com/, which gives permission for use in non-profit usage via https://www.monkeyuser.com/about/index.html. `bug_free.png` can be found at https://www.monkeyuser.com/2019/bug-free/, and the original version of `technical_debt.png` can be found at https://www.monkeyuser.com/2018/tech-debt/ (the version found in the folder has been modified). diff --git a/.github/images/badges/built-with-resentment.svg b/.github/images/badges/built-with-resentment.svg new file mode 100644 index 00000000000..702b62d7214 --- /dev/null +++ b/.github/images/badges/built-with-resentment.svg @@ -0,0 +1,30 @@ + + built-with-resentment + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/badges/contains-technical-debt.svg b/.github/images/badges/contains-technical-debt.svg new file mode 100644 index 00000000000..051cec71170 --- /dev/null +++ b/.github/images/badges/contains-technical-debt.svg @@ -0,0 +1,32 @@ + + contains-technical-debts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/badges/made-in-byond.gif b/.github/images/badges/made-in-byond.gif new file mode 100644 index 00000000000..aed1b7ca243 Binary files /dev/null and b/.github/images/badges/made-in-byond.gif differ diff --git a/.github/images/comics/106-tech-debt-modified.png b/.github/images/comics/106-tech-debt-modified.png new file mode 100644 index 00000000000..d88ea1f72b2 Binary files /dev/null and b/.github/images/comics/106-tech-debt-modified.png differ diff --git a/.github/images/comics/131-bug-free.png b/.github/images/comics/131-bug-free.png new file mode 100644 index 00000000000..fd3da8561e6 Binary files /dev/null and b/.github/images/comics/131-bug-free.png differ diff --git a/.github/workflows/run_integration_tests.yml b/.github/workflows/run_integration_tests.yml index 0c4ba61a8a4..22cec5d48bb 100644 --- a/.github/workflows/run_integration_tests.yml +++ b/.github/workflows/run_integration_tests.yml @@ -63,6 +63,7 @@ jobs: tools/build/build --ci dm -DCIBUILDING -DANSICOLORS -WError -NWTG0001 - name: Run Tests run: | + cp libbyond_sleeping_procs.so ~/.byond/bin/libbyond_sleeping_procs.so source $HOME/BYOND/byond/bin/byondsetup bash tools/ci/run_server.sh ${{ inputs.map }} - name: Upload screenshot tests diff --git a/.gitignore b/.gitignore index 1c74dfcdf37..f8688c913d8 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,9 @@ # Ignore compiled linux libs in the root folder, e.g. librust_g.so /*.so +# Remove when removing byond_status +!/libbyond_sleeping_procs.so + #Ignore compiled files and other files generated during compilation. *.mdme *.mdme.* diff --git a/README.md b/README.md index ca608e48f7e..5ffc0f23b91 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![CI Suite](https://github.com/Skyrat-SS13/Skyrat-tg/actions/workflows/ci_suite.yml/badge.svg)](https://github.com/Skyrat-SS13/Skyrat-tg/actions/workflows/ci_suite.yml) -[![resentment](https://forthebadge.com/images/badges/built-with-resentment.svg)](https://www.monkeyuser.com/assets/images/2019/131-bug-free.png) [![resentment](https://forthebadge.com/images/badges/contains-technical-debt.svg)](https://user-images.githubusercontent.com/8171642/50290880-ffef5500-043a-11e9-8270-a2e5b697c86c.png) [![forinfinityandbyond](https://user-images.githubusercontent.com/5211576/29499758-4efff304-85e6-11e7-8267-62919c3688a9.gif)](https://www.reddit.com/r/SS13/comments/5oplxp/what_is_the_main_problem_with_byond_as_an_engine/dclbu1a) +[![resentment](.github/images/badges/built-with-resentment.svg)](.github/images/comics/131-bug-free.png) [![technical debt](.github/images/badges/contains-technical-debt.svg)](.github/images/comics/106-tech-debt-modified.png) [![forinfinityandbyond](.github/images/badges/made-in-byond.gif)](https://www.reddit.com/r/SS13/comments/5oplxp/what_is_the_main_problem_with_byond_as_an_engine/dclbu1a) * **Git / GitHub cheatsheet:** https://www.notion.so/Git-GitHub-61bc81766b2e4c7d9a346db3078ce833 * **Modularization Policy for this repo:** Pending diff --git a/SQL/skyrat_schema.sql b/SQL/skyrat_schema.sql new file mode 100644 index 00000000000..4eb4ac4f68d --- /dev/null +++ b/SQL/skyrat_schema.sql @@ -0,0 +1,82 @@ +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + + +-- +-- Table structure for table `player_rank`. +-- +DROP TABLE IF EXISTS `player_rank`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `player_rank` ( + `ckey` VARCHAR(32) NOT NULL, + `rank` VARCHAR(12) NOT NULL, + `admin_ckey` VARCHAR(32) NOT NULL, + `date_added` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `last_modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `deleted` BOOLEAN NOT NULL DEFAULT FALSE, + PRIMARY KEY (`ckey`, `rank`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + + +-- +-- Table structure for table `player_rank_log`. +-- +DROP TABLE IF EXISTS `player_rank_log`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `player_rank_log` ( + `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `ckey` VARCHAR(32) NOT NULL, + `rank` VARCHAR(12) NOT NULL, + `admin_ckey` VARCHAR(32) NOT NULL, + `action` ENUM('ADDED', 'REMOVED') NOT NULL DEFAULT 'ADDED', + `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + + +-- +-- Trigger structure for trigger `log_player_rank_additions`. +-- +DROP TRIGGER IF EXISTS `log_player_rank_additions`; +CREATE TRIGGER `log_player_rank_additions` +AFTER INSERT ON `player_rank` +FOR EACH ROW +INSERT INTO player_rank_log (ckey, rank, admin_ckey, `action`) VALUES (NEW.ckey, NEW.rank, NEW.admin_ckey, 'ADDED'); + + +-- +-- Trigger structure for trigger `log_player_rank_changes`. +-- +DROP TRIGGER IF EXISTS `log_player_rank_changes`; +DELIMITER // +CREATE TRIGGER `log_player_rank_changes` +AFTER UPDATE ON `player_rank` +FOR EACH ROW +BEGIN + IF NEW.deleted = 1 THEN + INSERT INTO player_rank_log (ckey, rank, admin_ckey, `action`) VALUES (NEW.ckey, NEW.rank, NEW.admin_ckey, 'REMOVED'); + ELSE + INSERT INTO player_rank_log (ckey, rank, admin_ckey, `action`) VALUES (NEW.ckey, NEW.rank, NEW.admin_ckey, 'ADDED'); + END IF; +END; // +DELIMITER ; + + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm index 8f57721de28..8c31d589343 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm @@ -36,6 +36,18 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/iron, /area/ruin/planetengi) +"as" = ( +/obj/machinery/modular_computer/preset/civilian{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/mapping_helpers/apc/no_charge, +/turf/open/floor/iron, +/area/ruin/planetengi) "au" = ( /obj/machinery/rnd/production/circuit_imprinter/offstation, /obj/effect/turf_decal/trimline/yellow/filled/warning{ @@ -758,18 +770,6 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/surface/outdoors/nospawn) -"fh" = ( -/obj/machinery/modular_computer/preset/civilian{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/apc/no_charge, -/turf/open/floor/iron, -/area/ruin/planetengi) "gK" = ( /obj/effect/decal/cleanable/blood/tracks{ dir = 4 @@ -1143,7 +1143,7 @@ aa do ah aA -fh +as au cG bI diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm index 94b177c5662..ffa76bff094 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm @@ -144,6 +144,12 @@ initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) +"aO" = ( +/mob/living/basic/pet/fox, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/buried_library) "aP" = ( /obj/item/keycard/library, /turf/closed/mineral/random/snow, @@ -287,12 +293,6 @@ initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) -"bI" = ( -/mob/living/basic/pet/fox, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/unpowered/buried_library) "bK" = ( /obj/item/stack/sheet/mineral/wood, /obj/effect/mapping_helpers/broken_floor, @@ -325,6 +325,13 @@ initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) +"cA" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/pet/fox, +/turf/open/floor/wood{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/unpowered/buried_library) "gb" = ( /obj/structure/table/wood/fancy/black, /obj/effect/decal/cleanable/dirt, @@ -368,16 +375,6 @@ initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) -"vW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/fluff/paper{ - dir = 1 - }, -/mob/living/basic/pet/fox, -/turf/open/floor/wood{ - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/unpowered/buried_library) "Aq" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/fluff/paper, @@ -392,8 +389,11 @@ initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/unpowered/buried_library) -"Ei" = ( +"Eh" = ( /obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/paper{ + dir = 1 + }, /mob/living/basic/pet/fox, /turf/open/floor/wood{ initial_gas_mix = "ICEMOON_ATMOS" @@ -569,7 +569,7 @@ an ae an aM -bI +aO ah au ah @@ -602,7 +602,7 @@ bw ah aZ ah -vW +Eh ac ad ad @@ -769,7 +769,7 @@ at ah an ah -Ei +cA ah az ah diff --git a/_maps/RandomRuins/IceRuins/skyrat/icemoon_underground_icewalker_den.dmm b/_maps/RandomRuins/IceRuins/skyrat/icemoon_underground_icewalker_den.dmm index 92c99abf301..93ad7907a6b 100644 --- a/_maps/RandomRuins/IceRuins/skyrat/icemoon_underground_icewalker_den.dmm +++ b/_maps/RandomRuins/IceRuins/skyrat/icemoon_underground_icewalker_den.dmm @@ -725,11 +725,6 @@ pixel_x = 5; name = "high quality wound number" }, -/obj/item/stack/medical/splint/improvised{ - pixel_y = -2; - pixel_x = -3; - amount = 6 - }, /turf/open/floor/stone/icemoon, /area/ruin/unpowered/primitive_catgirl_den) "EC" = ( diff --git a/_maps/RandomRuins/IceRuins/skyrat/icemoon_underground_syndicate_base1_skyrat.dmm b/_maps/RandomRuins/IceRuins/skyrat/icemoon_underground_syndicate_base1_skyrat.dmm index 0cc76043d53..d2226a68b2d 100644 --- a/_maps/RandomRuins/IceRuins/skyrat/icemoon_underground_syndicate_base1_skyrat.dmm +++ b/_maps/RandomRuins/IceRuins/skyrat/icemoon_underground_syndicate_base1_skyrat.dmm @@ -503,7 +503,8 @@ /area/ruin/syndicate_lava_base/cargo) "dk" = ( /obj/structure/window/reinforced/survival_pod/spawner/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ + chamber_id = "intdyno2"; dir = 1 }, /turf/open/floor/engine/o2, @@ -4534,7 +4535,8 @@ /area/ruin/syndicate_lava_base/bar) "Ov" = ( /obj/structure/window/reinforced/survival_pod/spawner/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ + chamber_id = "intdynn2"; dir = 1 }, /turf/open/floor/engine/n2, @@ -4542,7 +4544,8 @@ "Ow" = ( /obj/structure/window/reinforced/survival_pod/spawner/directional/south, /obj/structure/window/reinforced/survival_pod/spawner/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ + chamber_id = "intdynserver"; dir = 1; external_pressure_bound = 120; name = "server vent" diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm index 81cbc8cea52..9fb7d46ce58 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm @@ -6,6 +6,10 @@ /obj/machinery/oven/range, /turf/open/floor/wood, /area/ruin/powered/beach) +"ae" = ( +/obj/structure/closet/secure_closet/bar/lavaland_bartender_booze, +/turf/open/floor/wood, +/area/ruin/powered/beach) "aj" = ( /turf/closed/wall/mineral/sandstone, /area/ruin/powered/beach) @@ -224,6 +228,12 @@ /obj/machinery/reagentgrinder, /turf/open/floor/wood, /area/ruin/powered/beach) +"fS" = ( +/mob/living/basic/crab{ + name = "Jonny" + }, +/turf/open/misc/beach/sand, +/area/ruin/powered/beach) "gg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, @@ -331,13 +341,6 @@ /obj/structure/punching_bag, /turf/open/floor/pod/dark, /area/ruin/powered/beach) -"hZ" = ( -/obj/effect/turf_decal/sand, -/mob/living/basic/crab{ - name = "James" - }, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) "iH" = ( /obj/structure/flora/bush/stalky/style_random, /obj/structure/flora/bush/sparsegrass/style_random, @@ -484,12 +487,6 @@ icon_state = "sand" }, /area/ruin/powered/beach) -"pV" = ( -/mob/living/basic/crab{ - name = "Jon" - }, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) "qc" = ( /obj/structure/mirror/directional/west, /obj/structure/sink/kitchen/directional/south, @@ -530,22 +527,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/closed/wall/mineral/sandstone, /area/ruin/powered/beach) -"qK" = ( -/obj/structure/closet/secure_closet{ - icon_state = "cabinet"; - name = "bartender's closet"; - req_access = list("bar") - }, -/obj/item/clothing/shoes/sandal{ - desc = "A very fashionable pair of flip-flops."; - name = "flip-flops" - }, -/obj/item/clothing/neck/beads, -/obj/item/clothing/glasses/sunglasses/reagent, -/obj/item/clothing/suit/costume/hawaiian, -/obj/machinery/light/small/directional/east, -/turf/open/floor/wood, -/area/ruin/powered/beach) "qT" = ( /obj/machinery/light/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -562,12 +543,6 @@ /obj/item/toy/seashell, /turf/open/misc/beach/sand, /area/ruin/powered/beach) -"rG" = ( -/mob/living/basic/crab{ - name = "Jonny" - }, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) "rK" = ( /obj/item/toy/beach_ball, /turf/open/misc/beach/sand, @@ -593,6 +568,12 @@ }, /turf/closed/wall/mineral/wood/nonmetal, /area/ruin/powered/beach) +"sA" = ( +/mob/living/basic/crab{ + name = "Jon" + }, +/turf/open/misc/beach/sand, +/area/ruin/powered/beach) "sV" = ( /obj/machinery/hydroponics/constructable, /turf/open/floor/iron/grimy, @@ -744,6 +725,13 @@ /obj/item/storage/medkit/brute, /turf/open/floor/wood, /area/ruin/powered/beach) +"AB" = ( +/obj/effect/turf_decal/sand, +/mob/living/basic/crab{ + name = "James" + }, +/turf/open/misc/beach/sand, +/area/ruin/powered/beach) "AC" = ( /obj/item/storage/crayons, /obj/structure/closet/crate/wooden, @@ -959,37 +947,6 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/stairs/left, /area/ruin/powered/beach) -"HW" = ( -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/vending_refill/cigarette, -/obj/item/vending_refill/boozeomat, -/obj/structure/closet/secure_closet{ - icon_state = "cabinet"; - name = "booze storage"; - req_access = list("bar") - }, -/obj/item/storage/backpack/duffelbag, -/obj/item/etherealballdeployer, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/bottle/beer/light, -/obj/item/reagent_containers/cup/glass/colocup, -/obj/item/reagent_containers/cup/glass/colocup, -/obj/item/reagent_containers/cup/glass/colocup, -/obj/item/reagent_containers/cup/glass/colocup, -/obj/item/reagent_containers/cup/glass/colocup, -/turf/open/floor/wood, -/area/ruin/powered/beach) "Il" = ( /obj/structure/table/wood, /obj/item/reagent_containers/condiment/saltshaker, @@ -1218,22 +1175,14 @@ dir = 8 }, /area/ruin/powered/beach) -"RB" = ( -/obj/structure/closet/cabinet, -/obj/item/storage/backpack/duffelbag, -/obj/item/clothing/under/shorts/blue, -/obj/item/clothing/suit/costume/ianshirt, -/obj/item/clothing/shoes/sandal{ - desc = "A very fashionable pair of flip-flops."; - name = "flip-flops" - }, -/obj/item/clothing/glasses/sunglasses, -/obj/item/clothing/neck/beads, -/turf/open/floor/wood, -/area/ruin/powered/beach) "RE" = ( /turf/closed/wall/mineral/wood/nonmetal, /area/ruin/powered/beach) +"RZ" = ( +/obj/structure/closet/secure_closet/bar/lavaland_bartender_clothes, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/ruin/powered/beach) "Sn" = ( /obj/machinery/door/airlock/maintenance{ name = "Supply Room" @@ -1242,6 +1191,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/plating, /area/ruin/powered/beach) +"SC" = ( +/obj/machinery/light/directional/north, +/mob/living/basic/crab{ + name = "Eddie" + }, +/turf/open/misc/beach/sand, +/area/ruin/powered/beach) "SH" = ( /obj/structure/closet/crate/freezer{ name = "Cooler" @@ -1321,13 +1277,6 @@ /obj/structure/noticeboard/staff, /turf/closed/wall/mineral/wood/nonmetal, /area/ruin/powered/beach) -"UM" = ( -/obj/machinery/light/directional/north, -/mob/living/basic/crab{ - name = "Eddie" - }, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) "UT" = ( /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/misc/beach/sand, @@ -1428,6 +1377,16 @@ /obj/structure/fluff/beach_umbrella/science, /turf/open/misc/beach/sand, /area/ruin/powered/beach) +"XR" = ( +/obj/structure/closet/cabinet, +/obj/item/storage/backpack/duffelbag, +/obj/item/clothing/under/shorts/blue, +/obj/item/clothing/suit/costume/ianshirt, +/obj/item/clothing/shoes/sandal/beach, +/obj/item/clothing/glasses/sunglasses, +/obj/item/clothing/neck/beads, +/turf/open/floor/wood, +/area/ruin/powered/beach) "XW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 @@ -1520,7 +1479,7 @@ Zi BE Mf Iy -rG +fS UT aj oQ @@ -1555,7 +1514,7 @@ VI UT SY aj -HW +ae aC aC Eq @@ -1587,7 +1546,7 @@ VI VI FH aj -qK +RZ aC aC CK @@ -1704,7 +1663,7 @@ ct BN Lm Lm -hZ +AB Lm Lm VI @@ -1888,7 +1847,7 @@ MZ Bp wL MZ -UM +SC VI cm VI @@ -2160,7 +2119,7 @@ VI VI VI VI -pV +sA Lm wY wY @@ -2247,7 +2206,7 @@ aC aj EE Rk -RB +XR aj tB aC diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm index f6966f67917..0a6ebba3305 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm @@ -176,7 +176,7 @@ /turf/open/floor/wood, /area/ruin/powered/snow_biodome) "aO" = ( -/obj/machinery/door/airlock/glass_large, +/obj/machinery/door/airlock/multi_tile/public/glass, /obj/structure/fans/tiny, /turf/open/floor/pod/dark, /area/ruin/powered/snow_biodome) @@ -360,7 +360,7 @@ /area/ruin/powered/snow_biodome) "Ez" = ( /obj/structure/fans/tiny, -/obj/machinery/door/airlock/glass_large, +/obj/machinery/door/airlock/multi_tile/public/glass, /turf/open/floor/pod/dark, /area/ruin/powered/snow_biodome) "EA" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm index 9b867618cd3..52e9e68ac40 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm @@ -82,38 +82,11 @@ /obj/structure/sign/warning/explosives, /turf/closed/wall, /area/ruin/unpowered/elephant_graveyard) -"bQ" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/decal/cleanable/cobweb, -/obj/item/paper/fluff/ruins/elephant_graveyard/hypothesis, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/mineral/titanium/white, -/area/ruin/powered/graveyard_shuttle) "bS" = ( /obj/effect/decal/cleanable/oil/slippery, /obj/machinery/rnd/destructive_analyzer, /turf/open/floor/mineral/titanium/white, /area/ruin/powered/graveyard_shuttle) -"bU" = ( -/obj/item/light/bulb/broken, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/mineral/titanium/white, -/area/ruin/powered/graveyard_shuttle) -"bW" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/shuttle{ - name = "Archaeology Shuttle Airlock" - }, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/graveyard_shuttle) -"bX" = ( -/obj/effect/decal/remains/human, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/head/fedora/curator, -/obj/item/clothing/suit/jacket/curator, -/turf/open/floor/mineral/titanium/white, -/area/ruin/powered/graveyard_shuttle) "cm" = ( /obj/structure/table/optable, /obj/item/storage/backpack/explorer, @@ -121,22 +94,27 @@ /obj/item/restraints/handcuffs/cable/zipties/used, /turf/open/floor/mineral/titanium/white, /area/ruin/powered/graveyard_shuttle) -"cv" = ( +"cO" = ( +/obj/structure/bed, +/obj/item/trash/pistachios, +/obj/item/trash/chips, +/obj/item/bedsheet/brown, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/mineral/titanium/white, -/area/ruin/powered/graveyard_shuttle) -"cx" = ( -/obj/item/light/bulb/broken, -/obj/effect/turf_decal/caution/stand_clear/white, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/graveyard_shuttle) +/turf/open/misc/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) "cZ" = ( /obj/structure/stone_tile{ dir = 8 }, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) +"di" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/decal/cleanable/cobweb, +/obj/item/paper/fluff/ruins/elephant_graveyard/hypothesis, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/titanium/white, +/area/ruin/powered/graveyard_shuttle) "do" = ( /obj/structure/stone_tile/block/cracked, /turf/open/misc/asteroid/basalt/wasteland, @@ -150,20 +128,10 @@ /obj/effect/decal/cleanable/blood/splatter, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) -"eq" = ( -/obj/structure/stone_tile, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) "eu" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) -"eG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/cigbutt, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) "gl" = ( /obj/effect/decal/remains/human, /obj/effect/decal/cleanable/blood/old, @@ -232,11 +200,6 @@ /obj/effect/spawner/random/decoration/glowstick, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) -"mO" = ( -/obj/item/stack/medical/gauze/improvised, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) "nl" = ( /obj/structure/table, /obj/item/pen, @@ -244,14 +207,6 @@ /obj/item/pen, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) -"nt" = ( -/obj/structure/bed, -/obj/item/trash/pistachios, -/obj/item/trash/chips, -/obj/item/bedsheet/brown, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) "nv" = ( /obj/structure/reagent_dispensers/water_cooler, /turf/open/misc/asteroid/basalt/wasteland, @@ -285,6 +240,12 @@ /obj/structure/stone_tile/slab/cracked, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) +"pI" = ( +/obj/item/light/bulb/broken, +/obj/effect/turf_decal/caution/stand_clear/white, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/titanium/purple, +/area/ruin/powered/graveyard_shuttle) "rb" = ( /obj/item/chair, /turf/open/misc/asteroid/basalt/wasteland, @@ -296,6 +257,15 @@ /obj/item/wrench, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) +"rH" = ( +/obj/structure/closet/crate/bin, +/obj/item/trash/candle, +/obj/item/trash/can/food/beans, +/obj/item/trash/can, +/obj/effect/decal/cleanable/dirt, +/obj/item/cigbutt, +/turf/open/misc/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) "sg" = ( /obj/structure/table, /obj/structure/cable, @@ -319,12 +289,22 @@ /obj/effect/mob_spawn/corpse/human/skeleton, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) -"vc" = ( +"vk" = ( /obj/structure/closet/crate/grave/filled, /obj/effect/decal/cleanable/dirt, /obj/effect/mob_spawn/corpse/human/skeleton, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) +"vP" = ( +/obj/item/light/bulb/broken, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/titanium/white, +/area/ruin/powered/graveyard_shuttle) +"vS" = ( +/obj/structure/stone_tile, +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) "wk" = ( /obj/structure/table, /obj/item/tape/random, @@ -377,6 +357,15 @@ /obj/item/assembly/mousetrap, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) +"Bf" = ( +/obj/structure/stone_tile/slab/cracked, +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) +"Bo" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/titanium/white, +/area/ruin/powered/graveyard_shuttle) "Br" = ( /obj/structure/cable, /turf/open/misc/asteroid/basalt/wasteland, @@ -388,6 +377,11 @@ /obj/structure/flora/rock/style_random, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) +"Cp" = ( +/obj/item/stack/medical/gauze/improvised, +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) "Cu" = ( /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface) @@ -424,17 +418,16 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) +"GC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/cigbutt, +/turf/open/misc/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) "Hq" = ( /obj/structure/barricade/wooden, /obj/structure/mineral_door/wood, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) -"Ix" = ( -/obj/structure/bed, -/obj/item/bedsheet/brown, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) "Iy" = ( /obj/item/paper/fluff/ruins/elephant_graveyard, /turf/open/misc/asteroid/basalt/lava_land_surface, @@ -445,15 +438,35 @@ /obj/item/paper_bin, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) +"IR" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/shuttle{ + name = "Archaeology Shuttle Airlock" + }, +/turf/open/floor/mineral/titanium/purple, +/area/ruin/powered/graveyard_shuttle) "Jd" = ( /obj/structure/stone_tile/cracked, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) +"JD" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/asteroid/basalt/wasteland, +/area/ruin/unpowered/elephant_graveyard) "JT" = ( /obj/structure/table, /obj/item/taperecorder, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) +"Kg" = ( +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/head/fedora/curator, +/obj/item/clothing/suit/jacket/curator, +/turf/open/floor/mineral/titanium/white, +/area/ruin/powered/graveyard_shuttle) "Kj" = ( /obj/item/organ/internal/heart, /obj/item/organ/internal/eyes, @@ -513,16 +526,6 @@ /obj/structure/statue/bone/rib, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) -"OC" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"PM" = ( -/obj/structure/stone_tile/slab/cracked, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) "PN" = ( /obj/machinery/power/floodlight, /obj/structure/cable, @@ -557,17 +560,14 @@ /obj/item/bedsheet/brown, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) -"UN" = ( -/obj/structure/closet/crate/bin, -/obj/item/trash/candle, -/obj/item/trash/can/food/beans, -/obj/item/trash/can, -/obj/effect/decal/cleanable/dirt, +"Vv" = ( /obj/item/cigbutt, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) -"Vv" = ( -/obj/item/cigbutt, +"VM" = ( +/obj/structure/bed, +/obj/item/bedsheet/brown, +/obj/effect/decal/cleanable/dirt, /turf/open/misc/asteroid/basalt/wasteland, /area/ruin/unpowered/elephant_graveyard) "WF" = ( @@ -758,7 +758,7 @@ ab ab bf bf -UN +rH Oa bf bf @@ -797,7 +797,7 @@ bf bf AG Vv -eG +GC gB bf bf @@ -975,7 +975,7 @@ bf bf bf Br -OC +JD gB gB gB @@ -1025,11 +1025,11 @@ gB Di oL gB -eq +vS gB gB UE -vc +vk bf bf dr @@ -1056,7 +1056,7 @@ gB gB ZH do -PM +Bf gB do gB @@ -1171,7 +1171,7 @@ gB gB gB gB -vc +vk gB gB gB @@ -1456,10 +1456,10 @@ aa ab ab bf -Ix +VM WZ dr -nt +cO bf bf bf @@ -1494,14 +1494,14 @@ aa ab at uj -mO +Cp gl AB bf aH aH ZC -bW +IR ZC aH aH @@ -1536,10 +1536,10 @@ bf bf aH aN -bQ +di bh -cv -bU +Bo +vP by aH aH @@ -1573,11 +1573,11 @@ ab ab YM aO -bX +Kg bi bp bi -cx +pI bE aH jx diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_gaia.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_gaia.dmm index 2e8d7902cfc..697a9a34e72 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_gaia.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_gaia.dmm @@ -55,6 +55,10 @@ /obj/structure/flora/bush/flowers_br/style_random, /turf/open/misc/grass/lavaland, /area/ruin/unpowered/gaia) +"o" = ( +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/bronze/filled/lavaland, +/area/ruin/unpowered/gaia) "p" = ( /mob/living/basic/lightgeist{ light_color = "#42ECFF" @@ -79,10 +83,6 @@ /obj/structure/flora/bush/sunny/style_random, /turf/open/misc/grass/lavaland, /area/ruin/unpowered/gaia) -"u" = ( -/obj/structure/flora/grass/jungle/b/style_random, -/turf/open/floor/bronze/filled/lavaland, -/area/ruin/unpowered/gaia) "v" = ( /obj/structure/flora/tree/jungle/style_random, /turf/open/misc/grass/lavaland, @@ -90,6 +90,11 @@ "w" = ( /turf/closed/mineral/volcanic/lava_land_surface, /area/ruin/unpowered/gaia) +"x" = ( +/obj/structure/flora/bush/sunny/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/misc/grass/lavaland, +/area/ruin/unpowered/gaia) "A" = ( /obj/structure/flora/bush/stalky/style_random, /turf/open/misc/grass/lavaland, @@ -110,46 +115,41 @@ /turf/open/misc/grass/lavaland, /area/ruin/unpowered/gaia) "E" = ( +/turf/open/floor/bronze/filled/lavaland, +/area/ruin/unpowered/gaia) +"I" = ( /obj/structure/flora/bush/fullgrass/style_random, /turf/open/floor/bronze/filled/lavaland, /area/ruin/unpowered/gaia) -"F" = ( -/obj/structure/flora/grass/jungle/b/style_random, +"J" = ( /turf/closed/wall/mineral/bronze, /area/ruin/unpowered/gaia) -"H" = ( -/turf/closed/wall/mineral/bronze, -/area/ruin/unpowered/gaia) -"I" = ( -/obj/structure/flora/bush/flowers_br/style_random, -/turf/open/floor/bronze/filled/lavaland, -/area/ruin/unpowered/gaia) "K" = ( -/obj/structure/flora/grass/jungle/a/style_random, -/turf/open/floor/bronze/filled/lavaland, -/area/ruin/unpowered/gaia) -"N" = ( -/obj/structure/flora/grass/jungle/b/style_random, -/obj/structure/flora/bush/flowers_br/style_random, -/turf/open/misc/grass/lavaland, -/area/ruin/unpowered/gaia) -"O" = ( -/obj/item/mod/construction/lavalandcore, -/turf/open/misc/grass/lavaland, -/area/ruin/unpowered/gaia) -"P" = ( /obj/structure/flora/bush/stalky/style_random, /obj/structure/flora/bush/fullgrass/style_random, /turf/open/floor/bronze/filled/lavaland, /area/ruin/unpowered/gaia) -"R" = ( -/obj/structure/flora/bush/sunny/style_random, +"N" = ( +/obj/structure/flora/grass/jungle/b/style_random, +/turf/open/floor/bronze/filled/lavaland, +/area/ruin/unpowered/gaia) +"P" = ( +/obj/structure/flora/grass/jungle/b/style_random, /obj/structure/flora/bush/flowers_br/style_random, /turf/open/misc/grass/lavaland, /area/ruin/unpowered/gaia) -"V" = ( +"T" = ( +/obj/structure/flora/grass/jungle/a/style_random, /turf/open/floor/bronze/filled/lavaland, /area/ruin/unpowered/gaia) +"V" = ( +/obj/item/mod/construction/lavalandcore, +/turf/open/misc/grass/lavaland, +/area/ruin/unpowered/gaia) +"Z" = ( +/obj/structure/flora/grass/jungle/b/style_random, +/turf/closed/wall/mineral/bronze, +/area/ruin/unpowered/gaia) (1,1,1) = {" a @@ -177,7 +177,7 @@ a w w c -u +N c b c @@ -214,7 +214,7 @@ c d c i -K +T C n c @@ -249,9 +249,9 @@ g d c c -V +E v -K +T c c h @@ -285,7 +285,7 @@ d c n c -u +N B n d @@ -305,7 +305,7 @@ d c d h -I +o f j c @@ -316,19 +316,19 @@ w (10,1,1) = {" w c -E +I h b -E +I +c +J +x +Z +T c -H -R -F K -c -P b -E +I w "} (11,1,1) = {" @@ -336,14 +336,14 @@ w d e i -I +o d c -R -O -E +x +V +I n -E +I c q c @@ -351,20 +351,20 @@ w "} (12,1,1) = {" w -E +I b c p g k -H -N -H +J +P +J h -K +T n c -u +N w "} (13,1,1) = {" @@ -377,7 +377,7 @@ d b c c -I +o c c b @@ -394,7 +394,7 @@ n c c b -E +I b j h @@ -411,7 +411,7 @@ l j c n -E +I c g c @@ -431,7 +431,7 @@ c c g c -E +I c n c @@ -466,7 +466,7 @@ c b n c -E +I j g c diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm index 5c327ba1455..c70a28308c3 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm @@ -88,7 +88,7 @@ /turf/open/floor/iron/dark, /area/ruin/powered/seedvault) "as" = ( -/obj/machinery/door/airlock/glass_large, +/obj/machinery/door/airlock/multi_tile/public/glass, /turf/open/floor/iron/freezer, /area/ruin/powered/seedvault) "at" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm index 950ce20a3de..c3c5ae2a121 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm @@ -48,15 +48,6 @@ }, /turf/open/floor/plating, /area/ruin/syndicate_lava_base/chemistry) -"az" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ - dir = 8 - }, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/engineering) "aA" = ( /obj/machinery/door/airlock{ name = "Unisex Restrooms" @@ -172,18 +163,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/cargo) -"bN" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) "bQ" = ( /obj/machinery/sleeper/syndie{ dir = 4 @@ -214,6 +193,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) +"cb" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/button/door{ + id = "lavalandsyndi_cargo"; + name = "Cargo Bay Blast Door Control"; + pixel_x = 26; + req_access = list("syndicate") + }, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/cargo) "ce" = ( /obj/machinery/door/airlock/public/glass{ name = "Dormitories" @@ -292,24 +283,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/arrivals) -"dl" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"ds" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/turf/open/floor/iron/white/side{ - dir = 4 - }, -/area/ruin/syndicate_lava_base/arrivals) -"dt" = ( +"di" = ( /obj/machinery/airalarm/directional/west, /obj/structure/sink/directional/east, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -322,6 +296,15 @@ dir = 8 }, /area/ruin/syndicate_lava_base/virology) +"ds" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/ruin/syndicate_lava_base/arrivals) "dv" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -806,11 +789,6 @@ "gj" = ( /turf/closed/wall/mineral/plastitanium/explosive, /area/ruin/syndicate_lava_base/virology) -"gs" = ( -/obj/structure/table/wood, -/obj/machinery/light/small/directional/east, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/bar) "gt" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -1145,6 +1123,29 @@ "iN" = ( /turf/closed/wall/mineral/plastitanium/explosive, /area/ruin/syndicate_lava_base/main) +"iQ" = ( +/obj/machinery/airalarm/directional/west, +/obj/structure/table, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/head/soft{ + pixel_x = -8 + }, +/obj/item/clothing/head/soft{ + pixel_x = -8 + }, +/obj/item/radio{ + pixel_x = 5 + }, +/obj/item/radio{ + pixel_x = 5 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/cargo) "iU" = ( /obj/machinery/light/small/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1186,6 +1187,13 @@ }, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) +"jm" = ( +/obj/structure/closet/emcloset/anchored, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/dormitories) "ju" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/syndicate_lava_base/engineering) @@ -1252,6 +1260,32 @@ /obj/effect/turf_decal/sand/plating/volcanic, /turf/open/floor/plating/lavaland_atmos, /area/ruin/syndicate_lava_base/arrivals) +"kt" = ( +/obj/structure/closet/crate/secure/gear{ + req_access = list("syndicate") + }, +/obj/item/clothing/gloves/combat, +/obj/item/clothing/gloves/combat, +/obj/item/clothing/under/syndicate/combat, +/obj/item/clothing/under/syndicate/combat, +/obj/item/storage/belt/military, +/obj/item/storage/belt/military, +/obj/item/clothing/shoes/combat, +/obj/item/clothing/shoes/combat, +/obj/item/clothing/mask/gas/syndicate, +/obj/item/clothing/mask/gas/syndicate, +/obj/item/clothing/glasses/night, +/obj/item/clothing/glasses/night, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/box/white/corners{ + dir = 1 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/cargo) "kv" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/side, @@ -1373,21 +1407,6 @@ /obj/structure/cable, /turf/open/lava/smooth/lava_land_surface, /area/ruin/syndicate_lava_base/main) -"le" = ( -/obj/structure/closet/secure_closet/medical1{ - req_access = list("syndicate") - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/box/beakers/bluespace, -/obj/item/storage/box/beakers/bluespace, -/obj/machinery/light/small/directional/west, -/obj/item/construction/plumbing, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/turf/open/floor/iron/white/side{ - dir = 9 - }, -/area/ruin/syndicate_lava_base/chemistry) "lf" = ( /obj/machinery/light/small/directional/west, /obj/structure/chair{ @@ -1560,12 +1579,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) -"mu" = ( -/obj/item/kirbyplants/organic/plant22, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) "mw" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, @@ -1627,6 +1640,15 @@ /obj/machinery/griddle, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) +"mQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/closet/crate/bin, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/chemistry) "mS" = ( /obj/machinery/door/airlock/external/ruin, /obj/structure/fans/tiny, @@ -1644,20 +1666,6 @@ /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, /turf/open/floor/plating, /area/ruin/syndicate_lava_base/bar) -"na" = ( -/obj/structure/rack{ - dir = 8 - }, -/obj/item/storage/toolbox/mechanical, -/obj/item/stack/cable_coil{ - pixel_x = 2; - pixel_y = -3 - }, -/obj/item/multitool, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) "nb" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -1844,15 +1852,6 @@ /obj/item/clothing/neck/stethoscope, /turf/open/floor/iron/white, /area/ruin/syndicate_lava_base/medbay) -"ou" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/end, -/obj/machinery/door/window/brigdoor{ - name = "Turbine Access" - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) "ov" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -1937,33 +1936,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/cargo) -"py" = ( -/obj/structure/table/glass, -/obj/item/folder/white, -/obj/item/reagent_containers/cup/beaker/large{ - pixel_x = -3 - }, -/obj/item/reagent_containers/cup/beaker/large{ - pixel_x = -3 - }, -/obj/item/reagent_containers/dropper, -/obj/machinery/airalarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/item/screwdriver/nuke{ - pixel_y = 18 - }, -/obj/effect/mapping_helpers/airalarm/syndicate_access, -/turf/open/floor/iron/white/side{ - dir = 4 - }, -/area/ruin/syndicate_lava_base/chemistry) -"pC" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) "pM" = ( /obj/structure/toilet{ pixel_y = 18 @@ -2067,23 +2039,6 @@ }, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) -"qR" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/structure/table, -/obj/item/folder/yellow, -/obj/item/stack/wrapping_paper{ - pixel_y = 5 - }, -/obj/item/stack/package_wrap, -/obj/item/hand_labeler, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 1 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) "rb" = ( /obj/machinery/door/poddoor/incinerator_syndicatelava_main{ id = "syndicatelava_mainvent_outer" @@ -2223,15 +2178,16 @@ }, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) -"sz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/white/side{ - dir = 10 - }, -/area/ruin/syndicate_lava_base/chemistry) +"sx" = ( +/obj/structure/rack, +/obj/item/storage/belt/utility, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/part_replacer/bluespace/tier4, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/box/white/corners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/cargo) "sH" = ( /obj/machinery/door/airlock/virology/glass{ name = "Monkey Pen" @@ -2369,11 +2325,6 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) -"ut" = ( -/obj/effect/turf_decal/tile/red/half/contrasted, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) "uv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/mineral/plastitanium/nodiagonal, @@ -2455,16 +2406,19 @@ }, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/cargo) -"vX" = ( -/obj/structure/rack, -/obj/item/storage/belt/utility, -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/part_replacer/bluespace/tier4, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/box/white/corners, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) +"vV" = ( +/obj/machinery/turretid{ + ailock = 1; + control_area = "/area/ruin/syndicate_lava_base/main"; + dir = 1; + icon_state = "control_kill"; + lethal = 1; + name = "Base turret controls"; + pixel_y = 30; + req_access = list("syndicate") + }, +/turf/open/floor/circuit/red, +/area/ruin/syndicate_lava_base/main) "wc" = ( /obj/structure/chair/stool/bar/directional/south, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -2513,19 +2467,24 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) -"xw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/white/side{ - dir = 6 - }, -/area/ruin/syndicate_lava_base/chemistry) "xA" = ( /obj/structure/extinguisher_cabinet/directional/south, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/arrivals) +"xQ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/main) "xX" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/reinforced, @@ -2571,6 +2530,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) +"yv" = ( +/turf/open/floor/circuit/red, +/area/ruin/syndicate_lava_base/main) +"yA" = ( +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/main) "yE" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -2617,15 +2584,6 @@ }, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) -"zf" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/firealarm/directional/west, -/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/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) "zk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -2675,6 +2633,15 @@ /obj/machinery/duct, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) +"zC" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/end, +/obj/machinery/door/window/brigdoor{ + name = "Turbine Access" + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/engineering) "zD" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2686,6 +2653,19 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/wood, /area/ruin/syndicate_lava_base/dormitories) +"zI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/arrivals) +"zK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white/side{ + dir = 6 + }, +/area/ruin/syndicate_lava_base/chemistry) "zT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -2866,6 +2846,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/red, /area/ruin/syndicate_lava_base/dormitories) +"Cc" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/bar) "Ce" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -2873,6 +2859,15 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) +"Cf" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white/side{ + dir = 8 + }, +/area/ruin/syndicate_lava_base/chemistry) "Ci" = ( /obj/effect/turf_decal/box/white/corners{ dir = 1 @@ -3069,18 +3064,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/ruin/syndicate_lava_base/chemistry) -"EF" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/button/door{ - id = "lavalandsyndi_cargo"; - name = "Cargo Bay Blast Door Control"; - pixel_x = 26; - req_access = list("syndicate") - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) "ET" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/layer_manifold/orange/visible{ @@ -3362,6 +3345,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/ruin/syndicate_lava_base/dormitories) +"JB" = ( +/obj/machinery/button/door{ + id = "lavalandsyndi_chemistry"; + name = "Chemistry Blast Door Control"; + pixel_y = 26; + req_access = list("syndicate") + }, +/obj/machinery/chem_mass_spec, +/turf/open/floor/iron/white/side{ + dir = 1 + }, +/area/ruin/syndicate_lava_base/chemistry) "JD" = ( /obj/machinery/airalarm/directional/west, /obj/structure/chair/stool/directional/south, @@ -3401,13 +3396,6 @@ }, /turf/open/floor/engine/co2, /area/ruin/syndicate_lava_base/engineering) -"Ko" = ( -/obj/structure/closet/emcloset/anchored, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/dormitories) "Ks" = ( /obj/structure/sign/warning/vacuum/external/directional/west, /turf/open/floor/plating, @@ -3525,19 +3513,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) -"Lx" = ( -/obj/machinery/turretid{ - ailock = 1; - control_area = "/area/ruin/syndicate_lava_base/main"; - dir = 1; - icon_state = "control_kill"; - lethal = 1; - name = "Base turret controls"; - pixel_y = 30; - req_access = list("syndicate") - }, -/turf/open/floor/circuit/red, -/area/ruin/syndicate_lava_base/main) "LK" = ( /obj/effect/turf_decal/tile/red, /obj/structure/cable, @@ -3563,6 +3538,14 @@ /obj/machinery/atmospherics/components/unary/portables_connector/visible, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) +"LX" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 1 + }, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/engineering) "Mg" = ( /obj/machinery/door/airlock/virology/glass{ name = "Isolation A" @@ -3576,16 +3559,13 @@ /obj/machinery/atmospherics/miner/nitrogen, /turf/open/floor/engine/n2, /area/ruin/syndicate_lava_base/engineering) -"Mp" = ( -/obj/machinery/button/door{ - id = "lavalandsyndi_chemistry"; - name = "Chemistry Blast Door Control"; - pixel_y = 26; - req_access = list("syndicate") - }, -/obj/machinery/chem_mass_spec, +"Mr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/west, /turf/open/floor/iron/white/side{ - dir = 1 + dir = 10 }, /area/ruin/syndicate_lava_base/chemistry) "MM" = ( @@ -3606,6 +3586,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) +"Nh" = ( +/obj/structure/rack{ + dir = 8 + }, +/obj/item/storage/toolbox/mechanical, +/obj/item/stack/cable_coil{ + pixel_x = 2; + pixel_y = -3 + }, +/obj/item/multitool, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/arrivals) "Np" = ( /obj/structure/closet/l3closet, /obj/machinery/power/apc/auto_name/directional/west, @@ -3617,12 +3611,6 @@ dir = 8 }, /area/ruin/syndicate_lava_base/chemistry) -"Nx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red/half/contrasted, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) "ND" = ( /obj/structure/fans/tiny, /obj/machinery/door/airlock/external/ruin{ @@ -3634,6 +3622,26 @@ }, /turf/open/floor/plating, /area/ruin/syndicate_lava_base/engineering) +"NE" = ( +/obj/structure/table/glass, +/obj/item/folder/white, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_x = -3 + }, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_x = -3 + }, +/obj/item/reagent_containers/dropper, +/obj/machinery/airalarm/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/item/screwdriver/nuke{ + pixel_y = 18 + }, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/ruin/syndicate_lava_base/chemistry) "NO" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3646,6 +3654,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/bar) +"Oa" = ( +/obj/machinery/computer/turbine_computer{ + dir = 1; + mapping_id = "syndie_lavaland_incineratorturbine" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/button/door/incinerator_vent_syndicatelava_main{ + pixel_y = -23; + id = "syndicatelava_mainvent_outer"; + name = "turbine exhaust chamber vent control" + }, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/engineering) "Oq" = ( /obj/effect/spawner/random/vending/colavend{ hacked = 1 @@ -3669,29 +3690,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/cargo) -"OC" = ( -/obj/machinery/airalarm/directional/west, -/obj/structure/table, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/head/soft{ - pixel_x = -8 - }, -/obj/item/clothing/head/soft{ - pixel_x = -8 - }, -/obj/item/radio{ - pixel_x = 5 - }, -/obj/item/radio{ - pixel_x = 5 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/obj/effect/mapping_helpers/airalarm/syndicate_access, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) "OF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3899,6 +3897,15 @@ }, /turf/open/floor/plating, /area/ruin/syndicate_lava_base/arrivals) +"Sv" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/engine, +/area/ruin/syndicate_lava_base/engineering) "SA" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/trinary/mixer/flipped/layer4{ @@ -3920,6 +3927,21 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/cargo) +"SX" = ( +/obj/structure/closet/secure_closet/medical1{ + req_access = list("syndicate") + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/beakers/bluespace, +/obj/item/storage/box/beakers/bluespace, +/obj/machinery/light/small/directional/west, +/obj/item/construction/plumbing, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/turf/open/floor/iron/white/side{ + dir = 9 + }, +/area/ruin/syndicate_lava_base/chemistry) "Tb" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/mining/glass{ @@ -3991,6 +4013,23 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/ruin/syndicate_lava_base/dormitories) +"TG" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/structure/table, +/obj/item/folder/yellow, +/obj/item/stack/wrapping_paper{ + pixel_y = 5 + }, +/obj/item/stack/package_wrap, +/obj/item/hand_labeler, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/cargo) "TL" = ( /obj/machinery/airalarm/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4004,6 +4043,11 @@ /obj/effect/mapping_helpers/airalarm/syndicate_access, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) +"TN" = ( +/obj/structure/table/wood, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/ruin/syndicate_lava_base/bar) "TO" = ( /obj/machinery/portable_atmospherics/canister, /turf/open/floor/iron, @@ -4128,32 +4172,6 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/main) -"Vn" = ( -/obj/structure/closet/crate/secure/gear{ - req_access = list("syndicate") - }, -/obj/item/clothing/gloves/combat, -/obj/item/clothing/gloves/combat, -/obj/item/clothing/under/syndicate/combat, -/obj/item/clothing/under/syndicate/combat, -/obj/item/storage/belt/military, -/obj/item/storage/belt/military, -/obj/item/clothing/shoes/combat, -/obj/item/clothing/shoes/combat, -/obj/item/clothing/mask/gas/syndicate, -/obj/item/clothing/mask/gas/syndicate, -/obj/item/clothing/glasses/night, -/obj/item/clothing/glasses/night, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/box/white/corners{ - dir = 1 - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) "Vs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/power/apc/auto_name/directional/south, @@ -4163,15 +4181,6 @@ /obj/machinery/duct, /turf/open/floor/wood, /area/ruin/syndicate_lava_base/dormitories) -"Vu" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white/side{ - dir = 8 - }, -/area/ruin/syndicate_lava_base/chemistry) "VH" = ( /obj/structure/table/wood, /obj/machinery/light/small/directional/south, @@ -4218,6 +4227,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/syndicate_lava_base/cargo) +"Wm" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/firealarm/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/ruin/syndicate_lava_base/cargo) "Wn" = ( /obj/modular_map_root/syndicatebase{ key = "mistake" @@ -4225,19 +4241,6 @@ /obj/effect/mapping_helpers/no_lava, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"Wr" = ( -/obj/machinery/computer/turbine_computer{ - dir = 1; - mapping_id = "syndie_lavaland_incineratorturbine" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/button/door/incinerator_vent_syndicatelava_main{ - pixel_y = -23; - id = "syndicatelava_mainvent_outer"; - name = "turbine exhaust chamber vent control" - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) "Wv" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/red/line{ @@ -4274,6 +4277,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/arrivals) +"WT" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/firealarm/directional/west, +/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/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/ruin/syndicate_lava_base/cargo) "WZ" = ( /obj/machinery/light/small/directional/north, /obj/machinery/power/apc/auto_name/directional/north, @@ -4295,9 +4307,6 @@ }, /turf/open/floor/carpet/red, /area/ruin/syndicate_lava_base/dormitories) -"Xj" = ( -/turf/open/floor/circuit/red, -/area/ruin/syndicate_lava_base/main) "Xv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4434,15 +4443,6 @@ }, /turf/open/floor/iron, /area/ruin/syndicate_lava_base/engineering) -"Zf" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/closet/crate/bin, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/chemistry) "Zj" = ( /obj/effect/turf_decal/bot, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -5157,7 +5157,7 @@ eh eI eI Zr -dt +di hs hH ab @@ -5474,11 +5474,11 @@ jZ tT ly NQ -mu +Cc mU nr tg -Nx +zI mT ab ab @@ -5674,7 +5674,7 @@ kM lk lC To -gs +TN jy jy fm @@ -5707,7 +5707,7 @@ ae oP fH IX -ut +yA hz hz hz @@ -5749,11 +5749,11 @@ ab pa pa as -le +SX Np bi -Vu -sz +Cf +Mr EC jd IX @@ -5799,7 +5799,7 @@ ab ab as as -Mp +JB Tg fv es @@ -5875,7 +5875,7 @@ mN tA SN jy -na +Nh JF nX mT @@ -5908,7 +5908,7 @@ fn fH IX he -Ko +jm hz pM aA @@ -5949,11 +5949,11 @@ ab ab at cG -Zf +mQ dE dY ev -xw +zK fp fH TD @@ -6001,12 +6001,12 @@ as as as dI -py +NE ew as as as -bN +xQ hh hz kU @@ -6100,14 +6100,14 @@ ab ab si dy -Vn +kt Aj -zf +WT XQ kl Ac HG -ut +yA hz hz hz @@ -6251,7 +6251,7 @@ ab ab dy Hk -vX +sx SQ Iw dy @@ -6305,7 +6305,7 @@ dy rC fa dy -qR +TG gP EU hl @@ -6327,7 +6327,7 @@ rI mF Cj Lp -az +Sv Lp rn dK @@ -6354,16 +6354,16 @@ dy ee pu fb -OC +iQ gb gQ UF gQ hT ha -Lx +vV Gm -Xj +yv XV OZ yq @@ -6454,9 +6454,9 @@ dy eg eD bE -pC +Wm gc -EF +cb Iv gQ zw @@ -6478,7 +6478,7 @@ yE PM tB Gu -ou +zC TV ju ab @@ -6527,7 +6527,7 @@ SA aG Wf sl -Wr +Oa ju OI ju @@ -6624,7 +6624,7 @@ YJ ta vB LW -dl +LX eK sl qd diff --git a/_maps/RandomRuins/LavaRuins/skyrat/lavaland_surface_syndicate_base1_skyrat.dmm b/_maps/RandomRuins/LavaRuins/skyrat/lavaland_surface_syndicate_base1_skyrat.dmm index 44b1e507ad4..00d87ded7d1 100644 --- a/_maps/RandomRuins/LavaRuins/skyrat/lavaland_surface_syndicate_base1_skyrat.dmm +++ b/_maps/RandomRuins/LavaRuins/skyrat/lavaland_surface_syndicate_base1_skyrat.dmm @@ -844,7 +844,8 @@ /area/ruin/syndicate_lava_base/bar) "hY" = ( /obj/structure/window/reinforced/survival_pod/spawner/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ + chamber_id = "interdyneo2"; dir = 1 }, /turf/open/floor/engine/o2, @@ -1996,7 +1997,8 @@ /area/ruin/syndicate_lava_base/medbay) "ve" = ( /obj/structure/window/reinforced/survival_pod/spawner/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ + chamber_id = "interdynen2"; dir = 1 }, /turf/open/floor/engine/n2, @@ -2764,7 +2766,8 @@ "BS" = ( /obj/structure/window/reinforced/survival_pod/spawner/directional/south, /obj/structure/window/reinforced/survival_pod/spawner/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ + chamber_id = "interdyneserver"; dir = 1; external_pressure_bound = 120; name = "server vent" diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_1.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_1.dmm index 998c3f34c75..534c49564cb 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_1.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_1.dmm @@ -13,7 +13,7 @@ /turf/open/floor/iron, /area/ruin/space/djstation) "h" = ( -/obj/item/stack/tile/iron{ +/obj/item/stack/tile/iron/base{ pixel_x = -10; pixel_y = -6 }, @@ -42,7 +42,7 @@ /turf/open/floor/plating, /area/ruin/space/djstation) "r" = ( -/obj/item/stack/tile/iron{ +/obj/item/stack/tile/iron/base{ pixel_x = -7; pixel_y = 4 }, diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/solars_1.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/solars_1.dmm index 98c3d08508a..bbe74385cfa 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/solars_1.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/solars_1.dmm @@ -32,7 +32,7 @@ /area/ruin/space/djstation/solars) "t" = ( /obj/structure/lattice, -/obj/item/stack/tile/iron{ +/obj/item/stack/tile/iron/base{ pixel_x = 3; pixel_y = 4 }, diff --git a/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm b/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm index ef7740fcc1e..136697eacc1 100644 --- a/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm +++ b/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm @@ -364,9 +364,7 @@ /turf/open/floor/iron/dark/side, /area/ruin/space/has_grav/abandonedzoo) "vU" = ( -/mob/living/simple_animal/hostile/asteroid/goldgrub{ - will_burrow = 0 - }, +/mob/living/basic/mining/goldgrub, /turf/open/misc/asteroid, /area/ruin/space/has_grav/abandonedzoo) "wc" = ( @@ -516,7 +514,7 @@ /turf/open/floor/iron/dark/side, /area/ruin/space/has_grav/abandonedzoo) "WV" = ( -/mob/living/simple_animal/hostile/asteroid/basilisk, +/mob/living/basic/mining/basilisk, /turf/open/misc/asteroid, /area/ruin/space/has_grav/abandonedzoo) "Xl" = ( diff --git a/_maps/RandomRuins/SpaceRuins/allamericandiner.dmm b/_maps/RandomRuins/SpaceRuins/allamericandiner.dmm index 0a1b1a01a6a..b21e7f4f770 100644 --- a/_maps/RandomRuins/SpaceRuins/allamericandiner.dmm +++ b/_maps/RandomRuins/SpaceRuins/allamericandiner.dmm @@ -307,6 +307,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/kitchen, /area/ruin/space/has_grav/allamericandiner) +"ow" = ( +/obj/machinery/light/dim/directional/south, +/obj/structure/window/reinforced/tinted/spawner/directional/east, +/obj/structure/chair/sofa/left/maroon{ + dir = 8 + }, +/turf/open/floor/iron/kitchen, +/area/ruin/space/has_grav/allamericandiner) "oN" = ( /turf/closed/mineral/random/low_chance, /area/ruin/space) @@ -965,11 +973,6 @@ /obj/machinery/grill, /turf/open/floor/iron/kitchen/small, /area/ruin/space/has_grav/allamericandiner) -"Ot" = ( -/obj/machinery/light/dim/directional/south, -/obj/structure/window/reinforced/tinted/spawner/directional/east, -/turf/open/floor/iron/kitchen, -/area/ruin/space/has_grav/allamericandiner) "OE" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line, /obj/effect/decal/cleanable/dirt, @@ -1613,7 +1616,7 @@ Xw FB PW Ap -Ot +ow EK EK EK diff --git a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm index caf048cc442..12c40f0b280 100644 --- a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm +++ b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm @@ -571,6 +571,33 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost) +"cC" = ( +/obj/structure/alien/weeds/creature, +/mob/living/basic/creature{ + desc = "Awh its so sm-OH GOD WHAT THE FUCK."; + health = 25; + maxHealth = 25; + name = "hatchling"; + current_size = 0.85 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/derelictoutpost) +"cD" = ( +/obj/structure/alien/weeds/creature, +/obj/effect/decal/cleanable/blood/old{ + dir = 10; + icon_state = "trails_1"; + name = "dried blood trail" + }, +/mob/living/basic/creature{ + desc = "Awh its so sm-OH GOD WHAT THE FUCK."; + health = 25; + maxHealth = 25; + name = "hatchling"; + current_size = 0.85 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/derelictoutpost) "cG" = ( /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, @@ -1067,6 +1094,16 @@ /obj/structure/alien/weeds/creature, /turf/open/misc/asteroid, /area/ruin/space/has_grav/derelictoutpost) +"gw" = ( +/obj/structure/closet/crate/medical, +/obj/item/storage/medkit/regular{ + empty = 1; + name = "First-Aid (empty)" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/ruin/space/has_grav/derelictoutpost/cargostorage) "hF" = ( /obj/structure/alien/weeds/creature, /obj/structure/alien/gelpod, @@ -1076,15 +1113,6 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/derelictoutpost) -"jO" = ( -/obj/effect/decal/cleanable/blood/old{ - dir = 4; - icon_state = "trails_1"; - name = "dried blood trail" - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/ruin/space/has_grav/derelictoutpost/cargobay) "ks" = ( /obj/structure/table/reinforced, /obj/structure/window/reinforced/spawner/directional/north, @@ -1106,22 +1134,22 @@ }, /turf/open/misc/asteroid, /area/ruin/space/has_grav/derelictoutpost) -"ls" = ( -/obj/structure/alien/weeds/creature, -/mob/living/basic/creature{ - desc = "Awh its so sm-OH GOD WHAT THE FUCK."; - health = 25; - maxHealth = 25; - name = "hatchling"; - current_size = 0.85 - }, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav/derelictoutpost) "lM" = ( /obj/structure/alien/weeds/creature, /obj/effect/decal/cleanable/blood/old, /turf/open/misc/asteroid, /area/ruin/space/has_grav/derelictoutpost) +"nc" = ( +/obj/structure/table, +/obj/item/clothing/gloves/fingerless, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/ruin/space/has_grav/derelictoutpost/cargobay) +"oc" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/bucket, +/turf/open/floor/iron, +/area/ruin/space/has_grav/derelictoutpost/cargobay) "oU" = ( /obj/structure/alien/weeds/creature, /obj/effect/decal/cleanable/blood/old{ @@ -1131,12 +1159,6 @@ }, /turf/open/misc/asteroid, /area/ruin/space/has_grav/derelictoutpost) -"pa" = ( -/obj/structure/table, -/obj/item/clothing/gloves/fingerless, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/ruin/space/has_grav/derelictoutpost/cargobay) "pB" = ( /obj/effect/decal/cleanable/blood/old{ dir = 4; @@ -1153,48 +1175,11 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/cargobay) -"rj" = ( -/obj/item/ammo_casing/c45{ - caliber = null; - desc = "A .45 bullet casing. This one is spent."; - name = "spent bullet casing" - }, -/obj/structure/alien/weeds/creature, -/obj/effect/decal/cleanable/blood/old{ - dir = 5; - icon_state = "trails_1"; - name = "dried blood trail" - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/ruin/space/has_grav/derelictoutpost/cargobay) "rS" = ( /obj/structure/closet/crate/medical, /obj/item/storage/medkit/o2, /turf/open/floor/mineral/titanium/yellow, /area/ruin/space/has_grav/derelictoutpost/dockedship) -"so" = ( -/obj/structure/grille/broken, -/obj/structure/alien/weeds/creature, -/turf/closed/wall/mineral/iron, -/area/ruin/space/has_grav/derelictoutpost/dockedship) -"sK" = ( -/obj/structure/filingcabinet, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/derelictoutpost) -"sW" = ( -/obj/structure/alien/weeds/creature, -/mob/living/basic/creature{ - desc = "Awh its so sm-OH GOD WHAT THE FUCK."; - health = 25; - maxHealth = 25; - name = "hatchling"; - current_size = 0.85 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/derelictoutpost) "tu" = ( /turf/open/misc/asteroid/airless, /area/ruin/space) @@ -1215,12 +1200,6 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/derelictoutpost/powerstorage) -"vh" = ( -/obj/structure/closet/crate/preopen, -/obj/effect/turf_decal/delivery, -/obj/effect/spawner/random/exotic/technology, -/turf/open/floor/iron, -/area/ruin/space/has_grav/derelictoutpost/cargostorage) "vr" = ( /obj/structure/alien/weeds/creature, /turf/open/misc/asteroid, @@ -1260,6 +1239,12 @@ /obj/structure/glowshroom/single, /turf/open/misc/asteroid, /area/ruin/space/has_grav/derelictoutpost) +"ye" = ( +/obj/structure/filingcabinet, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/derelictoutpost) "yl" = ( /obj/effect/decal/cleanable/blood/old{ dir = 8; @@ -1288,6 +1273,11 @@ }, /turf/open/misc/asteroid, /area/ruin/space/has_grav/derelictoutpost) +"zA" = ( +/obj/structure/grille/broken, +/obj/structure/alien/weeds/creature, +/turf/closed/wall/mineral/iron, +/area/ruin/space/has_grav/derelictoutpost/dockedship) "BI" = ( /obj/structure/closet/crate/medical, /obj/item/storage/medkit/brute, @@ -1300,16 +1290,6 @@ /obj/structure/alien/weeds/creature, /turf/open/misc/asteroid, /area/ruin/space/has_grav/derelictoutpost) -"CE" = ( -/obj/structure/closet/crate, -/obj/item/target/syndicate, -/obj/item/target/clown, -/obj/item/target/clown, -/obj/item/target/alien, -/obj/item/target, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/ruin/space/has_grav/derelictoutpost/cargostorage) "Dd" = ( /obj/structure/closet/crate/internals, /obj/item/tank/internals/emergency_oxygen/engi, @@ -1325,6 +1305,21 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/derelictoutpost) +"DL" = ( +/obj/item/ammo_casing/c45{ + caliber = null; + desc = "A .45 bullet casing. This one is spent."; + name = "spent bullet casing" + }, +/obj/structure/alien/weeds/creature, +/obj/effect/decal/cleanable/blood/old{ + dir = 5; + icon_state = "trails_1"; + name = "dried blood trail" + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/ruin/space/has_grav/derelictoutpost/cargobay) "Ef" = ( /obj/structure/closet/crate/medical, /obj/item/storage/medkit/regular, @@ -1341,11 +1336,6 @@ }, /turf/open/misc/asteroid, /area/ruin/space/has_grav/derelictoutpost) -"Fv" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/bucket, -/turf/open/floor/iron, -/area/ruin/space/has_grav/derelictoutpost/cargobay) "Gk" = ( /obj/structure/alien/resin/membrane/creature, /turf/open/misc/asteroid/airless, @@ -1383,6 +1373,22 @@ /obj/item/shard, /turf/open/misc/asteroid, /area/ruin/space/has_grav/derelictoutpost) +"Ks" = ( +/obj/structure/closet/crate/preopen, +/obj/effect/turf_decal/delivery, +/obj/effect/spawner/random/exotic/technology, +/turf/open/floor/iron, +/area/ruin/space/has_grav/derelictoutpost/cargostorage) +"KB" = ( +/obj/structure/closet/crate, +/obj/item/target/syndicate, +/obj/item/target/clown, +/obj/item/target/clown, +/obj/item/target/alien, +/obj/item/target, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/ruin/space/has_grav/derelictoutpost/cargostorage) "LB" = ( /obj/machinery/door/airlock/external/ruin, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -1421,6 +1427,17 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/derelictoutpost) +"RH" = ( +/obj/structure/alien/weeds/creature, +/mob/living/basic/creature{ + desc = "Awh its so sm-OH GOD WHAT THE FUCK."; + health = 25; + maxHealth = 25; + name = "hatchling"; + current_size = 0.85 + }, +/turf/open/misc/asteroid, +/area/ruin/space/has_grav/derelictoutpost) "RS" = ( /obj/structure/alien/weeds/creature, /obj/effect/decal/cleanable/blood/old{ @@ -1430,22 +1447,30 @@ }, /turf/open/misc/asteroid, /area/ruin/space/has_grav/derelictoutpost) -"Sl" = ( -/obj/structure/closet/crate/medical, -/obj/item/storage/medkit/regular{ - empty = 1; - name = "First-Aid (empty)" - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/ruin/space/has_grav/derelictoutpost/cargostorage) "Ve" = ( /obj/structure/alien/weeds/creature, /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/derelictoutpost) -"Vq" = ( +"Vy" = ( +/obj/structure/alien/resin/membrane/creature, +/turf/open/misc/asteroid, +/area/ruin/space/has_grav/derelictoutpost) +"Vz" = ( +/obj/structure/closet/crate/medical, +/obj/item/storage/medkit/brute, +/turf/open/floor/mineral/titanium/yellow, +/area/ruin/space/has_grav/derelictoutpost/dockedship) +"VZ" = ( +/obj/effect/decal/cleanable/blood/old{ + dir = 4; + icon_state = "trails_1"; + name = "dried blood trail" + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/ruin/space/has_grav/derelictoutpost/cargobay) +"XO" = ( /obj/effect/mob_spawn/corpse/human/nanotrasensoldier{ outfit_override = list("head"=null) }, @@ -1456,31 +1481,6 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/powerstorage) -"Vy" = ( -/obj/structure/alien/resin/membrane/creature, -/turf/open/misc/asteroid, -/area/ruin/space/has_grav/derelictoutpost) -"Vz" = ( -/obj/structure/closet/crate/medical, -/obj/item/storage/medkit/brute, -/turf/open/floor/mineral/titanium/yellow, -/area/ruin/space/has_grav/derelictoutpost/dockedship) -"Xi" = ( -/obj/structure/alien/weeds/creature, -/obj/effect/decal/cleanable/blood/old{ - dir = 10; - icon_state = "trails_1"; - name = "dried blood trail" - }, -/mob/living/basic/creature{ - desc = "Awh its so sm-OH GOD WHAT THE FUCK."; - health = 25; - maxHealth = 25; - name = "hatchling"; - current_size = 0.85 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/derelictoutpost) "YX" = ( /obj/structure/closet/crate/medical, /obj/item/storage/medkit/regular, @@ -1589,7 +1589,7 @@ aB aM uV ba -Vq +XO bH bJ cn @@ -1707,7 +1707,7 @@ bx dq bx bx -rj +DL dS eh eh @@ -1763,7 +1763,7 @@ ab af ai al -Fv +oc aw bK aN @@ -1820,7 +1820,7 @@ dU dW dW ex -vh +Ks dL aR aZ @@ -2023,7 +2023,7 @@ aV bg bw bN -so +zA cu cK cW @@ -2135,12 +2135,12 @@ ae cv ce bx -jO +VZ ab lm au dL -CE +KB dW es ex @@ -2176,7 +2176,7 @@ ab lm vr dL -Sl +gw dW BI ey @@ -2197,7 +2197,7 @@ ak ao aw az -pa +nc aN aX aw @@ -2310,7 +2310,7 @@ aa aY aK iK -sK +ye bC cj cO @@ -2536,7 +2536,7 @@ dm dC dC dQ -ls +RH vr vr vr @@ -2612,7 +2612,7 @@ vr lM bl vr -ls +RH vr Vy aa @@ -2641,9 +2641,9 @@ bF bF bF bF -sW +cC bl -sW +cC lM au au @@ -2712,7 +2712,7 @@ bF bl bl dk -sW +cC bl bF bl @@ -2744,7 +2744,7 @@ bo bF bl bF -sW +cC bl bF bF @@ -2790,7 +2790,7 @@ bF bl au au -ls +RH Vy aa aa @@ -2816,7 +2816,7 @@ bp bG bX cl -Xi +cD vr au dm diff --git a/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm b/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm index fd8519a1b91..2263b07e6f5 100644 --- a/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm +++ b/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm @@ -27,6 +27,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/ruin/space/has_grav/dangerous_research/medical) +"ar" = ( +/obj/machinery/light/dim/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/dangerous_research/maint) "at" = ( /obj/machinery/light/dim/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1172,6 +1180,11 @@ /obj/effect/mapping_helpers/airlock/access/all/away/command, /turf/open/floor/wood/parquet, /area/ruin/space/has_grav/dangerous_research/dorms) +"qf" = ( +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/computer/arcade/battle, +/turf/open/floor/iron/dark/diagonal, +/area/ruin/space/has_grav/dangerous_research/dorms) "qg" = ( /obj/effect/decal/cleanable/blood/gibs/core, /obj/effect/decal/cleanable/blood/footprints{ @@ -1669,7 +1682,7 @@ /obj/item/stack/cable_coil, /turf/open/floor/plating/rust, /area/ruin/space/has_grav/dangerous_research/lab) -"vO" = ( +"wb" = ( /obj/structure/closet/crate/trashcart/filled, /obj/effect/turf_decal/siding/dark{ dir = 9 @@ -1707,6 +1720,19 @@ }, /turf/open/floor/iron/white, /area/ruin/space/has_grav/dangerous_research) +"wk" = ( +/obj/effect/turf_decal/siding/purple{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/broken/directional/west, +/turf/open/floor/iron/white, +/area/ruin/space/has_grav/dangerous_research) "wt" = ( /obj/structure/sign/warning/directional/north, /obj/item/kirbyplants/random, @@ -1764,11 +1790,6 @@ "xd" = ( /turf/open/floor/plating/rust, /area/ruin/space/has_grav/dangerous_research/medical) -"xm" = ( -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/machinery/computer/arcade/battle, -/turf/open/floor/iron/dark/diagonal, -/area/ruin/space/has_grav/dangerous_research/dorms) "xo" = ( /obj/effect/turf_decal/stripes/end{ dir = 1 @@ -1788,6 +1809,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/ruin/space/has_grav/dangerous_research/lab) +"xA" = ( +/obj/machinery/light/warm/directional/north, +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/diagonal, +/area/ruin/space/has_grav/dangerous_research/dorms) "xB" = ( /obj/structure/barricade/wooden, /obj/structure/extinguisher_cabinet/directional/north, @@ -2050,17 +2078,6 @@ }, /turf/open/floor/plating/rust, /area/ruin/space/has_grav/dangerous_research/lab) -"AM" = ( -/obj/structure/table, -/obj/machinery/computer/security/telescreen/entertainment/directional/south, -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/item/clothing/suit/toggle/labcoat/science, -/obj/effect/mapping_helpers/atom_injector/element_injector{ - element_type = /datum/element/decal/blood; - target_type = /obj/item/clothing - }, -/turf/open/floor/iron/dark/diagonal, -/area/ruin/space/has_grav/dangerous_research/dorms) "AO" = ( /obj/structure/table, /obj/item/stack/sheet/cardboard, @@ -2470,6 +2487,20 @@ /obj/item/stack/sheet/iron/five, /turf/open/floor/plating/rust, /area/ruin/space/has_grav/dangerous_research/medical) +"FP" = ( +/obj/structure/toilet{ + pixel_x = 15; + pixel_y = 12 + }, +/obj/structure/fluff{ + desc = "Ew, I think I see a hairball."; + icon = 'icons/obj/mining_zones/survival_pod.dmi'; + icon_state = "fan_tiny"; + name = "shower drain" + }, +/obj/machinery/shower/directional/east, +/turf/open/floor/iron/showroomfloor, +/area/ruin/space/has_grav/dangerous_research/dorms) "FZ" = ( /obj/effect/decal/cleanable/blood/footprints, /obj/effect/decal/cleanable/blood/bubblegum, @@ -2866,11 +2897,15 @@ }, /turf/open/floor/iron/white, /area/ruin/space/has_grav/dangerous_research) -"Mn" = ( -/obj/machinery/light/warm/directional/north, +"Mb" = ( /obj/structure/table, +/obj/machinery/computer/security/telescreen/entertainment/directional/south, /obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/suit/toggle/labcoat/science, +/obj/effect/mapping_helpers/atom_injector/element_injector{ + element_type = /datum/element/decal/blood; + target_type = /obj/item/clothing + }, /turf/open/floor/iron/dark/diagonal, /area/ruin/space/has_grav/dangerous_research/dorms) "Mr" = ( @@ -2922,12 +2957,6 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/dangerous_research/maint) -"MY" = ( -/obj/machinery/washing_machine, -/obj/effect/turf_decal/tile/neutral/diagonal_edge, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/dark/diagonal, -/area/ruin/space/has_grav/dangerous_research/dorms) "Nc" = ( /obj/machinery/door/airlock/science/glass{ name = "Alternate Sciences Research Center" @@ -3153,19 +3182,6 @@ }, /turf/open/floor/iron/white, /area/ruin/space/has_grav/dangerous_research) -"PG" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 - }, -/obj/machinery/light/broken/directional/west, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/dangerous_research) "PJ" = ( /obj/effect/turf_decal/tile/neutral/diagonal_edge, /obj/effect/decal/cleanable/dirt, @@ -3202,6 +3218,14 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/dangerous_research/dorms) +"PZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/oil, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/has_grav/dangerous_research/maint) "Qa" = ( /obj/effect/turf_decal/siding/dark{ dir = 4 @@ -3599,14 +3623,6 @@ /obj/effect/turf_decal/tile/dark_red/half, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/dangerous_research) -"Ve" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/oil, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/dangerous_research/maint) "Vf" = ( /obj/structure/cable, /obj/machinery/door/airlock/engineering{ @@ -3669,14 +3685,6 @@ }, /turf/open/floor/iron, /area/ruin/space/has_grav/dangerous_research/maint) -"VW" = ( -/obj/machinery/light/dim/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/dangerous_research/maint) "Wm" = ( /obj/item/stack/rods/ten, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -3707,20 +3715,6 @@ }, /turf/open/floor/iron/white, /area/ruin/space/has_grav/dangerous_research) -"WQ" = ( -/obj/structure/toilet{ - pixel_x = 15; - pixel_y = 12 - }, -/obj/structure/fluff{ - desc = "Ew, I think I see a hairball."; - icon = 'icons/obj/mining_zones/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, -/obj/machinery/shower/directional/east, -/turf/open/floor/iron/showroomfloor, -/area/ruin/space/has_grav/dangerous_research/dorms) "Xb" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ chamber_id = "asrc_a"; @@ -3890,6 +3884,12 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/ruin/space/has_grav/dangerous_research/medical) +"Zg" = ( +/obj/machinery/washing_machine, +/obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/dark/diagonal, +/area/ruin/space/has_grav/dangerous_research/dorms) "Zn" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, @@ -4236,7 +4236,7 @@ ts um YL ts -WQ +FP ts rl EU @@ -4356,10 +4356,10 @@ jp ts ts ts -xm +qf OL Rt -vO +wb ts ts ts @@ -4440,7 +4440,7 @@ Qe bP Rx ts -Mn +xA AO Rt HF @@ -4482,10 +4482,10 @@ jp ts ts ts -MY +Zg PJ Rt -AM +Mb ts Bm OC @@ -4611,7 +4611,7 @@ jp MO Av Xr -PG +wk Av Av db @@ -5289,7 +5289,7 @@ Vf Cl Cl pu -VW +ar Qy jR On @@ -5372,7 +5372,7 @@ XI go Ob Aq -Ve +PZ MU CB jR diff --git a/_maps/RandomRuins/SpaceRuins/derelict7.dmm b/_maps/RandomRuins/SpaceRuins/derelict7.dmm index 21be352c09f..50d683c353b 100644 --- a/_maps/RandomRuins/SpaceRuins/derelict7.dmm +++ b/_maps/RandomRuins/SpaceRuins/derelict7.dmm @@ -66,7 +66,7 @@ /area/ruin/space/has_grav) "gw" = ( /obj/structure/lattice, -/obj/item/stack/tile/iron, +/obj/item/stack/tile/iron/base, /obj/structure/disposalpipe/broken, /turf/template_noop, /area/template_noop) @@ -106,11 +106,11 @@ /area/ruin/space/has_grav) "lQ" = ( /obj/structure/lattice, -/obj/item/stack/tile/iron, +/obj/item/stack/tile/iron/base, /turf/template_noop, /area/template_noop) "lU" = ( -/obj/item/stack/tile/iron, +/obj/item/stack/tile/iron/base, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/ruin/space/has_grav) @@ -118,7 +118,7 @@ /turf/open/floor/iron/airless, /area/ruin/space/has_grav) "or" = ( -/obj/item/stack/tile/iron, +/obj/item/stack/tile/iron/base, /turf/template_noop, /area/template_noop) "oy" = ( @@ -187,7 +187,7 @@ /turf/open/floor/plating/airless, /area/ruin/space/has_grav) "tH" = ( -/obj/item/stack/tile/iron, +/obj/item/stack/tile/iron/base, /obj/item/stack/rods, /turf/template_noop, /area/template_noop) @@ -205,7 +205,7 @@ /area/ruin/space/has_grav) "wz" = ( /obj/structure/lattice, -/obj/item/stack/tile/iron, +/obj/item/stack/tile/iron/base, /obj/item/stack/sheet/iron, /turf/template_noop, /area/template_noop) diff --git a/_maps/RandomRuins/SpaceRuins/derelict8.dmm b/_maps/RandomRuins/SpaceRuins/derelict8.dmm index 2370c6c89a1..41b53c9b816 100644 --- a/_maps/RandomRuins/SpaceRuins/derelict8.dmm +++ b/_maps/RandomRuins/SpaceRuins/derelict8.dmm @@ -1,6 +1,6 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "bY" = ( -/obj/item/stack/tile/iron, +/obj/item/stack/tile/iron/base, /obj/structure/lattice, /turf/template_noop, /area/template_noop) @@ -20,7 +20,7 @@ /area/ruin/space/has_grav) "dL" = ( /obj/structure/lattice, -/obj/item/stack/tile/iron, +/obj/item/stack/tile/iron/base, /turf/template_noop, /area/template_noop) "dS" = ( @@ -133,12 +133,12 @@ /turf/open/floor/wood/tile, /area/ruin/space/has_grav) "zc" = ( -/obj/item/stack/tile/iron, +/obj/item/stack/tile/iron/base, /obj/item/stack/rods, /turf/template_noop, /area/template_noop) "zh" = ( -/obj/item/stack/tile/iron, +/obj/item/stack/tile/iron/base, /turf/template_noop, /area/template_noop) "zt" = ( diff --git a/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm b/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm index f558f67951a..1f616ced8d2 100644 --- a/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm +++ b/_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm @@ -7,24 +7,12 @@ dir = 8 }, /area/ruin/space) -"ap" = ( -/obj/structure/table/reinforced, -/obj/item/kirbyplants{ - pixel_y = 10 - }, -/obj/machinery/camera/directional/north{ - network = list() - }, -/obj/effect/turf_decal/tile/red/anticorner{ - dir = 1 - }, -/turf/open/floor/iron/smooth_corner, -/area/ruin/space/has_grav/derelictsulaco) -"bK" = ( -/obj/machinery/light/dim/directional/east, -/obj/structure/mirror/directional/east, +"bI" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/showroomfloor, +/obj/effect/decal/cleanable/blood/gibs, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/pod/light, /area/ruin/space/has_grav/derelictsulaco) "bO" = ( /obj/structure/window/reinforced/spawner/directional/south, @@ -48,15 +36,6 @@ }, /turf/open/floor/pod/light, /area/ruin/space/has_grav/derelictsulaco) -"bP" = ( -/obj/item/radio/intercom/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/layer4{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/ruin/space/has_grav/derelictsulaco) "bV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/light, @@ -66,6 +45,11 @@ /obj/effect/decal/cleanable/oil, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/derelictsulaco) +"cu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/barricade/sandbags, +/turf/open/floor/iron/smooth, +/area/ruin/space/has_grav/derelictsulaco) "cE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -111,6 +95,17 @@ /obj/effect/decal/cleanable/xenoblood/xgibs/limb, /turf/open/floor/plating, /area/ruin/space/has_grav/derelictsulaco) +"dJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/footprints{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/layer4{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/pod/light, +/area/ruin/space/has_grav/derelictsulaco) "dM" = ( /obj/structure/alien/weeds, /obj/effect/decal/cleanable/blood, @@ -160,6 +155,16 @@ /obj/item/circuitboard/machine/teleporter_hub, /turf/open/floor/circuit, /area/ruin/space/has_grav/derelictsulaco) +"fI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/xtracks{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/plating/airless, +/area/ruin/space) "gg" = ( /obj/structure/barricade/sandbags, /obj/effect/turf_decal/tile/red{ @@ -188,6 +193,12 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/smooth_edge, /area/ruin/space/has_grav/derelictsulaco) +"gI" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/plating/airless, +/area/ruin/space/has_grav/derelictsulaco) "hi" = ( /turf/template_noop, /area/template_noop) @@ -247,15 +258,6 @@ }, /turf/open/floor/circuit, /area/ruin/space/has_grav/derelictsulaco) -"ji" = ( -/obj/structure/alien/weeds, -/obj/machinery/camera/directional/west{ - network = list() - }, -/obj/effect/decal/remains/xeno/larva, -/obj/machinery/light/dim/directional/west, -/turf/open/floor/plating, -/area/ruin/space/has_grav/derelictsulaco) "jn" = ( /turf/open/floor/pod/light, /area/ruin/space/has_grav/derelictsulaco) @@ -285,13 +287,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/light, /area/ruin/space/has_grav/derelictsulaco) -"jT" = ( -/obj/machinery/light/floor, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/robot_debris/limb, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/iron/smooth, -/area/ruin/space/has_grav/derelictsulaco) "kb" = ( /obj/effect/decal/cleanable/blood/footprints{ dir = 8 @@ -307,11 +302,6 @@ /obj/item/trash/flare, /turf/open/floor/pod/light, /area/ruin/space/has_grav/derelictsulaco) -"kg" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp, -/turf/open/floor/wood, -/area/ruin/space/has_grav/derelictsulaco) "kB" = ( /obj/machinery/door/window/brigdoor/left/directional/east, /obj/item/stack/sheet/mineral/sandbags{ @@ -326,6 +316,19 @@ /obj/structure/alien/weeds, /turf/open/floor/plating, /area/ruin/space/has_grav/derelictsulaco) +"kY" = ( +/obj/structure/table/reinforced, +/obj/item/kirbyplants{ + pixel_y = 10 + }, +/obj/machinery/camera/directional/north{ + network = list() + }, +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 1 + }, +/turf/open/floor/iron/smooth_corner, +/area/ruin/space/has_grav/derelictsulaco) "ld" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/north, @@ -375,10 +378,11 @@ /obj/structure/alien/weeds, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/derelictsulaco) -"lU" = ( -/obj/effect/decal/cleanable/xenoblood/xsplatter, -/obj/effect/turf_decal/tile/red/half, -/turf/open/floor/iron/smooth_edge, +"lX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/wood, /area/ruin/space/has_grav/derelictsulaco) "mg" = ( /obj/structure/alien/weeds, @@ -423,6 +427,11 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/derelictsulaco) +"mU" = ( +/obj/effect/decal/cleanable/xenoblood/xsplatter, +/obj/effect/turf_decal/tile/red/half, +/turf/open/floor/iron/smooth_edge, +/area/ruin/space/has_grav/derelictsulaco) "na" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/machinery/computer/terminal/sulaco/map, @@ -440,11 +449,6 @@ /obj/item/stack/tile/iron/smooth_half, /turf/template_noop, /area/template_noop) -"nC" = ( -/obj/structure/alien/weeds, -/obj/machinery/light/dim/directional/west, -/turf/open/floor/iron/smooth, -/area/ruin/space/has_grav/derelictsulaco) "ob" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -458,27 +462,17 @@ "oV" = ( /turf/open/floor/plating/airless, /area/ruin/space) -"pp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/gibs, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +"pb" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/barricade/sandbags, +/obj/structure/cable, +/obj/item/light/tube/broken, /turf/open/floor/pod/light, /area/ruin/space/has_grav/derelictsulaco) "pv" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/ruin/space/has_grav/derelictsulaco) -"px" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/xtracks{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/plating/airless, -/area/ruin/space) "pF" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -488,12 +482,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/light, /area/ruin/space/has_grav/derelictsulaco) -"qK" = ( -/obj/effect/turf_decal/tile/red/anticorner{ - dir = 1 - }, -/turf/open/floor/iron/smooth_corner, -/area/ruin/space/has_grav/derelictsulaco) "qS" = ( /obj/item/shard, /turf/open/floor/pod/light, @@ -509,6 +497,11 @@ dir = 1 }, /area/ruin/space/has_grav/derelictsulaco) +"rb" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/light, +/area/ruin/space/has_grav/derelictsulaco) "ri" = ( /obj/item/circuitboard/machine/telecomms/processor, /turf/open/floor/circuit, @@ -533,13 +526,6 @@ }, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/derelictsulaco) -"rU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/floor/broken, -/turf/open/floor/carpet, -/area/ruin/space/has_grav/derelictsulaco) "rW" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/south, @@ -564,6 +550,14 @@ /obj/structure/girder/reinforced, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/derelictsulaco) +"sw" = ( +/obj/structure/alien/weeds, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/light/floor, +/turf/open/floor/iron/smooth, +/area/ruin/space/has_grav/derelictsulaco) "sE" = ( /obj/structure/alien/weeds, /obj/structure/alien/resin/wall, @@ -588,6 +582,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/light, /area/ruin/space/has_grav/derelictsulaco) +"tm" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/showroomfloor, +/area/ruin/space/has_grav/derelictsulaco) "tp" = ( /obj/machinery/photocopier, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -611,6 +609,26 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/derelictsulaco) +"ug" = ( +/obj/item/radio/intercom/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/layer4{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/carpet, +/area/ruin/space/has_grav/derelictsulaco) +"uk" = ( +/obj/machinery/light/dim/directional/south, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/frame/computer{ + dir = 1; + anchored = 1 + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/smooth_edge, +/area/ruin/space/has_grav/derelictsulaco) "ur" = ( /obj/machinery/door/airlock/command/glass{ name = "Bridge Office" @@ -620,10 +638,6 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/derelictsulaco) -"us" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/ruin/space/has_grav/derelictsulaco) "uP" = ( /obj/effect/decal/cleanable/blood/footprints, /obj/structure/cable, @@ -654,6 +668,16 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/derelictsulaco) +"vl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/xtracks{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/smooth_edge, +/area/ruin/space/has_grav/derelictsulaco) "vJ" = ( /obj/effect/turf_decal/siding/wideplating/dark/corner{ dir = 4 @@ -673,11 +697,6 @@ }, /turf/open/floor/pod/light, /area/ruin/space/has_grav/derelictsulaco) -"wI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/barricade/sandbags, -/turf/open/floor/iron/smooth, -/area/ruin/space/has_grav/derelictsulaco) "wR" = ( /obj/effect/mapping_helpers/burnt_floor, /obj/effect/decal/cleanable/blood/xtracks{ @@ -697,14 +716,14 @@ /obj/machinery/door/window/brigdoor/left/directional/west, /turf/open/floor/circuit, /area/ruin/space/has_grav/derelictsulaco) -"xN" = ( -/obj/machinery/computer/crew, -/obj/structure/cable, -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/tile/red/anticorner{ - dir = 1 - }, -/turf/open/floor/iron/smooth_corner, +"xL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/iron/smooth, +/area/ruin/space/has_grav/derelictsulaco) +"xP" = ( +/obj/structure/alien/weeds, +/turf/open/floor/iron/smooth, /area/ruin/space/has_grav/derelictsulaco) "yb" = ( /obj/structure/cable, @@ -712,25 +731,11 @@ dir = 4 }, /area/ruin/space/has_grav/derelictsulaco) -"yl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/footprints, -/obj/structure/cable, -/turf/open/floor/iron/smooth, -/area/ruin/space/has_grav/derelictsulaco) "ym" = ( /obj/structure/chair/office, /obj/effect/turf_decal/tile/red/half, /turf/open/floor/iron/smooth_edge, /area/ruin/space/has_grav/derelictsulaco) -"yp" = ( -/obj/structure/frame/computer{ - dir = 1; - anchored = 1 - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/smooth_edge, -/area/ruin/space/has_grav/derelictsulaco) "yt" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/west, @@ -769,6 +774,12 @@ }, /turf/open/floor/plating/airless, /area/ruin/space) +"zs" = ( +/obj/machinery/light/dim/directional/east, +/obj/structure/mirror/directional/east, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/showroomfloor, +/area/ruin/space/has_grav/derelictsulaco) "zw" = ( /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/derelictsulaco) @@ -844,16 +855,15 @@ /obj/effect/mapping_helpers/apc/unlocked, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/derelictsulaco) -"DB" = ( -/obj/machinery/light/dim/directional/south, -/obj/structure/window/reinforced/spawner/directional/south, +"DD" = ( +/obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/frame/computer{ - dir = 1; - anchored = 1 - }, +/obj/machinery/computer/terminal/sulaco/map, /obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/smooth_edge, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron/smooth_edge{ + dir = 1 + }, /area/ruin/space/has_grav/derelictsulaco) "DJ" = ( /obj/item/storage/medkit, @@ -891,6 +901,11 @@ /obj/item/chair/plastic, /turf/open/floor/plating, /area/ruin/space/has_grav/derelictsulaco) +"Fc" = ( +/obj/structure/alien/weeds, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/iron/smooth, +/area/ruin/space/has_grav/derelictsulaco) "Fo" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/west, @@ -900,15 +915,19 @@ }, /turf/open/floor/circuit, /area/ruin/space/has_grav/derelictsulaco) +"Fs" = ( +/obj/structure/frame/computer{ + dir = 1; + anchored = 1 + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/smooth_edge, +/area/ruin/space/has_grav/derelictsulaco) "FA" = ( /obj/structure/alien/weeds, /obj/effect/decal/cleanable/xenoblood/xgibs/up, /turf/open/floor/plating, /area/ruin/space/has_grav/derelictsulaco) -"FH" = ( -/obj/structure/alien/weeds, -/turf/open/floor/iron/smooth, -/area/ruin/space/has_grav/derelictsulaco) "FK" = ( /obj/machinery/door/airlock/command{ name = "Captain's Washroom" @@ -936,24 +955,16 @@ }, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/derelictsulaco) -"Gd" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/iron/smooth, -/area/ruin/space/has_grav/derelictsulaco) "Gj" = ( /obj/structure/alien/weeds/node, /turf/open/floor/plating/airless, /area/ruin/space) -"GC" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/computer/terminal/sulaco/map, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/light/dim/directional/north, -/turf/open/floor/iron/smooth_edge{ - dir = 1 - }, +"Gy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor/broken, +/turf/open/floor/carpet, /area/ruin/space/has_grav/derelictsulaco) "GL" = ( /obj/effect/mapping_helpers/burnt_floor, @@ -987,14 +998,6 @@ dir = 8 }, /area/ruin/space/has_grav/derelictsulaco) -"Hn" = ( -/obj/structure/alien/weeds, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light/floor, -/turf/open/floor/iron/smooth, -/area/ruin/space/has_grav/derelictsulaco) "HC" = ( /obj/structure/alien/weeds, /obj/effect/decal/cleanable/blood/tracks{ @@ -1002,16 +1005,6 @@ }, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/derelictsulaco) -"HI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/xtracks{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/smooth_edge, -/area/ruin/space/has_grav/derelictsulaco) "HY" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 4 @@ -1042,10 +1035,8 @@ /turf/open/floor/wood, /area/ruin/space/has_grav/derelictsulaco) "IW" = ( -/obj/effect/decal/cleanable/glass, -/obj/structure/cable, -/obj/machinery/light/floor/broken, -/turf/open/floor/pod/light, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, /area/ruin/space/has_grav/derelictsulaco) "Jr" = ( /obj/structure/frame/machine{ @@ -1056,6 +1047,11 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/derelictsulaco) +"JO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/wood, +/area/ruin/space/has_grav/derelictsulaco) "JT" = ( /obj/structure/alien/weeds, /obj/machinery/door/poddoor/shutters/preopen, @@ -1077,26 +1073,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating/airless, /area/ruin/space) -"Kp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/wood, -/area/ruin/space/has_grav/derelictsulaco) "Kq" = ( /obj/structure/curtain, /obj/item/soap/deluxe, /obj/machinery/shower/directional/north, /turf/open/floor/iron/showroomfloor, /area/ruin/space/has_grav/derelictsulaco) -"Ku" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/barricade/sandbags, -/obj/structure/cable, -/obj/item/light/tube/broken, -/turf/open/floor/pod/light, -/area/ruin/space/has_grav/derelictsulaco) "Ky" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1105,6 +1087,12 @@ dir = 9 }, /area/ruin/space/has_grav/derelictsulaco) +"KC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/footprints, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/ruin/space/has_grav/derelictsulaco) "KG" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 10 @@ -1136,16 +1124,6 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/derelictsulaco) -"Lf" = ( -/obj/machinery/door/window/brigdoor/left/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/pod/light, -/area/ruin/space/has_grav/derelictsulaco) -"Lk" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/showroomfloor, -/area/ruin/space/has_grav/derelictsulaco) "Lm" = ( /obj/item/gps/spaceruin, /turf/open/floor/circuit, @@ -1165,6 +1143,12 @@ /obj/structure/bed, /turf/open/floor/wood, /area/ruin/space/has_grav/derelictsulaco) +"LA" = ( +/obj/effect/decal/cleanable/glass, +/obj/structure/cable, +/obj/machinery/light/floor/broken, +/turf/open/floor/pod/light, +/area/ruin/space/has_grav/derelictsulaco) "LW" = ( /obj/structure/cable, /turf/open/floor/iron/tgmcemblem/center{ @@ -1225,21 +1209,17 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/derelictsulaco) -"NM" = ( -/obj/machinery/camera/directional/south{ - network = list() - }, +"Nj" = ( +/obj/structure/alien/weeds, +/obj/effect/gibspawner/xeno/bodypartless, +/turf/open/floor/plating/airless, +/area/ruin/space) +"Nu" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/xenoblood/xgibs/down, -/obj/machinery/computer/monitor{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red/anticorner{ - dir = 8 - }, -/turf/open/floor/iron/smooth_corner{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/wood, /area/ruin/space/has_grav/derelictsulaco) "Oo" = ( /obj/effect/mapping_helpers/broken_floor, @@ -1264,25 +1244,35 @@ /obj/structure/alien/weeds, /turf/open/floor/iron/smooth_edge, /area/ruin/space/has_grav/derelictsulaco) -"Ox" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/frame/computer{ - anchored = 1 - }, -/obj/effect/turf_decal/tile/red/anticorner{ - dir = 1 - }, -/turf/open/floor/iron/smooth_corner, -/area/ruin/space/has_grav/derelictsulaco) "OJ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating/airless, /area/ruin/space) +"OK" = ( +/obj/machinery/camera/directional/south{ + network = list() + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/xenoblood/xgibs/down, +/obj/machinery/computer/monitor{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 8 + }, +/turf/open/floor/iron/smooth_corner{ + dir = 4 + }, +/area/ruin/space/has_grav/derelictsulaco) "OQ" = ( /obj/structure/cable, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/derelictsulaco) +"OW" = ( +/obj/structure/alien/weeds, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/iron/smooth, +/area/ruin/space/has_grav/derelictsulaco) "Pq" = ( /obj/structure/alien/weeds, /obj/effect/decal/cleanable/blood/tracks{ @@ -1314,10 +1304,14 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/derelictsulaco) -"Qv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/shreds, -/turf/open/floor/iron/smooth, +"QC" = ( +/obj/machinery/computer/crew, +/obj/structure/cable, +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 1 + }, +/turf/open/floor/iron/smooth_corner, /area/ruin/space/has_grav/derelictsulaco) "QF" = ( /obj/effect/decal/cleanable/blood/tracks{ @@ -1385,6 +1379,12 @@ }, /turf/open/floor/wood, /area/ruin/space/has_grav/derelictsulaco) +"SA" = ( +/obj/machinery/door/window/brigdoor/left/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/pod/light, +/area/ruin/space/has_grav/derelictsulaco) "SD" = ( /obj/machinery/camera/directional/west{ network = list() @@ -1421,6 +1421,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/derelictsulaco) +"Ti" = ( +/obj/machinery/light/floor, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/robot_debris/limb, +/obj/effect/decal/cleanable/blood, +/turf/open/floor/iron/smooth, +/area/ruin/space/has_grav/derelictsulaco) +"TD" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp, +/turf/open/floor/wood, +/area/ruin/space/has_grav/derelictsulaco) "TI" = ( /turf/open/floor/iron/tgmcemblem, /area/ruin/space/has_grav/derelictsulaco) @@ -1456,17 +1468,29 @@ }, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/derelictsulaco) -"Uu" = ( -/obj/structure/alien/weeds, -/obj/effect/gibspawner/xeno/bodypartless, -/turf/open/floor/plating/airless, -/area/ruin/space) +"Ut" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/frame/computer{ + anchored = 1 + }, +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 1 + }, +/turf/open/floor/iron/smooth_corner, +/area/ruin/space/has_grav/derelictsulaco) "UH" = ( /obj/structure/alien/weeds, /obj/structure/rack, /obj/item/storage/medkit/advanced, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/derelictsulaco) +"UO" = ( +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 1 + }, +/turf/open/floor/iron/smooth_corner, +/area/ruin/space/has_grav/derelictsulaco) "UP" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/frame/machine, @@ -1493,11 +1517,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/template_noop, /area/template_noop) -"VC" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/light, -/area/ruin/space/has_grav/derelictsulaco) "VO" = ( /obj/structure/alien/weeds, /obj/structure/barricade/sandbags, @@ -1507,17 +1526,6 @@ "VT" = ( /turf/closed/wall/r_wall, /area/ruin/space/has_grav/derelictsulaco) -"WB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/footprints{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/layer4{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/pod/light, -/area/ruin/space/has_grav/derelictsulaco) "WC" = ( /obj/structure/chair/office{ dir = 8 @@ -1571,11 +1579,6 @@ }, /turf/open/floor/pod/light, /area/ruin/space/has_grav/derelictsulaco) -"Xq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/wood, -/area/ruin/space/has_grav/derelictsulaco) "Xu" = ( /obj/structure/lattice, /obj/item/stack/tile/iron/smooth_corner, @@ -1588,11 +1591,14 @@ }, /turf/open/floor/plating/airless, /area/ruin/space) -"XH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/wood, +"XK" = ( +/obj/structure/alien/weeds, +/obj/machinery/camera/directional/west{ + network = list() + }, +/obj/effect/decal/remains/xeno/larva, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/plating, /area/ruin/space/has_grav/derelictsulaco) "Yh" = ( /obj/effect/mapping_helpers/burnt_floor, @@ -1639,12 +1645,6 @@ }, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/derelictsulaco) -"Zz" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/derelictsulaco) "ZA" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/blood/xtracks{ @@ -2141,7 +2141,7 @@ Ki lf VT yy -qK +UO Hj lr rW @@ -2177,11 +2177,11 @@ lf VT Jr mi -Qv +xL WC cl ym -yp +Fs VT Ki lf @@ -2210,10 +2210,10 @@ hi Ki VT VT -xN +QC FQ zw -jT +Ti RZ YQ jq @@ -2244,15 +2244,15 @@ hi hi Ki VT -ap +kY QF WG -pp +bI qx bV mu gg -NM +OK VT lf hi @@ -2286,8 +2286,8 @@ tp gi rA QP -wI -lU +cu +mU zH VT hi @@ -2348,7 +2348,7 @@ lf hi hi VT -GC +DD mi tq eU @@ -2358,7 +2358,7 @@ ib wb DJ cW -DB +uk VT hi hi @@ -2383,13 +2383,13 @@ ag dw dw VT -Ox +Ut rM -yl +KC uP yU -IW -Lf +LA +SA ZP Qp ee @@ -2459,7 +2459,7 @@ KS sI ob WJ -VC +rb kB dk VT @@ -2489,15 +2489,15 @@ UH JT Lv Bk -ji +XK Bk Bk jI -WB +dJ Yh mg HC -nC +Fc gx VT ub @@ -2605,7 +2605,7 @@ kH Bk Lv VT -Zz +gI OQ VT lf @@ -2633,7 +2633,7 @@ EQ Bk mS sR -Ku +pb EK zA Bk @@ -2676,7 +2676,7 @@ Lv Aa VT Lr -Xq +JO VT VT fd @@ -2710,7 +2710,7 @@ VT VT VT VT -kg +TD BQ Lz VT @@ -2738,15 +2738,15 @@ iF yS VT wR -Gd +OW hU VT -bP +ug SD tL Cs -Kp -XH +Nu +lX jA VT Yu @@ -2772,20 +2772,20 @@ pF pF pF VT -HI -Hn +vl +sw TL ur tL -rU +Gy LY VT Ss ZE -us +IW FK lq -Lk +tm Mk oV hT @@ -2808,7 +2808,7 @@ fd fd VT Ie -FH +xP dM VT PZ @@ -2819,7 +2819,7 @@ li It Ha VT -bK +zs Ep VT dO @@ -2912,7 +2912,7 @@ WN CU CU XC -px +fI ZZ Gj zf @@ -2953,7 +2953,7 @@ Oo Vz dO ZZ -Uu +Nj YA Ot oV diff --git a/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm b/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm index 1979231f243..f94d2051a42 100644 --- a/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm +++ b/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm @@ -329,7 +329,8 @@ bulb_power = 0.6 }, /obj/structure/industrial_lift/tram/purple, -/obj/effect/landmark/tram/hilbert/middle, +/obj/effect/landmark/tram/platform/hilbert/middle, +/obj/effect/landmark/tram/nav/hilbert/research, /turf/open/floor/engine, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "iY" = ( @@ -936,6 +937,10 @@ }, /turf/open/floor/mineral/titanium/tiled/white, /area/ruin/space/has_grav/powered/hilbertresearchfacility) +"yf" = ( +/obj/effect/landmark/tram/nav/immovable_rod, +/turf/closed/indestructible/riveted/plastinum, +/area/ruin/space/has_grav/powered/hilbertresearchfacility) "yi" = ( /obj/structure/table/reinforced/rglass, /obj/item/food/grown/banana, @@ -1156,6 +1161,7 @@ /obj/machinery/door/airlock/science{ name = "Hilbert's Office" }, +/obj/effect/landmark/tram/nav/immovable_rod, /turf/open/floor/wood, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "BF" = ( @@ -1383,7 +1389,7 @@ /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "Gf" = ( -/obj/effect/landmark/tram/hilbert/right, +/obj/effect/landmark/tram/platform/hilbert/right, /turf/open/floor/engine, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "Gi" = ( @@ -1477,7 +1483,7 @@ /turf/open/floor/grass/fairy, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "It" = ( -/obj/effect/landmark/tram/hilbert/left, +/obj/effect/landmark/tram/platform/hilbert/left, /turf/open/floor/engine, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "Iv" = ( @@ -2846,7 +2852,7 @@ Bo Bo Ok CP -Bo +yf CP Ok Bo diff --git a/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm b/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm index e9f78ff9cd3..f64cb52c71d 100644 --- a/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm +++ b/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm @@ -454,6 +454,26 @@ /obj/effect/spawner/random/entertainment/drugs, /turf/open/floor/plating, /area/ruin/space/has_grav/infested_frigate) +"gH" = ( +/obj/effect/turf_decal{ + icon_state = "warningline_white"; + dir = 1 + }, +/obj/item/storage/toolbox/ammobox/strilka310{ + pixel_y = 16; + pixel_x = 5 + }, +/obj/item/storage/toolbox/ammobox/strilka310{ + pixel_y = 8; + pixel_x = 3 + }, +/obj/item/storage/box/handcuffs{ + pixel_y = 2; + pixel_x = -8 + }, +/obj/structure/table/glass/plasmaglass, +/turf/open/floor/pod/dark, +/area/ruin/space/has_grav/infested_frigate) "gW" = ( /obj/effect/turf_decal{ dir = 4 @@ -1238,26 +1258,6 @@ /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) -"vo" = ( -/obj/effect/turf_decal{ - icon_state = "warningline_white"; - dir = 1 - }, -/obj/item/storage/toolbox/ammobox/a762{ - pixel_y = 16; - pixel_x = 5 - }, -/obj/item/storage/toolbox/ammobox/a762{ - pixel_y = 8; - pixel_x = 3 - }, -/obj/item/storage/box/handcuffs{ - pixel_y = 2; - pixel_x = -8 - }, -/obj/structure/table/glass/plasmaglass, -/turf/open/floor/pod/dark, -/area/ruin/space/has_grav/infested_frigate) "vx" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -3965,7 +3965,7 @@ bD wP zV kS -vo +gH wP wu wP diff --git a/_maps/RandomRuins/SpaceRuins/interdyne.dmm b/_maps/RandomRuins/SpaceRuins/interdyne.dmm index a604f693285..3ae6031bd71 100644 --- a/_maps/RandomRuins/SpaceRuins/interdyne.dmm +++ b/_maps/RandomRuins/SpaceRuins/interdyne.dmm @@ -4,11 +4,6 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) -"as" = ( -/obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear, -/obj/machinery/light/blacklight/directional/north, -/turf/open/floor/iron/smooth, -/area/ruin/space/has_grav/interdyne) "aF" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/mineral/plastitanium, @@ -27,14 +22,6 @@ /obj/item/reagent_containers/cup/glass/flask, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"bn" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) "bE" = ( /obj/machinery/light/blacklight/directional/north, /turf/open/floor/mineral/plastitanium, @@ -48,6 +35,10 @@ "bW" = ( /turf/template_noop, /area/template_noop) +"ca" = ( +/obj/machinery/light/blacklight/directional/north, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/interdyne) "ck" = ( /obj/effect/decal/cleanable/glass/plastitanium, /obj/structure/cable, @@ -156,6 +147,14 @@ /obj/effect/mob_spawn/corpse/human/geneticist, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"gp" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/light/cold/no_nightlight/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/interdyne) "gV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -171,18 +170,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"he" = ( -/obj/structure/fluff{ - desc = "Ew, I think I see a hairball."; - icon = 'icons/obj/mining_zones/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, -/obj/machinery/shower/directional/east, -/obj/item/soap/syndie, -/obj/machinery/light/blacklight/directional/north, -/turf/open/floor/iron/showroomfloor, -/area/ruin/space/has_grav/interdyne) "hi" = ( /obj/structure/sign/departments/chemistry, /turf/closed/wall/mineral/plastitanium, @@ -232,6 +219,10 @@ /obj/structure/table/optable, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"kl" = ( +/obj/machinery/light/blacklight/directional/west, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/interdyne) "kp" = ( /obj/structure/cable, /obj/item/paper/fluff/ruins/interdyne/note_2, @@ -330,6 +321,11 @@ /obj/item/paper/fluff/junkmail_generic, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"ne" = ( +/obj/structure/cable, +/obj/machinery/jukebox, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/interdyne) "nm" = ( /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/mineral/plastitanium, @@ -361,6 +357,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"oS" = ( +/obj/structure/rack, +/obj/effect/spawner/random/exotic/tool, +/turf/open/floor/iron/smooth, +/area/ruin/space/has_grav/interdyne) "pb" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/storage/box/syringes, @@ -375,11 +376,6 @@ /obj/machinery/computer/operating, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"pA" = ( -/obj/effect/mapping_helpers/burnt_floor, -/obj/structure/cable, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) "pE" = ( /obj/machinery/door/airlock/hatch{ name = "Chief Researcher's Room" @@ -523,10 +519,6 @@ /obj/structure/chair/office/tactical, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"vW" = ( -/obj/machinery/light/blacklight/directional/west, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) "wx" = ( /obj/structure/bed{ dir = 1 @@ -570,13 +562,6 @@ /obj/machinery/griddle, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) -"xH" = ( -/obj/effect/mapping_helpers/burnt_floor, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) "yt" = ( /obj/machinery/chem_dispenser/drinks/fullupgrade{ dir = 8 @@ -611,6 +596,13 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) +"Ak" = ( +/obj/machinery/computer/atmos_control/noreconnect{ + atmos_chambers = list("interdyne_atmos"="Air Supply"); + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/interdyne) "Am" = ( /obj/structure/table/wood, /obj/item/pizzabox/margherita, @@ -621,6 +613,13 @@ /obj/structure/closet/secure_closet/chemical, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"AD" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/cold/no_nightlight/directional/south, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/interdyne) "AN" = ( /obj/machinery/sleeper/syndie{ dir = 4 @@ -642,6 +641,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"Bk" = ( +/obj/machinery/light/blacklight/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/interdyne) "Bx" = ( /obj/structure/table/reinforced/rglass, /obj/item/paper/fluff/ruins/interdyne/note_3, @@ -652,24 +660,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) -"BG" = ( -/obj/structure/cable, -/obj/machinery/power/rtg/advanced, -/turf/open/floor/iron/smooth, -/area/ruin/space/has_grav/interdyne) "BZ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/blacklight/directional/north, /obj/structure/cable, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"CY" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/chair{ - dir = 1 - }, -/obj/machinery/light/cold/no_nightlight/directional/south, -/turf/open/floor/mineral/plastitanium/red, +"Ci" = ( +/obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear, +/obj/machinery/light/blacklight/directional/north, +/turf/open/floor/iron/smooth, /area/ruin/space/has_grav/interdyne) "DA" = ( /mob/living/simple_animal/hostile/zombie, @@ -711,14 +711,6 @@ "EM" = ( /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/interdyne) -"ES" = ( -/obj/structure/rack, -/obj/item/stack/sheet/mineral/silver{ - amount = 25 - }, -/obj/machinery/light/blacklight/directional/south, -/turf/open/floor/iron/smooth, -/area/ruin/space/has_grav/interdyne) "Fe" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, @@ -756,6 +748,11 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"Gk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/sofa/corp/left, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/interdyne) "Go" = ( /obj/machinery/chem_master, /obj/structure/cable, @@ -765,6 +762,11 @@ /obj/machinery/chem_master, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"Gq" = ( +/obj/structure/cable, +/obj/machinery/power/rtg/advanced, +/turf/open/floor/iron/smooth, +/area/ruin/space/has_grav/interdyne) "GK" = ( /obj/machinery/door/airlock/hatch, /obj/effect/mapping_helpers/airlock/access/all/medical/general, @@ -776,11 +778,6 @@ /obj/machinery/light/cold/no_nightlight/directional/north, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"HG" = ( -/obj/machinery/chem_heater/withbuffer, -/obj/machinery/light/blacklight/directional/south, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) "HP" = ( /obj/item/pizzabox, /obj/machinery/light/blacklight/directional/north, @@ -800,13 +797,6 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"Ij" = ( -/obj/machinery/computer/atmos_control/noreconnect{ - atmos_chambers = list("interdyne_atmos"="Air Supply"); - dir = 4 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/interdyne) "In" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -814,14 +804,26 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"Iq" = ( +/obj/structure/safe, +/obj/item/documents/syndicate, +/obj/item/stack/spacecash/c1000, +/obj/item/stack/spacecash/c1000, +/obj/item/stack/spacecash/c1000, +/obj/item/gps/spaceruin, +/turf/open/floor/iron/smooth, +/area/ruin/space/has_grav/interdyne) "IL" = ( /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, /turf/open/floor/plating, /area/ruin/space/has_grav/interdyne) -"Jg" = ( -/obj/structure/cable, -/obj/machinery/jukebox, -/turf/open/floor/mineral/plastitanium/red, +"IR" = ( +/obj/structure/rack, +/obj/item/stack/sheet/mineral/silver{ + amount = 25 + }, +/obj/machinery/light/blacklight/directional/south, +/turf/open/floor/iron/smooth, /area/ruin/space/has_grav/interdyne) "Jo" = ( /obj/structure/cable, @@ -881,6 +883,11 @@ icon_state = "asteroid1" }, /area/ruin/space/has_grav/interdyne) +"KI" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/cable, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/interdyne) "KN" = ( /obj/structure/closet/crate/mail, /obj/item/mail/junkmail, @@ -927,10 +934,13 @@ /obj/machinery/light/blacklight/directional/east, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"MW" = ( -/obj/structure/rack, -/obj/effect/spawner/random/exotic/tool, -/turf/open/floor/iron/smooth, +"MJ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) "MY" = ( /obj/structure/cable, @@ -962,6 +972,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"NU" = ( +/obj/structure/fluff{ + desc = "Ew, I think I see a hairball."; + icon = 'icons/obj/mining_zones/survival_pod.dmi'; + icon_state = "fan_tiny"; + name = "shower drain" + }, +/obj/machinery/shower/directional/east, +/obj/item/soap/syndie, +/obj/machinery/light/blacklight/directional/north, +/turf/open/floor/iron/showroomfloor, +/area/ruin/space/has_grav/interdyne) "NV" = ( /obj/structure/toilet{ dir = 4 @@ -987,8 +1009,9 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/interdyne) -"Pf" = ( -/obj/machinery/light/blacklight/directional/north, +"Po" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) "PB" = ( @@ -1005,20 +1028,18 @@ /obj/machinery/dna_scannernew, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"PO" = ( -/obj/machinery/light/blacklight/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) "PX" = ( /obj/item/kirbyplants/random, /obj/structure/cable, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) +"Qj" = ( +/obj/structure/rack, +/obj/item/stack/sheet/mineral/gold{ + amount = 25 + }, +/turf/open/floor/iron/smooth, +/area/ruin/space/has_grav/interdyne) "Qw" = ( /obj/effect/decal/cleanable/oil/streak, /turf/open/floor/mineral/plastitanium, @@ -1054,18 +1075,18 @@ "Rn" = ( /turf/closed/mineral/random, /area/ruin/space/has_grav/interdyne) +"RB" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/interdyne) "RF" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"RM" = ( -/obj/structure/rack, -/obj/item/stack/sheet/mineral/gold{ - amount = 25 - }, -/turf/open/floor/iron/smooth, -/area/ruin/space/has_grav/interdyne) "RR" = ( /obj/machinery/door/airlock/hatch, /obj/structure/barricade/wooden/crude, @@ -1094,6 +1115,11 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) +"SC" = ( +/obj/machinery/chem_heater/withbuffer, +/obj/machinery/light/blacklight/directional/south, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/interdyne) "SE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/plastitanium, @@ -1106,11 +1132,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/interdyne) -"SP" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/interdyne) "Te" = ( /obj/effect/decal/cleanable/glass/plastitanium, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1211,11 +1232,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) -"WN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/sofa/corp/left, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/interdyne) "WU" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -1234,13 +1250,6 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron/smooth, /area/ruin/space/has_grav/interdyne) -"XM" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/cold/no_nightlight/directional/south, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/interdyne) "XS" = ( /obj/machinery/vending/cigarette/syndicate, /turf/open/floor/mineral/plastitanium/red, @@ -1278,15 +1287,6 @@ "Yv" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/space/has_grav/interdyne) -"Zd" = ( -/obj/structure/safe, -/obj/item/documents/syndicate, -/obj/item/stack/spacecash/c1000, -/obj/item/stack/spacecash/c1000, -/obj/item/stack/spacecash/c1000, -/obj/item/gps/spaceruin, -/turf/open/floor/iron/smooth, -/area/ruin/space/has_grav/interdyne) "Zi" = ( /turf/closed/wall/mineral/plastitanium, /area/ruin/space/has_grav/interdyne) @@ -1431,7 +1431,7 @@ Zi QD hG Zi -vW +kl Zi ma Am @@ -1531,9 +1531,9 @@ mD rW vA Un -CY +gp Zi -he +NU NV Zi fu @@ -1674,11 +1674,11 @@ Zi RR Zi dU -MW +oS Ye Ub EM -RM +Qj dU Zi cF @@ -1713,7 +1713,7 @@ Ul Mn nU EM -ES +IR dU Zi AV @@ -1776,7 +1776,7 @@ Qw QD Zu bV -pA +KI Zi dU Fe @@ -1849,7 +1849,7 @@ tH ck Zi dU -as +Ci sD IL UN @@ -1881,18 +1881,18 @@ rr Nb Bj zp -XM +AD Zi dU -Zd +Iq EM IL ox -BG +Gq dU Zi zX -bn +MJ Zi fu QD @@ -1951,7 +1951,7 @@ QD QD nm nm -xH +RB Yv Zi Zi @@ -1991,16 +1991,16 @@ JD oO jA jA -PO +Bk jA jA Zi -Jg +ne Wd qa JM Zi -Ij +Ak IL si Zi @@ -2065,10 +2065,10 @@ wJ Zi Zi Yv -Pf +ca Nr Jo -SP +Po GK Ai IL @@ -2170,7 +2170,7 @@ Nb DA ga Zi -WN +Gk eh Nr eQ @@ -2198,7 +2198,7 @@ Sd uw XC Ft -HG +SC Zi ub cG diff --git a/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm b/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm index eb3d1ca2ba4..afa11afbc9a 100644 --- a/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm +++ b/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm @@ -215,7 +215,7 @@ pixel_y = -4; pixel_x = -7 }, -/obj/item/camera_bug{ +/obj/item/computer_disk/syndicate/camera_app{ pixel_x = -5; pixel_y = 9 }, diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm index c58f2aa56a6..7405b8ef6cd 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -153,12 +153,6 @@ /obj/structure/alien/egg/burst, /turf/open/floor/iron/dark, /area/ruin/space/ancientstation/delta/ai) -"aQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/bridge) "aS" = ( /obj/structure/sign/poster/official/nanotrasen_logo, /turf/closed/wall, @@ -2461,15 +2455,6 @@ /obj/structure/sign/poster/official/work_for_a_future, /turf/closed/wall/rust, /area/ruin/space/ancientstation/charlie/dorms) -"kN" = ( -/obj/structure/table, -/obj/item/crowbar, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/decoration/glowstick, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/dorms) "kO" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -3878,6 +3863,16 @@ /obj/structure/chair, /turf/open/floor/iron/white/textured, /area/ruin/space/ancientstation/delta/proto) +"sq" = ( +/obj/structure/table, +/obj/item/crowbar, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/decoration/glowstick, +/obj/structure/mirror/directional/west, +/obj/item/clothing/neck/link_scryer/loaded/charlie, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/dorms) "ss" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -4409,19 +4404,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hall) -"wg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/obj/structure/closet/crate/secure/weapon{ - req_access = list("away_sec") - }, -/obj/item/knife/combat, -/obj/item/clothing/suit/armor/vest/old, -/obj/item/gun/ballistic/rifle/boltaction, -/obj/item/ammo_box/a762, -/obj/item/ammo_box/a762, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/delta/hall) "wi" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/command{ @@ -4744,6 +4726,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/rnd) +"yN" = ( +/obj/structure/table, +/obj/item/crowbar, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/decoration/glowstick, +/obj/item/clothing/neck/link_scryer/loaded/charlie, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/dorms) "yQ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/window/plasma/spawner/directional/south, @@ -5472,6 +5464,14 @@ /obj/effect/mapping_helpers/airalarm/away_general_access, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/hall) +"Ej" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/lights/mixed, +/turf/open/floor/plating{ + initial_gas_mix = "co2=6;o2=16;n2=82;TEMP=293.15" + }, +/area/ruin/space/ancientstation/delta/hall) "El" = ( /obj/effect/decal/cleanable/dirt, /obj/item/shard, @@ -5618,6 +5618,19 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) +"Fy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/obj/structure/closet/crate/secure/weapon{ + req_access = list("away_sec") + }, +/obj/item/knife/combat, +/obj/item/clothing/suit/armor/vest/old, +/obj/item/gun/ballistic/rifle/boltaction, +/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/strilka310, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/delta/hall) "Fz" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -6697,15 +6710,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/supermatter) -"Mt" = ( -/obj/structure/table, -/obj/item/crowbar, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/decoration/glowstick, -/obj/structure/mirror/directional/west, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/dorms) "Mu" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/space_heater, @@ -8116,6 +8120,13 @@ /obj/effect/decal/cleanable/glass, /turf/open/floor/engine/airless, /area/ruin/space/ancientstation/beta/supermatter) +"Xf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/neck/link_scryer/loaded/charlie, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/bridge) "Xj" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -8459,14 +8470,6 @@ /obj/machinery/light/small/broken/directional/east, /turf/open/floor/iron/dark, /area/ruin/space/ancientstation/delta/ai) -"YV" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/box/lights/mixed, -/turf/open/floor/plating{ - initial_gas_mix = "co2=6;o2=16;n2=82;TEMP=293.15" - }, -/area/ruin/space/ancientstation/delta/hall) "YW" = ( /turf/open/floor/iron/textured_half, /area/ruin/space/ancientstation/beta/supermatter) @@ -12217,8 +12220,8 @@ aG nk mz gZ -kN -Mt +yN +sq mz nk nk @@ -12254,7 +12257,7 @@ aa aS wl bg -aQ +Xf aI ba bk @@ -12652,7 +12655,7 @@ AA ax aW aI -aQ +Xf bm qr aS @@ -13851,7 +13854,7 @@ Gz Lx LH Bu -YV +Ej Gz JR Gz @@ -15181,7 +15184,7 @@ Wd Np rp jg -wg +Fy yx bE Jg diff --git a/_maps/RandomRuins/SpaceRuins/prison_shuttle.dmm b/_maps/RandomRuins/SpaceRuins/prison_shuttle.dmm index fe71fb86582..5aeba75b3bd 100644 --- a/_maps/RandomRuins/SpaceRuins/prison_shuttle.dmm +++ b/_maps/RandomRuins/SpaceRuins/prison_shuttle.dmm @@ -19,7 +19,7 @@ /turf/open/floor/carpet/red/airless, /area/ruin/space/prison_shuttle) "g" = ( -/mob/living/simple_animal/hostile/asteroid/basilisk{ +/mob/living/basic/mining/basilisk{ environment_smash = 0 }, /turf/open/misc/asteroid/airless, diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/blackmarket.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/blackmarket.dmm index 272d068c9e7..2698638ab8b 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/blackmarket.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/blackmarket.dmm @@ -229,28 +229,28 @@ /area/ruin/space/has_grav/powered/skyrat/blackmarket) "tI" = ( /obj/structure/closet/crate/cardboard, -/obj/item/circuitboard/machine/spaceship_navigation_beacon{ +/obj/item/folded_navigation_gigabeacon{ pixel_y = 6 }, -/obj/item/circuitboard/machine/spaceship_navigation_beacon{ +/obj/item/folded_navigation_gigabeacon{ pixel_y = 6 }, -/obj/item/circuitboard/machine/spaceship_navigation_beacon{ +/obj/item/folded_navigation_gigabeacon{ pixel_y = 6 }, -/obj/item/circuitboard/machine/spaceship_navigation_beacon, -/obj/item/circuitboard/machine/spaceship_navigation_beacon, -/obj/item/circuitboard/machine/spaceship_navigation_beacon, -/obj/item/circuitboard/machine/spaceship_navigation_beacon{ +/obj/item/folded_navigation_gigabeacon, +/obj/item/folded_navigation_gigabeacon, +/obj/item/folded_navigation_gigabeacon, +/obj/item/folded_navigation_gigabeacon{ pixel_y = -6 }, -/obj/item/circuitboard/machine/spaceship_navigation_beacon{ +/obj/item/folded_navigation_gigabeacon{ pixel_y = -6 }, -/obj/item/circuitboard/machine/spaceship_navigation_beacon{ +/obj/item/folded_navigation_gigabeacon{ pixel_y = -6 }, -/obj/item/circuitboard/machine/spaceship_navigation_beacon{ +/obj/item/folded_navigation_gigabeacon{ pixel_y = -6 }, /turf/open/floor/catwalk_floor/iron_smooth, diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/cargodiselost.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/cargodiselost.dmm index 23c16bf7174..79a80371d07 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/cargodiselost.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/cargodiselost.dmm @@ -542,11 +542,11 @@ "iA" = ( /obj/effect/turf_decal/tile/brown/half/contrasted, /obj/structure/closet/crate, -/obj/item/circuitboard/machine/spaceship_navigation_beacon, -/obj/item/circuitboard/machine/spaceship_navigation_beacon, -/obj/item/circuitboard/machine/spaceship_navigation_beacon, -/obj/item/circuitboard/machine/spaceship_navigation_beacon, -/obj/item/circuitboard/machine/spaceship_navigation_beacon, +/obj/item/folded_navigation_gigabeacon, +/obj/item/folded_navigation_gigabeacon, +/obj/item/folded_navigation_gigabeacon, +/obj/item/folded_navigation_gigabeacon, +/obj/item/folded_navigation_gigabeacon, /obj/item/stack/cable_coil, /obj/item/stack/sheet/iron/fifty, /turf/open/floor/iron/dark, @@ -1153,7 +1153,7 @@ /obj/item/circuitboard/machine/rtg/advanced, /obj/item/circuitboard/machine/rtg/advanced, /obj/item/circuitboard/machine/rtg/advanced, -/obj/item/circuitboard/machine/spaceship_navigation_beacon, +/obj/item/folded_navigation_gigabeacon, /obj/structure/cable, /turf/open/floor/plating, /area/ruin/space/has_grav/cargodise_freighter/utility) diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/codealpha.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/codealpha.dmm index 9a068543601..de75f0b4d00 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/codealpha.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/codealpha.dmm @@ -316,7 +316,7 @@ /turf/open/floor/iron/dark/airless, /area/ruin/space/has_grav) "VZ" = ( -/obj/machinery/door/airlock/multi_tile/glass, +/obj/machinery/door/airlock/multi_tile/public/glass, /obj/structure/barricade/wooden/crude, /turf/open/floor/iron, /area/ruin/space/has_grav) diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/interdynefob.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/interdynefob.dmm index cf22cc8081a..dcc29862a51 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/interdynefob.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/interdynefob.dmm @@ -829,7 +829,8 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/skyrat/interdynefob/security/prison) "dy" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ + chamber_id = "interdynefobn2"; dir = 4 }, /turf/open/floor/engine/n2, @@ -5918,7 +5919,7 @@ /obj/effect/turf_decal/siding/dark, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/red/directional/north, -/obj/item/circuitboard/machine/spaceship_navigation_beacon, +/obj/item/folded_navigation_gigabeacon, /obj/structure/frame/machine{ anchored = 1; icon_state = "box_1"; @@ -10282,7 +10283,8 @@ /turf/open/floor/iron/white/textured_large, /area/ruin/space/has_grav/skyrat/interdynefob/security/prison) "Vf" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ + chamber_id = "interdynefobo2"; dir = 4 }, /turf/open/floor/engine/o2, @@ -10552,7 +10554,8 @@ /turf/open/floor/iron/dark/textured_large, /area/ruin/space/has_grav/skyrat/interdynefob/cargo) "Wk" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ + chamber_id = "interdynefobplasma"; dir = 4 }, /turf/open/floor/engine/plasma, diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon2.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon2.dmm index d5ff1614dd3..256ea411142 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon2.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon2.dmm @@ -1555,7 +1555,7 @@ /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/port_tarkon/kitchen) "iA" = ( -/obj/machinery/door/airlock/multi_tile/glass, +/obj/machinery/door/airlock/multi_tile/public/glass, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor/solid, @@ -2166,7 +2166,7 @@ /turf/open/floor/iron/dark, /area/ruin/space/has_grav/port_tarkon/atmos) "lR" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ dir = 8 }, /obj/machinery/door/firedoor/solid, @@ -5488,8 +5488,8 @@ /area/ruin/space/has_grav/port_tarkon/atmos) "Fk" = ( /obj/structure/table/reinforced, -/obj/item/storage/bag/ammo, -/obj/item/storage/bag/ammo, +/obj/item/storage/pouch/ammo, +/obj/item/storage/pouch/ammo, /obj/machinery/firealarm/directional/north, /obj/effect/turf_decal/tile/red/half{ dir = 1 @@ -5702,7 +5702,7 @@ /turf/open/floor/cult, /area/ruin/space/has_grav/port_tarkon/observ) "Gk" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ dir = 8 }, /obj/machinery/door/firedoor/solid, @@ -6054,7 +6054,7 @@ /turf/open/floor/cult, /area/ruin/space/has_grav/port_tarkon/developement) "Ih" = ( -/obj/machinery/door/airlock/multi_tile/glass, +/obj/machinery/door/airlock/multi_tile/public/glass, /obj/machinery/door/firedoor/solid, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8746,7 +8746,7 @@ /turf/open/floor/iron/dark, /area/ruin/space/has_grav/port_tarkon/developement) "Xj" = ( -/obj/machinery/door/airlock/multi_tile/glass, +/obj/machinery/door/airlock/multi_tile/public/glass, /obj/machinery/door/firedoor/solid, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/garden) diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon3.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon3.dmm index 94c0e61a3ac..4d834c7bb9b 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon3.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon3.dmm @@ -1540,7 +1540,7 @@ /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/port_tarkon/kitchen) "iA" = ( -/obj/machinery/door/airlock/multi_tile/glass, +/obj/machinery/door/airlock/multi_tile/public/glass, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, @@ -2175,7 +2175,7 @@ /turf/open/floor/iron/dark, /area/ruin/space/has_grav/port_tarkon/atmos) "lR" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ dir = 8 }, /obj/machinery/door/firedoor/solid, @@ -5333,8 +5333,8 @@ "Fk" = ( /obj/structure/table/reinforced, /obj/effect/decal/cleanable/dirt, -/obj/item/storage/bag/ammo, -/obj/item/storage/bag/ammo, +/obj/item/storage/pouch/ammo, +/obj/item/storage/pouch/ammo, /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm/directional/north, /obj/effect/turf_decal/tile/red/half{ @@ -5522,7 +5522,7 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/observ) "Gk" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ dir = 8 }, /obj/effect/turf_decal/tile/blue/half, @@ -5839,7 +5839,7 @@ /turf/open/misc/asteroid/airless, /area/solars/tarkon) "Ih" = ( -/obj/machinery/door/airlock/multi_tile/glass, +/obj/machinery/door/airlock/multi_tile/public/glass, /obj/machinery/door/firedoor/solid/closed, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8321,7 +8321,7 @@ /turf/open/floor/iron/dark, /area/ruin/space/has_grav/port_tarkon/developement) "Xj" = ( -/obj/machinery/door/airlock/multi_tile/glass, +/obj/machinery/door/airlock/multi_tile/public/glass, /obj/machinery/door/firedoor/solid, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/garden) diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon4.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon4.dmm index ec11376530e..2ca2d452e9d 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon4.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon4.dmm @@ -1338,7 +1338,7 @@ /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/port_tarkon/kitchen) "iA" = ( -/obj/machinery/door/airlock/multi_tile/glass, +/obj/machinery/door/airlock/multi_tile/public/glass, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor/solid, @@ -1893,7 +1893,7 @@ /turf/open/floor/iron/dark/airless, /area/ruin/space/has_grav/port_tarkon/atmos) "lR" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ dir = 8 }, /obj/machinery/door/firedoor/solid, @@ -4644,8 +4644,8 @@ /area/ruin/space/has_grav/port_tarkon/atmos) "Fk" = ( /obj/structure/table/reinforced, -/obj/item/storage/bag/ammo, -/obj/item/storage/bag/ammo, +/obj/item/storage/pouch/ammo, +/obj/item/storage/pouch/ammo, /obj/machinery/firealarm/directional/north, /obj/effect/turf_decal/tile/red/half{ dir = 1 @@ -4824,7 +4824,7 @@ /turf/open/floor/iron/airless, /area/ruin/space/has_grav/port_tarkon/observ) "Gk" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ dir = 8 }, /obj/effect/turf_decal/tile/blue/half, @@ -5122,7 +5122,7 @@ /turf/open/misc/asteroid/airless, /area/solars/tarkon) "Ih" = ( -/obj/machinery/door/airlock/multi_tile/glass, +/obj/machinery/door/airlock/multi_tile/public/glass, /obj/machinery/door/firedoor/solid/closed, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -7379,7 +7379,7 @@ /turf/open/floor/iron/dark/airless, /area/ruin/space/has_grav/port_tarkon/developement) "Xj" = ( -/obj/machinery/door/airlock/multi_tile/glass, +/obj/machinery/door/airlock/multi_tile/public/glass, /obj/machinery/door/firedoor/solid, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/garden) diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon5.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon5.dmm index 4fc54c04c25..45f045e745a 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon5.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/port_tarkon/defcon5.dmm @@ -1440,7 +1440,7 @@ /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/port_tarkon/kitchen) "iA" = ( -/obj/machinery/door/airlock/multi_tile/glass, +/obj/machinery/door/airlock/multi_tile/public/glass, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor/solid, @@ -2071,7 +2071,7 @@ /turf/open/floor/iron/dark, /area/ruin/space/has_grav/port_tarkon/atmos) "lR" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ dir = 8 }, /obj/machinery/door/firedoor/solid, @@ -5066,8 +5066,8 @@ /area/ruin/space/has_grav/port_tarkon/atmos) "Fk" = ( /obj/structure/table/reinforced, -/obj/item/storage/bag/ammo, -/obj/item/storage/bag/ammo, +/obj/item/storage/pouch/ammo, +/obj/item/storage/pouch/ammo, /obj/machinery/firealarm/directional/north, /obj/effect/turf_decal/tile/red/half{ dir = 1 @@ -5249,7 +5249,7 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/observ) "Gk" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ dir = 8 }, /obj/effect/turf_decal/tile/blue/half, @@ -5576,7 +5576,7 @@ /turf/open/misc/asteroid/airless, /area/solars/tarkon) "Ih" = ( -/obj/machinery/door/airlock/multi_tile/glass, +/obj/machinery/door/airlock/multi_tile/public/glass, /obj/machinery/door/firedoor/solid, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8098,7 +8098,7 @@ /turf/open/floor/iron/dark, /area/ruin/space/has_grav/port_tarkon/developement) "Xj" = ( -/obj/machinery/door/airlock/multi_tile/glass, +/obj/machinery/door/airlock/multi_tile/public/glass, /obj/machinery/door/firedoor/solid, /turf/open/floor/iron, /area/ruin/space/has_grav/port_tarkon/garden) diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/scrapheap.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/scrapheap.dmm index 050983fc760..3e18590cb99 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/scrapheap.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/scrapheap.dmm @@ -909,7 +909,7 @@ "yO" = ( /obj/machinery/light/red/directional/west, /obj/structure/table/reinforced, -/obj/item/camera_bug, +/obj/item/computer_disk/syndicate/camera_app, /obj/item/disk/design_disk/bepis, /obj/item/disk/design_disk/bepis, /obj/item/stack/spacecash/c500, diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/shuttle8532.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/shuttle8532.dmm index fe1244201ff..a5dc9eaab2d 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/shuttle8532.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/shuttle8532.dmm @@ -2045,7 +2045,6 @@ "Rf" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/item/stack/medical/splint/improvised, /turf/open/floor/iron/airless, /area/ruin/space/has_grav/shuttle8532crewquarters) "RA" = ( diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/smugglies.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/smugglies.dmm index 481b3774e31..a4bccd94332 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/smugglies.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/smugglies.dmm @@ -152,7 +152,7 @@ "W" = ( /obj/structure/table, /obj/item/seeds/cocoapod, -/obj/item/circuitboard/machine/spaceship_navigation_beacon, +/obj/item/folded_navigation_gigabeacon, /turf/open/floor/iron, /area/ruin/space/has_grav/powered/skyrat/smugglies) "Y" = ( diff --git a/_maps/RandomRuins/SpaceRuins/skyrat/waypointstation.dmm b/_maps/RandomRuins/SpaceRuins/skyrat/waypointstation.dmm index e359e7a4ac4..1db27495571 100644 --- a/_maps/RandomRuins/SpaceRuins/skyrat/waypointstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/skyrat/waypointstation.dmm @@ -134,7 +134,7 @@ /turf/closed/wall/r_wall, /area/ruin/space/has_grav/waypoint) "ht" = ( -/obj/item/stack/tile/iron, +/obj/item/stack/tile/iron/base, /obj/structure/lattice, /turf/template_noop, /area/ruin) @@ -302,7 +302,7 @@ /turf/open/floor/iron/dark, /area/ruin/space/has_grav/waypoint) "ra" = ( -/obj/item/stack/tile/iron, +/obj/item/stack/tile/iron/base, /turf/template_noop, /area/ruin) "rc" = ( @@ -542,7 +542,7 @@ /area/ruin/space/has_grav/waypoint) "BD" = ( /obj/effect/decal/cleanable/blood/footprints, -/obj/item/stack/tile/iron, +/obj/item/stack/tile/iron/base, /turf/open/floor/iron/airless, /area/ruin/space/has_grav/waypoint) "BQ" = ( @@ -701,7 +701,7 @@ /turf/template_noop, /area/template_noop) "Jj" = ( -/obj/item/stack/tile/iron, +/obj/item/stack/tile/iron/base, /turf/template_noop, /area/template_noop) "Jq" = ( @@ -784,7 +784,7 @@ /turf/open/floor/carpet/royalblue/airless, /area/ruin/space/has_grav/waypoint) "Oc" = ( -/obj/item/stack/tile/iron, +/obj/item/stack/tile/iron/base, /turf/open/floor/iron/airless, /area/ruin/space/has_grav/waypoint) "Ok" = ( @@ -1043,7 +1043,7 @@ /turf/open/floor/iron/dark, /area/ruin/space/has_grav/waypoint) "ZA" = ( -/obj/item/stack/tile/iron, +/obj/item/stack/tile/iron/base, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/waypoint) diff --git a/_maps/RandomRuins/SpaceRuins/space_ghost_restaurant.dmm b/_maps/RandomRuins/SpaceRuins/space_ghost_restaurant.dmm index f644cc1518f..fa97cdd8966 100644 --- a/_maps/RandomRuins/SpaceRuins/space_ghost_restaurant.dmm +++ b/_maps/RandomRuins/SpaceRuins/space_ghost_restaurant.dmm @@ -51,6 +51,12 @@ /obj/item/reagent_containers/cup/glass/mug/nanotrasen, /turf/open/floor/iron/cafeteria/airless, /area/ruin/space/space_ghost_restaurant) +"gS" = ( +/obj/item/food/mashed_potatoes, +/obj/structure/lattice, +/obj/item/clothing/head/costume/scarecrow_hat, +/turf/template_noop, +/area/space/nearstation) "hp" = ( /obj/item/stack/rods, /turf/template_noop, @@ -66,6 +72,11 @@ "kf" = ( /turf/open/floor/iron/cafeteria/airless, /area/ruin/space/space_ghost_restaurant) +"kM" = ( +/obj/structure/broken_flooring/pile/directional/east, +/obj/structure/lattice, +/turf/template_noop, +/area/space/nearstation) "kX" = ( /obj/structure/bed, /obj/item/bedsheet/yellow, @@ -83,11 +94,6 @@ }, /turf/template_noop, /area/space/nearstation) -"nr" = ( -/obj/structure/lattice, -/obj/structure/broken_flooring/singular/directional/south, -/turf/template_noop, -/area/space/nearstation) "nT" = ( /obj/effect/decal/cleanable/food/flour, /obj/structure/mannequin/wood, @@ -133,17 +139,16 @@ /obj/machinery/door/airlock/maintenance_hatch, /turf/open/floor/plating, /area/ruin/space/space_ghost_restaurant) -"Ak" = ( -/obj/structure/lattice, -/obj/structure/broken_flooring/singular/directional/east, -/turf/template_noop, -/area/space/nearstation) "AT" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/frame/machine, /obj/item/stack/cable_coil/cut, /turf/open/floor/iron/showroomfloor/airless, /area/ruin/space/space_ghost_restaurant) +"Bv" = ( +/obj/structure/broken_flooring/singular/directional/south, +/turf/template_noop, +/area/template_noop) "BA" = ( /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/glass, @@ -170,10 +175,20 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/showroomfloor/airless, /area/ruin/space/space_ghost_restaurant) +"Hc" = ( +/obj/structure/lattice, +/obj/structure/broken_flooring/singular/directional/south, +/turf/template_noop, +/area/space/nearstation) "Hx" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/plating, /area/ruin/space/space_ghost_restaurant) +"Im" = ( +/obj/structure/lattice, +/obj/structure/broken_flooring/singular/directional/east, +/turf/template_noop, +/area/space/nearstation) "Ix" = ( /obj/structure/lattice, /turf/template_noop, @@ -191,12 +206,6 @@ /obj/item/stack/tile/iron/cafeteria, /turf/template_noop, /area/space/nearstation) -"Jd" = ( -/obj/item/food/mashed_potatoes, -/obj/structure/lattice, -/obj/item/clothing/head/costume/scarecrow_hat, -/turf/template_noop, -/area/space/nearstation) "Jo" = ( /obj/item/bodypart/leg/left/robot/surplus, /obj/item/stack/tile/iron/cafeteria, @@ -206,11 +215,6 @@ /obj/item/chair, /turf/open/floor/iron/cafeteria/airless, /area/ruin/space/space_ghost_restaurant) -"Kj" = ( -/obj/structure/broken_flooring/pile/directional/east, -/obj/structure/lattice, -/turf/template_noop, -/area/space/nearstation) "Km" = ( /obj/structure/table/wood/fancy/red, /obj/item/clothing/head/costume/papersack/smiley, @@ -251,10 +255,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/carpet/donk, /area/ruin/space/space_ghost_restaurant) -"Oy" = ( -/obj/structure/broken_flooring/singular/directional/south, -/turf/template_noop, -/area/template_noop) "Py" = ( /obj/structure/table/wood/fancy/red, /obj/item/clothing/head/wizard/santa, @@ -387,7 +387,7 @@ Ea Ix Ea Ea -Ak +Im Ea Ea Ea @@ -474,7 +474,7 @@ Ns RI kf Qi -Jd +gS Dz Ix hp @@ -498,7 +498,7 @@ WY Jo vs vh -Kj +kM Ea Ea Ea @@ -522,7 +522,7 @@ Ix AT Ea Ea -Oy +Bv Ea Ea Ea @@ -564,7 +564,7 @@ Ix Ea Ea Ea -nr +Hc Ea Ea Ea diff --git a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm index 018080521e8..705b2654546 100644 --- a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm @@ -1595,13 +1595,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/sepia, /area/ruin/space/has_grav/hotel/guestroom/room_6) -"pA" = ( -/obj/machinery/door/airlock/external/glass, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hotel/power) "pF" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/iron/showroomfloor, @@ -4020,6 +4013,13 @@ /obj/structure/table/wood/fancy/purple, /turf/open/floor/carpet/lone, /area/ruin/space/has_grav/hotel/guestroom/room_1) +"Uw" = ( +/obj/machinery/door/airlock/external/glass, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hotel/power) "UD" = ( /obj/effect/turf_decal/stripes/end, /turf/open/floor/plating/airless, @@ -8198,7 +8198,7 @@ WD WD WD WD -pA +Uw WD WD Ft @@ -8347,7 +8347,7 @@ Cl Cl Cl WD -pA +Uw WD Cl Cl diff --git a/_maps/RandomRuins/SpaceRuins/spacehotel_skyrat.dmm b/_maps/RandomRuins/SpaceRuins/spacehotel_skyrat.dmm index 79d43f9a222..8bda7e70f3a 100644 --- a/_maps/RandomRuins/SpaceRuins/spacehotel_skyrat.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacehotel_skyrat.dmm @@ -1618,7 +1618,7 @@ dir = 8 }, /obj/structure/cable, -/obj/machinery/door/airlock/glass_large{ +/obj/machinery/door/airlock/multi_tile/public/glass{ dir = 4; id_tag = "HotelRoom8" }, @@ -3228,7 +3228,7 @@ dir = 1 }, /obj/item/crowbar, -/obj/item/circuitboard/machine/spaceship_navigation_beacon, +/obj/item/folded_navigation_gigabeacon, /obj/effect/turf_decal/siding/dark_blue{ dir = 8 }, @@ -5483,7 +5483,7 @@ /area/ruin/space/has_grav/hotel/power) "Fm" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/glass_large{ +/obj/machinery/door/airlock/multi_tile/public/glass{ dir = 4; id_tag = "HotelRoom8" }, diff --git a/_maps/RandomRuins/SpaceRuins/the_faceoff.dmm b/_maps/RandomRuins/SpaceRuins/the_faceoff.dmm index 1eb4ae89ab4..08f2fe4d8f4 100644 --- a/_maps/RandomRuins/SpaceRuins/the_faceoff.dmm +++ b/_maps/RandomRuins/SpaceRuins/the_faceoff.dmm @@ -41,6 +41,9 @@ /obj/item/light/bulb/broken, /turf/open/floor/iron/dark/smooth_large/airless, /area/ruin/space) +"bz" = ( +/turf/template_noop, +/area/template_noop) "bM" = ( /obj/item/ammo_casing/a357/spent{ dir = 1; @@ -336,9 +339,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/airless, /area/ruin/space) -"lk" = ( -/turf/template_noop, -/area/template_noop) "lX" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -1276,245 +1276,245 @@ /area/ruin/space) (1,1,1) = {" -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz "} (2,1,1) = {" -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz "} (3,1,1) = {" -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz "} (4,1,1) = {" -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz "} (5,1,1) = {" -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz Er Er Er -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz "} (6,1,1) = {" -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz Er Er Er -lk -lk -lk +bz +bz +bz Er Er Er Er -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz "} (7,1,1) = {" -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz Er Er Er Er Er -lk +bz Er Er Er @@ -1524,27 +1524,27 @@ Er Er Er Er -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz "} (8,1,1) = {" -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz Er Er Er @@ -1562,25 +1562,25 @@ ED ED Er Er -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz "} (9,1,1) = {" -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz Er Er Er @@ -1599,24 +1599,24 @@ so ED ED Er -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz "} (10,1,1) = {" -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz Er ED Er @@ -1636,22 +1636,22 @@ Ck fR xT Er -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz "} (11,1,1) = {" -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz Er Er Er @@ -1673,21 +1673,21 @@ yx Dm Er Er -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz "} (12,1,1) = {" -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz Er Er ED @@ -1710,19 +1710,19 @@ rG ED ED Er -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz "} (13,1,1) = {" -lk -lk -lk +bz +bz +bz Er Er Er @@ -1747,18 +1747,18 @@ Er Er Er Er -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz "} (14,1,1) = {" -lk -lk +bz +bz Er Er Er @@ -1782,20 +1782,20 @@ vZ xT Er Er -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz "} (15,1,1) = {" -lk -lk +bz +bz Er Er Er @@ -1818,22 +1818,22 @@ je ZC ED Er -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz "} (16,1,1) = {" -lk -lk -lk +bz +bz +bz Er Er AV @@ -1857,20 +1857,20 @@ ij Er Er Er -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz "} (17,1,1) = {" -lk -lk -lk +bz +bz +bz Er ED wW @@ -1895,19 +1895,19 @@ ED ED ED Er -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz "} (18,1,1) = {" -lk -lk -lk +bz +bz +bz Er ED fa @@ -1933,19 +1933,19 @@ ch ED Er Er -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz "} (19,1,1) = {" -lk -lk -lk -lk +bz +bz +bz +bz Er ED ou @@ -1970,19 +1970,19 @@ ZC HG ED Er -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz "} (20,1,1) = {" -lk -lk -lk -lk +bz +bz +bz +bz Er ED ED @@ -2008,19 +2008,19 @@ ZC ED ED Er -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz "} (21,1,1) = {" -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz Er Er Er @@ -2046,19 +2046,19 @@ ZC ED ED Er -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz "} (22,1,1) = {" -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz Er Er ED @@ -2083,21 +2083,21 @@ ZO aC ED Er -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz "} (23,1,1) = {" -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz Er Er Er @@ -2120,23 +2120,23 @@ Ef Ef ED Er -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz "} (24,1,1) = {" -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz Er ED LX @@ -2157,23 +2157,23 @@ Ef GX eA Er -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz "} (25,1,1) = {" -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz Er ED mG @@ -2194,23 +2194,23 @@ YI YI Qx Er -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz "} (26,1,1) = {" -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz Er Er Er @@ -2230,28 +2230,28 @@ xI sa Ds eA -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz "} (27,1,1) = {" -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz Er ED ED @@ -2267,28 +2267,28 @@ YI eA Ds eA -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz "} (28,1,1) = {" -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz Er Er Er @@ -2304,31 +2304,31 @@ Ts nl cq nl -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz "} (29,1,1) = {" -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz Er Er ED @@ -2336,237 +2336,237 @@ ED sZ ED Er -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz "} (30,1,1) = {" -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz Er ED ED ED Er -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz "} (31,1,1) = {" -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz Er Er Er Er -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz "} (32,1,1) = {" -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz "} (33,1,1) = {" -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz "} (34,1,1) = {" -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz "} (35,1,1) = {" -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk -lk +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz +bz "} diff --git a/_maps/RandomRuins/SpaceRuins/the_outlet.dmm b/_maps/RandomRuins/SpaceRuins/the_outlet.dmm index 699d509495d..1ed37f9df00 100644 --- a/_maps/RandomRuins/SpaceRuins/the_outlet.dmm +++ b/_maps/RandomRuins/SpaceRuins/the_outlet.dmm @@ -2006,7 +2006,7 @@ /turf/open/floor/plating/rust, /area/ruin/space/has_grav/the_outlet/researchrooms) "Wz" = ( -/obj/machinery/door/airlock/glass_large, +/obj/machinery/door/airlock/multi_tile/public/glass, /turf/open/floor/iron, /area/ruin/space/has_grav/the_outlet/storefront) "WC" = ( diff --git a/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm b/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm index a6afd28c85d..fe62f0ed09d 100644 --- a/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm +++ b/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm @@ -30,12 +30,6 @@ }, /turf/open/floor/iron/white, /area/ruin/space/has_grav/thelizardsgas) -"bt" = ( -/obj/structure/sign/poster/fluff/lizards_gas_payment/directional/north, -/turf/open/floor/iron/dark/smooth_corner{ - dir = 8 - }, -/area/ruin/space/has_grav/thelizardsgas) "bO" = ( /obj/structure/closet/crate/secure/gear, /turf/closed/mineral, @@ -58,6 +52,13 @@ dir = 4 }, /area/ruin/space/has_grav/thelizardsgas) +"cv" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/hidden, +/obj/structure/sign/poster/fluff/lizards_gas_payment/directional/west, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/ruin/space/has_grav/thelizardsgas) "de" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/components/binary/pump/off{ @@ -65,6 +66,12 @@ }, /turf/template_noop, /area/ruin/space/has_grav/thelizardsgas) +"eV" = ( +/obj/structure/sign/poster/fluff/lizards_gas_payment/directional/north, +/turf/open/floor/iron/dark/smooth_corner{ + dir = 8 + }, +/area/ruin/space/has_grav/thelizardsgas) "gL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -90,15 +97,6 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/thelizardsgas) -"iG" = ( -/obj/machinery/computer/atmos_control/noreconnect{ - atmos_chambers = list("lizardgas"="Plasma Supply"); - dir = 8 - }, -/turf/open/floor/iron/dark/smooth_edge{ - dir = 4 - }, -/area/ruin/space/has_grav/thelizardsgas) "iO" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/hidden, /obj/effect/turf_decal/tile/dark{ @@ -120,6 +118,13 @@ }, /turf/open/floor/iron/white, /area/ruin/space/has_grav/thelizardsgas) +"kk" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/iron/white/side, +/area/ruin/space/has_grav/thelizardsgas) "kS" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ chamber_id = "lizardgas" @@ -184,6 +189,14 @@ /obj/machinery/atmospherics/pipe/smart/simple/yellow/hidden, /turf/open/floor/iron/white, /area/ruin/space/has_grav/thelizardsgas) +"tq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/structure/sign/poster/fluff/lizards_gas_power/directional/east, +/turf/open/floor/plating, +/area/ruin/space/has_grav/thelizardsgas) "ua" = ( /obj/effect/spawner/random/structure/billboard/roadsigns, /turf/open/misc/asteroid/airless, @@ -210,13 +223,6 @@ /obj/structure/sign/warning/fire/directional/north, /turf/open/floor/iron/white/side, /area/ruin/space/has_grav/thelizardsgas) -"xw" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/iron/white/side, -/area/ruin/space/has_grav/thelizardsgas) "xy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -231,25 +237,6 @@ }, /turf/template_noop, /area/template_noop) -"ze" = ( -/obj/structure/closet/crate/secure/freezer{ - desc = "There's a reason why this is behind the counter. Do not sell to minors."; - locked = 0; - name = "The GOOD Stuff" - }, -/obj/machinery/power/apc/auto_name/directional/north{ - coverlocked = 0; - start_charge = 60 - }, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/structure/cable, -/obj/item/paper/fluff/spaceruins/lizardsgas/memorandum, -/obj/effect/spawner/random/contraband/cannabis/lizardsgas, -/obj/effect/spawner/random/contraband/cannabis/lizardsgas, -/obj/effect/spawner/random/contraband/cannabis/lizardsgas, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/dark/smooth_corner, -/area/ruin/space/has_grav/thelizardsgas) "zn" = ( /obj/structure/rack, /obj/effect/spawner/random/food_or_drink/snack, @@ -362,6 +349,25 @@ }, /turf/open/misc/asteroid/airless, /area/ruin/space/has_grav/thelizardsgas) +"JA" = ( +/obj/structure/closet/crate/secure/freezer{ + desc = "There's a reason why this is behind the counter. Do not sell to minors."; + locked = 0; + name = "The GOOD Stuff" + }, +/obj/machinery/power/apc/auto_name/directional/north{ + coverlocked = 0; + start_charge = 60 + }, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/structure/cable, +/obj/item/paper/fluff/spaceruins/lizardsgas/memorandum, +/obj/effect/spawner/random/contraband/cannabis/lizardsgas, +/obj/effect/spawner/random/contraband/cannabis/lizardsgas, +/obj/effect/spawner/random/contraband/cannabis/lizardsgas, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark/smooth_corner, +/area/ruin/space/has_grav/thelizardsgas) "JP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/small/directional/west, @@ -389,14 +395,6 @@ }, /turf/open/floor/plating, /area/ruin/space/has_grav/thelizardsgas) -"Mw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/structure/sign/poster/fluff/lizards_gas_power/directional/east, -/turf/open/floor/plating, -/area/ruin/space/has_grav/thelizardsgas) "MB" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/simple/yellow/hidden{ @@ -426,6 +424,15 @@ }, /turf/open/floor/iron/white, /area/ruin/space/has_grav/thelizardsgas) +"PF" = ( +/obj/machinery/computer/atmos_control/noreconnect{ + atmos_chambers = list("lizardgas"="Plasma Supply"); + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 4 + }, +/area/ruin/space/has_grav/thelizardsgas) "Qg" = ( /turf/closed/mineral, /area/ruin/space/has_grav/thelizardsgas) @@ -449,13 +456,6 @@ /obj/structure/marker_beacon/burgundy, /turf/open/misc/asteroid/airless, /area/ruin/space/has_grav/thelizardsgas) -"Ss" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/hidden, -/obj/structure/sign/poster/fluff/lizards_gas_payment/directional/west, -/turf/open/floor/iron/white/corner{ - dir = 4 - }, -/area/ruin/space/has_grav/thelizardsgas) "Tj" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /obj/effect/spawner/structure/window/reinforced/plasma, @@ -667,7 +667,7 @@ CA Qg Qg mR -ze +JA rs zz JY @@ -721,8 +721,8 @@ Qg Qg Qg mR -bt -iG +eV +PF VP hl Gr @@ -781,7 +781,7 @@ Tj na sN iO -Ss +cv GM Pb ss @@ -965,7 +965,7 @@ Qg mR Io cm -Mw +tq Cv nL gL @@ -994,7 +994,7 @@ mR mR mR mR -xw +kk jN zn Wh diff --git a/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm b/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm index ea8945d63a2..4be262c6fd0 100644 --- a/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm +++ b/_maps/RandomRuins/SpaceRuins/turretedoutpost.dmm @@ -244,7 +244,7 @@ /area/ruin/space/has_grav/turretedoutpost) "Iq" = ( /obj/structure/table/reinforced, -/obj/item/camera_bug, +/obj/item/computer_disk/syndicate/camera_app, /turf/open/floor/iron, /area/ruin/space/has_grav/turretedoutpost) "LS" = ( diff --git a/_maps/RandomRuins/SpaceRuins/waystation.dmm b/_maps/RandomRuins/SpaceRuins/waystation.dmm index 8b516c5c260..ab0801aea52 100644 --- a/_maps/RandomRuins/SpaceRuins/waystation.dmm +++ b/_maps/RandomRuins/SpaceRuins/waystation.dmm @@ -227,6 +227,18 @@ /obj/structure/lattice/catwalk, /turf/template_noop, /area/ruin/space) +"eq" = ( +/obj/effect/turf_decal/siding/red{ + dir = 9 + }, +/obj/machinery/door/window/brigdoor/security/cell/left{ + req_access = list("away_sec") + }, +/obj/structure/filingcabinet, +/obj/item/folder/documents, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/iron/dark, +/area/ruin/space/has_grav/waystation/securestorage) "er" = ( /turf/open/floor/iron/dark, /area/ruin/space/has_grav/waystation/securestorage) @@ -1926,17 +1938,6 @@ /obj/item/crowbar, /turf/open/floor/iron, /area/ruin/space/has_grav/waystation/cargobay) -"Jl" = ( -/obj/effect/turf_decal/siding/red{ - dir = 9 - }, -/obj/machinery/door/window/brigdoor/security/cell/left, -/obj/structure/filingcabinet, -/obj/item/folder/documents, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/waystation/securestorage) "Jy" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/iron, @@ -4998,7 +4999,7 @@ pK pK pK yi -Jl +eq EM kb NB diff --git a/_maps/RandomZLevels/SnowCabin.dmm b/_maps/RandomZLevels/SnowCabin.dmm index 471290bc568..cf2b35b3663 100644 --- a/_maps/RandomZLevels/SnowCabin.dmm +++ b/_maps/RandomZLevels/SnowCabin.dmm @@ -2594,7 +2594,7 @@ }, /area/awaymission/cabin/caves/sovietcave) "nM" = ( -/obj/machinery/door/airlock/glass_large{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Medical Bay" }, /obj/structure/cable, diff --git a/_maps/RandomZLevels/TheBeach.dmm b/_maps/RandomZLevels/TheBeach.dmm index 20b4d9c8169..18d0a7fdc86 100644 --- a/_maps/RandomZLevels/TheBeach.dmm +++ b/_maps/RandomZLevels/TheBeach.dmm @@ -136,6 +136,10 @@ /obj/structure/flora/tree/palm, /turf/open/misc/beach/sand, /area/awaymission/beach) +"aB" = ( +/mob/living/basic/crab/kreb, +/turf/open/misc/beach/sand, +/area/awaymission/beach) "aC" = ( /obj/item/flashlight/flare/torch, /turf/open/misc/beach/sand, @@ -172,6 +176,10 @@ }, /turf/open/water/beach, /area/awaymission/beach) +"aK" = ( +/mob/living/basic/crab, +/turf/open/misc/beach/sand, +/area/awaymission/beach) "aO" = ( /obj/effect/baseturf_helper/beach/sand, /turf/open/misc/beach/sand, @@ -946,10 +954,6 @@ }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"mZ" = ( -/mob/living/basic/crab/kreb, -/turf/open/misc/beach/sand, -/area/awaymission/beach) "oE" = ( /obj/structure/table/wood, /obj/item/food/burger/crab, @@ -1129,10 +1133,6 @@ }, /turf/open/misc/beach/sand, /area/awaymission/beach) -"Xc" = ( -/mob/living/basic/crab, -/turf/open/misc/beach/sand, -/area/awaymission/beach) "Za" = ( /obj/item/flashlight/flare/torch{ pixel_x = 10; @@ -5489,7 +5489,7 @@ ak ak ak ak -Xc +aK ak cG ap @@ -6240,7 +6240,7 @@ ak ak ak ak -Xc +aK ak ap av @@ -8698,7 +8698,7 @@ ak aA ak ak -Xc +aK ak ak ak @@ -9449,7 +9449,7 @@ ak ak cu ak -Xc +aK ap av av @@ -10065,7 +10065,7 @@ av av ag ak -Xc +aK ak ak ak @@ -10704,7 +10704,7 @@ av av ag aA -mZ +aB ak ak ak @@ -10841,7 +10841,7 @@ ak ak ak ak -Xc +aK ak ap av @@ -11049,7 +11049,7 @@ ak ak ak ak -Xc +aK ak ak ak @@ -11349,7 +11349,7 @@ av av ah az -Xc +aK ak ak aX diff --git a/_maps/RandomZLevels/blackmesa.dmm b/_maps/RandomZLevels/blackmesa.dmm index c23656ca855..07f0283bb95 100644 --- a/_maps/RandomZLevels/blackmesa.dmm +++ b/_maps/RandomZLevels/blackmesa.dmm @@ -614,13 +614,6 @@ /obj/item/stack/sheet/cloth/ten, /turf/open/floor/iron/textured, /area/awaymission/black_mesa/tram_room) -"ahv" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/multi_tile/glass{ - dir = 4 - }, -/turf/open/floor/iron/smooth_large, -/area/awaymission/black_mesa/cryo_room) "ahy" = ( /obj/machinery/light/cold, /turf/open/floor/iron, @@ -2099,11 +2092,6 @@ /obj/effect/random_mob_placer/hev_zombie, /turf/open/misc/xen, /area/awaymission/black_mesa/xen/crowbar_nook) -"aBb" = ( -/obj/machinery/door/airlock/multi_tile/glass, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/black_mesa/security_outpost) "aBc" = ( /obj/machinery/door/airlock/silver, /obj/effect/mapping_helpers/airlock/locked, @@ -3003,11 +2991,6 @@ "aMh" = ( /turf/open/misc/ice, /area/awaymission/black_mesa/cryo_room) -"aMi" = ( -/obj/structure/alien/weeds/xen, -/obj/item/ammo_box/a762, -/turf/open/misc/ironsand/black_mesa, -/area/awaymission/black_mesa) "aMk" = ( /obj/effect/turf_decal/stripes{ dir = 1 @@ -3384,10 +3367,6 @@ "aQZ" = ( /turf/closed/indestructible/rock, /area/space) -"aRa" = ( -/obj/machinery/door/airlock/multi_tile/glass, -/turf/open/floor/iron/dark, -/area/awaymission/black_mesa/security_outpost) "aRb" = ( /obj/structure/lattice/catwalk, /turf/open/chasm{ @@ -4067,12 +4046,6 @@ }, /turf/open/floor/iron/textured, /area/awaymission/black_mesa/cryo_room) -"aZm" = ( -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/black_mesa/security_outpost) "aZt" = ( /obj/structure/xen_crystal, /turf/open/misc/xen, @@ -4173,6 +4146,11 @@ /obj/item/tape/ruins/black_mesa/third_eas, /turf/open/floor/iron/textured, /area/awaymission/black_mesa/black_ops_entrance) +"bfx" = ( +/obj/structure/alien/weeds/xen, +/obj/item/ammo_box/strilka310, +/turf/open/misc/ironsand/black_mesa, +/area/awaymission/black_mesa) "bfV" = ( /obj/machinery/chem_master, /obj/structure/alien/weeds/xen, @@ -4698,7 +4676,7 @@ /turf/open/floor/iron/textured, /area/awaymission/black_mesa/hecu_zone_atrium) "ciB" = ( -/obj/item/ammo_casing/a277/weak, +/obj/item/ammo_casing/a223/weak, /turf/open/floor/iron/textured, /area/awaymission/black_mesa/black_ops_entrance) "ciK" = ( @@ -4847,10 +4825,6 @@ /obj/effect/baseturf_helper/black_mesa, /turf/closed/wall/r_wall, /area/awaymission/black_mesa/security_outpost) -"cug" = ( -/obj/machinery/door/airlock/multi_tile/glass, -/turf/open/floor/iron/smooth_large, -/area/awaymission/black_mesa/hecu_zone_external_hall) "cuS" = ( /obj/structure/filingcabinet/chestdrawer/wheeled, /obj/item/documents, @@ -5185,6 +5159,10 @@ /obj/effect/spawner/random/vending/colavend, /turf/open/floor/carpet/blue, /area/awaymission/black_mesa/high_security_servers) +"dbM" = ( +/obj/machinery/door/airlock/multi_tile/public/glass, +/turf/open/floor/iron/smooth_large, +/area/awaymission/black_mesa/hecu_zone_external_hall) "dcv" = ( /obj/machinery/atmospherics/components/unary/cryo_cell, /turf/open/floor/iron/smooth_large, @@ -5592,8 +5570,8 @@ /turf/open/floor/iron/smooth_large, /area/awaymission/black_mesa/high_security_surgery) "dPS" = ( -/obj/item/ammo_casing/a277/weak, -/obj/item/ammo_casing/a277/weak, +/obj/item/ammo_casing/a223/weak, +/obj/item/ammo_casing/a223/weak, /turf/open/floor/iron/textured, /area/awaymission/black_mesa/black_ops_entrance) "dQa" = ( @@ -5773,12 +5751,6 @@ /obj/machinery/light/broken, /turf/open/floor/iron/smooth_large, /area/awaymission/black_mesa/entrance_internal_hall) -"ecR" = ( -/obj/machinery/door/airlock/multi_tile/glass{ - dir = 4 - }, -/turf/open/floor/iron/textured, -/area/awaymission/black_mesa/black_ops_button) "edd" = ( /obj/structure/inflatable{ color = "#556B2F"; @@ -5805,6 +5777,14 @@ }, /turf/open/floor/iron/textured, /area/awaymission/black_mesa/black_ops_science_room) +"efO" = ( +/obj/machinery/door/airlock/multi_tile/public/glass{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/structure/alien/weeds/xen, +/turf/open/floor/iron/dark, +/area/awaymission/black_mesa/genetics_elevator) "egS" = ( /obj/effect/baseturf_helper/black_mesa, /turf/closed/wall/r_wall, @@ -6233,6 +6213,11 @@ /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/iron/smooth_large, /area/awaymission/black_mesa/high_security_emitter) +"faZ" = ( +/obj/machinery/door/airlock/multi_tile/public/glass, +/obj/structure/alien/weeds/xen, +/turf/open/floor/iron/smooth, +/area/awaymission/black_mesa/scientist_hall) "fbS" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -6423,14 +6408,6 @@ /obj/structure/alien/weeds/xen, /turf/open/floor/iron/smooth, /area/awaymission/black_mesa/scientist_hall) -"foy" = ( -/obj/machinery/door/airlock/multi_tile/glass{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/structure/alien/weeds/xen, -/turf/open/floor/iron/dark, -/area/awaymission/black_mesa/genetics_elevator) "fpv" = ( /obj/item/clothing/gloves/latex/nitrile, /turf/open/floor/iron/white, @@ -6505,6 +6482,12 @@ }, /turf/open/floor/iron/textured, /area/awaymission/black_mesa/black_ops_entrance) +"fxV" = ( +/obj/machinery/door/airlock/multi_tile/public/glass{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/awaymission/black_mesa/hecu_zone_external_hall) "fym" = ( /turf/open/floor/iron/textured_large, /area/awaymission/black_mesa/genetics) @@ -7285,13 +7268,6 @@ /obj/structure/mineral_door/paperframe, /turf/open/misc/xen, /area/awaymission/black_mesa/xen/vortigaunt_village) -"hgp" = ( -/obj/machinery/door/airlock/multi_tile/glass{ - dir = 4 - }, -/obj/structure/barricade/wooden/crude, -/turf/open/floor/iron/smooth_large, -/area/awaymission/black_mesa/hecu_zone_atrium) "hgt" = ( /obj/machinery/door/airlock/command, /obj/effect/mapping_helpers/airlock/locked, @@ -7563,11 +7539,6 @@ }, /turf/open/floor/iron/textured_half, /area/awaymission/black_mesa/hecu_zone_infirmary) -"hFo" = ( -/obj/machinery/door/airlock/multi_tile/glass, -/obj/structure/alien/weeds/xen, -/turf/open/floor/iron/textured, -/area/awaymission/black_mesa/scientist_hall) "hFW" = ( /obj/effect/spawner/random/vending/snackvend, /turf/open/floor/carpet/blue, @@ -8015,6 +7986,12 @@ }, /turf/open/floor/engine, /area/awaymission/black_mesa/high_security_emitter) +"iCN" = ( +/obj/machinery/door/airlock/multi_tile/public/glass{ + dir = 4 + }, +/turf/open/floor/iron/textured, +/area/awaymission/black_mesa/black_ops_hall) "iDr" = ( /obj/structure/railing{ dir = 4 @@ -8235,6 +8212,10 @@ dir = 8 }, /area/awaymission/black_mesa/xen/entering_zone) +"iZm" = ( +/obj/machinery/door/airlock/multi_tile/public/glass, +/turf/open/floor/iron/dark, +/area/awaymission/black_mesa/security_outpost) "iZn" = ( /obj/item/ammo_casing/shotgun/buckshot, /obj/structure/sign/flag/usa/directional/south, @@ -8309,6 +8290,13 @@ /obj/item/storage/box/hecu_rations, /turf/open/floor/bamboo, /area/awaymission/black_mesa/xen/vortigaunt_village) +"jem" = ( +/obj/machinery/door/airlock/multi_tile/public/glass{ + dir = 4 + }, +/obj/structure/alien/weeds/xen, +/turf/open/floor/iron/textured, +/area/awaymission/black_mesa/scientist_hall) "jev" = ( /obj/structure/spacevine/xen/thick, /obj/effect/baseturf_helper/black_mesa_xen, @@ -8346,6 +8334,11 @@ /obj/structure/alien/weeds/xen, /turf/open/floor/iron/textured_large, /area/awaymission/black_mesa/scientist_hall) +"jjg" = ( +/obj/machinery/door/airlock/multi_tile/public/glass, +/obj/structure/alien/weeds/xen, +/turf/open/floor/iron/textured, +/area/awaymission/black_mesa/scientist_hall) "jjC" = ( /obj/structure/table, /turf/open/floor/iron/textured, @@ -8604,13 +8597,6 @@ /obj/structure/marker_beacon/burgundy, /turf/open/misc/xen, /area/awaymission/black_mesa/xen/entering_zone) -"jCV" = ( -/obj/machinery/door/airlock/multi_tile/glass{ - dir = 4 - }, -/obj/structure/barricade/wooden, -/turf/open/floor/iron/smooth_large, -/area/awaymission/black_mesa/hecu_zone_atrium) "jDi" = ( /turf/open/misc/ironsand/black_mesa, /area/awaymission/black_mesa/black_ops_bus) @@ -8729,13 +8715,6 @@ "jRk" = ( /turf/open/floor/iron/textured, /area/awaymission/black_mesa/black_ops_downstairs_atrium) -"jRB" = ( -/obj/machinery/door/airlock/multi_tile/glass{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/locked, -/turf/open/floor/iron/smooth_large, -/area/awaymission/black_mesa/deep_sci_turret) "jRH" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/line, /obj/machinery/light/broken, @@ -8910,14 +8889,14 @@ }, /turf/open/floor/iron/white, /area/awaymission/black_mesa/hecu_zone_camp) +"khG" = ( +/obj/machinery/door/airlock/multi_tile/public/glass, +/turf/open/floor/iron/textured, +/area/awaymission/black_mesa/science_labs) "khU" = ( /obj/item/storage/box/hecu_rations, /turf/open/misc/xen, /area/awaymission/black_mesa/xen/freeman_puzzle) -"kjn" = ( -/obj/machinery/door/airlock/multi_tile/glass, -/turf/open/floor/iron/textured, -/area/awaymission/black_mesa/science_labs) "kjx" = ( /obj/structure/table, /obj/item/reagent_containers/hypospray/medipen/blood_loss, @@ -9175,6 +9154,10 @@ /obj/item/gun/energy/laser/thermal/cryo, /turf/open/floor/iron/textured_large, /area/awaymission/black_mesa/deep_sci_turret) +"kLe" = ( +/obj/machinery/door/airlock/multi_tile/public/glass, +/turf/open/floor/iron/smooth, +/area/awaymission/black_mesa/hecu_zone_test_chambers) "kLj" = ( /turf/open/floor/iron/stairs/medium{ dir = 4 @@ -9300,13 +9283,6 @@ /mob/living/simple_animal/hostile/blackmesa/xen/bullsquid, /turf/open/misc/xen, /area/awaymission/black_mesa/xen/acid_lake) -"kXb" = ( -/obj/machinery/door/airlock/multi_tile/glass{ - dir = 4 - }, -/obj/structure/alien/weeds/xen, -/turf/open/floor/iron/textured, -/area/awaymission/black_mesa/scientist_hall) "kXt" = ( /obj/structure/window/reinforced/unanchored/spawner/directional/north, /obj/structure/table, @@ -10318,10 +10294,6 @@ /obj/structure/spacevine/xen/thick, /turf/open/misc/xen, /area/awaymission/black_mesa/xen/village_hallway) -"mYQ" = ( -/obj/machinery/door/airlock/multi_tile/glass, -/turf/open/floor/iron/smooth, -/area/awaymission/black_mesa/hecu_zone_test_chambers) "mZP" = ( /obj/structure/toilet{ dir = 8 @@ -10464,6 +10436,13 @@ /obj/structure/pod, /turf/open/misc/xen, /area/awaymission/black_mesa/xen/entering_zone) +"nnQ" = ( +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/multi_tile/public/glass{ + dir = 4 + }, +/turf/open/floor/iron/smooth_large, +/area/awaymission/black_mesa/cryo_room) "noE" = ( /obj/structure/sign/warning/biohazard, /turf/closed/wall/r_wall, @@ -12064,6 +12043,13 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/smooth_large, /area/awaymission/black_mesa/deep_sci_storage) +"qAD" = ( +/obj/machinery/door/airlock/multi_tile/public/glass{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/iron/smooth_large, +/area/awaymission/black_mesa/deep_sci_turret) "qAH" = ( /obj/machinery/door/airlock, /obj/structure/alien/weeds/xen, @@ -12257,12 +12243,6 @@ }, /turf/open/floor/iron/smooth_large, /area/awaymission/black_mesa/genetics_elevator) -"qNc" = ( -/obj/machinery/door/airlock/multi_tile/glass{ - dir = 4 - }, -/turf/open/floor/iron/textured, -/area/awaymission/black_mesa/black_ops_hall) "qNk" = ( /obj/structure/sign/departments/chemistry{ pixel_x = -31 @@ -12308,12 +12288,6 @@ /obj/structure/alien/weeds/xen, /turf/open/floor/iron/textured, /area/awaymission/black_mesa/entrance_large_office) -"qRp" = ( -/obj/machinery/door/airlock/multi_tile/glass{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/awaymission/black_mesa/black_ops_server) "qRz" = ( /obj/structure/table, /obj/item/stack/telecrystal/five, @@ -12830,12 +12804,6 @@ /obj/structure/alien/weeds/xen, /turf/open/floor/iron/textured_large, /area/awaymission/black_mesa/science_labs) -"rOh" = ( -/obj/machinery/door/airlock/multi_tile/glass{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/awaymission/black_mesa/black_ops_hall) "rOE" = ( /obj/structure/extinguisher_cabinet/directional/west, /obj/structure/alien/weeds/xen, @@ -13016,7 +12984,7 @@ "sfK" = ( /obj/structure/table, /obj/machinery/light/cold/directional/north, -/obj/item/storage/bag/ammo, +/obj/item/storage/pouch/ammo, /obj/item/storage/belt/security/full, /obj/structure/sign/flag/usa/directional/north, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -13199,12 +13167,6 @@ /obj/structure/filingcabinet/chestdrawer, /turf/open/floor/wood/parquet, /area/awaymission/black_mesa/employee_dorm_room) -"swS" = ( -/obj/machinery/door/airlock/multi_tile/glass{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/awaymission/black_mesa/hecu_zone_external_hall) "sya" = ( /obj/structure/lattice/catwalk, /obj/structure/chair/plastic{ @@ -13317,6 +13279,12 @@ /obj/structure/curtain, /turf/open/floor/iron/textured_large, /area/awaymission/black_mesa/hecu_zone_infirmary) +"sIG" = ( +/obj/machinery/door/airlock/multi_tile/public/glass{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/awaymission/black_mesa/black_ops_server) "sJk" = ( /obj/structure/table, /obj/machinery/light/cold, @@ -13378,11 +13346,6 @@ /obj/item/grenade/syndieminibomb/concussion, /turf/open/floor/iron/smooth_large, /area/awaymission/black_mesa/high_security_armory) -"sRQ" = ( -/obj/machinery/door/airlock/multi_tile/glass, -/obj/structure/alien/weeds/xen, -/turf/open/floor/iron/smooth, -/area/awaymission/black_mesa/scientist_hall) "sST" = ( /obj/effect/random_mob_placer/xen/zombie, /turf/open/misc/ironsand/black_mesa, @@ -13590,6 +13553,12 @@ /obj/structure/alien/weeds/xen, /turf/open/floor/plating, /area/awaymission/black_mesa/resonant_chamber) +"tlC" = ( +/obj/machinery/door/airlock/multi_tile/public/glass{ + dir = 4 + }, +/turf/open/floor/iron/textured, +/area/awaymission/black_mesa/black_ops_button) "tlF" = ( /obj/machinery/light/cold/directional/north, /turf/open/floor/iron/dark, @@ -14319,6 +14288,12 @@ /obj/structure/alien/weeds/xen, /turf/open/floor/iron/stairs/medium, /area/awaymission/black_mesa/entrance_internal_hall) +"uQW" = ( +/obj/machinery/door/airlock/multi_tile/public/glass{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/awaymission/black_mesa/black_ops_hall) "uRb" = ( /obj/structure/flora/biolumi/mine/weaklight{ pixel_x = 7; @@ -14952,6 +14927,13 @@ }, /turf/open/floor/iron/dark, /area/awaymission/black_mesa/hecu_zone_camp) +"vTj" = ( +/obj/machinery/door/airlock/multi_tile/public/glass{ + dir = 4 + }, +/obj/structure/barricade/wooden/crude, +/turf/open/floor/iron/smooth_large, +/area/awaymission/black_mesa/hecu_zone_atrium) "vTT" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/line, /obj/effect/turf_decal/stripes{ @@ -15106,11 +15088,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/awaymission/black_mesa/genetics_sec) -"wma" = ( -/obj/machinery/door/airlock/multi_tile/glass, -/obj/structure/alien/weeds/xen, -/turf/open/floor/iron/smooth, -/area/awaymission/black_mesa/genetics_elevator) "wmo" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/line{ dir = 4 @@ -15192,6 +15169,11 @@ }, /turf/open/floor/iron, /area/awaymission/black_mesa/entrance_internal_hall) +"wuH" = ( +/obj/machinery/door/airlock/multi_tile/public/glass, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/awaymission/black_mesa/security_outpost) "wuY" = ( /obj/effect/random_mob_placer/xen, /turf/open/misc/xen, @@ -15221,6 +15203,13 @@ /obj/effect/baseturf_helper/black_mesa, /turf/closed/wall/r_wall, /area/awaymission/black_mesa/black_ops_armory) +"wxU" = ( +/obj/machinery/door/airlock/multi_tile/public/glass{ + dir = 4 + }, +/obj/structure/barricade/wooden, +/turf/open/floor/iron/smooth_large, +/area/awaymission/black_mesa/hecu_zone_atrium) "wye" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/corner, /obj/structure/alien/weeds/xen, @@ -15481,6 +15470,11 @@ }, /turf/open/floor/iron/textured_large, /area/awaymission/black_mesa/black_ops_downstairs_atrium) +"wXR" = ( +/obj/machinery/door/airlock/multi_tile/public/glass, +/obj/structure/alien/weeds/xen, +/turf/open/floor/iron/smooth, +/area/awaymission/black_mesa/genetics_elevator) "wYo" = ( /mob/living/simple_animal/hostile/blackmesa/xen/bullsquid, /turf/open/water/xen_acid, @@ -15564,7 +15558,7 @@ /obj/item/storage/medkit/toxin, /obj/item/storage/medkit/surgery, /obj/item/bodybag, -/obj/item/storage/bag/medpens, +/obj/item/storage/pouch/medpens, /turf/open/floor/iron/dark, /area/awaymission/black_mesa/science_labs) "xez" = ( @@ -45654,7 +45648,7 @@ aSi aSV aSV aOc -aRa +iZm aSV aSV aOc @@ -47967,7 +47961,7 @@ afK aSV arT aSV -aBb +wuH aSV aSV aOc @@ -47981,7 +47975,7 @@ arT aCn arT aXH -aZm +amW azp ayQ aVW @@ -51717,9 +51711,9 @@ oib gdr uKX bzF -jCV +wxU bzF -jCV +wxU uKX gdr oSj @@ -52745,9 +52739,9 @@ iar iar uKX xaN -hgp +vTj xaN -hgp +vTj uKX iar iar @@ -56627,7 +56621,7 @@ kSV kSV kSV gGF -jRB +qAD kSV kSV kSV @@ -57850,7 +57844,7 @@ wRQ pvA wRQ wRQ -mYQ +kLe wRQ wRQ wRQ @@ -57858,7 +57852,7 @@ wRQ vmt wRQ wRQ -mYQ +kLe wRQ wRQ wRQ @@ -57866,7 +57860,7 @@ usA wRQ wRQ wRQ -cug +dbM bKH kni bKH @@ -61447,7 +61441,7 @@ afj afj afj aHS -aMi +bfx aJT aOr ayr @@ -61707,7 +61701,7 @@ aoO aak aML aPB -aMi +bfx aHS afj afj @@ -61846,7 +61840,7 @@ ayB ayB ayB aWg -ahv +nnQ ayB ayB nLr @@ -64548,7 +64542,7 @@ afj afj ojG kni -swS +fxV ojG afj ojG @@ -66406,7 +66400,7 @@ aNo nxx vHB pCG -wma +wXR cbk cbk uOu @@ -67191,7 +67185,7 @@ nxx nxx tBk xNT -foy +efO tBk nxx aNo @@ -67962,7 +67956,7 @@ aNo nxx tBk xNT -foy +efO tBk nxx aNo @@ -72845,7 +72839,7 @@ dUs vNU dUs dGY -sRQ +faZ iWr iWr iWr @@ -73603,7 +73597,7 @@ aNo gtN gtN gdc -kXb +jem gtN gtN gtN @@ -75575,7 +75569,7 @@ aNo xxG xxG ivf -ecR +tlC xxG xxG xxG @@ -76423,7 +76417,7 @@ cqd cqd cqd cqd -hFo +jjg gdc gdc gdc @@ -76603,7 +76597,7 @@ eJC eJC eJC xPM -qNc +iCN eJC eJC kCw @@ -76915,10 +76909,10 @@ maZ eKW eKW eKW -kjn +khG vAi eKW -kjn +khG qNk eKW rSl @@ -77888,7 +77882,7 @@ eJC eJC eJC hfP -rOh +uQW eJC eJC kCw @@ -79173,7 +79167,7 @@ cFH cFH cFH hfc -qRp +sIG cFH cFH cFH diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm index 2e9df0b3616..697b0f4feef 100644 --- a/_maps/RandomZLevels/caves.dmm +++ b/_maps/RandomZLevels/caves.dmm @@ -1264,7 +1264,7 @@ }, /area/awaymission/caves/bmp_asteroid/level_two) "kE" = ( -/mob/living/basic/giant_spider/hunter, +/mob/living/basic/spider/giant/hunter, /turf/open/floor/iron, /area/awaymission/caves/bmp_asteroid) "kL" = ( @@ -1336,7 +1336,7 @@ /area/awaymission/caves/northblock) "pC" = ( /obj/item/mjollnir, -/mob/living/basic/giant_spider/nurse, +/mob/living/basic/spider/giant/nurse, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, @@ -1440,7 +1440,7 @@ /obj/machinery/sleeper{ dir = 8 }, -/mob/living/basic/giant_spider/hunter, +/mob/living/basic/spider/giant/hunter, /turf/open/floor/iron, /area/awaymission/caves/bmp_asteroid) "uO" = ( @@ -1598,7 +1598,7 @@ }, /area/awaymission/caves/bmp_asteroid/level_two) "Bz" = ( -/mob/living/basic/giant_spider/nurse, +/mob/living/basic/spider/giant/nurse, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, @@ -1680,7 +1680,7 @@ "FS" = ( /obj/machinery/light/small/built/directional/north, /obj/structure/spider/stickyweb, -/mob/living/basic/giant_spider/hunter, +/mob/living/basic/spider/giant/hunter, /turf/open/floor/iron, /area/awaymission/caves/bmp_asteroid) "FV" = ( @@ -1966,7 +1966,7 @@ /turf/open/floor/iron, /area/awaymission/caves/northblock) "Xs" = ( -/mob/living/basic/giant_spider/hunter, +/mob/living/basic/spider/giant/hunter, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, @@ -1988,7 +1988,7 @@ /area/awaymission/caves/bmp_asteroid/level_two) "XR" = ( /obj/structure/spider/stickyweb, -/mob/living/basic/giant_spider/hunter, +/mob/living/basic/spider/giant/hunter, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm index 010ed2b20ab..2a525e1df6e 100644 --- a/_maps/RandomZLevels/moonoutpost19.dmm +++ b/_maps/RandomZLevels/moonoutpost19.dmm @@ -93,6 +93,17 @@ }, /turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/research) +"aw" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/item/cigbutt{ + pixel_x = -6 + }, +/obj/item/cigbutt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/turf/open/floor/plastic, +/area/awaymission/moonoutpost19/arrivals/shed) "ay" = ( /obj/effect/turf_decal/siding/thinplating_new/light{ dir = 6 @@ -199,13 +210,6 @@ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"bg" = ( -/obj/machinery/light/warm/no_nightlight/directional/west, -/obj/item/cigbutt{ - pixel_x = 4 - }, -/turf/open/floor/plastic, -/area/awaymission/moonoutpost19/arrivals) "bk" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 8 @@ -310,6 +314,15 @@ temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) +"bR" = ( +/obj/machinery/light/floor, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/lunar_sand/plating, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) "bU" = ( /obj/machinery/door/airlock/security/glass{ name = "Security Post"; @@ -324,6 +337,16 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) +"ch" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 1 + }, +/turf/open/floor/plastic, +/area/awaymission/moonoutpost19/arrivals/shed) "cn" = ( /obj/structure/railing{ dir = 5 @@ -383,13 +406,6 @@ }, /turf/open/floor/iron/half, /area/awaymission/moonoutpost19/syndicate) -"cF" = ( -/obj/item/stack/tile/iron, -/obj/effect/decal/cleanable/crayon, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) "cH" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/closet/l3closet/scientist, @@ -429,7 +445,7 @@ /obj/effect/turf_decal/siding/thinplating_new/light, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"cZ" = ( +"dc" = ( /obj/structure/closet/firecloset{ name = "fire-proof closet" }, @@ -449,7 +465,7 @@ }, /obj/item/clothing/under/shorts/black, /turf/open/floor/plastic, -/area/awaymission/moonoutpost19/arrivals) +/area/awaymission/moonoutpost19/arrivals/shed) "dd" = ( /obj/structure/fluff/minepost, /obj/item/stack/sheet/mineral/plasma/thirty, @@ -504,16 +520,6 @@ temperature = 251 }, /area/awaymission/moonoutpost19/main) -"dw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) "dz" = ( /obj/structure/alien/weeds, /obj/structure/bed/nest, @@ -549,17 +555,6 @@ temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"dP" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/item/cigbutt{ - pixel_x = -6 - }, -/obj/item/cigbutt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/turf/open/floor/plastic, -/area/awaymission/moonoutpost19/arrivals) "dR" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral, @@ -779,6 +774,13 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) +"fn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) "fo" = ( /obj/effect/decal/cleanable/blood/tracks{ desc = "Your instincts say you shouldn't be following these."; @@ -917,6 +919,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) +"fQ" = ( +/obj/effect/turf_decal/caution/stand_clear{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) "fU" = ( /obj/machinery/light/small/directional/east, /obj/structure/chair/wood, @@ -1124,6 +1133,21 @@ temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) +"hG" = ( +/obj/item/key/atv{ + pixel_x = -6; + pixel_y = 26 + }, +/obj/structure/noticeboard/directional/north{ + pixel_x = -15; + pixel_y = 26 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) "hI" = ( /turf/closed/wall/rust, /area/awaymission/moonoutpost19/arrivals) @@ -1181,12 +1205,23 @@ temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) +"hZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) "ib" = ( /obj/item/stack/sheet/mineral/wood, /turf/open/misc/asteroid/moon{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) +"ii" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) "ij" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/firedoor/closed, @@ -1232,6 +1267,14 @@ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) +"it" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) "iu" = ( /obj/machinery/door/airlock/medical{ name = "Research Division"; @@ -1271,6 +1314,13 @@ }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) +"iE" = ( +/obj/machinery/light/warm/no_nightlight/directional/west, +/obj/item/cigbutt{ + pixel_x = 4 + }, +/turf/open/floor/plastic, +/area/awaymission/moonoutpost19/arrivals/shed) "iK" = ( /obj/machinery/light/small/directional/west, /obj/effect/turf_decal/tile/neutral{ @@ -1379,6 +1429,13 @@ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) +"jB" = ( +/obj/machinery/door/puzzle/keycard{ + name = "ATV Shed Door"; + puzzle_id = "atvs" + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) "jD" = ( /obj/machinery/space_heater, /obj/effect/decal/cleanable/dirt, @@ -1403,6 +1460,22 @@ }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) +"jK" = ( +/obj/item/stack/tile/iron/base, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) +"jL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) "jN" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue{ @@ -1537,11 +1610,6 @@ dir = 1 }, /area/awaymission/moonoutpost19/research) -"kF" = ( -/obj/item/radio/intercom/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plastic, -/area/awaymission/moonoutpost19/arrivals) "kH" = ( /obj/machinery/door/firedoor, /obj/structure/extinguisher_cabinet/directional/south, @@ -2099,6 +2167,11 @@ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) +"nB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) "nE" = ( /obj/machinery/door/poddoor/preopen{ desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; @@ -2117,15 +2190,6 @@ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"nK" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/lunar_sand/plating, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) "nL" = ( /obj/structure/table, /obj/machinery/recharger{ @@ -2154,21 +2218,6 @@ /obj/machinery/door/airlock/maintenance, /turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"nZ" = ( -/obj/item/key/atv{ - pixel_x = -6; - pixel_y = 26 - }, -/obj/structure/noticeboard/directional/north{ - pixel_x = -15; - pixel_y = 26 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) "od" = ( /obj/effect/decal/cleanable/xenoblood/xgibs/larva/body, /turf/open/misc/asteroid/moon{ @@ -2187,6 +2236,10 @@ /obj/machinery/duct, /turf/open/floor/iron/freezer, /area/awaymission/moonoutpost19/arrivals) +"om" = ( +/obj/structure/reagent_dispensers/fueltank/large, +/turf/open/floor/plastic, +/area/awaymission/moonoutpost19/arrivals/shed) "on" = ( /obj/structure/table/reinforced, /obj/structure/window/reinforced/spawner/directional/west, @@ -2406,10 +2459,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/awaymission/moonoutpost19/research) -"pO" = ( -/obj/structure/reagent_dispensers/fueltank/large, -/turf/open/floor/plastic, -/area/awaymission/moonoutpost19/arrivals) "pP" = ( /obj/machinery/door/airlock{ name = "Unit 2" @@ -2485,15 +2534,6 @@ }, /turf/open/floor/carpet, /area/awaymission/moonoutpost19/arrivals) -"qc" = ( -/obj/machinery/light/floor, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/lunar_sand/plating, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) "qg" = ( /obj/effect/decal/cleanable/generic, /obj/effect/decal/cleanable/dirt, @@ -2909,14 +2949,6 @@ temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"ss" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) "st" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -2998,17 +3030,6 @@ temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) -"sX" = ( -/obj/structure/rack, -/obj/item/stack/ducts/fifty, -/obj/item/weldingtool{ - pixel_x = 7 - }, -/obj/item/weldingtool{ - pixel_x = -7 - }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) "sY" = ( /obj/machinery/vending/coffee, /obj/effect/turf_decal/siding/thinplating_new/light{ @@ -3028,6 +3049,23 @@ "tb" = ( /turf/closed/mineral/random, /area/awaymission/moonoutpost19/mines) +"td" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/glass/bottle/beer/almost_empty{ + pixel_x = -5; + pixel_y = 15 + }, +/obj/item/reagent_containers/cup/glass/colocup{ + pixel_x = -9 + }, +/obj/machinery/button/door{ + id = "awaymission19atvs"; + name = "Biohazard Shutter Control"; + pixel_y = 8; + req_access = "201" + }, +/turf/open/floor/plastic, +/area/awaymission/moonoutpost19/arrivals/shed) "ti" = ( /obj/structure/fence/corner, /turf/open/misc/asteroid/moon{ @@ -3158,13 +3196,6 @@ temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) -"uf" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) "ug" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/effect/turf_decal/lunar_sand, @@ -3215,18 +3246,6 @@ }, /turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/syndicate) -"uz" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/structure/railing/corner, -/obj/item/cigbutt{ - pixel_x = -9; - pixel_y = -6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/turf/open/floor/plastic, -/area/awaymission/moonoutpost19/arrivals) "uF" = ( /obj/machinery/light/small/directional/east, /turf/open/misc/asteroid/moon{ @@ -3450,13 +3469,12 @@ /obj/structure/cable, /turf/open/floor/plating, /area/awaymission/moonoutpost19/research) -"vL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +"vO" = ( +/obj/machinery/door/poddoor/shutters{ + id = "awaymission19atvs" }, -/obj/machinery/airalarm/directional/south, /turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) +/area/awaymission/moonoutpost19/arrivals/shed) "vR" = ( /obj/structure/bed, /obj/item/bedsheet, @@ -3531,6 +3549,13 @@ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/arrivals) +"wx" = ( +/obj/machinery/computer/exoscanner_control, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/plastic, +/area/awaymission/moonoutpost19/arrivals/shed) "wz" = ( /obj/effect/mapping_helpers/burnt_floor, /obj/effect/decal/cleanable/blood/gibs/limb, @@ -3707,6 +3732,13 @@ }, /turf/open/floor/iron/dark, /area/awaymission/moonoutpost19/research) +"xW" = ( +/obj/item/stack/tile/iron/base, +/obj/effect/decal/cleanable/crayon, +/turf/open/misc/asteroid/moon{ + initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" + }, +/area/awaymission/moonoutpost19/main) "yg" = ( /obj/machinery/door/firedoor/closed, /obj/structure/cable, @@ -3788,6 +3820,9 @@ temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) +"yy" = ( +/turf/closed/wall/rust, +/area/awaymission/moonoutpost19/arrivals/shed) "yz" = ( /obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/plating, @@ -3819,15 +3854,6 @@ temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) -"yO" = ( -/obj/vehicle/ridden/atv{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) "yP" = ( /obj/item/pen{ pixel_x = -8 @@ -3918,11 +3944,10 @@ /obj/structure/cable, /turf/open/floor/plating, /area/awaymission/moonoutpost19/research) -"zw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +"zt" = ( +/obj/effect/turf_decal/lunar_sand, /turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) +/area/awaymission/moonoutpost19/arrivals/shed) "zx" = ( /obj/structure/table, /obj/item/radio/off, @@ -3981,13 +4006,6 @@ /obj/effect/turf_decal/lunar_sand/plating, /turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) -"zM" = ( -/obj/effect/turf_decal/caution/stand_clear{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) "zN" = ( /obj/structure/sink{ pixel_y = 28 @@ -4011,6 +4029,17 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/awaymission/moonoutpost19/arrivals) +"zX" = ( +/obj/machinery/light/floor, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/lunar_sand/plating, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) "zY" = ( /obj/structure/alien/resin/wall, /obj/structure/alien/weeds, @@ -4167,6 +4196,17 @@ }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) +"Bd" = ( +/obj/structure/rack, +/obj/item/stack/ducts/fifty, +/obj/item/weldingtool{ + pixel_x = 7 + }, +/obj/item/weldingtool{ + pixel_x = -7 + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) "Bf" = ( /obj/effect/decal/cleanable/dirt, /obj/item/ammo_casing/a357{ @@ -4179,13 +4219,6 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"Bg" = ( -/obj/machinery/computer/exoscanner_control, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/plastic, -/area/awaymission/moonoutpost19/arrivals) "Bk" = ( /obj/machinery/door/airlock/maintenance, /obj/machinery/duct, @@ -4512,19 +4545,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) -"Dt" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/chair/plastic, -/turf/open/floor/plastic, -/area/awaymission/moonoutpost19/arrivals) -"Dw" = ( -/obj/item/stack/tile/iron, -/turf/open/misc/asteroid/moon{ - initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" - }, -/area/awaymission/moonoutpost19/main) "Dx" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/effect/mapping_helpers/apc/full_charge, @@ -4571,12 +4591,6 @@ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"DR" = ( -/obj/machinery/door/poddoor/shutters{ - id = "awaymission19atvs" - }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) "DS" = ( /obj/structure/fence{ dir = 4 @@ -4592,6 +4606,9 @@ }, /turf/open/floor/iron/freezer, /area/awaymission/moonoutpost19/arrivals) +"DY" = ( +/turf/closed/indestructible/reinforced, +/area/awaymission/moonoutpost19/arrivals/shed) "DZ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/thinplating_new/light/corner{ @@ -4599,23 +4616,6 @@ }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"Ea" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/glass/bottle/beer/almost_empty{ - pixel_x = -5; - pixel_y = 15 - }, -/obj/item/reagent_containers/cup/glass/colocup{ - pixel_x = -9 - }, -/obj/machinery/button/door{ - id = "awaymission19atvs"; - name = "Biohazard Shutter Control"; - pixel_y = 8; - req_access = "201" - }, -/turf/open/floor/plastic, -/area/awaymission/moonoutpost19/arrivals) "Eg" = ( /obj/machinery/conveyor{ id = "awaysyndie" @@ -4631,6 +4631,15 @@ temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) +"Ek" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/lunar_sand/plating, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) "Ep" = ( /turf/closed/mineral/random/labormineral, /area/awaymission/moonoutpost19/mines) @@ -4936,6 +4945,13 @@ dir = 5 }, /area/awaymission/moonoutpost19/arrivals) +"GC" = ( +/obj/machinery/door/poddoor/shutters{ + id = "awaymission19atvs" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) "GE" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -5138,16 +5154,19 @@ }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/research) -"HX" = ( -/obj/structure/railing{ - dir = 4 +"HW" = ( +/obj/item/key/atv{ + pixel_x = 12; + pixel_y = 24 }, -/obj/machinery/portable_atmospherics/canister/air, -/obj/machinery/atmospherics/components/unary/portables_connector{ - dir = 1 +/obj/item/flashlight{ + pixel_x = -3; + pixel_y = 4 }, -/turf/open/floor/plastic, -/area/awaymission/moonoutpost19/arrivals) +/obj/structure/rack, +/obj/item/flashlight, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) "HY" = ( /obj/structure/sign/departments/science{ pixel_y = 32 @@ -5316,24 +5335,6 @@ }, /turf/open/floor/plating, /area/awaymission/moonoutpost19/research) -"Ji" = ( -/obj/machinery/door/puzzle/keycard{ - name = "ATV Shed Door"; - puzzle_id = "atvs" - }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"Jj" = ( -/obj/machinery/light/floor, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/lunar_sand/plating, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) "Jl" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -5531,10 +5532,10 @@ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"KI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +"KJ" = ( +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) +/area/awaymission/moonoutpost19/arrivals/shed) "KL" = ( /obj/structure/table, /obj/item/clothing/gloves/latex, @@ -5627,14 +5628,6 @@ }, /turf/open/floor/iron/white/corner, /area/awaymission/moonoutpost19/arrivals) -"LN" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/lunar_sand/plating, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) "LQ" = ( /obj/effect/decal/cleanable/blood/tracks{ dir = 4 @@ -5680,6 +5673,15 @@ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/hive) +"Md" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/effect/mapping_helpers/apc/cell_10k, +/obj/structure/cable, +/obj/effect/turf_decal/lunar_sand, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) "Mf" = ( /obj/structure/alien/weeds, /obj/effect/decal/cleanable/blood/drip, @@ -5702,14 +5704,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/engine, /area/awaymission/moonoutpost19/research) -"Mn" = ( -/obj/vehicle/ridden/atv{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) "Mt" = ( /obj/structure/table, /obj/item/toy/cards/deck, @@ -5973,6 +5967,11 @@ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/syndicate) +"NZ" = ( +/obj/item/radio/intercom/directional/west, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plastic, +/area/awaymission/moonoutpost19/arrivals/shed) "Oa" = ( /obj/structure/sink{ dir = 4; @@ -6006,10 +6005,14 @@ }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/research) -"Ol" = ( -/obj/effect/turf_decal/lunar_sand, +"Op" = ( +/obj/vehicle/ridden/atv{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) +/area/awaymission/moonoutpost19/arrivals/shed) "Oq" = ( /obj/structure/alien/weeds, /obj/structure/alien/resin/membrane, @@ -6725,19 +6728,6 @@ }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"SC" = ( -/obj/item/key/atv{ - pixel_x = 12; - pixel_y = 24 - }, -/obj/item/flashlight{ - pixel_x = -3; - pixel_y = 4 - }, -/obj/structure/rack, -/obj/item/flashlight, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) "SD" = ( /obj/item/trash/can{ pixel_x = 7; @@ -6789,13 +6779,6 @@ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) -"SL" = ( -/obj/machinery/door/poddoor/shutters{ - id = "awaymission19atvs" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) "SX" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/purple{ @@ -7216,6 +7199,15 @@ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/mines) +"Wd" = ( +/obj/vehicle/ridden/atv{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) "Wg" = ( /obj/structure/flora/rock/style_random{ pixel_y = -2 @@ -7374,15 +7366,6 @@ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/arrivals) -"Xe" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/apc/full_charge, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/effect/mapping_helpers/apc/cell_10k, -/obj/structure/cable, -/obj/effect/turf_decal/lunar_sand, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) "Xf" = ( /obj/machinery/light/small/directional/south, /obj/effect/decal/cleanable/dirt, @@ -7409,6 +7392,18 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/awaymission/moonoutpost19/research) +"Xq" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/structure/railing/corner, +/obj/item/cigbutt{ + pixel_x = -9; + pixel_y = -6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/turf/open/floor/plastic, +/area/awaymission/moonoutpost19/arrivals/shed) "Xr" = ( /obj/effect/decal/cleanable/oil, /obj/structure/cable, @@ -7537,6 +7532,13 @@ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251" }, /area/awaymission/moonoutpost19/main) +"Yq" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/chair/plastic, +/turf/open/floor/plastic, +/area/awaymission/moonoutpost19/arrivals/shed) "Yt" = ( /obj/structure/chair/stool/directional/south, /obj/effect/turf_decal/tile/bar, @@ -7559,9 +7561,6 @@ }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/arrivals) -"YE" = ( -/turf/closed/indestructible/reinforced, -/area/awaymission/moonoutpost19/arrivals) "YF" = ( /obj/structure/closet/secure_closet/personal/cabinet{ locked = 0; @@ -7757,6 +7756,14 @@ }, /turf/open/floor/iron, /area/awaymission/moonoutpost19/syndicate) +"ZF" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/lunar_sand/plating, +/turf/open/floor/plating, +/area/awaymission/moonoutpost19/arrivals/shed) "ZH" = ( /obj/structure/chair{ dir = 8 @@ -31644,13 +31651,13 @@ My My My Ia -YE -hI -YE -hI -YE -hI -YE +DY +yy +DY +yy +DY +yy +DY dA dA dA @@ -31901,13 +31908,13 @@ My My My Qs -YE -cZ -kF -bg -pO -Ea -hI +DY +dc +NZ +iE +om +td +yy dA dA dA @@ -32158,13 +32165,13 @@ My My My Ia -YE -Bg -Dt -uz -dP -HX -hI +DY +wx +Yq +Xq +aw +ch +yy dA dA dA @@ -32415,13 +32422,13 @@ My Wg My Qs -YE -SC -Mn -zM -yO -sX -YE +DY +HW +Op +fQ +Wd +Bd +DY dA dA dA @@ -32672,13 +32679,13 @@ My My My Qs -YE -nZ -uf -KI -dw -vL -hI +DY +hG +hZ +ii +jL +fn +yy dA dA dA @@ -32929,13 +32936,13 @@ My My My Qs -YE -Xe -Ue -zw -Ol -Ue -hI +DY +Md +KJ +nB +zt +KJ +yy dA dA dA @@ -33186,13 +33193,13 @@ My My My Uj -YE -LN -qc -nK -Jj -ss -YE +DY +it +bR +Ek +zX +ZF +DY dA dA dA @@ -33443,13 +33450,13 @@ My My My xm -YE -SL -DR -Ji -DR -DR -YE +DY +GC +vO +jB +vO +vO +DY dA dA Wg @@ -45724,12 +45731,12 @@ dA dA dA Wg -Dw +jK fi fi fi fi -cF +xW My My Wg @@ -47009,12 +47016,12 @@ My YX My My -Dw +jK fi fi fi fi -Dw +jK My My My diff --git a/_maps/RandomZLevels/mothership_astrum.dmm b/_maps/RandomZLevels/mothership_astrum.dmm index 01139fc35d2..26bebe36e55 100644 --- a/_maps/RandomZLevels/mothership_astrum.dmm +++ b/_maps/RandomZLevels/mothership_astrum.dmm @@ -2673,7 +2673,7 @@ /obj/structure/window/spawner/directional/north, /obj/structure/window/spawner/directional/east, /obj/structure/window/spawner/directional/west, -/obj/item/camera_bug, +/obj/item/computer_disk/syndicate/camera_app, /turf/open/floor/plating/abductor2, /area/awaymission/mothership_astrum/halls) "Ns" = ( @@ -3584,9 +3584,6 @@ /obj/machinery/vending/coffee, /turf/open/floor/wood, /area/awaymission/mothership_astrum/deck1) -"XO" = ( -/turf/open/space/basic, -/area/awaymission/mothership_astrum/halls) "XQ" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -42654,7 +42651,7 @@ ee ee ee ee -XO +Tu Tu ee ee diff --git a/_maps/RandomZLevels/research.dmm b/_maps/RandomZLevels/research.dmm index d084d9a779f..324734c4eb9 100644 --- a/_maps/RandomZLevels/research.dmm +++ b/_maps/RandomZLevels/research.dmm @@ -87,15 +87,6 @@ /obj/effect/turf_decal/tile/yellow/half/contrasted, /turf/open/floor/iron/white, /area/awaymission/research/interior/engineering) -"ax" = ( -/obj/item/kirbyplants/organic/plant20{ - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) "ay" = ( /obj/structure/chair{ dir = 8 @@ -1895,13 +1886,6 @@ /obj/structure/closet/secure_closet/personal/cabinet, /turf/open/floor/wood, /area/awaymission/research/interior/dorm) -"jm" = ( -/obj/item/kirbyplants/organic/plant14, -/obj/effect/turf_decal/siding/yellow{ - dir = 9 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) "jn" = ( /obj/effect/turf_decal/siding/yellow{ dir = 1 @@ -1952,12 +1936,6 @@ }, /turf/open/floor/iron/white, /area/awaymission/research/interior/medbay) -"jy" = ( -/obj/machinery/computer/scan_consolenew, -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/light/small/broken/directional/north, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) "jz" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 4 @@ -2001,6 +1979,13 @@ /obj/structure/sign/departments/medbay, /turf/closed/wall/r_wall, /area/awaymission/research/interior) +"jP" = ( +/obj/item/kirbyplants/organic/plant16, +/obj/effect/turf_decal/siding/yellow{ + dir = 10 + }, +/turf/open/floor/iron, +/area/awaymission/research/interior/dorm) "jR" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -2213,13 +2198,6 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/awaymission/research/interior/medbay) -"kC" = ( -/obj/item/kirbyplants/organic/plant22, -/obj/effect/turf_decal/siding/yellow{ - dir = 9 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) "kD" = ( /obj/effect/turf_decal/siding/yellow/corner{ dir = 1 @@ -2370,6 +2348,14 @@ }, /turf/open/floor/iron/white, /area/awaymission/research/interior/medbay) +"ls" = ( +/obj/machinery/computer/scan_consolenew{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/machinery/light/small/broken/directional/south, +/turf/open/floor/iron/dark, +/area/awaymission/research/interior/genetics) "lu" = ( /obj/item/ammo_casing/c45, /obj/item/ammo_casing/c45, @@ -2395,13 +2381,6 @@ }, /turf/open/floor/iron/white, /area/awaymission/research/interior/medbay) -"ly" = ( -/obj/item/kirbyplants/organic/plant16, -/obj/effect/turf_decal/siding/yellow{ - dir = 10 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) "lz" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/siding/yellow, @@ -2751,13 +2730,6 @@ }, /turf/open/floor/grass, /area/awaymission/research/interior/escapepods) -"mN" = ( -/obj/item/kirbyplants/organic/applebush, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) "mO" = ( /obj/machinery/door/airlock/external/ruin{ name = "Escape Pod Two" @@ -2855,15 +2827,6 @@ "nf" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/awaymission/research/interior/engineering) -"nw" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/closet/wardrobe/mixed, -/obj/effect/turf_decal/siding/yellow{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) "nC" = ( /obj/structure/rack, /obj/item/gun/ballistic/automatic/wt550, @@ -2877,6 +2840,15 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron, /area/awaymission/research/interior/security) +"oO" = ( +/obj/structure/chair/stool/directional/west, +/obj/effect/turf_decal/siding/yellow{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/mapping_helpers/apc/cell_5k, +/turf/open/floor/iron, +/area/awaymission/research/interior/dorm) "oT" = ( /obj/structure/table, /obj/effect/turf_decal/tile/red/fourcorners, @@ -2906,14 +2878,6 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior/engineering) -"pU" = ( -/obj/machinery/computer/scan_consolenew{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/light/small/broken/directional/south, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) "pW" = ( /obj/structure/closet/crate, /obj/effect/spawner/random/maintenance, @@ -2940,11 +2904,6 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior) -"qE" = ( -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) "qP" = ( /obj/effect/decal/cleanable/blood, /obj/effect/turf_decal/tile/purple/fourcorners, @@ -2993,6 +2952,11 @@ /obj/structure/closet/crate, /turf/open/floor/plating, /area/awaymission/research/interior/maint) +"rK" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/awaymission/research/interior) "si" = ( /obj/structure/chair/stool/directional/south, /obj/effect/turf_decal/tile/red/fourcorners, @@ -3026,6 +2990,12 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/awaymission/research/interior/gateway) +"ta" = ( +/obj/machinery/power/shuttle_engine/propulsion/left{ + dir = 1 + }, +/turf/open/floor/plating, +/area/awaymission/research/interior/engineering) "ts" = ( /turf/open/misc/asteroid/airless, /area/awaymission/research/exterior) @@ -3047,6 +3017,13 @@ }, /turf/open/floor/iron/white, /area/awaymission/research/interior) +"tW" = ( +/obj/item/kirbyplants/organic/applebush, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/awaymission/research/interior/escapepods) "uf" = ( /obj/machinery/dna_scannernew, /obj/effect/turf_decal/tile/purple/fourcorners, @@ -3062,20 +3039,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior) -"uM" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/siding/yellow{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"uX" = ( -/obj/machinery/power/shuttle_engine/propulsion/right{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/engineering) "va" = ( /obj/machinery/door/airlock/research{ name = "Cryogenetics Research" @@ -3092,18 +3055,14 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/research/interior/genetics) -"vq" = ( -/obj/structure/closet/wardrobe/grey, +"vv" = ( +/obj/machinery/light/directional/west, /obj/effect/turf_decal/siding/yellow{ - dir = 4 + dir = 8 }, +/obj/structure/cable, /turf/open/floor/iron, /area/awaymission/research/interior/dorm) -"vt" = ( -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) "vT" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, @@ -3125,11 +3084,6 @@ /obj/item/bikehorn, /turf/open/misc/asteroid/airless, /area/space/nearstation) -"wI" = ( -/obj/effect/turf_decal/siding/yellow, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) "wM" = ( /obj/machinery/door/airlock/medical{ name = "Medical" @@ -3147,12 +3101,11 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior/security) -"wY" = ( -/obj/item/ammo_casing/c9mm, +"xe" = ( +/obj/item/kirbyplants/organic/plant16, /obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) +/turf/open/floor/iron/dark, +/area/awaymission/research/interior/genetics) "xl" = ( /obj/structure/table, /obj/item/storage/medkit/regular, @@ -3184,6 +3137,11 @@ }, /turf/open/floor/plating, /area/awaymission/research/interior/escapepods) +"xS" = ( +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/awaymission/research/interior) "yc" = ( /obj/structure/table, /obj/item/paper_bin, @@ -3220,13 +3178,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/awaymission/research/interior/medbay) -"yB" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) "yM" = ( /obj/effect/decal/cleanable/blood/drip, /obj/effect/turf_decal/tile/red/fourcorners, @@ -3250,16 +3201,20 @@ /obj/structure/chair/stool/directional/south, /turf/open/floor/iron, /area/awaymission/research/interior/dorm) -"AC" = ( +"zt" = ( +/obj/item/ammo_casing/c9mm, /obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/light/directional/west, +/obj/machinery/light/directional/east, /turf/open/floor/iron/white, -/area/awaymission/research/interior) -"AQ" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/light/directional/west, +/area/awaymission/research/interior/cryo) +"zU" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/structure/cable, /turf/open/floor/iron/white, -/area/awaymission/research/interior) +/area/awaymission/research/interior/medbay) "AY" = ( /obj/structure/rack, /obj/item/clothing/suit/armor/riot, @@ -3296,6 +3251,12 @@ }, /turf/open/floor/iron/white, /area/awaymission/research/interior) +"By" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white, +/area/awaymission/research/interior/security) "BN" = ( /obj/structure/window/reinforced/spawner/directional/west, /mob/living/carbon/human/species/monkey, @@ -3307,11 +3268,28 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior/security) +"BY" = ( +/obj/effect/turf_decal/siding/yellow, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/awaymission/research/interior/dorm) +"Ch" = ( +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/awaymission/research/interior) "Cs" = ( /obj/machinery/door/window/left/directional/west, /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, /area/awaymission/research/interior/genetics) +"Cu" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/awaymission/research/interior/medbay) "CF" = ( /obj/item/stack/rods, /obj/effect/turf_decal/tile/purple/fourcorners, @@ -3367,27 +3345,16 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, /area/awaymission/research/interior/genetics) -"DW" = ( -/obj/effect/mob_spawn/corpse/human/doctor{ - brute_damage = 200 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) "DY" = ( /mob/living/simple_animal/hostile/nanotrasen/ranged, /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior/cryo) -"Eh" = ( -/obj/item/kirbyplants/organic/plant10, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) +"Em" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/awaymission/research/interior) "Ez" = ( /obj/effect/decal/cleanable/blood, /obj/item/stack/rods, @@ -3455,6 +3422,11 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior/engineering) +"Gd" = ( +/obj/item/kirbyplants/organic/plant10, +/obj/effect/turf_decal/tile/purple/fourcorners, +/turf/open/floor/iron/dark, +/area/awaymission/research/interior/genetics) "Ge" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/effect/turf_decal/tile/purple/fourcorners, @@ -3479,14 +3451,13 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, /area/awaymission/research/interior/genetics) -"Hz" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 +"Hc" = ( +/obj/item/kirbyplants/organic/plant14, +/obj/effect/turf_decal/siding/yellow{ + dir = 9 }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) +/turf/open/floor/iron, +/area/awaymission/research/interior/dorm) "HD" = ( /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/white, @@ -3537,6 +3508,13 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, /area/awaymission/research/interior/genetics) +"IX" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/awaymission/research/interior) "Jb" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Genetics Maintenance" @@ -3551,6 +3529,15 @@ }, /turf/open/floor/iron, /area/awaymission/research/interior/dorm) +"Jl" = ( +/obj/item/kirbyplants/organic/plant20{ + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/awaymission/research/interior/engineering) "Jm" = ( /obj/effect/turf_decal/siding/yellow{ dir = 8 @@ -3644,16 +3631,17 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior) +"LP" = ( +/obj/item/kirbyplants/organic/plant22, +/obj/effect/turf_decal/siding/yellow{ + dir = 9 + }, +/turf/open/floor/iron, +/area/awaymission/research/interior/dorm) "LX" = ( /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior/security) -"Mb" = ( -/obj/machinery/power/shuttle_engine/propulsion/left{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/engineering) "Mo" = ( /obj/item/stack/rods, /obj/item/ammo_casing/c45, @@ -3703,6 +3691,11 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior/engineering) +"Ob" = ( +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/awaymission/research/interior) "Ok" = ( /obj/effect/turf_decal/tile/purple/anticorner/contrasted{ dir = 1 @@ -3729,17 +3722,19 @@ }, /turf/open/floor/iron/white, /area/awaymission/research/interior/medbay) -"OE" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) "OF" = ( /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior) +"OG" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/closet/wardrobe/mixed, +/obj/effect/turf_decal/siding/yellow{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/awaymission/research/interior/dorm) "OH" = ( /obj/effect/turf_decal/tile/green/fourcorners, /turf/open/floor/iron/white, @@ -3801,12 +3796,6 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior) -"Qu" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half/contrasted, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) "Qz" = ( /obj/machinery/door/airlock/security/glass{ id_tag = "outerbrig"; @@ -3857,11 +3846,24 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior) -"RO" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/light/directional/east, +"Sf" = ( +/obj/effect/mob_spawn/corpse/human/doctor{ + brute_damage = 200 + }, +/obj/effect/decal/cleanable/blood, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron/white, -/area/awaymission/research/interior) +/area/awaymission/research/interior/medbay) +"SJ" = ( +/obj/structure/closet/wardrobe/grey, +/obj/effect/turf_decal/siding/yellow{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/research/interior/dorm) "SM" = ( /turf/open/misc/asteroid, /area/awaymission/research/exterior) @@ -3909,6 +3911,12 @@ }, /turf/open/floor/plating, /area/awaymission/research/interior/escapepods) +"TK" = ( +/obj/machinery/computer/scan_consolenew, +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/machinery/light/small/broken/directional/north, +/turf/open/floor/iron/dark, +/area/awaymission/research/interior/genetics) "Uf" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance, @@ -3956,11 +3964,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/awaymission/research/interior/cryo) -"UV" = ( -/obj/item/kirbyplants/organic/plant16, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) "UY" = ( /obj/item/ammo_casing/c46x30mm, /obj/item/ammo_casing/c9mm, @@ -3983,6 +3986,11 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron, /area/awaymission/research/interior/security) +"VY" = ( +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/awaymission/research/interior) "Wf" = ( /obj/effect/decal/cleanable/blood/drip, /obj/effect/turf_decal/tile/purple/fourcorners, @@ -4034,6 +4042,13 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior/cryo) +"XR" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/awaymission/research/interior/escapepods) "XU" = ( /obj/item/ammo_casing/c45, /obj/effect/decal/cleanable/blood/drip, @@ -4056,13 +4071,6 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/research/interior/genetics) -"Yt" = ( -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) "Yx" = ( /obj/effect/mob_spawn/corpse/human/doctor{ brute_damage = 200 @@ -4077,11 +4085,12 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron, /area/awaymission/research/interior/security) -"YN" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) +"YV" = ( +/obj/machinery/power/shuttle_engine/propulsion/right{ + dir = 1 + }, +/turf/open/floor/plating, +/area/awaymission/research/interior/engineering) "Zg" = ( /obj/item/stack/rods, /obj/item/shard, @@ -4092,15 +4101,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/awaymission/research/interior/escapepods) -"ZI" = ( -/obj/structure/chair/stool/directional/west, -/obj/effect/turf_decal/siding/yellow{ - dir = 8 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/apc/cell_5k, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) "ZJ" = ( /obj/effect/decal/cleanable/blood, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -36606,7 +36606,7 @@ Yf KK KK KK -UV +xe ea ev fc @@ -36887,11 +36887,11 @@ jj jC jT iX -kC -ZI +LP +oO Jm -uM -ly +vv +jP iX lO jC @@ -37116,7 +37116,7 @@ ad aH bD cx -jy +TK Tz KK KK @@ -37134,7 +37134,7 @@ KK KK KK uh -pU +ls cx bD id @@ -37644,7 +37644,7 @@ ev fc fE ea -Eh +Gd KK KK KK @@ -38690,7 +38690,7 @@ jn jF jF jF -wI +BY iX iX iX @@ -38924,7 +38924,7 @@ ea eD ff fJ -wY +zt gU ff fF @@ -39438,7 +39438,7 @@ ec eE cp fL -AC +Ch gV cp bD @@ -39967,7 +39967,7 @@ iM iR iU iX -jm +Hc jE jE jE @@ -40466,7 +40466,7 @@ eg bD cp fL -YN +VY gV cp bD @@ -40500,7 +40500,7 @@ mb mi OH OH -yB +XR mb mQ OH @@ -40743,8 +40743,8 @@ jF ka ku kF -vq -nw +SJ +OG lp lp lN @@ -41468,7 +41468,7 @@ aa ts ts ts -uX +YV am ap ap @@ -41786,7 +41786,7 @@ mm OH OH mH -mN +tW mm OH OH @@ -42239,7 +42239,7 @@ ts ts ts ts -Mb +ta ao aq aq @@ -42289,7 +42289,7 @@ ia ia ia ia -Yt +IX ia ia ia @@ -43052,7 +43052,7 @@ aH aO cp js -AQ +rK ke cp bD @@ -43272,7 +43272,7 @@ ts ts ts ar -ax +Jl aB aB aB @@ -43550,7 +43550,7 @@ aH aH cp fT -vt +Ob hc cp aH @@ -44080,7 +44080,7 @@ aH aO cp js -RO +Em ke cp bD @@ -44578,7 +44578,7 @@ aH aO cp fT -qE +xS hc cp bD @@ -46118,7 +46118,7 @@ do do do do -Qu +By QQ QQ QQ @@ -46395,7 +46395,7 @@ jc vT vT ZJ -OE +Cu jf jR jR @@ -46657,7 +46657,7 @@ jR kY lf jz -DW +Sf iW hD aH @@ -47171,7 +47171,7 @@ kL kZ Fl Th -Hz +zU iW aO aH diff --git a/_maps/RandomZLevels/research2.dmm b/_maps/RandomZLevels/research2.dmm deleted file mode 100644 index 0038005e51c..00000000000 --- a/_maps/RandomZLevels/research2.dmm +++ /dev/null @@ -1,70152 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/open/space, -/area/space) -"ab" = ( -/turf/closed/mineral, -/area/space/nearstation) -"ac" = ( -/turf/open/misc/asteroid/airless, -/area/space/nearstation) -"ad" = ( -/turf/closed/mineral, -/area/awaymission/research/exterior) -"ae" = ( -/turf/open/misc/asteroid/airless, -/area/awaymission/research/exterior) -"af" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/mob/living/carbon/human/species/monkey, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/genetics) -"ag" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/door/window/right/directional/west{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"ah" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/genetics) -"ai" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/mob/living/carbon/human/species/monkey, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/genetics) -"aj" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/genetics) -"ak" = ( -/obj/docking_port/stationary/picked{ - dir = 2; - shuttle_id = "research_dock"; - name = "research dock" - }, -/turf/open/space, -/area/space) -"ap" = ( -/obj/machinery/status_display/evac, -/turf/closed/wall/r_wall, -/area/awaymission/research/interior/engineering) -"ar" = ( -/turf/closed/wall/r_wall, -/area/awaymission/research/interior/engineering) -"at" = ( -/obj/machinery/suit_storage_unit/engine, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"aw" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall/r_wall, -/area/awaymission/research/interior/engineering) -"ax" = ( -/obj/item/kirbyplants/organic/plant20{ - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"aB" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"aC" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/research/interior/engineering) -"aD" = ( -/obj/machinery/power/port_gen/pacman, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"aH" = ( -/turf/closed/wall/r_wall, -/area/awaymission/research/interior/maint) -"aJ" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/plating, -/area/awaymission/research/interior/engineering) -"aL" = ( -/obj/structure/window/reinforced/plasma/spawner/directional/west, -/obj/structure/cable, -/turf/open/floor/engine, -/area/awaymission/research/interior/engineering) -"aO" = ( -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"aP" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - req_access = list("maint_tunnels") - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"aQ" = ( -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"aW" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"aX" = ( -/obj/item/stack/sheet/mineral/bananium{ - amount = 50 - }, -/turf/open/misc/asteroid/airless, -/area/space/nearstation) -"aZ" = ( -/obj/machinery/light/directional/west, -/obj/machinery/airalarm/directional/west{ - pixel_x = -32 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"ba" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bi" = ( -/obj/structure/table, -/obj/item/storage/toolbox/electrical, -/obj/item/clothing/gloves/color/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bj" = ( -/obj/machinery/light/small/directional/south, -/turf/open/misc/asteroid/airless, -/area/awaymission/research/exterior) -"bk" = ( -/obj/item/bikehorn, -/turf/open/misc/asteroid/airless, -/area/space/nearstation) -"bl" = ( -/turf/closed/wall/r_wall, -/area/awaymission/research/interior/gateway) -"bm" = ( -/obj/machinery/power/apc/auto_name/directional/east{ - auto_name = 1 - }, -/obj/effect/mapping_helpers/apc/cell_10k, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/engineering) -"bn" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bo" = ( -/obj/item/screwdriver, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bs" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bw" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bx" = ( -/obj/machinery/door/airlock/external{ - req_access = list("external airlocks") - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"by" = ( -/obj/item/clothing/mask/gas/clown_hat, -/turf/open/misc/asteroid/airless, -/area/space/nearstation) -"bz" = ( -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"bA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"bB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"bC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"bD" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"bE" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bF" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bG" = ( -/obj/machinery/button/door{ - id = "engsm"; - name = "Radiation Shutters Control"; - pixel_y = -24; - req_access = list("engineering") - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/engineering/glass/critical{ - heat_proof = 1; - name = "Supermatter Chamber"; - req_one_access = list("engineering","atmospherics") - }, -/turf/open/floor/engine, -/area/awaymission/research/interior/engineering) -"bI" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bK" = ( -/obj/item/wrench, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bM" = ( -/obj/item/storage/toolbox/mechanical, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bN" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bO" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = 32 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bP" = ( -/obj/structure/sign/warning/vacuum/directional/east, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"bQ" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"bR" = ( -/obj/effect/landmark/awaystart, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"bS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"bT" = ( -/obj/machinery/gateway/away{ - calibrated = 0 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"bU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"bV" = ( -/obj/structure/sign/warning/no_smoking/circle/directional/west, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bY" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"bZ" = ( -/obj/effect/landmark/awaystart, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"ca" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"cb" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/apc/cell_10k, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"cf" = ( -/obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/engineering) -"ch" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"ci" = ( -/obj/machinery/light/directional/west, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/closet/emcloset, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"cj" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/landmark/awaystart, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"ck" = ( -/obj/machinery/door/window/right/directional/east{ - dir = 2 - }, -/obj/effect/landmark/awaystart, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"cl" = ( -/obj/machinery/light/directional/east, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"cn" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"cp" = ( -/turf/closed/wall/r_wall, -/area/awaymission/research/interior) -"cq" = ( -/obj/machinery/door/airlock/engineering{ - name = "Engine Room"; - req_access = list("engineering") - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"cs" = ( -/obj/machinery/door/airlock/engineering{ - name = "Engine Room"; - req_access = list("engineering") - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"ct" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/machinery/airalarm/directional/west{ - pixel_x = -32 - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"cv" = ( -/obj/structure/table, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"cx" = ( -/turf/closed/wall/r_wall, -/area/awaymission/research/interior/genetics) -"cy" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Genetics Maintenance"; - req_access = list("genetics") - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"cA" = ( -/turf/open/floor/engine, -/area/awaymission/research/interior/engineering) -"cC" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"cD" = ( -/obj/structure/table, -/obj/item/radio, -/obj/item/radio, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"cF" = ( -/obj/structure/table, -/obj/item/paper/pamphlet/gateway, -/obj/item/paper/pamphlet/gateway, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"cG" = ( -/obj/structure/reagent_dispensers/wall/peppertank{ - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"cH" = ( -/obj/structure/table, -/obj/item/reagent_containers/spray/pepper, -/obj/machinery/button/door{ - id = "cryopodg2"; - name = "panic lockdown button" - }, -/obj/machinery/airalarm/directional/north{ - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"cI" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/machinery/rnd/rna_recombinator, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"cK" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"cQ" = ( -/turf/closed/wall/r_wall, -/area/awaymission/research/interior/secure) -"cR" = ( -/obj/machinery/door/airlock/highsecurity{ - aiDisabledIdScanner = 1; - name = "Gateway Access"; - req_access = list("away_generic1") - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/gateway) -"cS" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/apc/cell_5k, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/genetics) -"cU" = ( -/obj/machinery/door/window/right/directional/east, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/genetics) -"cV" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"cW" = ( -/obj/machinery/door/window/left/directional/west, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/genetics) -"cX" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/mob/living/carbon/human, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/genetics) -"cZ" = ( -/obj/machinery/door/airlock/engineering{ - name = "Engine Room"; - req_access = list("engineering") - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"da" = ( -/obj/machinery/door/airlock/engineering{ - name = "Engine Room"; - req_access = list("engineering") - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"db" = ( -/obj/structure/filingcabinet, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"dc" = ( -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"dd" = ( -/obj/structure/closet/crate, -/obj/item/disk/data{ - desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, information will turn up blank on most DNA machines."; - name = "encrypted genetic data disk"; - read_only = 1 - }, -/obj/item/firing_pin/dna, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"de" = ( -/obj/structure/filingcabinet, -/obj/structure/filingcabinet, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"df" = ( -/obj/structure/closet/crate, -/obj/item/disk/data{ - desc = "A data disk used to store cloning and genetic records. The name on the label appears to be scratched off."; - genetic_makeup_buffer = list("label" = "Buffer1:Kr-$$@##", "UI" = "f8f603857000f930127c4", "SE" = "414401462231053131010241514651403453121613263463440351136366", "UE" = "340008485c321e542aed4df7032ac04d", "name" = "Krystal Symers", "blood_type" = "A+"); - name = "dusty genetics data disk"; - read_only = 1 - }, -/obj/item/disk/data{ - desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, information will turn up blank on most DNA machines."; - name = "encrypted genetic data disk"; - read_only = 1 - }, -/obj/item/dnainjector/xraymut, -/obj/item/dnainjector/xraymut, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"dg" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior) -"dh" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/genetics) -"di" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/mob/living/carbon/human/species/monkey, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/genetics) -"dl" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"do" = ( -/turf/closed/wall/r_wall, -/area/awaymission/research/interior/security) -"dp" = ( -/obj/structure/closet/crate, -/obj/item/disk/data{ - desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, information will turn up blank on most DNA machines."; - name = "encrypted genetic data disk"; - read_only = 1 - }, -/obj/item/dnainjector/telemut, -/obj/item/dnainjector/telemut, -/obj/item/dnainjector/chavmut, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"dq" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/mob/living/carbon/human/species/monkey, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/genetics) -"dr" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/genetics) -"du" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/genetics) -"dv" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/mob/living/carbon/human/species/monkey, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/genetics) -"dy" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"dC" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"dD" = ( -/obj/structure/closet, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"dE" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"dF" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"dG" = ( -/obj/structure/rack, -/obj/item/clothing/suit/armor/riot, -/obj/item/clothing/head/helmet/toggleable/riot, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"dJ" = ( -/obj/structure/rack, -/obj/item/clothing/suit/armor/bulletproof, -/obj/item/clothing/suit/armor/bulletproof, -/obj/item/clothing/head/helmet/alt, -/obj/item/clothing/head/helmet/alt, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"dK" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"dL" = ( -/obj/structure/closet/crate, -/obj/item/disk/data{ - desc = "A data disk used to store cloning and genetic records. The name on the label appears to be scratched off with the words 'DO NOT CLONE' hastily written over it."; - genetic_makeup_buffer = list("label" = "Buffer1:George Melons", "UI" = "3c300f11b5421ca7014d8", "SE" = "430431205660551642142504334461413202111310233445620533134255", "UE" = "6893e6a0b0076a41897776b10cc2b324", "name" = "George Melons", "blood_type" = "B+"); - name = "old genetics data disk" - }, -/obj/item/disk/data{ - desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, information will turn up blank on most DNA machines."; - name = "encrypted genetic data disk"; - read_only = 1 - }, -/obj/item/firing_pin/dna, -/obj/item/dnainjector/dwarf, -/obj/item/dnainjector/dwarf, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"dM" = ( -/obj/structure/closet/crate, -/obj/item/disk/data{ - desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, information will turn up blank on most DNA machines."; - name = "encrypted genetic data disk"; - read_only = 1 - }, -/obj/item/disk/data{ - desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, information will turn up blank on most DNA machines."; - name = "encrypted genetic data disk"; - read_only = 1 - }, -/obj/item/dnainjector/chameleonmut, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"dN" = ( -/obj/item/kirbyplants/organic/plant16, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"dQ" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/mob/living/carbon/human, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/genetics) -"dU" = ( -/obj/structure/rack, -/obj/item/gun/ballistic/automatic/wt550, -/obj/item/gun/ballistic/automatic/wt550, -/obj/item/ammo_box/magazine/wt550m9, -/obj/item/ammo_box/magazine/wt550m9, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"dV" = ( -/obj/structure/rack, -/obj/item/clothing/suit/armor/vest, -/obj/item/clothing/suit/armor/vest, -/obj/item/clothing/head/helmet, -/obj/item/clothing/head/helmet, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"dW" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/highsecurity{ - aiDisabledIdScanner = 1; - name = "Secure Storage C"; - req_access = list("away_generic1") - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"dX" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/highsecurity{ - aiDisabledIdScanner = 1; - name = "Secure Storage D"; - req_access = list("away_generic1") - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"dY" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/research/interior) -"dZ" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"ea" = ( -/turf/closed/wall/r_wall, -/area/awaymission/research/interior/cryo) -"eb" = ( -/obj/machinery/door/airlock/research{ - name = "Cryogenetics Research"; - req_access = list("genetics") - }, -/turf/open/floor/iron/stairs, -/area/awaymission/research/interior/genetics) -"ee" = ( -/obj/structure/grille, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"ef" = ( -/obj/effect/spawner/random/maintenance, -/obj/effect/spawner/random/maintenance, -/obj/structure/closet/crate, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"eh" = ( -/turf/open/floor/iron/white/corner, -/area/awaymission/research/interior) -"ei" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"ej" = ( -/obj/machinery/airalarm/directional/north{ - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"ek" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"el" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"em" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"en" = ( -/turf/open/floor/iron/white/corner{ - dir = 8 - }, -/area/awaymission/research/interior) -"eo" = ( -/obj/structure/chair/stool, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"ep" = ( -/obj/structure/rack, -/obj/item/gun/ballistic/automatic/pistol/m1911, -/obj/item/gun/ballistic/automatic/pistol/m1911, -/obj/item/ammo_box/magazine/m45, -/obj/item/ammo_box/magazine/m45, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"eq" = ( -/obj/structure/rack, -/obj/item/clothing/suit/hooded/ablative, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"er" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"es" = ( -/turf/open/floor/plating, -/area/awaymission/research/interior) -"et" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - req_access = list("maint_tunnels") - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"eu" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"ev" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"ew" = ( -/obj/machinery/airalarm/directional/north{ - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"ex" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"ez" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"eA" = ( -/obj/structure/extinguisher_cabinet{ - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"eE" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"eF" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"eG" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"eH" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - req_access = list("maint_tunnels") - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"eI" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"eJ" = ( -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"eK" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"eL" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"eN" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"eO" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"eP" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"eQ" = ( -/obj/machinery/door/window/right/directional/north{ - name = "Cell Door"; - req_access = list("security") - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"eS" = ( -/obj/machinery/door/airlock/security/glass{ - id_tag = "outerbrig"; - name = "Brig"; - req_access = list("security") - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"eT" = ( -/obj/machinery/airalarm/directional/west{ - pixel_x = -32 - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"eX" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/awaymission/research/interior) -"eY" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/awaymission/research/interior) -"eZ" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"fa" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/apc/cell_5k, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"fb" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"fc" = ( -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/door/window/right/directional/west{ - dir = 2 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"fd" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/cup/beaker/cryoxadone{ - pixel_x = -7; - pixel_y = 1 - }, -/obj/item/reagent_containers/cup/beaker/cryoxadone{ - pixel_x = -7; - pixel_y = 1 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"fe" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/cup/beaker/cryoxadone{ - pixel_x = 7; - pixel_y = 1 - }, -/obj/item/reagent_containers/cup/beaker/cryoxadone{ - pixel_x = 7; - pixel_y = 1 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"ff" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"fg" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"fh" = ( -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"fi" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"fk" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"fm" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"fo" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"fp" = ( -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"fq" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"fr" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"ft" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"fu" = ( -/obj/machinery/airalarm/directional/north{ - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"fv" = ( -/obj/structure/plaque/static_plaque/golden{ - pixel_x = 32 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"fw" = ( -/obj/machinery/power/smes{ - capacity = 9e+006; - charge = 10000 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"fx" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"fy" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/apc/cell_10k, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"fz" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"fB" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"fC" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"fD" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"fE" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"fF" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"fK" = ( -/obj/machinery/door/airlock/research{ - name = "Cryogenetics Research"; - req_access = list("genetics") - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"fL" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"fM" = ( -/obj/machinery/door/airlock/research{ - name = "Cryogenetics Research"; - req_access = list("genetics") - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"fN" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"fO" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"fQ" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"fR" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"fS" = ( -/obj/machinery/door/airlock/security/glass{ - id_tag = "outerbrig"; - name = "Brig"; - req_access = list("security") - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"fT" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"fV" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"fW" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"fX" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"fZ" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"ga" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/book/manual/wiki/security_space_law, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"gb" = ( -/obj/structure/table, -/obj/item/storage/fancy/donut_box, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"gc" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = 32 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"gd" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/machinery/power/terminal, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"gf" = ( -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"gg" = ( -/obj/machinery/door/airlock/highsecurity{ - aiDisabledIdScanner = 1; - name = "Power Storage"; - req_access = list("away_generic1") - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"gl" = ( -/obj/machinery/door/airlock/highsecurity{ - name = "Vault Storage"; - req_access = list("away_generic1") - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"gn" = ( -/obj/machinery/door/airlock/research{ - name = "Secure Storage"; - req_access = list("genetics","brig_entrance") - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/secure) -"gp" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior) -"gq" = ( -/obj/machinery/door/airlock/research{ - name = "Cryogenetics Research"; - req_access = list("genetics") - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior) -"gt" = ( -/obj/machinery/door/airlock/research{ - name = "Cryogenetics Research"; - req_access = list("genetics") - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"gu" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"gw" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/machinery/door/window/right/directional/west{ - dir = 2 - }, -/obj/machinery/door/window/right/directional/west{ - dir = 1 - }, -/obj/machinery/door/window/right/directional/west, -/obj/machinery/door/window/right/directional/west{ - dir = 4 - }, -/obj/structure/table/glass, -/obj/item/storage/briefcase/virology/hnz, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"gz" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"gA" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"gB" = ( -/obj/structure/sign/departments/science, -/turf/closed/wall/r_wall, -/area/awaymission/research/interior) -"gC" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"gE" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"gG" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"gH" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"gI" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"gM" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"gN" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"gO" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"gP" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"gQ" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"gV" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"gX" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"gZ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"ha" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"hb" = ( -/obj/machinery/door/airlock/security/glass{ - id_tag = "outerbrig"; - name = "Brig"; - req_access = list("security") - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"hc" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"he" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"hf" = ( -/obj/structure/table, -/obj/item/folder, -/obj/item/folder, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"hg" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"hh" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"hl" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"hm" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"hn" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"ho" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"hr" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"hs" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"ht" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"hv" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"hA" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"hB" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"hC" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"hD" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"hE" = ( -/obj/machinery/door/window/right/directional/south{ - name = "Cell Door"; - req_access = list("security") - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"hF" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/security) -"hG" = ( -/obj/structure/closet/secure_closet/security, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"hH" = ( -/obj/machinery/vending/security, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"hI" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/highsecurity{ - aiDisabledIdScanner = 1; - name = "Secure Storage A"; - req_access = list("away_generic1") - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"hJ" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/highsecurity{ - aiDisabledIdScanner = 1; - name = "Secure Storage B"; - req_access = list("away_generic1") - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"hK" = ( -/obj/machinery/door/poddoor{ - id = "cryopodg1"; - name = "Cryogenetic Genetics Blastdoor" - }, -/obj/machinery/door/airlock/research{ - name = "Cryogenetics Research"; - req_access = list("genetics") - }, -/turf/open/floor/iron/stairs{ - dir = 1 - }, -/area/awaymission/research/interior/genetics) -"hL" = ( -/turf/open/floor/iron/white/corner{ - dir = 4 - }, -/area/awaymission/research/interior) -"hM" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"hO" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"hP" = ( -/obj/structure/sign/directions/medical{ - pixel_x = 32; - pixel_y = -32 - }, -/obj/structure/sign/directions/evac{ - pixel_x = 32; - pixel_y = -24 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"hQ" = ( -/turf/open/floor/iron/white/corner{ - dir = 1 - }, -/area/awaymission/research/interior) -"hR" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"hS" = ( -/obj/structure/closet/crate, -/obj/item/disk/data{ - desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, information will turn up blank on most DNA machines."; - name = "encrypted genetic data disk"; - read_only = 1 - }, -/obj/item/disk/data{ - desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, information will turn up blank on most DNA machines. This one has the initials 'C.P' marked on the front."; - name = "encrypted genetic data disk"; - read_only = 1 - }, -/obj/item/clothing/head/collectable/petehat{ - name = "dusty hat" - }, -/obj/item/firing_pin/dna, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"hT" = ( -/obj/structure/closet/crate, -/obj/item/disk/data{ - desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, information will turn up blank on most DNA machines."; - name = "encrypted genetic data disk"; - read_only = 1 - }, -/obj/item/disk/data{ - desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, information will turn up blank on most DNA machines."; - name = "encrypted genetic data disk"; - read_only = 1 - }, -/obj/item/firing_pin/dna, -/obj/item/dnainjector/hulkmut, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"hU" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/mob/living/carbon/human/species/monkey, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/genetics) -"hV" = ( -/obj/item/kirbyplants/organic/plant10, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"hW" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/mob/living/carbon/human/species/monkey, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/genetics) -"hX" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"hY" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"hZ" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"ia" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"ib" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/genetics) -"id" = ( -/turf/closed/wall, -/area/awaymission/research/interior/maint) -"ih" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"ii" = ( -/obj/item/kirbyplants{ - desc = "A potted plant, it doesn't look very healthy..."; - name = "dead potted plant" - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"ik" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"il" = ( -/obj/structure/closet/crate, -/obj/item/disk/data{ - desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, information will turn up blank on most DNA machines."; - name = "encrypted genetic data disk"; - read_only = 1 - }, -/obj/item/firing_pin/dna/dredd, -/obj/item/firing_pin/dna/dredd, -/obj/item/dnainjector/lasereyesmut, -/obj/item/dnainjector/lasereyesmut, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"io" = ( -/obj/structure/mirror{ - pixel_x = -32 - }, -/obj/structure/sink/directional/east, -/turf/open/floor/iron/freezer, -/area/awaymission/research/interior/bathroom) -"ip" = ( -/obj/structure/urinal{ - pixel_y = 32 - }, -/turf/open/floor/iron/freezer, -/area/awaymission/research/interior/bathroom) -"ir" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"is" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"it" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"iv" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Security Maintenance"; - req_access = list("security") - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"ix" = ( -/obj/machinery/door/window/left/directional/east, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/genetics) -"iy" = ( -/obj/structure/chair/office, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"iz" = ( -/obj/machinery/door/window/right/directional/west, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/genetics) -"iA" = ( -/turf/open/floor/iron/freezer, -/area/awaymission/research/interior/bathroom) -"iB" = ( -/obj/machinery/door/airlock{ - name = "Stall" - }, -/turf/open/floor/iron/freezer, -/area/awaymission/research/interior/bathroom) -"iC" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/effect/landmark/awaystart, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/freezer, -/area/awaymission/research/interior/bathroom) -"iD" = ( -/turf/closed/wall, -/area/awaymission/research/interior) -"iE" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"iF" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/security) -"iG" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"iH" = ( -/obj/structure/table, -/obj/item/reagent_containers/spray/pepper, -/obj/machinery/button/door{ - id = "cryopodg1"; - name = "panic lockdown button" - }, -/obj/machinery/airalarm/directional/south{ - pixel_y = -32 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"iI" = ( -/obj/structure/reagent_dispensers/wall/peppertank{ - pixel_y = -32 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"iJ" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/freezer, -/area/awaymission/research/interior/bathroom) -"iK" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/south, -/turf/open/floor/iron/freezer, -/area/awaymission/research/interior/bathroom) -"iL" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/freezer, -/area/awaymission/research/interior/bathroom) -"iM" = ( -/turf/closed/wall, -/area/awaymission/research/interior/bathroom) -"iN" = ( -/obj/machinery/shower/directional/west, -/turf/open/floor/iron/freezer, -/area/awaymission/research/interior/bathroom) -"iO" = ( -/obj/structure/window/reinforced/tinted/spawner/directional/west, -/turf/open/floor/iron/freezer, -/area/awaymission/research/interior/bathroom) -"iP" = ( -/obj/machinery/door/airlock{ - name = "Unisex Bathroom" - }, -/turf/open/floor/iron/freezer, -/area/awaymission/research/interior/bathroom) -"iR" = ( -/turf/open/floor/iron/white, -/area/awaymission/research/interior/maint) -"iS" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/maint) -"iU" = ( -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/maint) -"iW" = ( -/turf/closed/wall/r_wall, -/area/awaymission/research/interior/medbay) -"iX" = ( -/turf/closed/wall, -/area/awaymission/research/interior/dorm) -"iY" = ( -/obj/machinery/door/airlock{ - name = "Bathroom" - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/dorm) -"iZ" = ( -/obj/machinery/airalarm/directional/north{ - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"ja" = ( -/obj/machinery/sleeper, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"jb" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"jc" = ( -/obj/structure/table, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"jd" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"je" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"jf" = ( -/turf/closed/wall, -/area/awaymission/research/interior/medbay) -"jg" = ( -/obj/structure/sink/directional/east, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"jh" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"jj" = ( -/obj/structure/dresser, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"jk" = ( -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"jl" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"jm" = ( -/obj/item/kirbyplants/organic/plant14, -/turf/open/floor/iron{ - dir = 9 - }, -/area/awaymission/research/interior/dorm) -"jn" = ( -/turf/open/floor/iron{ - dir = 1 - }, -/area/awaymission/research/interior/dorm) -"jo" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron{ - dir = 1 - }, -/area/awaymission/research/interior/dorm) -"jr" = ( -/obj/structure/sign/directions/security{ - dir = 1; - pixel_x = 32; - pixel_y = 40 - }, -/obj/structure/sign/directions/engineering{ - dir = 1; - pixel_x = 32; - pixel_y = 33 - }, -/obj/structure/sign/directions/science{ - dir = 1; - pixel_x = 32; - pixel_y = 26 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"js" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"jt" = ( -/obj/machinery/door/airlock/medical{ - name = "Medical" - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"jv" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"jw" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"jx" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"jy" = ( -/obj/machinery/door/airlock/medical{ - name = "Medical Surgery" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"jz" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"jA" = ( -/obj/structure/table/optable, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"jB" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"jC" = ( -/obj/structure/table/wood, -/obj/machinery/light/small/directional/west, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"jD" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"jE" = ( -/turf/open/floor/iron{ - dir = 8 - }, -/area/awaymission/research/interior/dorm) -"jI" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"jJ" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"jK" = ( -/obj/structure/sign/departments/medbay, -/turf/closed/wall/r_wall, -/area/awaymission/research/interior) -"jM" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"jN" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"jQ" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"jR" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/research/interior/medbay) -"jS" = ( -/obj/structure/table, -/obj/item/surgical_drapes, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"jT" = ( -/obj/machinery/button/door{ - id = "Dorm1"; - name = "Privacy Button"; - pixel_y = -28 - }, -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"jU" = ( -/obj/structure/bed, -/obj/item/bedsheet/blue, -/obj/effect/landmark/awaystart, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"jV" = ( -/obj/machinery/button/door{ - id = "Dorm2"; - name = "Privacy Button"; - pixel_y = -28 - }, -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"jW" = ( -/obj/structure/bed, -/obj/item/bedsheet/purple, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"jX" = ( -/obj/machinery/button/door{ - id = "Dorm3"; - name = "Privacy Button"; - pixel_y = -28 - }, -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"jY" = ( -/obj/structure/bed, -/obj/item/bedsheet/clown, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"ka" = ( -/turf/open/floor/iron/corner, -/area/awaymission/research/interior/dorm) -"kc" = ( -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"ke" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"kf" = ( -/obj/machinery/door/airlock/medical{ - name = "Medical" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"kg" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"ki" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"kl" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"km" = ( -/obj/structure/table, -/obj/item/circular_saw, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"kn" = ( -/obj/structure/table, -/obj/item/scalpel, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"ko" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"kp" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/mapping_helpers/apc/cell_5k, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/dorm) -"kq" = ( -/obj/machinery/door/airlock{ - id_tag = "Dorm1"; - name = "Dorm 1" - }, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"kr" = ( -/obj/machinery/door/airlock{ - id_tag = "Dorm2"; - name = "Dorm 2" - }, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"ks" = ( -/obj/machinery/door/airlock{ - id_tag = "Dorm3"; - name = "Dorm 3" - }, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"kt" = ( -/obj/item/gun/ballistic/automatic/pistol/m1911, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/dorm) -"ku" = ( -/obj/structure/closet/wardrobe/pjs, -/turf/open/floor/iron{ - dir = 4 - }, -/area/awaymission/research/interior/dorm) -"kv" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"kw" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"ky" = ( -/obj/structure/table, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"kz" = ( -/obj/machinery/iv_drip, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"kB" = ( -/obj/effect/spawner/structure/window/reinforced/tinted, -/turf/open/floor/plating, -/area/awaymission/research/interior/medbay) -"kC" = ( -/obj/item/kirbyplants/organic/plant22, -/turf/open/floor/iron{ - dir = 9 - }, -/area/awaymission/research/interior/dorm) -"kD" = ( -/turf/open/floor/iron/corner{ - dir = 1 - }, -/area/awaymission/research/interior/dorm) -"kE" = ( -/turf/open/floor/iron/white, -/area/awaymission/research/interior/dorm) -"kF" = ( -/obj/structure/closet/wardrobe/green, -/turf/open/floor/iron{ - dir = 4 - }, -/area/awaymission/research/interior/dorm) -"kL" = ( -/turf/open/floor/plating, -/area/awaymission/research/interior/medbay) -"kM" = ( -/obj/machinery/door/airlock/medical{ - name = "Medical Storage" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"kN" = ( -/obj/machinery/vending/cola, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"kO" = ( -/obj/structure/chair/comfy/beige, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"kQ" = ( -/obj/structure/chair/stool, -/turf/open/floor/iron{ - dir = 8 - }, -/area/awaymission/research/interior/dorm) -"kR" = ( -/obj/structure/table/wood, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/dorm) -"kS" = ( -/obj/structure/table/wood, -/obj/item/storage/dice, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/dorm) -"kT" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen/fourcolor, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/dorm) -"kU" = ( -/obj/structure/chair/stool, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/dorm) -"kV" = ( -/obj/structure/closet/wardrobe/grey, -/obj/machinery/light/directional/east, -/turf/open/floor/iron{ - dir = 4 - }, -/area/awaymission/research/interior/dorm) -"kW" = ( -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"kY" = ( -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"lb" = ( -/obj/structure/table, -/obj/machinery/microwave, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"lc" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/closet/wardrobe/mixed, -/turf/open/floor/iron{ - dir = 4 - }, -/area/awaymission/research/interior/dorm) -"ld" = ( -/obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/random, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"le" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/item/storage/medkit/regular, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"lk" = ( -/obj/structure/chair/stool, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"ll" = ( -/obj/structure/table, -/obj/item/storage/box/donkpockets, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"lm" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron{ - dir = 8 - }, -/area/awaymission/research/interior/dorm) -"ln" = ( -/turf/open/floor/iron/white, -/area/space/nearstation) -"lo" = ( -/obj/structure/table/wood, -/obj/structure/bedsheetbin, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/dorm) -"lp" = ( -/obj/machinery/washing_machine, -/turf/open/floor/iron{ - dir = 4 - }, -/area/awaymission/research/interior/dorm) -"lq" = ( -/obj/machinery/iv_drip, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"ls" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/item/storage/medkit/toxin, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"lx" = ( -/obj/structure/table, -/obj/item/storage/fancy/cigarettes/dromedaryco, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"ly" = ( -/obj/item/kirbyplants/organic/plant16, -/turf/open/floor/iron{ - dir = 10 - }, -/area/awaymission/research/interior/dorm) -"lz" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"lA" = ( -/obj/structure/chair/stool, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"lB" = ( -/turf/open/floor/iron/corner{ - dir = 8 - }, -/area/awaymission/research/interior/dorm) -"lC" = ( -/obj/machinery/iv_drip, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"lD" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"lE" = ( -/obj/structure/table, -/obj/item/storage/medkit/brute, -/obj/item/storage/medkit/fire, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"lH" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"lI" = ( -/obj/machinery/vending/snack, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"lJ" = ( -/obj/structure/closet/crate/bin, -/obj/item/trash/can, -/obj/item/trash/chips, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"lK" = ( -/obj/machinery/door/airlock{ - id_tag = "Dorm6"; - name = "Dorm 6" - }, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"lL" = ( -/obj/machinery/door/airlock{ - id_tag = "Dorm5"; - name = "Dorm 5" - }, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"lM" = ( -/obj/machinery/door/airlock{ - id_tag = "Dorm4"; - name = "Dorm 4" - }, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"lN" = ( -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, -/obj/machinery/airalarm/directional/east{ - pixel_x = 32 - }, -/turf/open/floor/iron{ - dir = 4 - }, -/area/awaymission/research/interior/dorm) -"lO" = ( -/obj/machinery/button/door{ - id = "Dorm6"; - name = "Privacy Button"; - pixel_y = 28 - }, -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"lP" = ( -/obj/structure/bed, -/obj/item/bedsheet/rainbow, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"lQ" = ( -/obj/machinery/button/door{ - id = "Dorm5"; - name = "Privacy Button"; - pixel_y = 28 - }, -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"lR" = ( -/obj/structure/bed, -/obj/item/bedsheet/green, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"lS" = ( -/obj/machinery/button/door{ - id = "Dorm4"; - name = "Privacy Button"; - pixel_y = 28 - }, -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"lT" = ( -/obj/structure/bed, -/obj/item/bedsheet/patriot, -/obj/effect/landmark/awaystart, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"lU" = ( -/obj/effect/spawner/random/entertainment/arcade, -/turf/open/floor/iron{ - dir = 4 - }, -/area/awaymission/research/interior/dorm) -"lW" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/medbay) -"lX" = ( -/obj/structure/closet/crate/bin, -/turf/open/floor/iron{ - dir = 10 - }, -/area/awaymission/research/interior/dorm) -"lY" = ( -/turf/open/floor/iron{ - dir = 6 - }, -/area/awaymission/research/interior/dorm) -"lZ" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/escapepods) -"ma" = ( -/turf/closed/wall/r_wall, -/area/awaymission/research/interior/escapepods) -"mb" = ( -/turf/closed/wall, -/area/awaymission/research/interior/escapepods) -"md" = ( -/turf/open/misc/asteroid, -/area/awaymission/research/exterior) -"me" = ( -/turf/closed/wall/mineral/titanium, -/area/awaymission/research/exterior) -"mf" = ( -/obj/machinery/power/shuttle_engine/propulsion/burst{ - dir = 4 - }, -/turf/closed/wall/mineral/titanium/interior, -/area/awaymission/research/exterior) -"mg" = ( -/obj/structure/closet/emcloset, -/obj/structure/sign/warning/vacuum/directional/north, -/turf/open/floor/plating, -/area/awaymission/research/interior/escapepods) -"mh" = ( -/obj/structure/sign/warning/pods/directional/west, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mi" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mj" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mk" = ( -/obj/effect/spawner/random/entertainment/arcade, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"ml" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mm" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mn" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mo" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mp" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mq" = ( -/turf/open/floor/plating, -/area/awaymission/research/exterior) -"mr" = ( -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/research/exterior) -"ms" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/research/exterior) -"mt" = ( -/obj/machinery/door/airlock/titanium{ - name = "Escape Pod Airlock" - }, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/research/exterior) -"mu" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Pod One" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/escapepods) -"mv" = ( -/turf/open/floor/plating, -/area/awaymission/research/interior/escapepods) -"mw" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mx" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"my" = ( -/turf/closed/wall/mineral/titanium/interior, -/area/awaymission/research/exterior) -"mA" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mB" = ( -/turf/closed/wall, -/area/awaymission/research/exterior) -"mC" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mD" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mE" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mF" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mG" = ( -/obj/structure/table, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mH" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mI" = ( -/obj/structure/sign/warning/pods/directional/west, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mJ" = ( -/obj/item/kirbyplants, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mK" = ( -/obj/structure/flora/bush/flowers_br, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, -/turf/open/floor/grass, -/area/awaymission/research/interior/escapepods) -"mL" = ( -/obj/structure/flora/bush/ferny, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, -/turf/open/floor/grass, -/area/awaymission/research/interior/escapepods) -"mM" = ( -/obj/structure/flora/bush/grassy, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, -/turf/open/floor/grass, -/area/awaymission/research/interior/escapepods) -"mN" = ( -/obj/item/kirbyplants/organic/applebush, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mO" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Pod Two" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/escapepods) -"mP" = ( -/obj/structure/chair, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mQ" = ( -/obj/structure/table, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mS" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Pod Three" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/escapepods) -"mT" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mU" = ( -/obj/structure/sign/warning/vacuum/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mV" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mW" = ( -/obj/structure/sign/warning/vacuum/directional/south, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mX" = ( -/obj/machinery/airalarm/directional/east{ - pixel_x = 32 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mY" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/research/interior/escapepods) -"mZ" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/awaymission/research/interior/escapepods) -"na" = ( -/turf/closed/wall/mineral/plasma, -/area/space/nearstation) -"nb" = ( -/obj/structure/table/wood, -/obj/item/book/granter/action/spell/random, -/turf/open/floor/mineral/plasma, -/area/space/nearstation) -"nc" = ( -/mob/living/basic/creature, -/turf/open/floor/mineral/plasma, -/area/space/nearstation) -"nd" = ( -/obj/structure/healingfountain, -/turf/open/floor/mineral/plasma, -/area/space/nearstation) -"ne" = ( -/turf/open/floor/mineral/plasma, -/area/space/nearstation) -"nf" = ( -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"pt" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Pod Three" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/escapepods) -"qS" = ( -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"rj" = ( -/obj/machinery/atmospherics/components/binary/pump/layer2{ - dir = 8; - name = "Gas to Chamber" - }, -/obj/machinery/atmospherics/components/binary/pump/layer4{ - dir = 4; - name = "Chamber to Cooling" - }, -/turf/open/floor/engine, -/area/awaymission/research/interior/engineering) -"su" = ( -/obj/machinery/door/airlock/medical{ - name = "Medical" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"sM" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/landmark/awaystart, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"tE" = ( -/obj/machinery/door/airlock/medical{ - name = "Medical" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"uF" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/engineering) -"va" = ( -/obj/machinery/door/airlock/research{ - name = "Cryogenetics Research"; - req_access = list("genetics") - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"ws" = ( -/obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/item/wrench, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/engineering) -"wM" = ( -/obj/machinery/door/airlock/medical{ - name = "Medical" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"xk" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/engineering) -"xG" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Pod Two" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/escapepods) -"yr" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/engine_access, -/turf/open/floor/engine, -/area/awaymission/research/interior/engineering) -"zn" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - req_access = list("maint_tunnels") - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"Aj" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/structure/table, -/obj/item/rna_vial, -/obj/item/rna_extractor, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"AQ" = ( -/obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/item/crowbar, -/turf/open/floor/plating, -/area/awaymission/research/interior/engineering) -"Bx" = ( -/obj/machinery/door/airlock/engineering{ - name = "Engine Room"; - req_access = list("engineering") - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"Do" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - req_access = list("maint_tunnels") - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"DP" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/engine, -/area/awaymission/research/interior/engineering) -"DX" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/machinery/rnd/rna_recombinator, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"FG" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/engine, -/area/awaymission/research/interior/engineering) -"Gv" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Engineering - Supermatter"; - name = "engineering camera" - }, -/turf/open/floor/engine, -/area/awaymission/research/interior/engineering) -"IO" = ( -/obj/structure/table/wood, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"Jc" = ( -/obj/structure/table/wood, -/turf/open/floor/iron{ - dir = 1 - }, -/area/awaymission/research/interior/dorm) -"Kf" = ( -/obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/structure/cable, -/obj/item/tank/internals/plasma, -/turf/open/floor/plating, -/area/awaymission/research/interior/engineering) -"Km" = ( -/obj/machinery/door/airlock/security/glass{ - id_tag = "outerbrig"; - name = "Brig"; - req_access = list("security") - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"LA" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 1 - }, -/turf/open/floor/engine, -/area/awaymission/research/interior/engineering) -"MI" = ( -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/engineering) -"OF" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/turf/open/floor/engine, -/area/awaymission/research/interior/engineering) -"OH" = ( -/obj/structure/cable, -/turf/open/floor/engine, -/area/awaymission/research/interior/engineering) -"Qd" = ( -/obj/machinery/door/airlock/medical{ - name = "Medical" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"Qz" = ( -/obj/machinery/door/airlock/security/glass{ - id_tag = "outerbrig"; - name = "Brig"; - req_access = list("security") - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"Rw" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/engineering) -"TD" = ( -/obj/machinery/door/airlock/engineering{ - name = "Engine Room"; - req_access = list("engineering") - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"TE" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Pod One" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/escapepods) -"Uu" = ( -/obj/machinery/door/airlock/security/glass{ - id_tag = "outerbrig"; - name = "Brig"; - req_access = list("security") - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"Uy" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/meter, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/engineering) -"UA" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - req_access = list("maint_tunnels") - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"Vw" = ( -/turf/open/floor/plating, -/area/awaymission/research/interior/engineering) -"WR" = ( -/obj/machinery/door/airlock/security/glass{ - id_tag = "outerbrig"; - name = "Brig"; - req_access = list("security") - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"XE" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/escapepods) -"XS" = ( -/obj/machinery/power/supermatter_crystal/engine, -/turf/open/floor/engine, -/area/awaymission/research/interior/engineering) -"Zl" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock/engineering/glass/critical{ - heat_proof = 1; - name = "Supermatter Chamber"; - req_one_access = list("engineering","atmospherics") - }, -/turf/open/floor/engine, -/area/awaymission/research/interior/engineering) - -(1,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(2,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(3,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(4,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(5,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(6,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(7,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(8,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(9,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(10,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(11,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(12,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(13,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(14,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(15,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(16,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(17,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -na -na -na -na -na -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(18,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -na -nb -nb -nb -na -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(19,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -na -nc -ne -nc -na -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(20,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -na -nd -ne -nd -na -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(21,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -na -na -ne -na -na -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(22,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -na -ne -na -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(23,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -na -na -ne -na -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(24,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -na -ne -ne -na -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(25,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -na -na -na -na -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(26,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(27,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(28,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(29,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(30,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(31,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(32,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(33,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(34,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(35,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(36,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(37,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(38,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(39,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(40,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(41,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(42,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(43,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(44,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(45,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(46,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(47,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(48,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(49,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(50,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(51,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(52,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(53,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(54,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(55,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(56,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(57,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(58,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(59,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(60,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(61,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(62,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(63,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(64,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(65,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(66,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(67,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(68,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(69,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(70,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(71,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(72,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(73,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(74,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(75,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(76,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(77,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(78,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(79,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(80,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(81,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(82,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(83,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(84,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(85,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(86,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(87,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(88,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(89,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(90,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(91,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(92,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -cQ -cQ -cQ -cQ -cQ -cQ -cQ -cQ -cQ -cQ -cQ -cQ -cQ -cQ -cQ -cQ -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(93,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -cQ -db -db -dK -cQ -er -cQ -fw -gd -fw -cQ -hs -cQ -db -db -dK -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(94,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -cQ -dc -dc -dc -dW -dc -cQ -fx -dc -gf -cQ -dc -hI -dc -dc -dc -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(95,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -cQ -dc -dc -dc -cQ -dc -cQ -fy -gf -gf -cQ -dc -cQ -dc -dc -dc -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(96,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -cQ -dd -dp -dL -cQ -dc -cQ -cQ -gg -cQ -cQ -dc -cQ -hS -dM -il -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(97,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -cQ -cQ -cQ -cQ -cQ -dc -eT -dK -gf -dK -dc -dc -cQ -cQ -cQ -cQ -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(98,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -cQ -de -db -dK -cQ -dc -dc -dc -gf -dc -dc -dc -cQ -db -db -dK -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(99,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cQ -dc -dc -dc -dX -dc -dc -dc -gf -dc -dc -dc -hJ -dc -dc -dc -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(100,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cQ -dc -dc -dc -cQ -dc -dc -dc -gf -dc -dc -dc -cQ -dc -dc -dc -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(101,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cQ -df -dd -dM -cQ -dc -dc -fz -gf -fz -dc -dc -cQ -hT -hT -dd -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(102,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cQ -cQ -cQ -cQ -cQ -cQ -cQ -cQ -gl -cQ -cQ -cQ -cQ -cQ -cQ -cQ -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(103,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cQ -dc -dc -dK -gf -dK -dc -dc -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(104,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cQ -dc -dc -dc -gf -dc -dc -dc -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(105,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cQ -dc -dc -dc -gf -dc -dc -dc -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(106,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cQ -cQ -cQ -cQ -gn -cQ -cQ -cQ -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(107,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -dY -dg -dY -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(108,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bl -bl -bl -bl -bl -bl -ad -ad -ad -ae -ae -ae -ae -dY -dg -dY -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -md -mq -my -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(109,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bl -bl -bQ -bQ -ci -ct -bl -bl -ad -ae -ae -ae -ae -ae -dY -dg -dY -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -md -mr -me -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(110,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bl -bz -bR -bR -cj -bz -cD -bl -ad -ae -ae -dY -dY -cp -dY -dg -dY -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -me -ms -me -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(111,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bl -bA -bS -bY -cj -bz -bz -bl -cp -cp -cp -dY -es -eX -es -dg -dY -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -mf -mt -mf -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(112,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bl -bB -bT -bZ -ck -qS -qS -cR -dg -dg -dg -dg -dg -dg -dg -gp -cp -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(113,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bl -bC -bU -ca -sM -bz -bz -bl -cp -cp -cp -dY -es -eY -es -dg -dY -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(114,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bl -bz -bR -bR -sM -bz -cF -bl -ad -ae -ae -dY -dY -cp -dY -dg -dY -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ab -ab -ab -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(115,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bl -bl -bz -cb -cl -cv -bl -bl -ad -ae -ae -ae -ae -ae -dY -dg -dY -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(116,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bl -bl -bl -bl -bl -bl -ad -ad -ad -ae -ae -ae -ae -dY -dg -dY -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(117,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -dY -dg -dY -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(118,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -cp -cp -gq -cp -cp -aH -ad -ad -ad -ad -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(119,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aH -aH -aH -eZ -fB -fC -fB -eZ -aH -aH -aH -aH -ad -ad -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(120,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -bD -dZ -et -fa -fC -fC -fC -fC -zn -dZ -bD -aH -ad -ad -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(121,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -bD -ea -ea -ea -ea -gt -ea -ea -ea -ea -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(122,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aH -aH -aH -aH -aH -bD -ea -eu -fb -fD -gu -eu -fb -fD -ea -bD -aH -aH -aH -aH -aH -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(123,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -bD -bD -cS -bD -bD -bD -ea -ev -fc -fE -gu -ev -ag -fE -ea -bD -bD -bD -cS -bD -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(124,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aH -bD -cx -cx -cx -cx -cx -ea -ev -fd -fE -gu -ev -fd -fE -ea -cx -cx -cx -cx -cx -bD -aH -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(125,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -bD -bD -cx -hU -dh -dq -hU -ea -ev -fc -fE -gu -ev -ag -fE -ea -hU -ah -hU -dh -cx -bD -bD -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(126,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -bD -cx -cx -cU -di -dr -dr -ea -ew -fe -fE -gu -ev -fe -fE -ea -dr -ai -aj -ix -cx -cx -bD -id -bD -bD -bD -bD -bD -kp -bD -dy -bD -bD -bD -bD -bD -bD -bD -bD -bD -aH -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(127,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -bD -cx -cG -cK -cK -cK -dN -ea -ev -fh -fE -gu -ev -fh -fE -ea -cK -cK -cK -cK -cK -cy -bD -id -bD -iX -iX -iX -iX -iX -iX -iX -aP -iX -iX -iX -iX -iX -iX -iX -bD -aH -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(128,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -bD -cx -cH -Aj -cK -cK -cK -ea -ex -ff -fF -gu -gQ -ff -ht -ea -cK -cK -cK -cK -DX -cx -hD -id -bD -iX -jj -jC -jT -iX -kC -kQ -jE -lm -ly -iX -lO -jC -jj -iX -bD -aH -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(129,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -bD -cx -cI -cV -cK -cK -cK -eb -gu -gu -gu -gw -gu -gu -gu -hK -cK -cK -cK -iy -iG -cx -bD -id -bD -iX -jk -jD -jk -kq -jn -kR -kR -kE -kc -lK -jk -jD -jk -iX -bD -aH -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(130,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -bD -cx -cK -cK -cK -cK -cK -ea -ez -fg -fD -gu -eu -fg -hv -ea -cK -cK -cK -Aj -iH -cx -bD -id -bD -iX -jl -jk -jU -iX -jn -kS -kR -kU -kc -iX -lP -jk -jl -iX -bD -aH -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(131,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -aH -bD -cy -cK -cK -cK -cK -cK -ea -ev -fc -fE -gu -ev -ag -fE -ea -hV -cK -cK -cK -iI -cx -bD -id -bD -iX -iX -iX -iX -iX -jn -kT -kR -kE -kc -iX -iX -iX -iX -iX -bD -aH -ae -ae -ae -mB -ae -ae -ae -mB -ae -ae -ae -mB -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(132,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -aH -cn -cx -cx -cW -af -du -dQ -ea -eA -fd -fE -gu -ev -fd -fE -ea -hW -ib -hW -iz -cx -cx -bD -id -bD -iX -jj -jC -jV -iX -jn -kU -kE -kE -kc -iX -lQ -jC -jj -iX -bD -ma -mb -mu -mb -mb -mb -mO -mb -mb -mb -mS -mb -mb -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(133,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -aH -bD -bD -cx -cX -dh -dv -dh -ea -ev -fc -fE -gu -ev -ag -fE -ea -dh -dv -dh -hU -cx -bD -bD -id -bD -iX -jk -jD -jk -kr -jn -kE -kE -ln -kc -lL -jk -jD -jk -iX -bD -ma -mg -mv -mv -mb -mg -mv -mv -mb -mg -mv -mv -mb -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(134,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -aH -aH -bD -cx -cx -cx -cx -cx -ea -ev -fe -fE -gu -ev -fe -fE -ea -cx -cx -cx -cx -cx -bD -id -id -bD -iX -jl -jk -jW -iX -jn -kE -kE -kE -kc -iX -lR -jk -jl -iX -bD -ma -mb -TE -mb -mb -mb -xG -mb -mb -mb -pt -mb -mb -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(135,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -aH -bD -bD -bD -bD -bD -bD -ea -ev -fh -fE -gu -ev -fh -fE -ea -bD -bD -bD -bD -bD -bD -id -aO -bD -iX -iX -iX -iX -iX -jn -kE -kE -kE -kc -iX -iX -iX -iX -iX -bD -mb -mh -mw -mw -mC -mI -mw -mw -mC -mI -mT -mb -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(136,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -aH -aH -aH -aH -aH -aH -bD -ea -fh -fi -fF -gu -gQ -fi -fF -ea -bD -id -id -id -id -id -id -aO -bD -iX -jj -jC -jX -iX -jn -kE -kE -kE -lz -iX -lS -jC -jj -iX -bD -mb -mi -mn -mn -mn -mn -mn -mn -mn -mn -mE -mb -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(137,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -bD -ea -ea -cp -fK -cp -fK -cp -ea -ea -bD -id -io -io -iJ -iA -iM -aO -bD -iX -jk -jD -jk -ks -jn -kE -kE -kU -kc -lM -jk -jD -jk -iX -bD -mb -mj -mn -mn -mn -mn -mn -mn -mn -mn -mE -mY -mY -mY -mY -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(138,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -bD -aO -eE -cp -fL -eZ -gV -cp -bD -bD -bD -id -ip -iA -iK -iA -iM -aO -bD -iX -jl -jk -jY -iX -jn -kU -kR -kE -kc -iX -lT -jk -jl -iX -bD -mb -mj -mn -mn -mD -mJ -mo -mn -mn -mn -mE -mZ -mv -mv -XE -ak -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(139,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -bD -aO -eF -cp -fL -gz -gV -cp -bD -eF -hX -id -ip -iA -iK -iN -iM -id -eH -iX -iX -iX -iX -iX -jn -kE -kR -kE -lA -iX -iX -iX -iX -iX -bD -mb -mk -mn -mn -mE -mb -mi -mn -mn -mn -mE -mY -mY -mY -mY -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(140,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -aH -aH -aH -aH -aH -aH -aH -aH -ad -ad -ad -ad -aH -bD -ee -ee -cp -fM -cp -fM -cp -bD -ee -ee -id -ip -iA -iA -iO -iM -iR -iU -iX -jm -jE -jE -jE -kD -kE -kE -lo -lB -jE -jE -jE -lX -iX -lZ -mb -ml -mn -mn -mF -mK -mP -mn -mn -mn -mU -mb -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(141,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -aH -aO -ch -bm -bD -bD -bD -aH -ad -ad -ad -aH -aH -bD -ef -eG -cp -fL -gA -gV -cp -bD -aO -hY -id -id -iA -iL -iA -iP -iR -iU -iY -jn -kE -kE -kt -kE -kE -kE -kU -kE -kE -kE -kE -lz -iX -bD -mb -mi -mn -mn -mF -mL -mP -mn -mn -mn -mE -mY -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(142,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ar -ar -ar -ar -ar -aP -ar -ar -ar -ar -bD -aH -ad -ad -ad -aH -bD -bD -dy -bD -cp -fL -eZ -gV -cp -bD -dy -bD -bD -id -iB -iM -iB -iM -iS -iU -iX -jo -kE -kE -kE -kE -kE -kE -kE -kE -kE -kU -kU -kc -iX -hD -mb -mi -mn -mn -mG -mb -mQ -mn -mn -mn -mE -mY -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(143,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ar -at -at -aD -Vw -aQ -aZ -bn -bE -ar -bD -aH -ad -ad -ad -aH -bD -cp -cp -eH -cp -va -gB -va -cp -eH -cp -cp -bD -id -iC -iM -iC -iM -iR -iU -iX -jn -kE -ka -ku -kF -kV -lc -lp -lp -lN -lU -lU -lY -aP -bD -mb -mi -mn -mn -mG -mb -mQ -mn -mn -mn -mE -mY -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(144,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ap -cf -ws -cf -Vw -Uy -MI -ba -bF -ar -bD -aH -aH -aH -aH -aH -bD -cp -eh -eI -eI -fN -gC -fC -eI -eI -hL -cp -bD -id -id -id -id -id -id -eH -iX -Jc -kR -IO -iX -iX -iX -iX -iX -iX -iX -iX -iX -iX -iX -bD -aP -mi -mn -mn -mF -mM -mP -mn -mn -mn -mE -mY -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(145,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ar -cA -OH -FG -ar -uF -uF -bo -bN -ar -bD -bD -bD -bD -bD -bD -dy -cp -ei -eJ -fk -fO -eZ -gX -fk -eJ -hM -cp -dy -bD -bD -bD -bD -bD -dZ -bD -iX -jn -kE -kc -iX -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD -mb -ml -mn -mn -mF -mL -mP -mn -mn -mn -mV -mb -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(146,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ar -aL -aL -aL -ar -ar -ap -ba -bN -ar -ar -cp -cp -eJ -cp -UA -cp -cp -ej -eK -eJ -eJ -eZ -eJ -eJ -hC -hM -cp -cp -eH -iD -iD -iD -iD -iD -iD -iD -hO -hZ -hA -iD -eH -iD -iD -iD -iD -iD -iD -iD -iD -iD -iD -iD -mi -mn -mn -mE -mb -mi -mn -mn -mn -mE -mY -mY -mY -mY -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(147,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ar -OF -cA -LA -aL -DP -AQ -ba -bI -bV -bn -cq -eJ -eJ -Bx -dl -dl -cZ -ek -eL -eJ -eJ -eZ -eJ -eJ -hA -hO -hZ -hZ -ir -hZ -hZ -hZ -hZ -hZ -hZ -hA -hl -hl -hl -hO -ir -hZ -hZ -hZ -hZ -hZ -hZ -hZ -hZ -hZ -hZ -hZ -mm -mn -mn -mH -mN -mm -mn -mn -mn -mE -mZ -mv -mv -XE -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(148,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ae -aJ -OF -XS -LA -aL -OH -Kf -bs -ba -ba -nf -cp -fm -fm -cp -fm -fm -cp -el -fm -fm -fm -eJ -hl -hl -hl -hl -hl -hl -is -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -is -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -hl -mn -mn -mn -mn -mn -mn -mn -mn -mn -mE -mY -mY -mY -mY -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(149,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ae -ar -OF -cA -LA -aL -Gv -cf -bs -bK -aB -nf -cs -cC -cC -TD -cC -cC -da -em -eN -eJ -eJ -gE -eJ -eJ -hB -hP -ia -ia -it -iE -ia -ia -ia -ia -ia -ia -jr -jI -hl -kv -it -ia -iE -ia -ia -ia -ia -ia -ia -iE -ia -ia -mo -mn -mn -mn -mn -mn -mn -mn -mn -mW -mb -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(150,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ae -ar -ar -Zl -ar -ar -ar -ap -ba -bN -ar -ar -cp -cp -cp -cp -Do -cp -cp -ei -eK -eJ -eJ -gE -eJ -eJ -hC -hM -cp -cp -eH -cp -cp -cp -cp -cp -cp -cp -js -jJ -ke -cp -eH -iD -iD -iD -iD -iD -iD -iD -iD -iD -aP -iD -mp -mx -mA -mx -mx -mx -mx -mA -mx -mX -mb -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(151,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ae -ar -yr -rj -FG -ar -xk -xk -ba -bM -ar -aO -aO -aO -aO -aO -aO -dC -cp -ei -eJ -fo -fQ -gE -gZ -fo -eJ -hM -cp -dZ -bD -aO -aO -aO -aO -aO -aO -cp -su -jK -tE -cp -bD -dC -aO -aO -aO -aO -aO -aO -aO -dC -aO -id -mb -mb -mb -mb -mb -mb -mb -mb -mb -mb -mb -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(152,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ae -ap -aw -bG -ar -ar -Rw -Rw -ba -bN -ar -aO -aH -aH -aH -aH -aH -aO -cp -en -eO -eO -fR -gG -ha -eO -eO -hQ -cp -bD -aH -aH -aH -aH -aH -aH -aO -cp -js -jI -ke -cp -bD -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(153,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ae -ar -ax -aB -aB -aB -aW -bi -bw -bO -ar -aO -aH -ad -ad -ad -aH -aO -cp -cp -cp -cp -Km -cp -Qz -cp -cp -cp -cp -bD -aH -ad -ad -ad -ad -aH -aO -cp -js -jJ -ke -cp -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(154,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ae -ar -ar -aC -aC -aC -ar -ar -ar -ar -ar -aO -aH -ad -ad -ad -aH -aO -aO -aH -aH -cp -fT -gE -hc -cp -aH -aH -bD -bD -aH -ad -ad -ad -ad -aH -aO -cp -wM -cp -Qd -cp -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(155,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -bx -bP -bx -ch -aH -ad -ad -ad -aH -aH -aO -aO -aO -aP -fT -gG -hc -aP -bD -bD -bD -aH -aH -ad -ad -ad -ad -aH -aO -cp -js -jM -ke -cp -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(156,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -bj -aH -aH -aH -aH -aH -ad -ad -ad -ad -aH -aH -aH -eP -cp -Uu -cp -WR -cp -hD -aH -aH -aH -ad -ad -ad -ad -ad -aH -aO -cp -js -jI -ke -cp -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(157,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -cp -fT -gH -hc -cp -bD -aH -ad -ad -ad -ad -ad -ad -ad -aH -aO -cp -jt -cp -kf -cp -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(158,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -aH -aH -aH -aH -aH -aH -aO -cp -fT -gE -hc -cp -bD -aH -aH -aH -aH -aH -aH -ad -aH -aH -aO -iW -jh -jN -kg -iW -bD -aH -aH -aH -aH -aH -aH -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(159,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -aH -aO -aO -aO -aO -aO -aO -cp -fS -cp -hb -cp -bD -bD -bD -bD -bD -bD -aH -ad -aH -aO -aO -iW -jh -jw -kg -iW -bD -bD -bD -bD -bD -bD -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(160,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ae -ae -ae -ae -ae -ad -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -do -do -do -do -do -fq -gI -hn -do -do -do -do -do -do -bD -aH -ad -aH -aO -iW -iW -jh -jw -kg -iW -iW -iW -iW -iW -iW -iW -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(161,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -dD -fW -fW -do -fp -fV -fW -he -hm -do -fW -fW -dD -do -bD -aH -ad -aH -aO -iW -iZ -jv -jw -ki -kw -jf -kW -ld -lq -lC -iW -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(162,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -dE -fW -fW -eQ -fq -fW -fW -fW -hn -hE -fW -fW -ih -do -bD -aH -ad -aH -aO -iW -ja -jw -jw -jw -kg -kL -jh -jw -jw -lD -iW -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(163,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -dF -hg -eo -hF -fr -fW -fW -fW -ho -hF -eo -hg -dF -do -bD -aH -ad -aH -aO -iW -ja -jw -jw -jQ -kg -kM -jh -jw -jw -kg -iW -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(164,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -do -do -do -do -fr -fX -fX -fX -ho -do -do -do -do -do -bD -aH -ad -aH -aO -iW -jb -jw -jw -jw -kg -jR -je -le -ls -lE -iW -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(165,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -dD -fW -fW -do -fq -fW -fX -fW -hn -do -fW -fW -dD -do -bD -aH -ad -aH -aO -iW -jc -jw -jw -jw -ky -jf -jR -jR -jR -jR -iW -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(166,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -dE -fW -fW -eQ -fq -fW -fX -fW -hn -hE -fW -fW -ih -do -bD -aH -ad -aH -aO -iW -jd -jw -jw -jw -kz -jR -kY -jz -jz -kw -iW -hD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(167,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -dF -hg -eo -hF -fr -fW -fX -fW -ho -hF -eo -hg -dF -do -bD -aH -ad -aH -aO -iW -ja -jw -jw -jw -kg -kM -jh -jw -jw -kg -aP -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(168,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -do -do -do -do -ft -fZ -fZ -fX -ho -do -do -do -do -do -bD -aH -ad -aH -aO -iW -ja -jw -jw -jw -kg -kL -jh -jw -jw -lD -iW -lW -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(169,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -dG -dU -ep -do -fu -ga -gM -hf -he -hG -hG -hG -ii -do -iF -aH -ad -aH -aO -iW -je -jx -jx -jx -ko -jf -je -jx -jx -ko -iW -aO -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(170,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -fW -fW -fW -eS -fq -gb -gN -hg -fW -fW -fW -fW -hn -do -bD -aH -ad -aH -aO -iW -jf -jy -jR -jR -jf -jf -kB -jy -kL -jf -iW -aO -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(171,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -fW -fW -fW -eS -fq -fW -gO -hh -fW -fW -fW -fW -hn -do -hD -aH -ad -aH -aO -iW -jg -jz -jS -kl -jf -kN -jz -jz -jz -lH -iW -aO -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(172,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -dJ -dV -eq -do -fv -gc -gP -gP -hr -hH -hR -hR -ik -iv -bD -aH -ad -aH -aO -iW -jh -jw -jw -km -kB -kO -jw -jw -jw -lI -iW -aO -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(173,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -aO -aH -ad -aH -aO -iW -jh -jA -jw -kn -kB -kO -jw -lk -jw -kg -iW -aO -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(174,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aH -ad -aH -aO -iW -je -jB -jx -ko -jf -je -lb -ll -lx -lJ -iW -aO -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(175,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -ad -aH -aO -iW -iW -iW -iW -iW -iW -iW -iW -iW -iW -iW -iW -aO -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(176,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(177,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(178,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(179,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(180,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(181,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(182,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(183,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(184,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(185,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(186,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(187,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(188,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(189,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(190,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(191,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -ae -ae -ae -ae -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(192,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -ae -ae -ae -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(193,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -ae -ae -ae -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(194,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -ae -ae -ae -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(195,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(196,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ae -ae -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(197,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ae -ae -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(198,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(199,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(200,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(201,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(202,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(203,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(204,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(205,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(206,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(207,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(208,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(209,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(210,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(211,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(212,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(213,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(214,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(215,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(216,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(217,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(218,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(219,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(220,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(221,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(222,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(223,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(224,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(225,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aX -ac -ac -ac -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(226,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -bk -ac -ac -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(227,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -by -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(228,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(229,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(230,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ac -ab -ab -aa -aa -aa -aa -aa -aa -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(231,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(232,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(233,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ac -ac -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(234,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ac -ac -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(235,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(236,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(237,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(238,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(239,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(240,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(241,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -ac -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(242,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(243,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(244,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(245,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(246,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(247,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(248,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(249,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(250,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(251,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(252,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(253,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(254,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(255,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm index 24b7983c031..e464f86bc22 100644 --- a/_maps/RandomZLevels/snowdin.dmm +++ b/_maps/RandomZLevels/snowdin.dmm @@ -95,10 +95,6 @@ "az" = ( /turf/closed/wall, /area/awaymission/snowdin/post/research) -"aA" = ( -/obj/effect/turf_decal/delivery, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) "aB" = ( /obj/structure/table, /obj/item/pen, @@ -437,6 +433,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/awaymission/snowdin/post/research) +"bG" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/item/storage/toolbox/electrical{ + pixel_x = 4; + pixel_y = 8 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/engineering) "bH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ dir = 4; @@ -1012,13 +1021,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) -"dc" = ( -/obj/structure/door_assembly/door_assembly_min{ - anchored = 1; - name = "broken airlock" - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "dd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ dir = 4; @@ -1207,6 +1209,13 @@ }, /turf/open/floor/iron, /area/awaymission/snowdin/post/dorm) +"dF" = ( +/obj/machinery/door/airlock/external/glass/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "dG" = ( /obj/machinery/light/directional/south, /turf/open/floor/plating, @@ -1215,12 +1224,6 @@ /obj/structure/table, /turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) -"dJ" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "dK" = ( /turf/closed/wall, /area/awaymission/snowdin/post) @@ -1690,10 +1693,11 @@ /turf/open/floor/wood, /area/awaymission/snowdin/outside) "fq" = ( -/obj/machinery/holopad, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "fr" = ( /turf/open/lava/plasma, /area/awaymission/snowdin/cave/cavern) @@ -1763,28 +1767,10 @@ }, /turf/open/floor/iron/white, /area/awaymission/snowdin/post) -"fB" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) "fD" = ( /obj/effect/spawner/random/structure/crate_abandoned, /turf/open/floor/plating/snowed/cavern, /area/awaymission/snowdin/cave/cavern) -"fE" = ( -/obj/machinery/conveyor{ - id = "snowdin_belt_mine" - }, -/obj/machinery/light/small/directional/east, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/post/mining_dock) "fF" = ( /turf/open/floor/iron, /area/awaymission/snowdin/post/gateway) @@ -1854,6 +1840,12 @@ }, /turf/open/floor/iron, /area/awaymission/snowdin/post/hydro) +"fU" = ( +/obj/machinery/conveyor{ + id = "snowdin_belt_mine" + }, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "fV" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ piping_layer = 4; @@ -1910,6 +1902,19 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/cave) +"gg" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "gh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ piping_layer = 4; @@ -2270,12 +2275,8 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) "hf" = ( -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) +/turf/open/floor/plating/elevatorshaft, +/area/awaymission/snowdin/post/mining_main/mechbay) "hg" = ( /obj/item/shard, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -2283,13 +2284,6 @@ }, /turf/open/floor/iron/white, /area/awaymission/snowdin/post) -"hh" = ( -/obj/structure/plasticflaps, -/obj/machinery/conveyor{ - id = "snowdin_belt_mine" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) "hj" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -2589,8 +2583,8 @@ /area/awaymission/snowdin/post/hydro) "hZ" = ( /obj/item/gun/ballistic/rifle/boltaction, -/obj/item/ammo_box/a762, -/obj/item/ammo_box/a762, +/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/strilka310, /obj/structure/closet/secure_closet{ icon_state = "sec"; name = "security officer's locker"; @@ -3304,14 +3298,6 @@ /obj/item/storage/toolbox/mechanical/old, /turf/open/floor/plating, /area/awaymission/snowdin/post/garage) -"jN" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4; - piping_layer = 4 - }, -/obj/structure/sign/warning/xeno_mining/directional/east, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) "jO" = ( /mob/living/basic/blankbody{ desc = "It's Jacob Ullman, but their flesh has an ashy texture, and their face is featureless save an eerie smile."; @@ -3581,20 +3567,6 @@ }, /turf/open/floor/iron/showroomfloor, /area/awaymission/snowdin/post/dorm) -"kC" = ( -/obj/structure/ore_box, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"kD" = ( -/obj/structure/sign/warning/no_smoking/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "kF" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 @@ -3734,10 +3706,13 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/garage) "la" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "lb" = ( /obj/machinery/light/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ @@ -3757,11 +3732,6 @@ /obj/machinery/space_heater, /turf/open/floor/plating, /area/awaymission/snowdin/post/garage) -"le" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "lf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ dir = 9; @@ -3782,12 +3752,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/showroomfloor, /area/awaymission/snowdin/post/dorm) -"li" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "lj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ dir = 9; @@ -4455,13 +4419,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/snowdin/post/garage) -"mD" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "mE" = ( /obj/structure/table, /turf/open/floor/iron/dark, @@ -4693,14 +4650,6 @@ /obj/effect/baseturf_helper/asteroid/snow, /turf/closed/wall, /area/awaymission/snowdin/post/engineering) -"nm" = ( -/obj/item/shard, -/obj/item/stack/rods{ - amount = 2 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) "no" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/yellow/half/contrasted{ @@ -4797,12 +4746,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/plating, /area/awaymission/snowdin/post/secpost) -"nI" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "nJ" = ( /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 8 @@ -5203,6 +5146,13 @@ /obj/structure/cable, /turf/closed/wall/ice, /area/awaymission/snowdin/post/engineering) +"oZ" = ( +/obj/machinery/conveyor{ + dir = 10; + id = "snowdin_belt_mine" + }, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "pa" = ( /turf/closed/wall/ice, /area/awaymission/snowdin/post/cavern2) @@ -5216,11 +5166,6 @@ /obj/item/pen, /turf/open/floor/iron/grimy, /area/awaymission/snowdin/post/cavern2) -"pc" = ( -/obj/structure/spider/stickyweb, -/mob/living/basic/giant_spider/hunter/ice, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) "pd" = ( /obj/structure/bed, /turf/open/floor/iron/grimy, @@ -5734,12 +5679,6 @@ /obj/structure/closet/secure_closet/freezer/fridge/open, /turf/open/floor/iron/cafeteria, /area/awaymission/snowdin/post/cavern2) -"qJ" = ( -/obj/structure/closet/crate/preopen, -/obj/item/storage/toolbox/emergency, -/obj/item/clothing/suit/hooded/wintercoat, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) "qK" = ( /obj/structure/rack, /obj/item/storage/box/lethalshot, @@ -5874,10 +5813,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/snowdin/post/cavern2) -"rg" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) "rh" = ( /obj/structure/window/spawner/directional/south, /turf/open/floor/engine/cult, @@ -5887,6 +5822,11 @@ /obj/structure/table, /turf/open/floor/iron/cafeteria, /area/awaymission/snowdin/post/cavern2) +"rj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "rk" = ( /obj/structure/rack, /turf/open/floor/plating, @@ -6128,6 +6068,14 @@ }, /turf/open/floor/plating, /area/awaymission/snowdin/post/cavern2) +"se" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/awaymission/snowdin/post) "sf" = ( /obj/machinery/computer/monitor, /obj/structure/cable, @@ -6199,6 +6147,14 @@ }, /turf/open/floor/plating/snowed/cavern, /area/awaymission/snowdin/cave/cavern) +"sr" = ( +/obj/structure/plasticflaps, +/obj/machinery/conveyor{ + dir = 8; + id = "snowdin_belt_mine" + }, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "ss" = ( /obj/structure/cable, /turf/open/floor/engine/cult, @@ -6219,6 +6175,17 @@ /obj/structure/cable, /turf/open/floor/plating, /area/awaymission/snowdin/post/cavern2) +"sv" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) +"sx" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "sz" = ( /obj/machinery/door/poddoor{ id = "snowdinturbinegas"; @@ -6288,17 +6255,11 @@ /turf/open/floor/iron/dark/snowdin, /area/awaymission/snowdin/outside) "sL" = ( -/obj/machinery/computer/shuttle/snowdin/mining{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) +/obj/machinery/door/airlock/maintenance, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "sO" = ( /obj/structure/fence{ dir = 4 @@ -6410,12 +6371,6 @@ /obj/structure/window/spawner/directional/east, /turf/open/floor/iron/showroomfloor, /area/awaymission/snowdin/post/cavern2) -"tj" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "tk" = ( /obj/structure/toilet{ dir = 1 @@ -6429,11 +6384,6 @@ }, /turf/open/floor/iron/dark/snowdin, /area/awaymission/snowdin/outside) -"tn" = ( -/obj/structure/ore_box, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "tp" = ( /turf/closed/wall/mineral/snow, /area/awaymission/snowdin/cave/cavern) @@ -6462,10 +6412,22 @@ /obj/structure/barricade/wooden/crude/snow, /turf/open/floor/plating/snowed/cavern, /area/awaymission/snowdin/cave/cavern) +"tx" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "tz" = ( /mob/living/simple_animal/hostile/skeleton/ice, /turf/open/floor/plating/snowed/cavern, /area/awaymission/snowdin/cave/cavern) +"tD" = ( +/obj/structure/barricade/sandbags, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "tE" = ( /turf/closed/indestructible/rock/snow, /area/awaymission/snowdin/cave) @@ -6481,12 +6443,14 @@ /turf/open/floor/plating/snowed/cavern, /area/awaymission/snowdin/cave/cavern) "tS" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 4 - }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) +"tV" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) +/area/awaymission/snowdin/post/mining_main/mechbay) "tY" = ( /turf/closed/wall, /area/awaymission/snowdin/post/cavern1) @@ -6546,6 +6510,25 @@ /obj/structure/cable, /turf/open/floor/plating, /area/awaymission/snowdin/post/cavern1) +"ut" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8; + piping_layer = 4; + pixel_x = 5; + pixel_y = 5 + }, +/obj/structure/table, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/item/stack/sheet/iron/fifty{ + pixel_x = -1; + pixel_y = 1 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/engineering) "ux" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 @@ -6594,6 +6577,10 @@ "uI" = ( /turf/closed/wall/ice, /area/awaymission/snowdin/post/cavern1) +"uJ" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "uK" = ( /obj/structure/cable, /mob/living/simple_animal/hostile/skeleton/plasmaminer, @@ -6617,6 +6604,11 @@ /obj/effect/spawner/structure/electrified_grille, /turf/open/floor/plating, /area/awaymission/snowdin/post/cavern1) +"uP" = ( +/obj/machinery/holopad, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "uS" = ( /mob/living/simple_animal/hostile/skeleton/plasmaminer, /obj/effect/mapping_helpers/broken_floor, @@ -6773,6 +6765,15 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/showroomfloor, /area/awaymission/snowdin/post/dorm) +"vz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "vA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/closed/wall/ice, @@ -6808,18 +6809,14 @@ /turf/open/floor/plating/snowed/cavern, /area/awaymission/snowdin/post/cavern1) "vH" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/item/storage/toolbox/electrical{ - pixel_x = 4; - pixel_y = 8 +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 }, /turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) +/area/awaymission/snowdin/post/mining_main/mechbay) "vL" = ( /turf/closed/wall/mineral/titanium, /area/awaymission/snowdin/post/broken_shuttle) @@ -6832,6 +6829,14 @@ /obj/effect/baseturf_helper/asteroid/snow, /turf/open/floor/plating, /area/awaymission/snowdin/post/broken_shuttle) +"vQ" = ( +/obj/structure/ore_box, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "vR" = ( /obj/structure/sign/nanotrasen, /turf/closed/wall/mineral/titanium, @@ -6893,47 +6898,24 @@ /obj/machinery/light/small/directional/east, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/cave) -"wt" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"ww" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/structure/table, -/obj/item/stack/sheet/glass/fifty{ - pixel_x = 1; - pixel_y = -1 - }, -/obj/item/stack/sheet/iron/fifty{ - pixel_x = -1; - pixel_y = 1 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) "wx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"wz" = ( -/obj/machinery/conveyor{ - dir = 10; - id = "snowdin_belt_mine" - }, +/obj/machinery/power/smes/engineering, +/obj/structure/cable, /turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) +/area/awaymission/snowdin/post/mining_main/mechbay) +"wz" = ( +/obj/machinery/door/airlock/mining/glass{ + name = "Mining Dock" + }, +/obj/effect/mapping_helpers/airlock/access/all/supply/mining, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) +"wB" = ( +/obj/machinery/computer/monitor, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "wD" = ( /turf/closed/wall, /area/awaymission/snowdin/post/mining_dock) @@ -7078,6 +7060,14 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/plating/snowed, /area/awaymission/snowdin/cave) +"xo" = ( +/mob/living/basic/mining/basilisk, +/turf/open/misc/asteroid/snow{ + floor_variance = 0; + icon_state = "snow_dug"; + slowdown = 1 + }, +/area/awaymission/snowdin/cave/mountain) "xp" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 8 @@ -7088,6 +7078,13 @@ /obj/machinery/light/small/broken/directional/east, /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/post/cavern1) +"xr" = ( +/obj/effect/baseturf_helper/asteroid/snow{ + baseturf = /turf/open/misc/asteroid/snow/ice; + name = "asteroid snowice baseturf editor" + }, +/turf/closed/wall/ice, +/area/awaymission/snowdin/post/mining_main/mechbay) "xs" = ( /obj/item/gun/energy/e_gun{ dead_cell = 1 @@ -7195,13 +7192,6 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/plating/snowed, /area/awaymission/snowdin/cave) -"xG" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "xH" = ( /obj/structure/bed{ dir = 4 @@ -7225,6 +7215,11 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) +"xK" = ( +/obj/item/disk/holodisk/snowdin/ripjacob, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "xL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ dir = 8 @@ -7250,6 +7245,10 @@ }, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) +"xP" = ( +/obj/item/shard, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "xQ" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -7296,6 +7295,15 @@ "xW" = ( /turf/closed/wall/ice, /area/awaymission/snowdin/post/mining_dock) +"xX" = ( +/obj/machinery/door/firedoor, +/obj/structure/grille/broken, +/obj/item/stack/rods{ + amount = 2 + }, +/obj/item/shard, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "xY" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/firedoor, @@ -7535,10 +7543,6 @@ slowdown = 1 }, /area/awaymission/snowdin/outside) -"yN" = ( -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "yO" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -7570,12 +7574,6 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/awaymission/snowdin/post/mining_dock) -"yV" = ( -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "yW" = ( /turf/closed/wall/ice, /area/awaymission/snowdin/post/minipost) @@ -7596,6 +7594,10 @@ }, /turf/open/floor/engine/plasma, /area/awaymission/snowdin/cave) +"zb" = ( +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "zc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ dir = 8 @@ -7622,28 +7624,11 @@ /turf/open/floor/plating/snowed, /area/awaymission/snowdin/cave) "zg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/storage/box{ - illustration = "donk_kit"; - name = "box of donkpockets" - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"zi" = ( -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ +/obj/effect/turf_decal/tile/neutral{ dir = 1 }, /turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) +/area/awaymission/snowdin/post/mining_main/mechbay) "zj" = ( /obj/effect/turf_decal/stripes/corner, /obj/structure/fence/corner{ @@ -7739,6 +7724,14 @@ }, /turf/open/floor/wood, /area/awaymission/snowdin/igloo) +"zF" = ( +/obj/machinery/airalarm/directional/north, +/obj/structure/sign/warning/docking/directional/east, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "zG" = ( /obj/machinery/space_heater, /obj/structure/cable, @@ -7785,12 +7778,6 @@ /obj/structure/rack, /turf/open/floor/plating/snowed, /area/awaymission/snowdin/cave) -"zO" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 8 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/post/mining_dock) "zQ" = ( /obj/item/hatchet{ pixel_x = 4; @@ -7974,12 +7961,6 @@ /mob/living/simple_animal/hostile/skeleton/eskimo, /turf/open/floor/wood, /area/awaymission/snowdin/igloo) -"AB" = ( -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "AC" = ( /obj/machinery/door/airlock/external/glass/ruin, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -8069,6 +8050,10 @@ /obj/item/stack/sheet/iron, /turf/open/floor/plating/snowed/smoothed, /area/awaymission/snowdin/post/minipost) +"AS" = ( +/mob/living/basic/migo, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "AU" = ( /obj/effect/light_emitter{ name = "outdoor light"; @@ -8163,12 +8148,6 @@ }, /turf/open/floor/iron/white, /area/awaymission/snowdin/post/minipost) -"Bn" = ( -/obj/machinery/conveyor{ - id = "snowdin_belt_mine" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) "Bo" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -8411,6 +8390,12 @@ }, /turf/open/floor/plating/snowed, /area/awaymission/snowdin/cave) +"Ci" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "Cj" = ( /obj/structure/fence{ dir = 4 @@ -8425,6 +8410,13 @@ "Cl" = ( /turf/closed/wall/ice, /area/awaymission/snowdin/cave/cavern) +"Cs" = ( +/obj/structure/closet/crate/preopen, +/obj/item/storage/toolbox/emergency, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "Ct" = ( /turf/closed/wall/mineral/plastitanium, /area/awaymission/snowdin/outside) @@ -8436,10 +8428,23 @@ /obj/effect/turf_decal/weather/snow, /turf/open/floor/plating/snowed, /area/awaymission/snowdin/outside) +"Cw" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/sign/nanotrasen{ + pixel_y = -32 + }, +/turf/open/misc/asteroid/snow/ice, +/area/awaymission/snowdin/cave/cavern) "Cx" = ( /obj/machinery/light/small/broken/directional/west, /turf/open/floor/carpet, /area/awaymission/snowdin/post/dorm) +"Cz" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "CA" = ( /obj/structure/bonfire/prelit{ burn_icon = "bonfire_warm" @@ -8501,11 +8506,6 @@ }, /turf/open/floor/iron/dark, /area/awaymission/snowdin/cave) -"CM" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "CO" = ( /obj/machinery/recharge_station, /turf/open/floor/circuit/red, @@ -8642,12 +8642,6 @@ }, /turf/open/floor/plating/snowed/smoothed, /area/awaymission/snowdin/cave) -"Dp" = ( -/obj/machinery/door/firedoor, -/obj/structure/grille/broken, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) "Dq" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -8676,6 +8670,14 @@ /obj/machinery/light/built/directional/south, /turf/open/floor/plating/snowed, /area/awaymission/snowdin/cave) +"Dz" = ( +/obj/machinery/light/small/directional/west, +/obj/item/stack/rods{ + amount = 2 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "DA" = ( /obj/item/stack/rods, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -8739,6 +8741,15 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/plating/snowed, /area/awaymission/snowdin/cave) +"DV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "DX" = ( /obj/item/shard, /obj/effect/turf_decal/weather/snow, @@ -8771,13 +8782,11 @@ /turf/open/floor/mineral/plastitanium/red, /area/awaymission/snowdin/cave) "Eh" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Mining Dock" +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 8 }, -/obj/effect/mapping_helpers/airlock/access/all/supply/mining, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) +/turf/open/floor/plating/snowed/cavern, +/area/awaymission/snowdin/post/mining_main/mechbay) "Ej" = ( /obj/structure/grille/broken, /obj/item/stack/rods, @@ -8924,6 +8933,10 @@ }, /turf/open/floor/iron/dark, /area/awaymission/snowdin/cave) +"EL" = ( +/mob/living/basic/spider/giant/nurse/ice, +/turf/open/misc/asteroid/snow/ice, +/area/awaymission/snowdin/cave/cavern) "EM" = ( /obj/structure/table/optable, /obj/effect/turf_decal/bot_white, @@ -8978,10 +8991,6 @@ }, /turf/open/floor/plating/snowed/cavern, /area/awaymission/snowdin/cave/cavern) -"EY" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) "EZ" = ( /obj/effect/turf_decal/weather/snow, /obj/effect/light_emitter{ @@ -8991,6 +9000,16 @@ }, /turf/open/floor/plating/snowed, /area/awaymission/snowdin/outside) +"Fc" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) +"Ff" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "Fg" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/loading_area, @@ -9002,17 +9021,17 @@ /obj/vehicle/ridden/atv, /turf/open/floor/plating/snowed/smoothed, /area/awaymission/snowdin/outside) +"Fi" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "Fj" = ( /obj/effect/turf_decal/bot, /turf/open/floor/plating/snowed/smoothed, /area/awaymission/snowdin/outside) -"Fm" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "Fn" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/machinery/portable_atmospherics/canister/plasma, @@ -9027,19 +9046,6 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/plating/snowed, /area/awaymission/snowdin/outside) -"Fq" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"Fs" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "Ft" = ( /obj/structure/fence/door, /turf/open/misc/asteroid/snow, @@ -9095,15 +9101,21 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating/snowed, /area/awaymission/snowdin/outside) +"FQ" = ( +/obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) +"FS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "FT" = ( /obj/structure/ore_box, /turf/closed/mineral/snowmountain/cavern, /area/awaymission/snowdin/cave/cavern) -"FV" = ( -/obj/item/disk/holodisk/snowdin/ripjacob, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) "FZ" = ( /turf/closed/wall/ice, /area/awaymission/snowdin/post/mining_main) @@ -9153,6 +9165,12 @@ "Gq" = ( /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_main) +"Gr" = ( +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "Gt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ dir = 1 @@ -9296,6 +9314,19 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_main/robotics) +"Ha" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) +"Hb" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "Hc" = ( /obj/structure/table, /obj/item/storage/toolbox/mechanical{ @@ -9371,10 +9402,12 @@ /obj/machinery/holopad, /turf/open/floor/iron/white, /area/awaymission/snowdin/post/mining_main/robotics) -"Hv" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted, +"Hw" = ( +/obj/structure/sign/warning/no_smoking/directional/south, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) +/area/awaymission/snowdin/post/mining_main/mechbay) "Hy" = ( /obj/machinery/door/airlock/research/glass{ name = "Mech Lab" @@ -9525,6 +9558,12 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/awaymission/snowdin/post/mining_main/robotics) +"Ih" = ( +/obj/machinery/door/firedoor, +/obj/structure/grille/broken, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "Ij" = ( /obj/effect/turf_decal/bot, /turf/open/floor/iron/recharge_floor, @@ -9542,11 +9581,6 @@ /obj/machinery/mech_bay_recharge_port, /turf/open/floor/iron/dark, /area/awaymission/snowdin/post/mining_main/mechbay) -"In" = ( -/obj/vehicle/sealed/mecha/ripley/mining, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/recharge_floor, -/area/awaymission/snowdin/post/mining_main/mechbay) "Io" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -9615,6 +9649,13 @@ }, /turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) +"ID" = ( +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "IE" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -9652,6 +9693,12 @@ /obj/structure/flora/grass/both/style_random, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) +"IN" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "IQ" = ( /obj/effect/spawner/random/structure/crate_abandoned, /obj/effect/mapping_helpers/broken_floor, @@ -9718,6 +9765,15 @@ }, /turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) +"Jd" = ( +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) +"Jf" = ( +/obj/structure/sign/warning/electric_shock/directional/east, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "Ji" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -9731,20 +9787,30 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_main) -"Jk" = ( -/obj/machinery/mineral/processing_unit{ - dir = 1 - }, +"Jm" = ( /obj/machinery/conveyor{ id = "snowdin_belt_mine" }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"Jl" = ( -/obj/structure/barricade/sandbags, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) +/obj/machinery/light/small/directional/east, +/turf/open/misc/asteroid/snow/ice, +/area/awaymission/snowdin/post/mining_main/mechbay) +"Jn" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) +"Jo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 5 + }, +/obj/structure/spider/stickyweb, +/mob/living/basic/spider/giant/hunter/ice, +/turf/open/floor/iron/freezer, +/area/awaymission/snowdin/post/kitchen) "Jq" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -9800,6 +9866,13 @@ }, /turf/open/floor/iron, /area/awaymission/snowdin/post/mining_main) +"JJ" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "JL" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 1 @@ -9838,6 +9911,10 @@ "JQ" = ( /turf/open/floor/plating/elevatorshaft, /area/awaymission/snowdin/post/mining_main) +"JS" = ( +/obj/machinery/holopad, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "JU" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -9905,6 +9982,12 @@ }, /turf/open/floor/iron, /area/awaymission/snowdin/post/mining_main) +"Ks" = ( +/obj/structure/closet/crate/preopen, +/obj/item/storage/toolbox/emergency, +/obj/item/clothing/suit/hooded/wintercoat, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "Kv" = ( /obj/structure/fence/corner, /turf/open/misc/asteroid/snow, @@ -9942,10 +10025,6 @@ /obj/structure/flora/grass/both/style_random, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/cave) -"KH" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "KI" = ( /obj/structure/table, /obj/item/storage/toolbox/mechanical, @@ -10034,13 +10113,6 @@ /obj/effect/turf_decal/tile/brown/anticorner/contrasted, /turf/open/floor/iron, /area/awaymission/snowdin/post/mining_main) -"Ld" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "Lf" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -10066,12 +10138,9 @@ /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) "Lj" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, +/obj/machinery/light/directional/west, /turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) +/area/awaymission/snowdin/post/mining_main/mechbay) "Lk" = ( /obj/machinery/button/door/directional/west{ id = "snowdindormabandoned1"; @@ -10136,13 +10205,10 @@ /obj/structure/cable, /turf/open/floor/plating, /area/awaymission/snowdin/post/minipost) -"LH" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/post/mining_dock) +"LG" = ( +/obj/structure/sign/warning/docking/directional/east, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "LI" = ( /obj/effect/turf_decal/weather/snow, /obj/effect/decal/cleanable/blood/drip, @@ -10164,6 +10230,14 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating, /area/awaymission/snowdin/post) +"LL" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/research) "LM" = ( /obj/effect/mob_spawn/corpse/human/assistant, /turf/open/misc/asteroid/snow/ice, @@ -10237,10 +10311,16 @@ }, /area/awaymission/snowdin/cave/cavern) "Md" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 4 + }, /turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) +/area/awaymission/snowdin/post/mining_main/mechbay) +"Mf" = ( +/obj/item/shard, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "Mg" = ( /obj/structure/table, /obj/item/clothing/neck/stethoscope, @@ -10251,6 +10331,18 @@ }, /turf/open/floor/iron/white, /area/awaymission/snowdin/post) +"Mh" = ( +/obj/machinery/computer/shuttle/snowdin/mining{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "Mj" = ( /obj/structure/chair{ dir = 4 @@ -10258,6 +10350,14 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/cafeteria, /area/awaymission/snowdin/post/messhall) +"Mk" = ( +/obj/structure/ore_box, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "Ml" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ dir = 8 @@ -10265,35 +10365,34 @@ /obj/structure/cable, /turf/open/floor/iron, /area/awaymission/snowdin/post/engineering) -"Mo" = ( -/mob/living/simple_animal/hostile/asteroid/basilisk, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave/mountain) "Mq" = ( /obj/effect/turf_decal/weather/snow, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark/snowdin, /area/awaymission/snowdin/cave) "Ms" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/caution/stand_clear{ - dir = 8 +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ + piping_layer = 4; + pixel_x = 5; + pixel_y = 5 }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"Mw" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "snowdin_belt_mine" +/obj/item/storage/box{ + name = "box of donkpockets" }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/kitchen) +"Mt" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "Mz" = ( /obj/structure/fence, /turf/open/misc/asteroid/snow, @@ -10309,10 +10408,6 @@ }, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) -"MD" = ( -/obj/structure/sign/warning/docking/directional/east, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) "MG" = ( /obj/effect/decal/remains/human, /obj/effect/decal/cleanable/blood/old, @@ -10343,14 +10438,18 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/plating, /area/awaymission/snowdin/post/kitchen) -"MM" = ( +"ML" = ( /obj/structure/plasticflaps, /obj/machinery/conveyor{ - dir = 8; id = "snowdin_belt_mine" }, /turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) +/area/awaymission/snowdin/post/mining_main/mechbay) +"MM" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "MN" = ( /obj/item/stack/rods, /turf/open/misc/asteroid/snow, @@ -10428,39 +10527,12 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/carpet, /area/awaymission/snowdin/post/dorm) -"Nc" = ( -/obj/machinery/door/firedoor, -/obj/structure/holosign/barrier/atmos, -/obj/structure/grille/broken, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"Nd" = ( -/obj/docking_port/stationary{ - dir = 4; - dwidth = 2; - height = 5; - shuttle_id = "snowdin_mining_down"; - name = "snowdin mining bottom"; - width = 5 - }, -/turf/open/floor/plating/elevatorshaft, -/area/awaymission/snowdin/post/mining_dock) "Nf" = ( /obj/structure/fence/corner{ dir = 6 }, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) -"Ng" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "Nh" = ( /obj/structure/closet/cabinet, /obj/item/clothing/suit/hooded/wintercoat/science, @@ -10494,12 +10566,6 @@ }, /turf/open/floor/iron, /area/awaymission/snowdin/post/hydro) -"Ns" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "Nt" = ( /obj/structure/sink/directional/west, /obj/structure/mirror/directional/east, @@ -10596,6 +10662,13 @@ /obj/effect/spawner/random/exotic/antag_gear_weak, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/cave) +"NU" = ( +/obj/machinery/door/firedoor, +/obj/structure/holosign/barrier/atmos, +/obj/structure/grille/broken, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "NV" = ( /obj/effect/turf_decal/weather/snow, /obj/effect/turf_decal/weather/snow/corner{ @@ -10604,12 +10677,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark/snowdin, /area/awaymission/snowdin/outside) -"NW" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/obj/structure/fans/tiny, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) "NX" = ( /obj/structure/noticeboard/directional/north, /obj/item/paper/crumpled/ruins/snowdin/shovel, @@ -10618,6 +10685,13 @@ }, /turf/open/floor/iron, /area/awaymission/snowdin/post) +"NZ" = ( +/obj/structure/door_assembly/door_assembly_min{ + anchored = 1; + name = "broken airlock" + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "Ob" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -10626,6 +10700,10 @@ }, /turf/open/floor/iron, /area/awaymission/snowdin/post/secpost) +"Od" = ( +/mob/living/basic/spider/giant/hunter/ice, +/turf/open/misc/asteroid/snow/ice, +/area/awaymission/snowdin/cave/cavern) "Oe" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -10680,15 +10758,6 @@ }, /turf/open/floor/iron, /area/awaymission/snowdin/post/dorm) -"Ow" = ( -/obj/machinery/door/firedoor, -/obj/structure/grille/broken, -/obj/item/stack/rods{ - amount = 2 - }, -/obj/item/shard, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) "Ox" = ( /obj/structure/table, /obj/item/disk/holodisk/snowdin/welcometodie, @@ -10718,11 +10787,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) -"OG" = ( -/obj/structure/sign/warning/electric_shock/directional/east, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) "OH" = ( /obj/effect/turf_decal/weather/snow, /obj/effect/decal/cleanable/blood/old, @@ -10752,10 +10816,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/showroomfloor, /area/awaymission/snowdin/post/dorm) -"OU" = ( -/obj/item/shard, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) "OV" = ( /obj/structure/table/wood, /turf/open/misc/asteroid/snow{ @@ -10771,6 +10831,17 @@ /obj/item/paper/fluff/awaymissions/snowdin/secnotice, /turf/open/floor/plating, /area/awaymission/snowdin/post/secpost) +"OX" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + piping_layer = 4; + pixel_x = 5; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/research) "OZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ piping_layer = 4; @@ -10850,14 +10921,6 @@ }, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) -"Pr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/obj/structure/spider/stickyweb, -/mob/living/basic/giant_spider/hunter/ice, -/turf/open/floor/iron/freezer, -/area/awaymission/snowdin/post/kitchen) "Ps" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 1 @@ -10868,6 +10931,17 @@ slowdown = 1 }, /area/awaymission/snowdin/cave) +"Pt" = ( +/obj/docking_port/stationary{ + dir = 4; + dwidth = 2; + height = 5; + shuttle_id = "snowdin_mining_down"; + name = "snowdin mining bottom"; + width = 5 + }, +/turf/open/floor/plating/elevatorshaft, +/area/awaymission/snowdin/post/mining_main/mechbay) "Pu" = ( /obj/effect/light_emitter{ name = "outdoor light"; @@ -10882,11 +10956,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_main) -"PD" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) "PH" = ( /obj/structure/closet/crate/wooden, /obj/effect/spawner/random/exotic/antag_gear, @@ -10920,6 +10989,20 @@ initial_gas_mix = "o2=22;n2=82;TEMP=180" }, /area/awaymission/snowdin/cave) +"PN" = ( +/obj/machinery/light/small/directional/north, +/obj/effect/spawner/random/structure/crate_abandoned, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) +"PO" = ( +/obj/structure/spider/stickyweb, +/mob/living/basic/spider/giant/hunter/ice, +/turf/open/misc/asteroid/snow/ice, +/area/awaymission/snowdin/cave/cavern) +"PP" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "PQ" = ( /obj/item/reagent_containers/cup/glass/bottle/beer{ list_reagents = null @@ -10965,23 +11048,6 @@ slowdown = 1 }, /area/awaymission/snowdin/outside) -"Qa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/storage/box{ - illustration = "donk_kit"; - name = "box of donkpockets" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) "Qc" = ( /obj/structure/flora/tree/stump, /obj/effect/light_emitter{ @@ -11048,6 +11114,13 @@ /obj/machinery/space_heater, /turf/open/floor/plating, /area/awaymission/snowdin/post/cavern1) +"Qu" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "Qv" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/extinguisher_cabinet/directional/south, @@ -11059,11 +11132,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/awaymission/snowdin/post/engineering) -"Qz" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/spawner/random/structure/crate_abandoned, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) +"QA" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "QB" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1; @@ -11116,9 +11191,12 @@ /turf/open/floor/iron/dark, /area/awaymission/snowdin/post/research) "QM" = ( -/mob/living/basic/giant_spider/nurse/ice, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) +/obj/machinery/door/airlock/maintenance{ + name = "Misc Storage" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "QN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ piping_layer = 4; @@ -11135,10 +11213,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/snowdin/cave) -"QP" = ( -/mob/living/simple_animal/hostile/asteroid/basilisk, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) "QQ" = ( /obj/structure/flora/grass/both/style_random, /obj/structure/flora/grass/both/style_random, @@ -11171,6 +11245,18 @@ /obj/item/storage/toolbox/mechanical, /turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) +"QX" = ( +/obj/machinery/mineral/unloading_machine{ + dir = 1; + icon_state = "unloader-corner"; + input_dir = 1; + output_dir = 2 + }, +/obj/machinery/conveyor{ + id = "snowdin_belt_mine" + }, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "QY" = ( /obj/structure/girder, /obj/effect/turf_decal/weather/snow, @@ -11194,14 +11280,6 @@ /obj/structure/barricade/wooden, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/cave) -"Rb" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/caution/stand_clear{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "Rd" = ( /obj/structure/barricade/sandbags, /turf/open/misc/asteroid/snow{ @@ -11236,6 +11314,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/awaymission/snowdin/post/mining_main) +"Rr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ + dir = 4; + piping_layer = 4 + }, +/turf/closed/wall/ice, +/area/awaymission/snowdin/post/mining_main/mechbay) "Rs" = ( /obj/item/stack/cable_coil{ amount = 1 @@ -11243,6 +11328,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/snowdin/cave) +"Rt" = ( +/mob/living/basic/mining/basilisk, +/turf/open/misc/asteroid/snow/ice, +/area/awaymission/snowdin/cave/cavern) "Ru" = ( /obj/item/shard, /turf/open/misc/asteroid/snow, @@ -11253,6 +11342,15 @@ }, /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) +"Ry" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 8 + }, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "RB" = ( /obj/effect/decal/cleanable/blood/drip, /turf/open/misc/asteroid/snow, @@ -11278,6 +11376,16 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/cafeteria, /area/awaymission/snowdin/post/messhall) +"RK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/caution/stand_clear, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "RN" = ( /obj/structure/flora/bush/snow/style_random, /obj/effect/light_emitter{ @@ -11353,10 +11461,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark/snowdin, /area/awaymission/snowdin/cave) -"Si" = ( -/mob/living/basic/giant_spider/hunter/ice, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) "Sj" = ( /obj/machinery/button/door/directional/south{ id = "snowdinturbineoutlet"; @@ -11394,6 +11498,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/awaymission/snowdin/post/mining_dock) +"Sn" = ( +/obj/machinery/power/port_gen/pacman, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "So" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/plating/snowed/smoothed, @@ -11564,14 +11673,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/snowdin/cave) -"Ta" = ( -/obj/machinery/airalarm/directional/north, -/obj/structure/sign/warning/docking/directional/east, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "Tb" = ( /obj/effect/light_emitter{ name = "outdoor light"; @@ -11590,6 +11691,12 @@ /mob/living/basic/bear/snow, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) +"Tj" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "Tk" = ( /obj/effect/turf_decal/weather/snow/corner, /turf/open/misc/asteroid/snow{ @@ -11609,24 +11716,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/awaymission/snowdin/post/mining_dock) -"To" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/caution/stand_clear, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"Tp" = ( -/obj/machinery/light/small/directional/west, -/obj/item/stack/rods{ - amount = 2 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) "Tr" = ( /obj/effect/turf_decal/weather/snow, /obj/effect/turf_decal/weather/snow/corner{ @@ -11660,20 +11749,12 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/engine/n2, /area/awaymission/snowdin/post/engineering) -"TF" = ( -/obj/item/shard, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"TH" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) +"TG" = ( +/obj/machinery/door/airlock/external/glass/ruin, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "TI" = ( /obj/structure/flora/grass/both/style_random, /turf/open/misc/asteroid/snow, @@ -11711,10 +11792,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/snowdin/cave) -"TU" = ( -/obj/machinery/holopad, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) "TW" = ( /mob/living/simple_animal/hostile/skeleton/plasmaminer, /turf/open/floor/plating/snowed/cavern, @@ -11825,14 +11902,6 @@ /obj/item/clothing/head/cone, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/cave) -"Uz" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) "UA" = ( /obj/machinery/light/small/directional/east, /obj/structure/closet/cabinet, @@ -11892,9 +11961,6 @@ /obj/structure/flora/rock/pile/icy/style_random, /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) -"UZ" = ( -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "Va" = ( /obj/structure/fence{ dir = 4 @@ -11923,11 +11989,35 @@ slowdown = 1 }, /area/awaymission/snowdin/cave) +"Vh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ + dir = 4; + piping_layer = 4; + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/storage/box{ + name = "box of donkpockets" + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/kitchen) "Vi" = ( /obj/effect/decal/cleanable/blood/old, /mob/living/basic/bear/snow, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/cave) +"Vj" = ( +/obj/item/shard, +/obj/item/stack/rods{ + amount = 2 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "Vl" = ( /obj/machinery/power/shuttle_engine/propulsion{ dir = 4 @@ -11947,10 +12037,6 @@ slowdown = 1 }, /area/awaymission/snowdin/outside) -"Vo" = ( -/mob/living/basic/giant_spider/ice, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) "Vp" = ( /obj/item/paper/crumpled/ruins/snowdin/misc1, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -11960,15 +12046,6 @@ /obj/machinery/light/broken/directional/south, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) -"Vs" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "Vt" = ( /obj/docking_port/stationary{ dir = 4; @@ -12013,19 +12090,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/snowdin/cave) -"VD" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +"VC" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "snowdin_belt_mine" }, -/obj/effect/turf_decal/caution/stand_clear{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "VE" = ( /obj/structure/table/wood, /obj/machinery/atmospherics/components/unary/vent_pump/on, @@ -12040,6 +12111,10 @@ }, /turf/open/floor/iron, /area/awaymission/snowdin/post/mining_dock) +"VH" = ( +/mob/living/basic/spider/giant/ice, +/turf/open/misc/asteroid/snow/ice, +/area/awaymission/snowdin/cave/cavern) "VJ" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, @@ -12067,18 +12142,6 @@ slowdown = 1 }, /area/awaymission/snowdin/cave) -"VR" = ( -/obj/machinery/mineral/unloading_machine{ - dir = 1; - icon_state = "unloader-corner"; - input_dir = 1; - output_dir = 2 - }, -/obj/machinery/conveyor{ - id = "snowdin_belt_mine" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) "VU" = ( /obj/structure/closet/crate/wooden, /obj/effect/spawner/random/exotic/antag_gear_weak, @@ -12098,6 +12161,12 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/plating/snowed, /area/awaymission/snowdin/cave) +"Wg" = ( +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "Wh" = ( /obj/structure/bookcase/random, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -12197,6 +12266,11 @@ /obj/structure/cable, /turf/open/floor/plating, /area/awaymission/snowdin/post/minipost) +"WK" = ( +/obj/vehicle/sealed/mecha/ripley/mining, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/recharge_floor, +/area/awaymission/snowdin/post/mining_main/mechbay) "WM" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/plating, @@ -12204,6 +12278,10 @@ "WN" = ( /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) +"WP" = ( +/obj/structure/cable, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "WR" = ( /obj/item/shard, /turf/open/misc/ice/smooth, @@ -12215,6 +12293,11 @@ }, /turf/open/floor/iron, /area/awaymission/snowdin/post/cavern1) +"WU" = ( +/obj/structure/ore_box, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/mining_main/mechbay) "WV" = ( /obj/machinery/light/small/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ @@ -12241,10 +12324,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/snowdin/cave) -"Xf" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) "Xh" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/manifold4w/pink/visible, @@ -12263,10 +12342,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/awaymission/snowdin/post/mining_main/robotics) -"Xn" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "Xo" = ( /obj/structure/flora/grass/both/style_random, /obj/effect/light_emitter{ @@ -12276,13 +12351,6 @@ }, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) -"Xr" = ( -/obj/structure/closet/crate/preopen, -/obj/item/storage/toolbox/emergency, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) "Xt" = ( /obj/structure/rack, /obj/item/storage/box/rubbershot, @@ -12301,10 +12369,6 @@ }, /turf/open/floor/iron/white, /area/awaymission/snowdin/post/minipost) -"Xz" = ( -/mob/living/basic/migo, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "XB" = ( /obj/effect/turf_decal/weather/snow/corner, /turf/open/misc/asteroid/snow{ @@ -12389,12 +12453,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/showroomfloor, /area/awaymission/snowdin/post/cavern1) -"Yc" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) "Yd" = ( /obj/machinery/light/small/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, @@ -12487,13 +12545,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/grimy, /area/awaymission/snowdin/post/mining_main) -"Yy" = ( -/obj/effect/baseturf_helper/asteroid/snow{ - baseturf = /turf/open/misc/asteroid/snow/ice; - name = "asteroid snowice baseturf editor" - }, -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/mining_dock) "Yz" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/plating, @@ -12536,6 +12587,15 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/grimy, /area/awaymission/snowdin/post/cavern2) +"YN" = ( +/obj/machinery/mineral/processing_unit{ + dir = 1 + }, +/obj/machinery/conveyor{ + id = "snowdin_belt_mine" + }, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "YO" = ( /obj/structure/ore_box, /turf/open/misc/asteroid/snow/ice, @@ -12548,13 +12608,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark/snowdin, /area/awaymission/snowdin/cave) -"YS" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Misc Storage" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) "YT" = ( /obj/effect/turf_decal/weather/snow, /obj/effect/turf_decal/weather/snow/corner{ @@ -12625,13 +12678,6 @@ /obj/machinery/light/broken/directional/north, /turf/open/floor/engine/cult, /area/awaymission/snowdin/post/cavern2) -"Zt" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "Zu" = ( /obj/machinery/light/small/directional/east, /turf/open/misc/asteroid/snow, @@ -12666,6 +12712,14 @@ /obj/structure/mecha_wreckage/ripley, /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) +"ZA" = ( +/obj/machinery/door/airlock/maintenance{ + name = "SMES Storage" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/structure/cable, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "ZB" = ( /obj/structure/table, /obj/machinery/airalarm/directional/north, @@ -12677,6 +12731,14 @@ }, /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) +"ZF" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4; + piping_layer = 4 + }, +/obj/structure/sign/warning/xeno_mining/directional/east, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main/mechbay) "ZH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ dir = 4; @@ -12708,13 +12770,6 @@ }, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) -"ZO" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "ZT" = ( /obj/structure/chair/stool/directional/west, /turf/open/misc/asteroid/snow{ @@ -12727,14 +12782,6 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/cafeteria, /area/awaymission/snowdin/post/messhall) -"ZW" = ( -/obj/structure/ore_box, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "ZX" = ( /obj/structure/flora/tree/stump, /turf/open/misc/asteroid/snow, @@ -21511,7 +21558,7 @@ iu jm jT kF -wx +se md xw QB @@ -23037,7 +23084,7 @@ az aC aC az -Uz +LL bF bV cA @@ -24065,7 +24112,7 @@ aC aC aC az -fB +OX bJ Sp bp @@ -25353,7 +25400,7 @@ be bu bL Lg -Pr +Jo dn dO et @@ -26399,9 +26446,9 @@ ZU dO ST nU -ww +ut oQ -vH +bG pV Nv Mb @@ -26895,7 +26942,7 @@ Zy Zy bf SE -Qa +Vh ds dR ey @@ -27154,7 +27201,7 @@ bf ch cN dt -zg +Ms ez fj fQ @@ -45220,7 +45267,7 @@ ae Pd Pd Pd -Mo +xo Pd ae ae @@ -45731,7 +45778,7 @@ ae ae ae Pd -Mo +xo Pd Pd Pd @@ -50352,7 +50399,7 @@ wN wN WN WN -Vo +VH WN WN wN @@ -50855,13 +50902,13 @@ eJ wN WN WN -Vo +VH wN wN WN WN WN -QM +EL WN WN eJ @@ -51127,7 +51174,7 @@ eJ eJ eJ WN -QM +EL WN wN WN @@ -51622,7 +51669,7 @@ eJ eJ eJ WN -QM +EL eJ eJ eJ @@ -51665,7 +51712,7 @@ eJ eJ UT WN -QP +Rt WN WN WN @@ -52147,10 +52194,10 @@ eJ eJ eJ WN -Si +Od WN WN -pc +PO eJ eJ eJ @@ -52297,11 +52344,11 @@ ge gW WN WN -QP +Rt WN gW WN -QP +Rt WN WN eJ @@ -53329,7 +53376,7 @@ WN WN WN WN -QP +Rt WN WN WN @@ -53929,7 +53976,7 @@ WN WN WN WN -QP +Rt WN WN WN @@ -53973,7 +54020,7 @@ eJ WN WN WN -QP +Rt WN eJ eJ @@ -55738,7 +55785,7 @@ WN WN WN WN -QP +Rt WN WN WN @@ -56271,7 +56318,7 @@ WN WN WN WN -QP +Rt WN WN WN @@ -57183,11 +57230,11 @@ OP HL Iz GU -wE -wE -wE -wD -wD +GH +GH +GH +GN +GN eJ eJ eJ @@ -57440,11 +57487,11 @@ HK HL IA GU -vW -Xf -wL -wO -wE +wB +uJ +He +Sn +GH eJ eJ eJ @@ -57697,11 +57744,11 @@ HL Vd IB Gx -wM -wL -wL -hf -wE +Jd +He +He +ID +GH eJ eJ eJ @@ -57954,11 +58001,11 @@ HM HM IB IJ -wM -wM -OG -wG -wE +Jd +Jd +Jf +wx +GH eJ eJ eJ @@ -58088,7 +58135,7 @@ eJ eJ eJ WN -QP +Rt WN WN eJ @@ -58211,14 +58258,14 @@ GC Ic GU GU -wR -wD -wD -wE -wE -wD -wD -wD +ZA +GN +GN +GH +GH +GN +GN +GN eJ eJ bh @@ -58458,24 +58505,24 @@ WN WN WN WN -xW -xW -xW -wT -xN -wL -xN -Zt -Zt -Zt -ZO -Eh -zi -dJ -kC -kC -ZW -wD +Gk +Gk +Gk +Gr +Hb +He +Hb +Qu +Qu +Qu +sv +wz +fq +Ci +Mk +Mk +vQ +GN eJ eJ bh @@ -58711,28 +58758,28 @@ WN WN WN WN -LH -Yy -xW -xW -xW -wL -xN -li -Fs -xy -UZ -wL -wL -le -TF -Ow -tj -Fs -UZ -xy -xy -wD +Cw +xr +Gk +Gk +Gk +He +Hb +zg +Hg +Hf +Hh +He +He +rj +Mf +xX +IN +Hg +Hh +Hf +Hf +GN eJ eJ bh @@ -58969,27 +59016,27 @@ WN WN WN PV -Nc -nm -Tp -Dp -xG -le -FV -KH -PD -PD -PD -Ld -wM -yN -Eh -AB -wL -xy -UZ -xy -wD +NU +Vj +Dz +Ih +Mt +rj +xK +WP +FQ +FQ +FQ +JJ +Jd +zb +wz +Md +He +Hf +Hh +Hf +GN eJ eJ bh @@ -59226,27 +59273,27 @@ WN cF WN WN -NW -OU -wL -Lj -xy -UZ -xy -Xz -fq -xy -Jl -wD -Yc -wE -wD -wD -wD -tj -Fs -Md -wD +TG +xP +He +dF +Hf +Hh +Hf +AS +uP +Hf +tD +GN +sL +GH +GN +GN +GN +IN +Hg +tV +GN eJ eJ bh @@ -59483,27 +59530,27 @@ UI WN WN WN -NW -wL -jN -Lj -xy -xy -wL -UZ -Fs -UZ -kD -wD -wM -wE -EY -EY -wE -tj -TU -Hv -wD +TG +He +ZF +dF +Hf +Hf +He +Hh +Hg +Hh +Hw +GN +Jd +GH +Ff +Ff +GH +IN +JS +PP +GN eJ eJ bh @@ -59587,7 +59634,7 @@ eJ eJ UT WN -Si +Od eJ eJ eJ @@ -59739,28 +59786,28 @@ WN WN WN WN -LH -xW -xW -zI -xW -tS -ya -Ns -xy -wL -xy -Xn -wD -wM -wD -Qz -wL -YS -tj -Fs -xy -wD +Cw +Gk +Gk +Rr +Gk +tx +Cz +Fc +Hf +He +Hf +sx +GN +Jd +GN +PN +He +QM +IN +Hg +Hf +GN eJ eJ bh @@ -59999,25 +60046,25 @@ WN WN WN WN -zO -xW -xW -xW -yV -wL -ya -ya -yN -wD -la -wD -Xr -qJ -wD -Ta -nI -MD -wD +Eh +Gk +Gk +Gk +Wg +He +Cz +Cz +zb +GN +Jd +GN +Cs +Ks +GN +zF +Tj +LG +GN eJ eJ bh @@ -60266,17 +60313,17 @@ Hy GN GH GH -wM -wE -wD -wE -wE -wD -dc -wD -wD -wE -wE +Jd +GH +GN +GH +GH +GN +NZ +GN +GN +GH +GH bh bh bh @@ -60523,17 +60570,17 @@ Hg YZ Im GN -wM -wL -wD -tn -tn -rg -wL -Fs -wL -UZ -wD +Jd +He +GN +WU +WU +Lj +He +Hg +He +Hh +GN bh bh bh @@ -60780,17 +60827,17 @@ Hg HO Ij GH -wM -wL -wD -mD -Ng -xO -Ms -Ng -sL -Fm -wE +Jd +He +GN +Fi +vH +FS +Ry +vH +Mh +Ha +GH bh bh bh @@ -61037,17 +61084,17 @@ He HP Ik GH -wM -wL -wE -CM -Ys -Ys -Nd -Ys -Ys -Vs -wE +Jd +He +GH +MM +hf +hf +Pt +hf +hf +vz +GH bh bh bh @@ -61295,16 +61342,16 @@ HQ Il GH WX -wL -wE -CM -Ys -Ys -Ys -Ys -Ys -Vs -wE +He +GH +MM +hf +hf +hf +hf +hf +vz +GH bh bh bh @@ -61380,7 +61427,7 @@ eJ eJ eJ eJ -QP +Rt WN eJ eJ @@ -61551,17 +61598,17 @@ Hz HO Im GN -wL -wL -wE -Rb -Ys -Ys -Ys -Ys -Ys -To -wE +He +He +GH +la +hf +hf +hf +hf +hf +RK +GH bh bh bh @@ -61795,7 +61842,7 @@ WN WN WN WN -QP +Rt WN WN WN @@ -61806,19 +61853,19 @@ GJ He HA HO -In +WK +GH +He +He +GH +MM +hf +hf +hf +hf +hf +vz GH -wL -wL -wE -CM -Ys -Ys -Ys -Ys -Ys -Vs -wE bh bh bh @@ -62065,17 +62112,17 @@ Hf HO Ik GN -wL -wL -wD -CM -Ys -Ys -Ys -Ys -Ys -Vs -wD +He +He +GN +MM +hf +hf +hf +hf +hf +vz +GN bh bh bh @@ -62322,17 +62369,17 @@ Hg Um Io IE -wL -aA -wD -Fq -TH -TH -VD -TH -TH -wt -wD +He +tS +GN +Jn +DV +DV +gg +DV +DV +QA +GN bh bh bh @@ -62579,17 +62626,17 @@ Hh HS Hh GN -wD -MM -wE -wD -wE -wD -wD -wE -wE -wD -wD +GN +sr +GH +GN +GH +GN +GN +GH +GH +GN +GN bh bh bh @@ -62836,9 +62883,9 @@ HB GN GH GH -wL -Mw -wD +He +VC +GN eJ eJ eJ @@ -63085,17 +63132,17 @@ WN WN WN Bw -fE -hh -VR -Bn -Jk -Bn -Bn -Bn -Bn -wz -wE +Jm +ML +QX +fU +YN +fU +fU +fU +fU +oZ +GH eJ eJ eJ @@ -63342,17 +63389,17 @@ WN WN WN ui -xW -xW -xW -xW -xW -xW -xW -xW -xW -xW -xW +Gk +Gk +Gk +Gk +Gk +Gk +Gk +Gk +Gk +Gk +Gk eJ eJ eJ @@ -65775,7 +65822,7 @@ WN WN WN WN -QP +Rt WN eJ eJ @@ -66020,7 +66067,7 @@ WN WN WN WN -QP +Rt WN WN WN @@ -66281,7 +66328,7 @@ WN WN WN WN -QP +Rt WN WN WN @@ -67055,7 +67102,7 @@ WN WN WN WN -QP +Rt WN WN WN diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index 87c8c258a02..4a0881d5c0a 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -2,8 +2,6 @@ #include "map_files\generic\CentCom.dmm" -#include "map_files\generic\CentCom_skyrat_z2.dmm" //SKYRAT EDIT ADDITION - SMMS - #ifndef LOWMEMORYMODE #ifdef ALL_MAPS #include "map_files\Birdshot\birdshot.dmm" diff --git a/_maps/gateway_test.json b/_maps/gateway_test.json new file mode 100644 index 00000000000..5f4f8eec8a9 --- /dev/null +++ b/_maps/gateway_test.json @@ -0,0 +1,15 @@ +{ + "version": 1, + "map_name": "Gateway Test", + "map_path": "map_files/debug", + "map_file": "gateway_test.dmm", + "space_ruin_levels": 1, + "load_all_away_missions": true, + "ignored_unit_tests": [ + "/datum/unit_test/antag_moodlets", + "/datum/unit_test/job_roundstart_spawnpoints", + "/datum/unit_test/required_map_items", + "/datum/unit_test/space_dragon_expiration", + "/datum/unit_test/traitor" + ] +} diff --git a/_maps/map_files/Basketball/soviet_bear.dmm b/_maps/map_files/Basketball/soviet_bear.dmm index 5bc653974aa..b034f0c33c8 100644 --- a/_maps/map_files/Basketball/soviet_bear.dmm +++ b/_maps/map_files/Basketball/soviet_bear.dmm @@ -6,9 +6,9 @@ /area/centcom/basketball) "aw" = ( /obj/structure/table, -/obj/item/ammo_box/a762, -/obj/item/ammo_box/a762, -/obj/item/ammo_box/a762, +/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/strilka310, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -353,9 +353,9 @@ /area/centcom/basketball) "Bd" = ( /obj/structure/table, -/obj/item/ammo_box/a762, -/obj/item/ammo_box/a762, -/obj/item/ammo_box/a762, +/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/strilka310, /turf/open/floor/iron/dark, /area/centcom/basketball) "BJ" = ( diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index bf747e57f11..748aa80de1d 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -674,11 +674,6 @@ /obj/structure/marker_beacon/jade, /turf/open/space/basic, /area/space/nearstation) -"ans" = ( -/obj/structure/cable, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/white, -/area/station/science/cytology) "anv" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner{ @@ -912,6 +907,15 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos/project) +"asN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/multi_tile/public/glass{ + name = "Diner" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/textured_half, +/area/station/service/cafeteria) "ata" = ( /obj/structure/flora/bush/flowers_yw/style_random, /obj/machinery/light/small/directional/west, @@ -923,6 +927,10 @@ name = "hyper-reinforced wall" }, /area/station/science/ordnance/bomb) +"ati" = ( +/obj/machinery/hydroponics/soil, +/turf/open/misc/sandy_dirt, +/area/station/science/cytology) "atm" = ( /obj/structure/table, /obj/item/stack/spacecash/c1{ @@ -1029,6 +1037,16 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/engine) +"avN" = ( +/obj/structure/table/glass, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/north, +/obj/item/food/pizzaslice/moldy/bacteria{ + pixel_x = -4; + pixel_y = 2 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "avU" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 8 @@ -1448,6 +1466,15 @@ "aFR" = ( /turf/open/floor/plating, /area/station/security/tram) +"aFY" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/stairs{ + dir = 8 + }, +/area/station/science/xenobiology) "aGa" = ( /obj/structure/lattice/catwalk, /obj/structure/marker_beacon/fuchsia, @@ -1744,6 +1771,7 @@ /area/station/engineering/break_room) "aMy" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/visible, /turf/open/floor/plating, /area/station/science/ordnance/testlab) "aME" = ( @@ -1962,16 +1990,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/smooth_large, /area/station/science/robotics/mechbay) -"aPY" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer2{ - dir = 8 - }, -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 5 - }, -/turf/open/space/basic, -/area/space/nearstation) "aQm" = ( /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark/small, @@ -3176,6 +3194,21 @@ /obj/item/clothing/mask/breath/medical, /turf/open/floor/iron/white, /area/station/science/robotics/augments) +"boX" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/orange{ + pixel_x = 4; + pixel_y = -2 + }, +/obj/item/stack/tile/iron/base{ + pixel_y = 18 + }, +/obj/item/key/janitor{ + pixel_x = -3; + pixel_y = 6 + }, +/turf/open/floor/iron/white/small, +/area/station/service/janitor) "boY" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -3265,6 +3298,11 @@ }, /turf/open/floor/iron/white/small, /area/station/medical/virology) +"bqR" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/closet/crate/mod, +/turf/open/floor/iron/white, +/area/station/science/robotics/augments) "bqZ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/crate, @@ -3809,9 +3847,9 @@ dir = 4 }, /obj/machinery/disposal/delivery_chute{ + desc = "The quickest way back to society"; dir = 1; - name = "freedom"; - desc = "The quickest way back to society" + name = "freedom" }, /obj/machinery/door/window/brigdoor/right/directional/north, /turf/open/floor/iron/dark, @@ -6002,6 +6040,18 @@ /obj/structure/bed/roller, /turf/open/floor/iron/dark, /area/station/medical/medbay/lobby) +"cvH" = ( +/obj/effect/turf_decal/trimline/purple/end{ + dir = 4 + }, +/obj/effect/turf_decal/siding/white{ + dir = 9 + }, +/obj/machinery/shower/directional/east{ + name = "emergency shower" + }, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "cvJ" = ( /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) @@ -7699,6 +7749,7 @@ dir = 4 }, /obj/machinery/light/directional/north, +/obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) "dcG" = ( @@ -8557,6 +8608,10 @@ }, /turf/open/floor/iron, /area/station/security/brig/entrance) +"dtk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/closed/wall, +/area/station/science/ordnance/testlab) "dtq" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -9581,10 +9636,6 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/plating, /area/station/construction/mining/aux_base) -"dMn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/closed/wall, -/area/station/science/ordnance/testlab) "dMM" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron, @@ -9601,6 +9652,17 @@ "dNq" = ( /turf/closed/wall/r_wall/rust, /area/station/ai_monitored/aisat/exterior) +"dNw" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/door/airlock/multi_tile/public/glass{ + name = "Library" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/textured_half, +/area/station/service/library) "dNy" = ( /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, @@ -11608,6 +11670,18 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"ewo" = ( +/obj/effect/turf_decal/box/corners{ + dir = 4 + }, +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, +/obj/machinery/plumbing/growing_vat{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/science/cytology) "ewy" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -13730,6 +13804,10 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/service/chapel/funeral) +"fnd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/closed/wall/r_wall, +/area/station/science/ordnance/testlab) "fni" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/red/opposingcorners{ @@ -14535,6 +14613,10 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/engine, /area/station/engineering/supermatter) +"fzq" = ( +/obj/structure/closet/crate/trashcart/filled, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "fzt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15204,6 +15286,16 @@ }, /turf/open/floor/iron, /area/station/science/xenobiology) +"fJO" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "flamedra"; + name = "Incinerator Conveyor"; + pixel_x = -13; + pixel_y = -4 + }, +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) "fJZ" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/tile/yellow{ @@ -17697,7 +17789,6 @@ /obj/effect/turf_decal/siding/brown{ dir = 1 }, -/obj/item/radio/intercom/directional/north, /turf/open/floor/iron/smooth, /area/station/command/bridge) "gFs" = ( @@ -18516,7 +18607,8 @@ }, /obj/structure/industrial_lift/tram, /obj/machinery/door/window/tram/right/directional/north{ - pixel_y = -25 + pixel_y = -25; + associated_lift = "maint_tram" }, /turf/open/floor/noslip/tram_platform, /area/station/maintenance/port/aft) @@ -18950,6 +19042,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"hbk" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "hbm" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -19883,6 +19982,10 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/wood/parquet, /area/station/service/theater) +"hpM" = ( +/obj/effect/turf_decal/siding, +/turf/open/floor/iron/white, +/area/station/science/cytology) "hpP" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -20479,6 +20582,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/firealarm/directional/east, +/obj/effect/landmark/tram/nav/immovable_rod, /turf/open/floor/iron, /area/station/hallway/secondary/entry) "hzK" = ( @@ -21886,7 +21990,8 @@ /obj/structure/industrial_lift/tram, /obj/machinery/door/window/tram/left/directional/north{ pixel_x = -32; - pixel_y = -25 + pixel_y = -25; + associated_lift = "maint_tram" }, /turf/open/floor/noslip/tram_platform, /area/station/maintenance/port/aft) @@ -22580,6 +22685,12 @@ /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"ioR" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/airalarm/directional/west, +/obj/effect/spawner/random/trash/moisture_trap, +/turf/open/floor/iron/white, +/area/station/science/cytology) "ioW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -23004,10 +23115,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood/parquet, /area/station/service/library) -"iuN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/closed/wall/r_wall, -/area/station/science/ordnance/testlab) "iuW" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/west, @@ -24582,6 +24689,16 @@ }, /turf/open/floor/iron/small, /area/station/command/teleporter) +"iYJ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/passive_vent/layer2{ + dir = 8 + }, +/turf/open/space/basic, +/area/space/nearstation) "iYY" = ( /obj/structure/cable, /turf/open/floor/iron/small, @@ -25017,22 +25134,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_half, /area/station/hallway/primary/aft) -"jif" = ( -/obj/item/mod/core/standard{ - pixel_x = -4 - }, -/obj/item/mod/core/standard{ - pixel_x = 4 - }, -/obj/item/mod/core/standard{ - pixel_y = 4 - }, -/obj/structure/closet/crate/science{ - name = "MOD core crate" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/white, -/area/station/science/robotics/augments) "jig" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 9 @@ -26777,9 +26878,8 @@ /area/station/engineering/supermatter/room) "jMv" = ( /obj/structure/industrial_lift/tram, -/obj/effect/landmark/tram/birdshot/maint_left{ - specific_lift_id = "maint_tram" - }, +/obj/effect/landmark/tram/nav/birdshot/maint, +/obj/effect/landmark/tram/platform/birdshot/maint_left, /turf/open/floor/noslip/tram_plate, /area/station/maintenance/port/aft) "jMC" = ( @@ -26880,11 +26980,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) -"jOc" = ( -/mob/living/simple_animal/hostile/asteroid/basilisk, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid, -/area/station/maintenance/fore/greater) "jOh" = ( /obj/structure/cable, /obj/machinery/door/firedoor, @@ -28041,21 +28136,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_command) -"kkF" = ( -/obj/structure/table, -/obj/item/clothing/gloves/color/orange{ - pixel_x = 4; - pixel_y = -2 - }, -/obj/item/stack/tile/iron{ - pixel_y = 18 - }, -/obj/item/key/janitor{ - pixel_x = -3; - pixel_y = 6 - }, -/turf/open/floor/iron/white/small, -/area/station/service/janitor) "kkL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -28633,10 +28713,9 @@ /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "kvb" = ( -/obj/effect/landmark/tram/birdshot/sec_wing{ - specific_lift_id = "prison_tram" - }, /obj/structure/industrial_lift/tram/white, +/obj/effect/landmark/tram/nav/birdshot/prison, +/obj/effect/landmark/tram/platform/birdshot/sec_wing, /turf/open/floor/noslip/tram_platform, /area/station/security/tram) "kvf" = ( @@ -30202,8 +30281,17 @@ /turf/open/floor/iron/showroomfloor, /area/station/medical/surgery/theatre) "kZF" = ( +/obj/structure/closet/crate/secure{ + desc = "A secure crate containing various materials for building a customised test-site."; + name = "Test Site Materials Crate"; + req_access = list("ordnance") + }, +/obj/item/target/clown, +/obj/item/target/clown, +/obj/item/target/syndicate, +/obj/item/target/alien, /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/plating, /area/station/science/ordnance/testlab) "lao" = ( @@ -30545,8 +30633,8 @@ pixel_y = -3 }, /obj/item/storage/box/prisoner{ - pixel_y = -12; - pixel_x = 5 + pixel_x = 5; + pixel_y = -12 }, /obj/structure/disposalpipe/segment{ dir = 10 @@ -31515,6 +31603,7 @@ name = "Prison Garden" }, /obj/machinery/door/firedoor, +/obj/effect/landmark/tram/nav/immovable_rod, /turf/open/floor/iron/textured_half{ dir = 8 }, @@ -31558,9 +31647,9 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) "lwn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/hatch, +/obj/machinery/atmospherics/components/binary/pump/on/supply/hidden/layer4, /turf/open/floor/plating, /area/station/science/ordnance/testlab) "lwp" = ( @@ -33317,8 +33406,8 @@ dir = 8 }, /obj/machinery/computer/telecomms/monitor{ - network = "tcommsat"; - dir = 8 + dir = 8; + network = "tcommsat" }, /turf/open/floor/iron/grimy, /area/station/tcommsat/server) @@ -34900,6 +34989,15 @@ /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor/flat_white, /area/station/science/robotics/lab) +"mEf" = ( +/obj/item/kirbyplants/random, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/closet/crate/trashcart/filled, +/turf/open/floor/iron, +/area/station/hallway/secondary/recreation) "mEk" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/binary/pump/on{ @@ -35532,9 +35630,7 @@ /turf/open/floor/light/colour_cycle/dancefloor_b, /area/station/maintenance/starboard/central) "mOP" = ( -/obj/effect/landmark/tram/birdshot/prison_wing{ - specific_lift_id = "prison_tram" - }, +/obj/effect/landmark/tram/platform/birdshot/prison_wing, /turf/open/floor/noslip/tram_platform, /area/station/security/tram) "mOT" = ( @@ -35605,13 +35701,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall, /area/station/maintenance/department/engine) -"mQE" = ( -/obj/effect/turf_decal/siding/white{ - dir = 9 - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/dark/small, -/area/station/science/xenobiology) "mQF" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -36915,10 +37004,13 @@ dir = 8 }, /obj/structure/reagent_dispensers/wall/peppertank/directional/west, -/obj/machinery/requests_console/directional/south, /obj/machinery/computer/records/security{ dir = 4 }, +/obj/machinery/requests_console/directional/south{ + department = "Security"; + name = "Security Requests Console" + }, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/supply) "nsc" = ( @@ -38187,6 +38279,7 @@ /area/station/maintenance/central/lesser) "nNZ" = ( /obj/structure/tank_dispenser, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, /turf/open/floor/plating, /area/station/science/ordnance/testlab) "nOf" = ( @@ -38635,12 +38728,6 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/white, /area/station/science/cytology) -"nXe" = ( -/obj/structure/table/glass, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/white, -/area/station/science/cytology) "nXt" = ( /obj/effect/turf_decal/tile/yellow/full, /obj/structure/table/reinforced, @@ -38658,15 +38745,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/restrooms) -"nXE" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/item/kirbyplants/random, -/obj/effect/decal/cleanable/cobweb, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/white, -/area/station/science/cytology) "nXP" = ( /obj/machinery/airalarm/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -39282,17 +39360,6 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/white/small, /area/station/science/ordnance/storage) -"ojk" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/door/airlock/glass_large{ - name = "Library" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/textured_half, -/area/station/service/library) "ojw" = ( /obj/item/kirbyplants/random, /obj/effect/mapping_helpers/broken_floor, @@ -39620,9 +39687,7 @@ /turf/open/floor/iron, /area/station/hallway/secondary/dock) "oqS" = ( -/obj/effect/landmark/tram/birdshot/maint_right{ - specific_lift_id = "maint_tram" - }, +/obj/effect/landmark/tram/platform/birdshot/maint_right, /turf/open/floor/noslip/tram_plate, /area/station/maintenance/department/medical/central) "oqT" = ( @@ -39995,13 +40060,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"oyz" = ( -/obj/effect/turf_decal/box/corners, -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/science/cytology) "oyA" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -40944,10 +41002,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/commons/storage/tools) -"oRd" = ( -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/cytology) "oRm" = ( /obj/effect/landmark/atmospheric_sanity/ignore_area, /turf/closed/mineral/random/stationside, @@ -41489,10 +41543,11 @@ /turf/open/floor/iron/smooth, /area/station/service/greenroom) "pca" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/maintenance/port/lesser) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/landmark/tram/nav/immovable_rod, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "pcb" = ( /obj/effect/turf_decal/tile/dark_red{ dir = 4 @@ -41752,6 +41807,15 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"pgy" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/decal/cleanable/cobweb, +/obj/item/radio/intercom/directional/north, +/obj/item/kirbyplants/fern, +/turf/open/floor/iron/white, +/area/station/science/cytology) "pgE" = ( /obj/structure/chair/office, /obj/effect/mapping_helpers/broken_floor, @@ -43577,11 +43641,6 @@ /obj/effect/turf_decal/delivery/red, /turf/open/floor/iron/white/small, /area/station/medical/medbay/central) -"pKL" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/white, -/area/station/science/cytology) "pKR" = ( /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ dir = 4 @@ -43629,6 +43688,11 @@ }, /turf/open/floor/iron/small, /area/station/ai_monitored/command/storage/eva) +"pLk" = ( +/mob/living/basic/mining/basilisk, +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/asteroid, +/area/station/maintenance/fore/greater) "pLl" = ( /obj/effect/spawner/random/vending/snackvend, /obj/effect/turf_decal/tile/red/opposingcorners{ @@ -44040,6 +44104,13 @@ }, /turf/open/space/basic, /area/space/nearstation) +"pSB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/tank/air{ + dir = 5 + }, +/turf/open/floor/plating, +/area/station/science/ordnance/testlab) "pSI" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/destructible/cult/item_dispenser/archives/library, @@ -45561,6 +45632,11 @@ /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) +"qop" = ( +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/space/nearstation) "qoD" = ( /turf/closed/wall/r_wall, /area/station/command/corporate_showroom) @@ -46747,6 +46823,14 @@ /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron/white/side, /area/station/science/lower) +"qIM" = ( +/obj/structure/cable, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/siding/corner{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "qIO" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 1 @@ -47977,15 +48061,6 @@ /obj/structure/barricade/wooden/crude, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_recreation) -"rdk" = ( -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/turf/open/floor/engine, -/area/station/science/cytology) "rdo" = ( /obj/structure/window/spawner/directional/west, /obj/structure/flora/bush/jungle/a/style_random, @@ -48859,19 +48934,6 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/showroomfloor, /area/station/medical/virology) -"rsA" = ( -/obj/structure/closet/crate/secure{ - desc = "A secure crate containing various materials for building a customised test-site."; - name = "Test Site Materials Crate"; - req_access = list("ordnance") - }, -/obj/item/target/clown, -/obj/item/target/clown, -/obj/item/target/syndicate, -/obj/item/target/alien, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/science/ordnance/testlab) "rsH" = ( /obj/structure/punching_bag, /obj/effect/turf_decal/bot, @@ -49014,8 +49076,11 @@ "rvD" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/effect/turf_decal/tile/dark_red/fourcorners, -/obj/machinery/requests_console/directional/south, /obj/structure/closet/secure_closet/security, +/obj/machinery/requests_console/directional/south{ + department = "Security"; + name = "Security Requests Console" + }, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/escape) "rvE" = ( @@ -49265,14 +49330,6 @@ /obj/machinery/light/floor, /turf/open/floor/wood/large, /area/station/service/hydroponics/garden/monastery) -"rzC" = ( -/obj/item/kirbyplants/random, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/recreation) "rzG" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/dark_red/half/contrasted{ @@ -50164,6 +50221,13 @@ /obj/machinery/digital_clock/directional/north, /turf/open/floor/iron, /area/station/security) +"rNq" = ( +/obj/machinery/door/airlock/multi_tile/public/glass{ + name = "Theatre" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/textured_half, +/area/station/service/theater) "rNA" = ( /turf/open/floor/wood, /area/station/service/theater) @@ -50334,7 +50398,7 @@ /obj/machinery/door/airlock/research/glass{ name = "Pharmacy" }, -/obj/effect/mapping_helpers/airlock/access/all/medical/chemistry, +/obj/effect/mapping_helpers/airlock/access/all/medical/pharmacy, /turf/open/floor/iron/dark/small, /area/station/medical/pharmacy) "rQN" = ( @@ -50700,7 +50764,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 4 }, -/obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) "rVX" = ( @@ -53591,15 +53654,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/genetics) -"sTa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/glass_large{ - name = "Diner" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/textured_half, -/area/station/service/cafeteria) "sTf" = ( /obj/structure/window/spawner/directional/west, /obj/structure/chair/sofa/corp/left{ @@ -53676,13 +53730,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"sTW" = ( -/obj/machinery/door/airlock/glass_large{ - name = "Theatre" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/textured_half, -/area/station/service/theater) "sUe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, @@ -60728,6 +60775,12 @@ dir = 1 }, /area/station/service/chapel/office) +"vmJ" = ( +/obj/structure/cable, +/obj/machinery/holopad, +/obj/effect/turf_decal/siding/corner, +/turf/open/floor/iron/white, +/area/station/science/cytology) "vmL" = ( /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating/airless, @@ -63749,6 +63802,11 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"wiP" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/space/nearstation) "wiT" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/newscaster/directional/south, @@ -63856,11 +63914,6 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/station/hallway/secondary/recreation) -"wkJ" = ( -/obj/structure/cable, -/obj/machinery/holopad, -/turf/open/floor/iron/white, -/area/station/science/cytology) "wla" = ( /turf/open/floor/iron/chapel, /area/station/maintenance/starboard/greater) @@ -67059,16 +67112,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"xgW" = ( -/obj/machinery/conveyor_switch/oneway{ - id = "QMLoad2"; - name = "Incinerator Conveyor"; - pixel_x = -13; - pixel_y = -4 - }, -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) "xhe" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -70458,7 +70501,7 @@ /obj/effect/turf_decal/siding/white, /obj/machinery/light/small/directional/south, /obj/structure/table/reinforced, -/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/item/storage/backpack/duffelbag/coroner/surgery, /turf/open/floor/iron/small, /area/station/medical/morgue) "yaL" = ( @@ -70669,6 +70712,16 @@ /obj/structure/sign/poster/random/directional/east, /turf/open/floor/wood, /area/station/maintenance/port/fore) +"ydH" = ( +/obj/effect/turf_decal/box/corners, +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/obj/machinery/plumbing/input{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/science/cytology) "yea" = ( /turf/closed/wall, /area/station/service/chapel/office) @@ -71012,6 +71065,10 @@ /obj/structure/window/spawner/directional/north, /turf/open/floor/plating, /area/station/maintenance/department/engine) +"yhE" = ( +/obj/effect/landmark/tram/nav/immovable_rod, +/turf/closed/wall, +/area/station/maintenance/port/aft) "yhF" = ( /obj/machinery/door/firedoor, /turf/open/floor/iron, @@ -85074,7 +85131,7 @@ uAi fEC rui qVP -blb +qop xkt nKf mVt @@ -85331,7 +85388,7 @@ xjU fEC kJJ qVP -blb +wiP xkt kJp pJx @@ -85577,7 +85634,7 @@ tdg wBm wXk bVv -xOS +pca rQC von vRe @@ -85588,7 +85645,7 @@ tAu fEC rui qVP -pca +rui qVP llW llW @@ -87688,7 +87745,7 @@ trp trp trp trp -trp +yhE trp trp trp @@ -88845,7 +88902,7 @@ tWj cAh cLn blb -aPY +iYJ fPb dUr dzl @@ -90127,7 +90184,7 @@ tpH tTd pJg vxt -xgW +fJO awi fZq yfa @@ -92491,7 +92548,7 @@ xZS vrn ncL wQB -ojk +dNw lql lKK lql @@ -96110,7 +96167,7 @@ rij xCu xCu xCu -sTa +asN wEI tIL tYX @@ -97652,7 +97709,7 @@ rjb rKL siv sED -sTW +rNq tmV tIL tYX @@ -103796,7 +103853,7 @@ xmO sHe nFW kam -kkF +boX kBH ukW cZL @@ -107635,7 +107692,7 @@ dDB dDB aJq jbm -jOc +pLk twN jbm jbm @@ -112031,7 +112088,7 @@ yjK xpE xMT xQJ -rzC +mEf qrR sid xbg @@ -112582,7 +112639,7 @@ wMH wMH aSy aSy -roC +aFY pWZ qZe xvF @@ -112838,7 +112895,7 @@ xjb pAF nyB gOQ -mQE +cvH xiT blk rUE @@ -113315,7 +113372,7 @@ mjf mFh noB xQJ -nXe +avN ovg rRU wBI @@ -113829,12 +113886,12 @@ mjF mGp vUz qNn -nXE +pgy owm sXi bfe sXi -pKL +ioR mEL vbK sfq @@ -114853,14 +114910,14 @@ kNI xXT oOv vwd -ikc +fzq xau rsL qhh ghC -wkJ -oRd -ans +vmJ +hbk +qIM xfu xbT snJ @@ -115115,8 +115172,8 @@ xau rsL xSe miz -xlL -xlL +hpM +ati wJL ppQ tTp @@ -115628,8 +115685,8 @@ rsL mIh rsL xTO -rdk -oyz +ewo +ydH xPj wJL sHX @@ -116177,7 +116234,7 @@ eQn vnf wML rrt -jif +bqR ryy boW sYa @@ -121565,7 +121622,7 @@ yeZ yeZ yeZ yeZ -iuN +fnd yeZ yeZ qei @@ -121822,9 +121879,9 @@ yeZ rma xxn xFL -dMn +dtk kZF -rsA +pSB qei qZU jeG diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 2c91d906a4b..9bb336d23d3 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -278,7 +278,7 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/incinerator_input{ dir = 4 }, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "adC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1211,7 +1211,7 @@ /turf/open/floor/iron/dark, /area/station/command/bridge) "aoB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/r_wall, /area/station/science/ordnance/storage) "aoJ" = ( @@ -2482,8 +2482,14 @@ /area/station/engineering/atmos) "aEE" = ( /obj/structure/table/wood, -/obj/item/flashlight/lamp, -/obj/item/reagent_containers/cup/glass/flask/det, +/obj/item/flashlight/lamp{ + pixel_x = 4; + pixel_y = 2 + }, +/obj/item/reagent_containers/cup/glass/flask/det{ + pixel_x = -12; + pixel_y = 10 + }, /turf/open/floor/carpet, /area/station/security/detectives_office) "aEJ" = ( @@ -2815,11 +2821,13 @@ /turf/open/floor/iron, /area/station/cargo/office) "aIp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/components/tank/air{ + dir = 12 + }, /turf/open/floor/iron/dark/corner, /area/station/maintenance/disposal/incinerator) "aIA" = ( @@ -4055,6 +4063,7 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) "aZp" = ( @@ -4354,8 +4363,14 @@ /area/station/commons/fitness/recreation) "bdC" = ( /obj/structure/table, -/obj/item/storage/box/bodybags, -/obj/item/clothing/gloves/latex, +/obj/item/storage/box/bodybags{ + pixel_x = -3; + pixel_y = 18 + }, +/obj/item/clothing/gloves/latex{ + pixel_x = 3; + pixel_y = 4 + }, /obj/effect/turf_decal/trimline/neutral/warning{ dir = 1 }, @@ -9286,7 +9301,6 @@ /turf/open/space/basic, /area/space/nearstation) "clx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, /obj/machinery/computer/atmos_control/nocontrol/incinerator{ dir = 1 @@ -9294,6 +9308,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, /turf/open/floor/iron/dark/corner, /area/station/maintenance/disposal/incinerator) "clE" = ( @@ -9865,10 +9880,17 @@ /area/station/service/hydroponics) "csy" = ( /obj/structure/table/wood, -/obj/item/pen, -/obj/item/paper_bin/carbon, -/obj/item/pen, -/obj/item/toy/figure/detective, +/obj/item/pen{ + pixel_x = 16 + }, +/obj/item/paper_bin/carbon{ + pixel_x = -1; + pixel_y = 5 + }, +/obj/item/pen{ + pixel_x = -1; + pixel_y = 8 + }, /turf/open/floor/carpet, /area/station/security/detectives_office) "csz" = ( @@ -10420,17 +10442,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/main) -"czA" = ( -/obj/effect/turf_decal/trimline/neutral/mid_joiner{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/item/storage/backpack/duffelbag/coroner/surgery, -/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "czB" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ dir = 8 @@ -13192,10 +13203,15 @@ /turf/open/floor/iron/smooth, /area/station/maintenance/department/science/xenobiology) "djT" = ( -/obj/machinery/holopad, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/rack, +/obj/item/book/manual/wiki/ordnance{ + pixel_x = 4; + pixel_y = 1 + }, +/obj/item/book/manual/wiki/atmospherics, /obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/full, -/turf/open/floor/iron/dark/smooth_large, +/turf/open/floor/iron/dark, /area/station/science/ordnance) "djV" = ( /obj/effect/spawner/random/structure/chair_flipped{ @@ -13443,6 +13459,13 @@ /obj/structure/sign/poster/ripped/directional/north, /turf/open/floor/iron/grimy, /area/station/maintenance/port/fore) +"dnH" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/grimy, +/area/station/security/detectives_office) "dnM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -14088,10 +14111,12 @@ /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "dvA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/visible{ + dir = 4 + }, /turf/open/floor/iron/dark/corner, /area/station/maintenance/disposal/incinerator) "dvG" = ( @@ -15889,14 +15914,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) -"dSz" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/dark, -/area/station/service/bar) "dSA" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white/smooth_large, @@ -20799,10 +20816,10 @@ "fff" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, -/obj/item/holosign_creator/atmos, -/obj/structure/rack, -/obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/visible{ + dir = 4 + }, /turf/open/floor/iron/dark, /area/station/science/ordnance) "ffi" = ( @@ -20895,11 +20912,11 @@ /turf/open/floor/wood/tile, /area/station/service/library/artgallery) "ffQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/dark_red{ - dir = 8 +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 }, -/turf/open/floor/iron/grimy, +/turf/open/floor/iron/dark, /area/station/security/detectives_office) "ffY" = ( /obj/item/kirbyplants/random, @@ -24836,6 +24853,7 @@ dir = 4 }, /obj/machinery/requests_console/directional/north{ + department = "Ordnance"; name = "Ordnance Mixing Lab Requests Console" }, /obj/effect/turf_decal/box/red, @@ -25410,8 +25428,8 @@ /area/station/science/xenobiology) "gmK" = ( /obj/structure/cable, -/obj/machinery/newscaster/directional/south, /obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/machinery/mining_weather_monitor/directional/south, /turf/open/floor/iron, /area/station/construction/mining/aux_base) "gmP" = ( @@ -27877,6 +27895,16 @@ }, /turf/open/floor/iron, /area/station/maintenance/central) +"gQw" = ( +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/bot, +/obj/item/computer_disk/engineering, +/obj/item/computer_disk/engineering, +/obj/item/computer_disk/engineering, +/obj/structure/rack, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "gQz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -28550,8 +28578,12 @@ /area/station/science/xenobiology) "gZz" = ( /obj/structure/table/wood, -/obj/item/folder/red, -/obj/item/hand_labeler, +/obj/item/folder/red{ + pixel_y = 5 + }, +/obj/item/hand_labeler{ + pixel_y = -11 + }, /turf/open/floor/carpet, /area/station/security/detectives_office) "gZU" = ( @@ -28803,9 +28835,11 @@ /area/station/medical/morgue) "hcW" = ( /obj/machinery/light/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/structure/sign/warning/gas_mask/directional/north, /obj/effect/turf_decal/tile/neutral/full, +/obj/machinery/atmospherics/components/binary/pump/on/supply/visible/layer4{ + dir = 4 + }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/ordnance) "hdx" = ( @@ -28967,7 +29001,7 @@ }, /obj/effect/mapping_helpers/airlock/locked, /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "hfe" = ( /obj/effect/turf_decal/stripes/end{ @@ -29344,7 +29378,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/smooth_half{ dir = 1 }, @@ -33550,9 +33584,10 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "iqg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral/full, +/obj/machinery/holopad, +/turf/open/floor/iron/dark/smooth_large, /area/station/science/ordnance) "iqj" = ( /obj/effect/turf_decal/trimline/purple/filled/warning, @@ -33725,6 +33760,13 @@ dir = 1 }, /area/station/medical/medbay/lobby) +"iss" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/service/bar) "isy" = ( /obj/structure/chair/office{ dir = 4 @@ -34131,10 +34173,16 @@ "ixR" = ( /obj/structure/cable, /obj/structure/table/wood, -/obj/item/taperecorder, -/obj/item/restraints/handcuffs, +/obj/item/taperecorder{ + pixel_x = 6; + pixel_y = 5 + }, /obj/machinery/power/apc/auto_name/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/toy/figure/detective{ + pixel_x = -10; + pixel_y = 3 + }, /turf/open/floor/iron/dark, /area/station/security/detectives_office) "ixZ" = ( @@ -35189,7 +35237,7 @@ /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "iML" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, /turf/closed/wall/r_wall, /area/station/science/ordnance/burnchamber) "iMO" = ( @@ -36352,9 +36400,12 @@ /obj/structure/rack, /obj/item/storage/briefcase{ pixel_x = -3; - pixel_y = 3 + pixel_y = 1 + }, +/obj/item/storage/secure/briefcase{ + pixel_x = 5; + pixel_y = -3 }, -/obj/item/storage/secure/briefcase, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -39072,7 +39123,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ dir = 1 }, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "jJf" = ( /obj/machinery/duct, @@ -42499,11 +42550,9 @@ /turf/open/floor/plating, /area/station/maintenance/port/fore) "kBb" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/tile/neutral/full, +/obj/item/kirbyplants/random, /turf/open/floor/iron/dark/smooth_large, /area/station/security/detectives_office) "kBz" = ( @@ -42609,9 +42658,12 @@ /turf/open/floor/iron/dark, /area/station/command/bridge) "kCX" = ( -/obj/machinery/light/small/directional/north, -/turf/closed/wall, -/area/station/hallway/secondary/service) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "kDd" = ( /obj/structure/disposalpipe/segment, /obj/machinery/duct, @@ -46920,7 +46972,7 @@ /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) "lHz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) "lHC" = ( @@ -50468,7 +50520,7 @@ /turf/open/floor/iron, /area/station/service/kitchen/abandoned) "mDO" = ( -/obj/machinery/door/airlock/glass_large{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Laundromat" }, /obj/effect/turf_decal/stripes/line, @@ -50641,9 +50693,9 @@ /area/station/security/checkpoint/arrivals) "mGi" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/bot, /obj/machinery/status_display/ai/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/science/ordnance/storage) "mGk" = ( @@ -52457,6 +52509,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"neT" = ( +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/storage/backpack/duffelbag/coroner/surgery, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "nfd" = ( /obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/engine/plasma, @@ -54729,7 +54792,9 @@ /turf/open/floor/iron, /area/station/hallway/primary/starboard) "nJK" = ( -/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_ordmix, +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_ordmix{ + dir = 1 + }, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) "nJL" = ( @@ -58374,19 +58439,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"oIL" = ( -/obj/item/computer_disk/atmos, -/obj/item/computer_disk/atmos, -/obj/item/computer_disk/atmos, -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/bot, -/obj/item/computer_disk/engineering, -/obj/item/computer_disk/engineering, -/obj/item/computer_disk/engineering, -/obj/structure/rack, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "oIU" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -59055,6 +59107,9 @@ "oSA" = ( /obj/machinery/status_display/ai/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/rack, +/obj/item/holosign_creator/atmos, +/obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, /area/station/science/ordnance) "oSE" = ( @@ -61031,13 +61086,10 @@ "ptA" = ( /obj/structure/cable, /obj/structure/table/reinforced, -/obj/item/tank/jetpack/carbondioxide{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/tank/jetpack/carbondioxide, /obj/effect/turf_decal/delivery, /obj/machinery/power/apc/auto_name/directional/east, +/obj/item/mod/module/tether, +/obj/item/mod/module/tether, /turf/open/floor/iron, /area/station/engineering/storage) "ptC" = ( @@ -61873,8 +61925,14 @@ /area/station/science/xenobiology) "pDS" = ( /obj/structure/table/wood, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/camera/detective, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = 9; + pixel_y = 4 + }, +/obj/item/camera/detective{ + pixel_x = -6; + pixel_y = 6 + }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/detectives_office) @@ -61976,7 +62034,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/glass_large{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Laundromat" }, /turf/open/floor/iron, @@ -64169,13 +64227,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port) -"qcO" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/service/bar) "qdc" = ( /obj/effect/landmark/start/hangover, /obj/structure/chair/sofa/bench{ @@ -67663,7 +67714,7 @@ /area/station/service/abandoned_gambling_den) "qYx" = ( /obj/machinery/igniter/incinerator_atmos, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "qYy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68590,9 +68641,16 @@ /area/station/hallway/primary/central/aft) "rku" = ( /obj/structure/table/wood, -/obj/item/clipboard, -/obj/item/folder/red, -/obj/item/pen, +/obj/item/clipboard{ + pixel_y = 3 + }, +/obj/item/folder/red{ + pixel_y = 4 + }, +/obj/item/pen{ + pixel_x = -6; + pixel_y = 3 + }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/detectives_office) @@ -68712,7 +68770,7 @@ dir = 4 }, /obj/machinery/air_sensor/incinerator_tank, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "rlG" = ( /obj/item/crowbar/red, @@ -72978,15 +73036,15 @@ /turf/open/floor/iron/dark, /area/station/science/circuits) "sog" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ - dir = 8 - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/components/binary/pump/on/supply/visible/layer4{ + dir = 8 + }, /turf/open/floor/iron/dark/corner, /area/station/maintenance/disposal/incinerator) "sox" = ( @@ -76398,15 +76456,10 @@ /turf/open/floor/wood, /area/station/commons/dorms) "tgI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/book/manual/wiki/atmospherics, -/obj/item/book/manual/wiki/ordnance{ - pixel_x = 4; - pixel_y = 1 - }, -/obj/effect/turf_decal/bot, -/obj/structure/rack, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/tank/air{ + dir = 9 + }, /turf/open/floor/iron/dark, /area/station/science/ordnance) "tgN" = ( @@ -77068,13 +77121,20 @@ /area/station/service/bar/backroom) "trf" = ( /obj/structure/table/wood, +/obj/item/restraints/handcuffs{ + pixel_y = 6 + }, /obj/item/clothing/mask/cigarette/cigar/cohiba{ - pixel_x = 3 + pixel_x = 7; + pixel_y = -7 }, /obj/item/clothing/mask/cigarette/cigar/havana{ pixel_x = -3 }, -/obj/item/clothing/mask/cigarette/cigar, +/obj/item/clothing/mask/cigarette/cigar{ + pixel_x = -1; + pixel_y = -7 + }, /turf/open/floor/carpet, /area/station/security/detectives_office) "trw" = ( @@ -77778,7 +77838,7 @@ /obj/machinery/airlock_sensor/incinerator_ordmix{ pixel_y = 24 }, -/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) "tzT" = ( @@ -78745,7 +78805,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/start/hangover, -/obj/machinery/requests_console/directional/east, +/obj/machinery/requests_console/directional/east{ + department = "Theater"; + name = "Theater Requests Console" + }, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/service/theater) @@ -80358,7 +80421,10 @@ /obj/structure/table/reinforced, /obj/item/folder/blue, /obj/item/pen, -/obj/machinery/requests_console/directional/west, +/obj/machinery/requests_console/directional/west{ + department = "AI Chamber"; + name = "AI Chamber Requests Console" + }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) @@ -83207,6 +83273,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 1 }, +/obj/machinery/hydroponics/constructable, /turf/open/floor/iron/white, /area/station/science/xenobiology) "uOH" = ( @@ -83618,6 +83685,7 @@ /obj/effect/turf_decal/bot, /obj/item/radio/intercom/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/science/ordnance) "uSY" = ( @@ -85389,9 +85457,11 @@ /turf/open/floor/wood, /area/station/service/lawoffice) "vss" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /turf/open/floor/iron/dark, /area/station/science/ordnance) "vsy" = ( @@ -85680,8 +85750,8 @@ /area/station/security/prison/work) "vvD" = ( /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "vvF" = ( @@ -87345,6 +87415,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"vQB" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/service/bar) "vRn" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/structure/railing/corner, @@ -87708,18 +87786,6 @@ /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) "vWV" = ( -/obj/structure/closet/crate/science{ - anchored = 1 - }, -/obj/item/mod/core/standard{ - pixel_x = -4 - }, -/obj/item/mod/core/standard{ - pixel_x = 4 - }, -/obj/item/mod/core/standard{ - pixel_y = 4 - }, /obj/effect/turf_decal/bot, /obj/machinery/requests_console/directional/north{ department = "Robotics"; @@ -87728,6 +87794,7 @@ /obj/effect/mapping_helpers/requests_console/ore_update, /obj/effect/mapping_helpers/requests_console/supplies, /obj/machinery/light/cold/directional/north, +/obj/structure/closet/crate/mod, /turf/open/floor/iron, /area/station/science/robotics/lab) "vXh" = ( @@ -96155,7 +96222,7 @@ /obj/machinery/atmospherics/components/binary/pump{ dir = 4 }, -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) "yeD" = ( @@ -119204,7 +119271,7 @@ ylf ylf ylf eDp -oIL +gQw gAw phn gAw @@ -129027,7 +129094,7 @@ nJK yex iML tgI -iqg +uUG djT kzc kzc @@ -129284,7 +129351,7 @@ vqx oHM iLH pKR -uUG +iqg uUG fgy oFC @@ -133820,7 +133887,7 @@ pqv uGR qdl ewV -qcO +iss jhH vnU vnU @@ -134077,7 +134144,7 @@ pOV eqM ask dep -dSz +vQB bwh vnU tOs @@ -134572,8 +134639,8 @@ rbR euQ bsb dLJ -bsb kCX +kVP bpd pyw kVP @@ -137770,7 +137837,7 @@ uue jdf qYL qpU -czA +neT aNV hvf vid @@ -143357,7 +143424,7 @@ oIU kJb qud kdY -xEJ +ffQ kBb dCk rTO @@ -143614,8 +143681,8 @@ oIU pDS dbd qgQ +dnH uja -ffQ oIU rTO ljd diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 8b5d413621c..cf0cd03c97a 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -2771,9 +2771,9 @@ "aTJ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; id = "pharmacy_shutters"; - name = "Pharmacy Shutters"; - dir = 4 + name = "Pharmacy Shutters" }, /turf/open/floor/plating, /area/station/medical/pharmacy) @@ -2822,6 +2822,10 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"aUv" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "aUA" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -3001,7 +3005,7 @@ /area/station/ai_monitored/security/armory/upper) "aWs" = ( /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_ordmix{ - dir = 4 + dir = 8 }, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) @@ -3653,9 +3657,21 @@ "bhK" = ( /obj/structure/table, /obj/item/folder/blue{ - pixel_x = 8 + pixel_x = -6; + pixel_y = 3 + }, +/obj/item/pen{ + pixel_x = -1; + pixel_y = 1 + }, +/obj/item/paper_bin/carbon{ + pixel_x = 5; + pixel_y = 18 + }, +/obj/item/stamp/head/hop{ + pixel_x = 8; + pixel_y = 5 }, -/obj/item/papercutter, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) "bhV" = ( @@ -6573,7 +6589,7 @@ dir = 5 }, /obj/machinery/igniter/incinerator_atmos, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "bZg" = ( /obj/structure/cable, @@ -7586,6 +7602,7 @@ /obj/structure/railing{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "coL" = ( @@ -7978,9 +7995,9 @@ }, /obj/effect/turf_decal/tile/yellow/fourcorners, /obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; id = "pharmacy_shutters"; - name = "Pharmacy Shutters"; - dir = 4 + name = "Pharmacy Shutters" }, /turf/open/floor/iron, /area/station/medical/pharmacy) @@ -8204,7 +8221,10 @@ "cyF" = ( /obj/structure/table/wood, /obj/machinery/recharger, -/obj/item/melee/chainofcommand, +/obj/item/coin/plasma{ + pixel_x = -6; + pixel_y = 13 + }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) "cyG" = ( @@ -9043,7 +9063,7 @@ /turf/open/floor/plating, /area/station/maintenance/fore) "cKp" = ( -/obj/machinery/door/airlock/glass_large{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Hydroponics" }, /obj/effect/mapping_helpers/airlock/access/all/service/hydroponics, @@ -9561,6 +9581,7 @@ req_access = list("aux_base") }, /obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/obj/machinery/mining_weather_monitor/directional/south, /turf/open/floor/iron, /area/station/construction/mining/aux_base) "cRX" = ( @@ -10498,7 +10519,9 @@ /area/station/security/checkpoint/medical) "dho" = ( /obj/structure/table/reinforced, -/obj/item/storage/secure/briefcase, +/obj/item/storage/secure/briefcase{ + pixel_y = 5 + }, /obj/machinery/status_display/evac/directional/west, /turf/open/floor/iron, /area/station/command/bridge) @@ -10826,8 +10849,7 @@ /area/station/service/bar/backroom) "dmG" = ( /obj/structure/table/wood, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/coin/plasma, +/obj/item/camera, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) "dmI" = ( @@ -10981,8 +11003,10 @@ /turf/open/floor/wood/large, /area/mine/eva/lower) "doT" = ( -/obj/item/hand_labeler, -/obj/item/assembly/timer, +/obj/item/assembly/timer{ + pixel_x = -3; + pixel_y = 15 + }, /obj/structure/table, /turf/open/floor/wood, /area/station/command/meeting_room) @@ -12761,7 +12785,7 @@ dir = 8 }, /obj/machinery/door/firedoor/heavy, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/science/ordnance) "dSj" = ( @@ -16248,7 +16272,10 @@ pixel_x = -3; pixel_y = 7 }, -/obj/item/pen, +/obj/item/pen{ + pixel_x = 11; + pixel_y = 2 + }, /obj/structure/table/wood, /turf/open/floor/carpet, /area/station/command/meeting_room) @@ -17423,8 +17450,13 @@ /area/station/maintenance/starboard/aft) "fue" = ( /obj/structure/table/wood, -/obj/item/flashlight/lamp/green, +/obj/item/flashlight/lamp/green{ + pixel_y = 14 + }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/book/manual/wiki/security_space_law{ + pixel_y = 5 + }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) "fum" = ( @@ -20327,6 +20359,9 @@ /obj/item/assembly/flash/handheld, /obj/item/assembly/flash/handheld, /obj/machinery/newscaster/directional/west, +/obj/item/wrench{ + pixel_y = 17 + }, /turf/open/floor/iron, /area/station/command/bridge) "grD" = ( @@ -20537,6 +20572,7 @@ /area/station/security/checkpoint/engineering) "gxn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/science/ordnance) "gxq" = ( @@ -21349,7 +21385,9 @@ "gKk" = ( /obj/structure/table/reinforced, /obj/item/storage/secure/safe/caps_spare/directional/east, -/obj/item/papercutter, +/obj/item/papercutter{ + pixel_x = 7 + }, /turf/open/floor/iron, /area/station/command/bridge) "gKl" = ( @@ -22166,7 +22204,9 @@ pixel_x = -3; pixel_y = 7 }, -/obj/item/pen, +/obj/item/pen{ + pixel_x = 12 + }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) "gYG" = ( @@ -22196,11 +22236,18 @@ /area/station/medical/virology) "gZj" = ( /obj/structure/table/reinforced, -/obj/item/storage/toolbox/emergency, -/obj/item/wrench, +/obj/item/storage/toolbox/emergency{ + pixel_y = 9 + }, /obj/item/assembly/timer, -/obj/item/assembly/signaler, -/obj/item/assembly/signaler, +/obj/item/assembly/signaler{ + pixel_x = 7; + pixel_y = -7 + }, +/obj/item/assembly/signaler{ + pixel_x = -8; + pixel_y = -12 + }, /obj/machinery/status_display/ai/directional/east, /turf/open/floor/iron, /area/station/command/bridge) @@ -22344,7 +22391,7 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/incinerator_input{ dir = 8 }, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "hbm" = ( /obj/structure/cable, @@ -23021,7 +23068,15 @@ /obj/machinery/camera/directional/east{ c_tag = "Captain's Office" }, -/obj/item/storage/lockbox/medal, +/obj/item/storage/lockbox/medal{ + pixel_y = 8 + }, +/obj/item/pinpointer/nuke{ + pixel_y = -9 + }, +/obj/item/disk/nuclear{ + pixel_y = -8 + }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) "hpm" = ( @@ -23692,6 +23747,11 @@ /obj/structure/chair/stool/bar/directional/east, /turf/open/floor/stone, /area/station/commons/lounge) +"hzV" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/smartfridge/petri/preloaded, +/turf/open/openspace, +/area/station/science/xenobiology) "hzY" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -23847,7 +23907,10 @@ /area/station/commons/lounge) "hCV" = ( /obj/structure/table/wood, -/obj/item/hand_tele, +/obj/item/hand_tele{ + pixel_y = 11 + }, +/obj/item/melee/chainofcommand, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) "hDb" = ( @@ -24575,7 +24638,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ dir = 8 }, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "hPK" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -25483,6 +25546,11 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"ieZ" = ( +/obj/effect/spawner/random/trash, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "ifa" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -25556,6 +25624,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/mine/eva/lower) +"igs" = ( +/obj/structure/closet, +/obj/item/clothing/under/suit/black, +/obj/item/clothing/under/suit/black/skirt, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "igx" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 5 @@ -27508,7 +27585,7 @@ dir = 1 }, /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/glass_large{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "The Girly Boar" }, /turf/open/floor/iron/dark/textured_half, @@ -27746,8 +27823,8 @@ /obj/machinery/airlock_sensor/incinerator_ordmix{ pixel_x = 24 }, -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ - dir = 8 +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ + dir = 4 }, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) @@ -28316,6 +28393,11 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) +"iYq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/trash/raisins, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "iYs" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -28619,7 +28701,10 @@ /turf/open/floor/plating, /area/station/hallway/secondary/entry) "jcC" = ( -/obj/machinery/requests_console/directional/north, +/obj/machinery/requests_console/directional/north{ + department = "Ordnance"; + name = "Ordnance Lab Requests Console" + }, /turf/open/floor/iron/white, /area/station/science/ordnance) "jcP" = ( @@ -29319,6 +29404,16 @@ }, /turf/open/floor/iron, /area/station/science/robotics/lab) +"jse" = ( +/obj/effect/turf_decal/weather/snow/corner, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "jsp" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, @@ -30721,6 +30816,16 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/science/breakroom) +"jPA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/science/ordnance) +"jPE" = ( +/obj/machinery/atmospherics/components/binary/pump/on/supply/hidden/layer4{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "jPK" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32348,13 +32453,11 @@ /area/station/security/holding_cell) "kpp" = ( /obj/structure/table/wood, -/obj/item/storage/box/matches, -/obj/item/razor{ - pixel_x = -4; - pixel_y = 2 +/obj/item/clothing/mask/cigarette/cigar{ + pixel_x = 7; + pixel_y = 10 }, -/obj/item/clothing/mask/cigarette/cigar, -/obj/item/reagent_containers/cup/glass/flask/gold, +/obj/item/storage/box/matches, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) "kpu" = ( @@ -32457,8 +32560,8 @@ /turf/open/floor/iron/white/corner, /area/station/engineering/atmos) "kqs" = ( -/obj/machinery/vending/sustenance, /obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/sustenance/labor_camp, /turf/open/floor/iron, /area/mine/laborcamp) "kqw" = ( @@ -33036,6 +33139,7 @@ /obj/effect/turf_decal/siding/wideplating/dark{ dir = 4 }, +/obj/machinery/holopad, /turf/open/floor/iron/dark/textured, /area/station/security/prison/rec) "kzv" = ( @@ -33082,6 +33186,10 @@ /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 4 }, +/obj/item/multitool{ + pixel_x = 9; + pixel_y = 4 + }, /turf/open/floor/iron, /area/station/command/bridge) "kzG" = ( @@ -33215,7 +33323,9 @@ /area/station/science/robotics/mechbay) "kBr" = ( /obj/structure/table/reinforced, -/obj/item/storage/medkit/regular, +/obj/item/storage/medkit/regular{ + pixel_y = 5 + }, /turf/open/floor/iron, /area/station/command/bridge) "kBL" = ( @@ -33782,19 +33892,10 @@ /turf/open/floor/iron, /area/station/hallway/primary/aft) "kKI" = ( -/obj/item/mod/core/standard{ - pixel_x = -4 - }, -/obj/item/mod/core/standard{ - pixel_x = 4 - }, -/obj/item/mod/core/standard{ - pixel_y = 4 - }, -/obj/structure/table, /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 }, +/obj/structure/closet/crate/mod, /turf/open/floor/iron/white, /area/station/science/robotics/lab) "kKL" = ( @@ -35945,6 +36046,14 @@ /obj/item/grenade/chem_grenade/smart_metal_foam, /obj/item/grenade/chem_grenade/smart_metal_foam, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/clothing/shoes/magboots{ + pixel_x = -11; + pixel_y = 1 + }, +/obj/item/clothing/shoes/magboots{ + pixel_x = -9; + pixel_y = -4 + }, /turf/open/floor/iron/dark, /area/station/engineering/engine_smes) "lup" = ( @@ -36860,6 +36969,10 @@ /obj/structure/sink/directional/west, /obj/structure/mirror/directional/east, /obj/machinery/light/small/directional/north, +/obj/item/razor{ + pixel_x = 8; + pixel_y = 8 + }, /turf/open/floor/iron/freezer, /area/station/command/heads_quarters/captain) "lIs" = ( @@ -39389,9 +39502,8 @@ "mBX" = ( /obj/structure/table/wood, /obj/machinery/airalarm/directional/east, -/obj/item/camera, /obj/item/storage/photo_album{ - pixel_y = -10 + pixel_y = -1 }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) @@ -39688,9 +39800,9 @@ "mIt" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; id = "pharmacy_shutters3"; - name = "Pharmacy Shutters"; - dir = 1 + name = "Pharmacy Shutters" }, /turf/open/floor/plating, /area/station/medical/pharmacy) @@ -39844,8 +39956,8 @@ /obj/machinery/atmospherics/components/binary/pump/on{ dir = 1 }, -/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ + dir = 8 }, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) @@ -40574,9 +40686,12 @@ dir = 4 }, /obj/machinery/light/directional/east, -/obj/machinery/requests_console/directional/east, /obj/effect/mapping_helpers/requests_console/assistance, /obj/effect/mapping_helpers/requests_console/information, +/obj/machinery/requests_console/directional/east{ + department = "Security"; + name = "Security Requests Console" + }, /turf/open/floor/iron, /area/station/security/checkpoint/supply) "mYG" = ( @@ -41879,6 +41994,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos/mix) +"nrf" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "nrm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43114,7 +43235,10 @@ /area/station/security/checkpoint/medical) "nKe" = ( /obj/structure/table, -/obj/item/hand_tele, +/obj/item/hand_tele{ + pixel_x = 3; + pixel_y = 13 + }, /turf/open/floor/iron, /area/station/command/teleporter) "nKj" = ( @@ -44433,6 +44557,7 @@ "ohG" = ( /obj/effect/landmark/start/prisoner, /obj/effect/landmark/event_spawn, +/obj/machinery/holopad, /turf/open/floor/carpet/red, /area/station/security/prison/work) "ohS" = ( @@ -44493,6 +44618,12 @@ /obj/structure/sign/warning/electric_shock, /turf/open/floor/plating, /area/station/science/xenobiology) +"oiv" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/table/reinforced, +/obj/item/storage/backpack/duffelbag/coroner/surgery, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "oiy" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/aisat/service) @@ -45452,6 +45583,18 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/station/ai_monitored/turret_protected/aisat/maint) +"oxu" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/surface/outdoors/nospawn) "oxB" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/abandoned, @@ -45879,15 +46022,15 @@ "oCA" = ( /obj/structure/closet/secure_closet/cytology, /obj/machinery/button/door/directional/north{ - name = "Containment Blast Doors"; id = "xenobiomain"; - req_access = list("xenobiology"); - pixel_y = 32 + name = "Containment Blast Doors"; + pixel_y = 32; + req_access = list("xenobiology") }, /obj/machinery/button/door/directional/north{ - pixel_y = 23; - name = "Test Chamber Blast Doors"; id = "misclab"; + name = "Test Chamber Blast Doors"; + pixel_y = 23; req_access = list("xenobiology") }, /turf/open/floor/glass/reinforced, @@ -46207,9 +46350,7 @@ /area/station/command/heads_quarters/captain) "oGR" = ( /obj/item/radio/intercom/directional/north, -/obj/structure/reagent_dispensers/plumbed{ - dir = 8 - }, +/obj/structure/reagent_dispensers/plumbed, /obj/effect/turf_decal/stripes/line{ dir = 4 }, @@ -46320,9 +46461,9 @@ "oKb" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; id = "pharmacy_shutters3"; - name = "Pharmacy Shutters"; - dir = 1 + name = "Pharmacy Shutters" }, /turf/open/floor/plating, /area/station/service/kitchen) @@ -46509,12 +46650,6 @@ "oMT" = ( /turf/open/floor/iron, /area/station/command/heads_quarters/rd) -"oNj" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/table/reinforced, -/obj/item/storage/backpack/duffelbag/coroner/surgery, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "oNp" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 9 @@ -46577,6 +46712,10 @@ /obj/machinery/status_display/evac/directional/west, /turf/open/floor/iron/white, /area/station/science/research) +"oOq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "oOx" = ( /obj/machinery/door/airlock/public/glass/incinerator/atmos_interior, /obj/effect/mapping_helpers/airlock/cyclelink_helper, @@ -46636,14 +46775,9 @@ /area/station/science/lab) "oPt" = ( /obj/structure/table, -/obj/item/paper_bin/carbon{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, -/obj/item/stamp/head/hop, -/obj/item/storage/wallet/random{ - pixel_x = 9 +/obj/item/papercutter{ + pixel_x = 8; + pixel_y = 6 }, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) @@ -48044,7 +48178,7 @@ }, /obj/effect/mapping_helpers/airlock/locked, /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "pmg" = ( /obj/effect/turf_decal/siding/white{ @@ -48161,8 +48295,8 @@ }, /obj/effect/landmark/event_spawn, /obj/machinery/door/window/brigdoor/left/directional/west{ - req_access = list("morgue_secure"); - name = "Coroner's Office" + name = "Coroner's Office"; + req_access = list("morgue_secure") }, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -54477,8 +54611,9 @@ /area/station/security/brig) "rns" = ( /obj/structure/table/reinforced, -/obj/item/aicard, -/obj/item/multitool, +/obj/item/aicard{ + pixel_y = 6 + }, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 8 }, @@ -58608,6 +58743,9 @@ /area/station/service/library) "sEl" = ( /obj/structure/table, +/obj/item/hand_labeler{ + pixel_y = 2 + }, /turf/open/floor/wood, /area/station/command/meeting_room) "sEp" = ( @@ -59203,8 +59341,8 @@ req_access = list("hop") }, /obj/machinery/flasher/directional/south{ - pixel_y = -23; - id = "hopflash" + id = "hopflash"; + pixel_y = -23 }, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) @@ -59284,8 +59422,10 @@ /turf/closed/wall, /area/station/cargo/lobby) "sOo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/components/binary/pump/on/supply/hidden/layer4{ + dir = 8 + }, /turf/open/floor/plating, /area/station/maintenance/aft/greater) "sOz" = ( @@ -60065,7 +60205,7 @@ /turf/open/floor/iron/dark, /area/station/service/chapel) "tdY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/r_wall, /area/station/science/ordnance/burnchamber) "ted" = ( @@ -60506,6 +60646,7 @@ }, /obj/machinery/door/firedoor/heavy, /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/science/ordnance) "tml" = ( @@ -60713,9 +60854,9 @@ }, /obj/effect/turf_decal/tile/yellow/fourcorners, /obj/machinery/door/poddoor/shutters/preopen{ + dir = 4; id = "pharmacy_shutters2"; - name = "Pharmacy Shutters"; - dir = 4 + name = "Pharmacy Shutters" }, /turf/open/floor/iron, /area/station/medical/pharmacy) @@ -60967,6 +61108,10 @@ pixel_x = 5; pixel_y = 2 }, +/obj/item/storage/wallet/random{ + pixel_x = 6; + pixel_y = -24 + }, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) "tuH" = ( @@ -61160,7 +61305,7 @@ /turf/open/floor/iron/white, /area/station/medical/chemistry) "txk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall/r_wall, /area/station/maintenance/starboard/aft) "txo" = ( @@ -62968,15 +63113,6 @@ /obj/structure/sign/warning/electric_shock, /turf/closed/wall/r_wall, /area/station/engineering/supermatter) -"ucZ" = ( -/obj/structure/closet, -/obj/item/clothing/under/suit/black, -/obj/item/clothing/under/suit/black/skirt, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms/laundry) "udc" = ( /obj/structure/cable/multilayer/multiz, /obj/machinery/light/small/dim/directional/west, @@ -64167,7 +64303,7 @@ /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible/layer2, /obj/machinery/air_sensor/incinerator_tank, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "uxK" = ( /obj/machinery/light/small/directional/east, @@ -64837,6 +64973,10 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark, /area/station/service/chapel) +"uJs" = ( +/obj/structure/closet/bombcloset, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "uJt" = ( /turf/open/floor/carpet, /area/station/service/chapel) @@ -65057,7 +65197,9 @@ /area/station/engineering/storage) "uNw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/trash/raisins, +/obj/machinery/atmospherics/components/tank/air{ + dir = 4 + }, /turf/open/floor/plating, /area/station/maintenance/aft/greater) "uNA" = ( @@ -66961,6 +67103,7 @@ dir = 1 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/mining_weather_monitor/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/central) "vtA" = ( @@ -68546,7 +68689,6 @@ /obj/item/computer_disk/engineering, /obj/item/computer_disk/engineering, /obj/item/computer_disk/engineering, -/obj/item/computer_disk/atmos, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -70403,8 +70545,6 @@ /area/station/engineering/atmos) "wwB" = ( /obj/structure/table/wood, -/obj/item/pinpointer/nuke, -/obj/item/disk/nuclear, /obj/item/storage/secure/safe/directional/east, /obj/machinery/light/directional/east, /turf/open/floor/wood, @@ -71127,7 +71267,7 @@ }, /obj/effect/turf_decal/siding/wood, /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/glass_large{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "The Girly Boar" }, /turf/open/floor/iron/dark/textured_half, @@ -71221,7 +71361,13 @@ /area/station/hallway/secondary/exit/departure_lounge) "wKw" = ( /obj/structure/table/wood, -/obj/item/flashlight/lamp/green, +/obj/item/flashlight/lamp/green{ + pixel_y = 14 + }, +/obj/item/reagent_containers/cup/glass/flask/gold{ + pixel_x = 6; + pixel_y = 5 + }, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) "wKA" = ( @@ -74004,6 +74150,13 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) +"xBu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/holopad, +/turf/open/floor/iron/dark/textured, +/area/station/security/execution/transfer) "xBv" = ( /obj/machinery/light/directional/north, /obj/effect/decal/cleanable/dirt, @@ -74167,7 +74320,9 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/medical/virology) "xEt" = ( -/obj/structure/closet/bombcloset, +/obj/machinery/atmospherics/components/tank/air{ + initialize_directions = 2 + }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "xEx" = ( @@ -160516,7 +160671,7 @@ iwS iqT tDG tDG -ucZ +igs iwS tKI wkj @@ -169978,7 +170133,7 @@ ate ate fgJ cpw -ihB +xBu ihB ddp hBg @@ -181339,7 +181494,7 @@ fwB btU cJa fDp -oNj +oiv vAO jUB oXs @@ -191127,7 +191282,7 @@ mIC aWs wPC qSk -qSk +jPA rEh qSk jwj @@ -191384,7 +191539,7 @@ iao iPD iao odf -qSk +jPA jaY rhY uSq @@ -191894,10 +192049,10 @@ vzD vzD jdd xEt -jCl -jCl -jCl -qXY +aUv +oOq +jPE +ieZ coH vzD thA @@ -192409,7 +192564,7 @@ jCl bFq axu dVq -jCl +uJs jCl jCl iVY @@ -233183,7 +233338,7 @@ wNO wNO wNO wNO -wNO +aBR aBR aBR aBR @@ -233440,7 +233595,7 @@ wNO wNO wNO wNO -wNO +aBR aBR aBR aBR @@ -233696,8 +233851,8 @@ wNO wNO wNO wNO -wNO -wNO +aBR +aBR aBR aBR aBR @@ -233953,8 +234108,8 @@ wNO wNO wNO wNO -wNO -wNO +aBR +aBR aBR aBR aBR @@ -234209,10 +234364,10 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +aBR +aBR +aBR +bln aBR aBR nbp @@ -234465,13 +234620,13 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO aBR aBR +aBR +aBR +bln +bln +aBR nbp mhx jeF @@ -234722,12 +234877,12 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO +aBR +aBR +aBR +bln +lBD +bln aBR nbp xKY @@ -234979,13 +235134,13 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO aBR +aBR +aBR +bln +uer +bln +lBD nbp mhx jeF @@ -235235,14 +235390,14 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO aBR +aBR +aBR +lBD +bln +bln +bln +lBD nbp nbp mUM @@ -235492,14 +235647,14 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +aBR +aBR +aBR +bln +bln +bln +tGr +bln lbc nbp mMX @@ -235749,14 +235904,14 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +aBR +aBR +aBR +bln +lBD +tGr +tGr +tGr lbc nbp nbp @@ -236006,17 +236161,17 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +aBR +aBR +aBR +uer +bln +tGr +tGr +tGr lbc bln -bln +lBD bln npb bln @@ -236263,14 +236418,14 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +aBR +aBR +aBR +aBR +bln +tGr +tGr +tGr lbc bln bln @@ -236521,13 +236676,13 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +aBR +aBR +aBR +bln +bln +tGr +tGr lbc bln bln @@ -236778,13 +236933,13 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +aBR +aBR +aBR +bln +bln +lBD +tGr lbc bln bln @@ -237035,13 +237190,13 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +aBR +aBR +aBR +bln +bln +lBD +tGr lbc bln bln @@ -237049,7 +237204,7 @@ bln lbc bln bln -bln +lBD bln lSu bUx @@ -237292,23 +237447,23 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -wNO +aBR +aBR +aBR +aBR +bln +bln +bln mZf oot oot ajx -rwt -aBR -aBR -aBR -aBR -aBR +qVo +bln +bln +bln +bln +bln bUx xmO ubE @@ -237550,22 +237705,22 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -aBR -aBR -aBR -aBR -aBR -aBR -aBR aBR aBR aBR +bln +uer +bln +lBD +bln +bln +bln +npb +bln +bln +bln +tGr +tGr bUx xmO deY @@ -237807,22 +237962,22 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO -wNO -aBR -aBR -aBR -aBR -aBR -aBR -aBR aBR aBR aBR +bln +bln +bln +tGr +tGr +bln +bln +npb +bln +tGr +tGr +tGr +tGr bUx hJe xmO @@ -238065,16 +238220,16 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO aBR aBR aBR bln bln +tGr +tGr +lBD +bln +jse bln xAs nXb @@ -238322,14 +238477,14 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO -wNO aBR aBR aBR +aBR +lBD +tGr +tGr +tGr bln bln bln @@ -238580,19 +238735,19 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO aBR aBR aBR bln bln +tGr +tGr +bln +lSu xiI -bln -bln -bln +oxu +oot +oot kei pDC clq @@ -238837,16 +238992,16 @@ wNO wNO wNO wNO -wNO -wNO -wNO -wNO +aBR aBR aBR aBR bln bln bln +lBD +bln +bln bln bln bln @@ -239095,14 +239250,14 @@ wNO wNO wNO wNO -wNO -wNO -wNO +aBR aBR aBR aBR bln bln +lBD +bln bln bln bln @@ -239352,9 +239507,8 @@ wNO wNO wNO wNO -wNO -wNO -wNO +aBR +aBR aBR aBR aBR @@ -239363,6 +239517,7 @@ bln bln bln bln +lBD tCR lGK jRP @@ -239609,15 +239764,15 @@ wNO wNO wNO wNO -wNO -wNO -wNO +aBR +aBR +aBR aBR aBR aBR bln bln -bln +uer bln bln tCR @@ -239867,15 +240022,15 @@ wNO wNO wNO wNO -wNO -wNO +aBR +aBR aBR aBR aBR bln bln bln -bln +lBD bln tCR nKR @@ -240125,7 +240280,7 @@ wNO wNO wNO wNO -wNO +aBR aBR aBR aBR @@ -240382,13 +240537,13 @@ wNO wNO wNO wNO -wNO +aBR aBR aBR aBR bln bln -bln +lBD bln ykw mvl @@ -246664,7 +246819,7 @@ ves dFA iye sZF -eZu +nrf sZF bln bln @@ -247178,7 +247333,7 @@ fZT dFA axC sZF -eZu +iYq vjZ bln bln @@ -250515,7 +250670,7 @@ bCL ofr sBx hfc -hfc +hzV adY tmR sZF diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 890467c7d95..8d89ed86ee6 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -222,40 +222,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/iron/dark/textured, /area/station/medical/cryo) -"aeB" = ( -/obj/machinery/door/airlock/grunge{ - name = "Morgue" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, -/obj/effect/mapping_helpers/airlock/access/all/medical/morgue, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"aeF" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/beaker{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/reagent_containers/cup/beaker/large, -/obj/item/reagent_containers/dropper, -/obj/item/reagent_containers/cup/bottle/epinephrine{ - pixel_x = -4; - pixel_y = 12 - }, -/obj/item/reagent_containers/cup/bottle/multiver{ - pixel_x = 7; - pixel_y = 12 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "afj" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -319,7 +285,6 @@ "agN" = ( /obj/structure/table/glass, /obj/item/radio/intercom/directional/west, -/obj/structure/microscope, /obj/machinery/camera/directional/west{ c_tag = "Xenobiology Lab - Fore"; network = list("ss13","rd","xeno") @@ -329,6 +294,21 @@ /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 8 }, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_x = -6; + pixel_y = 22 + }, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = 4; + pixel_y = 17 + }, +/obj/item/food/tofu{ + pixel_y = 6 + }, +/obj/item/food/tofu, +/obj/item/food/tofu{ + pixel_y = -6 + }, /turf/open/floor/iron/white, /area/station/science/cytology) "agQ" = ( @@ -469,14 +449,6 @@ /obj/structure/window/spawner/directional/east, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) -"aix" = ( -/obj/machinery/suit_storage_unit/cmo, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/cmo) "aja" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -490,10 +462,21 @@ /obj/machinery/vending/drugs, /turf/open/floor/iron/dark, /area/station/medical/medbay/central) -"ajM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) +"ajK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 1 + }, +/turf/open/floor/iron/white/smooth_half, +/area/station/medical/cryo) "aks" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral{ @@ -505,6 +488,41 @@ /obj/structure/chair/stool/directional/east, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"akA" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/o_plus{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/reagent_containers/blood/o_minus, +/obj/item/reagent_containers/blood/b_plus, +/obj/item/reagent_containers/blood/b_minus, +/obj/item/reagent_containers/blood/a_plus, +/obj/item/reagent_containers/blood/a_minus, +/obj/item/reagent_containers/blood/lizard, +/obj/item/reagent_containers/blood/ethereal, +/obj/item/reagent_containers/blood{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/reagent_containers/blood{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/reagent_containers/blood{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/virology) "akE" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -584,13 +602,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) -"amb" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) "amc" = ( /obj/structure/chair{ dir = 4; @@ -713,8 +724,8 @@ "anT" = ( /obj/structure/chair/sofa/corp/right{ desc = "Looks like someone threw it out. Covered in donut crumbs."; - name = "couch"; - dir = 1 + dir = 1; + name = "couch" }, /obj/structure/lattice, /turf/open/space/basic, @@ -734,11 +745,6 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space/nearstation) -"aoL" = ( -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) "apg" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible, @@ -772,10 +778,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"apB" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/central) "apJ" = ( /obj/structure/cable, /turf/open/floor/iron/dark, @@ -888,17 +890,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"ari" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "ark" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -981,10 +972,17 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) -"ati" = ( -/obj/effect/spawner/random/vending/colavend, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/aft) +"atk" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "atN" = ( /obj/structure/cable, /obj/machinery/computer/records/security{ @@ -1031,17 +1029,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/commons/dorms) -"auH" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "auJ" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -1059,6 +1046,22 @@ /obj/item/storage/box/lights/mixed, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"avb" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/holopad, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 1 + }, +/turf/open/floor/iron/white/smooth_half, +/area/station/medical/cryo) "avc" = ( /obj/machinery/airalarm/directional/east, /obj/machinery/camera/directional/east{ @@ -1196,19 +1199,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/security/prison) -"axR" = ( -/obj/machinery/light_switch/directional/east, -/obj/structure/table/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/obj/machinery/fax{ - fax_name = "Psychology Office"; - name = "Psychology Office Fax Machine" - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) "axW" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -1312,6 +1302,15 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/white, /area/station/security/prison/mess) +"aAb" = ( +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) "aAg" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral, @@ -1509,6 +1508,14 @@ }, /turf/open/floor/iron/checker, /area/station/science/research) +"aDo" = ( +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "aDA" = ( /obj/machinery/light/small/directional/south, /obj/item/folder, @@ -1753,6 +1760,13 @@ /obj/structure/sign/warning/biohazard, /turf/closed/wall/r_wall, /area/station/science/research) +"aIl" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "aIm" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=7.5-Starboard-Aft-Corner"; @@ -1777,15 +1791,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"aID" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) "aIE" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 8 @@ -1796,6 +1801,19 @@ }, /turf/open/floor/iron, /area/station/construction/storage_wing) +"aIO" = ( +/obj/machinery/dna_scannernew, +/obj/effect/turf_decal/siding/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/requests_console/directional/east{ + department = "Genetics"; + name = "Genetics Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/turf/open/floor/iron/dark, +/area/station/science/genetics) "aJa" = ( /obj/item/radio/intercom/directional/south, /obj/structure/disposalpipe/segment{ @@ -1804,6 +1822,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) +"aJb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "aJd" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -1827,9 +1857,10 @@ /turf/open/floor/iron, /area/station/engineering/main) "aJm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/station/maintenance/starboard/lesser) +/obj/effect/spawner/random/structure/grille, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) "aJn" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -2599,6 +2630,22 @@ }, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) +"aWR" = ( +/obj/structure/table/glass, +/obj/machinery/light_switch/directional/north, +/obj/item/storage/secure/briefcase{ + pixel_x = 3; + pixel_y = 5 + }, +/obj/item/storage/medkit/regular{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) "aXa" = ( /turf/closed/wall, /area/station/security/prison/mess) @@ -2746,19 +2793,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) -"aZq" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/holopad, -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron/white/smooth_edge, -/area/station/medical/cryo) "aZr" = ( /obj/structure/table, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3338,6 +3372,15 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron, /area/station/science/xenobiology) +"bjy" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "bjB" = ( /obj/structure/sign/directions/security{ dir = 1; @@ -3375,6 +3418,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/science/research) +"bjK" = ( +/obj/structure/tank_holder/extinguisher, +/obj/machinery/camera/directional/east{ + c_tag = "Medbay Cryogenics"; + network = list("ss13","medbay") + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/cryo) "bjP" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/aisat/foyer) @@ -3653,10 +3706,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/storage/primary) -"bod" = ( -/obj/structure/closet, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/aft) "boD" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -3766,6 +3815,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/siding/purple/corner{ + dir = 4 + }, /turf/open/floor/iron/white, /area/station/science/cytology) "bqX" = ( @@ -3804,6 +3856,15 @@ /obj/structure/transit_tube/diagonal/topleft, /turf/open/space, /area/space/nearstation) +"brX" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/structure/steam_vent, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) "brY" = ( /obj/machinery/camera/motion/directional/east{ c_tag = "MiniSat Foyer"; @@ -4149,6 +4210,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/locker) +"bxq" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "bxr" = ( /obj/structure/sign/warning/electric_shock/directional/east, /turf/open/space/basic, @@ -4283,6 +4353,14 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/carpet, /area/station/commons/dorms) +"bAI" = ( +/obj/machinery/disposal/bin, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "bAR" = ( /obj/effect/turf_decal/plaque{ icon_state = "L4" @@ -4479,6 +4557,22 @@ /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/burnchamber) +"bEA" = ( +/obj/structure/cable, +/obj/machinery/camera/directional/south{ + c_tag = "Chief Medical Officer's Office"; + network = list("ss13","medbay") + }, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/machinery/requests_console/directional/south{ + department = "Chief Medical Officer's Desk"; + name = "Chief Medical Officer's Requests Console" + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) "bEC" = ( /obj/machinery/computer/scan_consolenew{ dir = 4 @@ -4508,6 +4602,7 @@ dir = 1 }, /obj/machinery/modular_computer/preset/id, +/obj/item/radio/intercom/directional/north, /turf/open/floor/iron, /area/station/security/checkpoint/customs) "bFr" = ( @@ -4686,16 +4781,6 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/storage) -"bJc" = ( -/obj/structure/table/wood, -/obj/item/food/grown/harebell, -/obj/item/food/grown/harebell, -/obj/item/food/grown/harebell, -/obj/item/food/grown/harebell, -/obj/item/food/grown/harebell, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "bJk" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -4868,15 +4953,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"bMh" = ( -/obj/effect/turf_decal/trimline/neutral/filled/warning{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "bMA" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -4921,6 +4997,18 @@ "bMY" = ( /turf/closed/wall, /area/station/medical/office) +"bNa" = ( +/obj/machinery/shower/directional/west, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white/textured, +/area/station/medical/surgery/theatre) +"bNc" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) "bNf" = ( /obj/structure/closet/secure_closet/bar, /obj/machinery/light/small/directional/west, @@ -5082,6 +5170,26 @@ /obj/effect/landmark/start/scientist, /turf/open/floor/engine, /area/station/science/explab) +"bRq" = ( +/obj/structure/table/wood, +/obj/item/food/grown/harebell{ + pixel_x = -6; + pixel_y = 10 + }, +/obj/item/food/grown/harebell{ + pixel_x = 8; + pixel_y = 12 + }, +/obj/item/food/grown/harebell{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/food/grown/harebell{ + pixel_y = 7 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "bRF" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/iron, @@ -5319,6 +5427,12 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/dark, /area/station/command/bridge) +"bVx" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) "bVz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -5465,14 +5579,8 @@ /obj/item/stack/sheet/mineral/plasma{ pixel_y = 4 }, -/obj/item/reagent_containers/cup/beaker{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/reagent_containers/dropper, -/obj/item/reagent_containers/cup/beaker/large{ - pixel_x = -3; - pixel_y = 3 +/obj/item/reagent_containers/dropper{ + pixel_y = -4 }, /obj/structure/cable, /obj/machinery/light_switch/directional/west, @@ -5600,22 +5708,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/security/courtroom) -"caC" = ( -/obj/machinery/portable_atmospherics/canister/anesthetic_mix, -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" - }, -/obj/effect/turf_decal/siding/white{ - dir = 1 - }, -/turf/open/floor/iron/kitchen_coldroom, -/area/station/medical/coldroom) "caO" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "cbg" = ( @@ -5664,6 +5762,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"cdk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "cdv" = ( /obj/machinery/door/airlock{ id_tag = "AuxToilet1"; @@ -5841,13 +5949,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, /area/station/medical/break_room) -"chx" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "chH" = ( /obj/structure/chair/stool/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -5917,6 +6018,17 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/maintenance/fore) +"cjv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "cjJ" = ( /turf/open/floor/carpet/red, /area/station/command/heads_quarters/qm) @@ -6129,14 +6241,6 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/wood, /area/station/maintenance/port/aft) -"cpb" = ( -/obj/structure/bodycontainer/morgue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "cpi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit/green{ @@ -6297,7 +6401,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /obj/machinery/air_sensor/incinerator_tank, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "crk" = ( /obj/machinery/airalarm/directional/east, @@ -6372,15 +6476,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"csH" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/gloves/latex/nitrile, -/obj/item/clothing/gloves/latex/nitrile, -/obj/item/clothing/gloves/latex/nitrile, -/obj/item/clothing/gloves/latex/nitrile, -/obj/item/wrench/medical, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "csQ" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock{ @@ -6423,13 +6518,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) -"ctO" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "cuc" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -6440,6 +6528,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) +"cuk" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/smooth_corner{ + dir = 1 + }, +/area/station/medical/morgue) "cur" = ( /turf/open/floor/plating, /area/station/maintenance/fore) @@ -6481,24 +6581,6 @@ }, /turf/open/floor/iron, /area/station/engineering/main) -"cvd" = ( -/obj/item/storage/medkit/regular{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/storage/medkit/fire{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/medkit/fire, -/obj/item/storage/medkit/fire{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/structure/table/reinforced, -/obj/structure/window/spawner/directional/south, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "cve" = ( /obj/machinery/biogenerator, /turf/closed/wall, @@ -6745,6 +6827,16 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron/white, /area/station/medical/office) +"cxw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/showcase/machinery/cloning_pod{ + desc = "An old decommissioned scanner, permanently scuttled."; + icon_state = "scanner"; + name = "decommissioned cloning scanner" + }, +/obj/structure/sign/poster/contraband/random/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) "cxz" = ( /turf/closed/wall, /area/station/science/ordnance/bomb) @@ -7274,8 +7366,8 @@ /obj/structure/table/wood, /obj/structure/cable, /obj/item/storage/backpack/satchel/leather/withwallet{ - pixel_y = 4; - pixel_x = -1 + pixel_x = -1; + pixel_y = 4 }, /obj/item/stack/package_wrap, /obj/item/hand_labeler, @@ -7570,6 +7662,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"cRw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "cRU" = ( /obj/structure/bed, /obj/item/bedsheet/captain, @@ -7826,16 +7927,6 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"cWk" = ( -/obj/machinery/dna_scannernew, -/obj/effect/turf_decal/siding/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/requests_console/directional/east, -/obj/effect/mapping_helpers/requests_console/supplies, -/turf/open/floor/iron/dark, -/area/station/science/genetics) "cWr" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -7921,6 +8012,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/office) +"cXH" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/obj/structure/sign/poster/official/safety_eye_protection/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "cXP" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/engine, @@ -7983,6 +8081,13 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/port) +"cZi" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/wood/parquet, +/area/station/medical/psychology) "cZk" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/east, @@ -8012,6 +8117,7 @@ /obj/machinery/atmospherics/components/unary/thermomachine/heater{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "cZK" = ( @@ -8026,6 +8132,11 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) +"daa" = ( +/obj/structure/table/reinforced, +/obj/machinery/computer/records/medical/laptop, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "dac" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -8147,7 +8258,7 @@ anchored = 1; dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/engine/vacuum, /area/space/nearstation) "dcN" = ( @@ -8262,18 +8373,7 @@ name = "Robotics Privacy Control"; req_access = list("robotics") }, -/obj/item/mod/core/standard{ - pixel_x = -4 - }, -/obj/item/mod/core/standard{ - pixel_x = 4 - }, -/obj/item/mod/core/standard{ - pixel_y = 4 - }, -/obj/structure/closet/crate/science{ - name = "MOD core crate" - }, +/obj/structure/closet/crate/mod, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -8470,28 +8570,10 @@ "dgD" = ( /turf/closed/wall, /area/station/security/range) -"dgN" = ( -/obj/structure/bodycontainer/crematorium{ - dir = 1; - id = "crematoriumChapel" - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) "dgS" = ( /obj/machinery/rnd/production/techfab/department/security, /turf/open/floor/iron/dark, /area/station/security/office) -"dhb" = ( -/obj/structure/table, -/obj/item/stack/sheet/plasteel{ - amount = 10 - }, -/obj/item/stack/rods/fifty, -/obj/effect/spawner/random/trash/janitor_supplies, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) "dhi" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8589,6 +8671,19 @@ }, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"dim" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/reinforced, +/obj/item/clothing/gloves/color/blue{ + desc = "An old pair of nitrile gloves, with no sterile properties."; + name = "old nitrile gloves" + }, +/obj/item/clothing/mask/surgical, +/obj/item/clothing/suit/apron/surgical, +/obj/item/reagent_containers/cup/rag, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) "diq" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/window/left/directional/west{ @@ -8708,6 +8803,11 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"dlL" = ( +/obj/structure/sign/warning/vacuum/external/directional/west, +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/plating, +/area/station/maintenance/port) "dmJ" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ @@ -8761,18 +8861,6 @@ /obj/structure/window/spawner/directional/south, /turf/open/floor/iron, /area/station/engineering/atmos) -"don" = ( -/obj/machinery/airalarm/directional/west, -/obj/structure/closet/secure_closet/security/med, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/requests_console/directional/north{ - department = "Security"; - name = "Security Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/medical) "dox" = ( /obj/structure/rack, /obj/item/screwdriver{ @@ -8811,6 +8899,19 @@ }, /turf/open/floor/iron/white, /area/station/science/robotics/lab) +"dpl" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/obj/structure/table, +/obj/machinery/reagentgrinder{ + pixel_x = 2; + pixel_y = 9 + }, +/obj/item/stack/sheet/mineral/plasma{ + pixel_y = 3 + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "dpn" = ( /obj/effect/spawner/random/food_or_drink/donkpockets, /obj/structure/table/glass, @@ -8845,8 +8946,16 @@ /obj/machinery/light/floor, /turf/open/floor/iron, /area/station/commons/locker) -"dpN" = ( +"dpI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"dpN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) "dpU" = ( @@ -8960,13 +9069,6 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"drW" = ( -/obj/machinery/vending/wardrobe/chem_wardrobe, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "dsb" = ( /obj/effect/turf_decal/plaque{ icon_state = "L13" @@ -9079,6 +9181,15 @@ dir = 1 }, /area/station/engineering/atmos/pumproom) +"dub" = ( +/obj/machinery/modular_computer/preset/cargochat/medical{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) "duk" = ( /obj/machinery/light/small/dim/directional/west, /turf/open/floor/iron, @@ -9152,6 +9263,19 @@ /obj/machinery/holopad, /turf/open/floor/iron, /area/station/engineering/atmos) +"dwk" = ( +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Morgue"; + network = list("ss13","medbay") + }, +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) "dwm" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance, @@ -9230,14 +9354,16 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"dyh" = ( -/obj/structure/closet{ - name = "janitorial supplies" - }, -/obj/item/storage/box/bodybags, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) +"dyq" = ( +/obj/structure/table/glass, +/obj/item/retractor, +/obj/item/hemostat, +/obj/item/cautery, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/status_display/evac/directional/west, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) "dyr" = ( /obj/machinery/status_display/door_timer{ id = "Cell 3"; @@ -9267,13 +9393,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/robotics/mechbay) -"dzM" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "dzY" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/engine/n2o, @@ -9300,20 +9419,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/storage) -"dAx" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "dBb" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/structure/window/reinforced/spawner/directional/north, @@ -9462,26 +9567,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/science/robotics/mechbay) -"dEp" = ( -/obj/structure/table/wood, -/obj/item/food/grown/poppy{ - pixel_y = 2 - }, -/obj/item/food/grown/poppy{ - pixel_y = 2 - }, -/obj/item/food/grown/poppy{ - pixel_y = 2 - }, -/obj/item/food/grown/poppy{ - pixel_y = 2 - }, -/obj/item/food/grown/poppy{ - pixel_y = 2 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "dEx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -9494,10 +9579,10 @@ /area/station/engineering/gravity_generator) "dEF" = ( /obj/machinery/atmospherics/components/binary/pump/on, -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ dir = 4 }, -/obj/machinery/light/small/directional/east, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) "dEH" = ( @@ -9507,11 +9592,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"dEM" = ( -/obj/machinery/vending/medical, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "dEV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -9529,6 +9609,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/library) +"dFi" = ( +/obj/structure/closet/l3closet/virology, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/virology) "dFo" = ( /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/stripes/line{ @@ -9569,13 +9657,6 @@ /obj/structure/window/spawner/directional/west, /turf/open/floor/grass, /area/station/science/research) -"dGi" = ( -/obj/structure/bodycontainer/morgue{ - dir = 1 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "dGq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/stairs/left{ @@ -9682,14 +9763,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/central) -"dIA" = ( -/obj/structure/rack, -/obj/item/wrench/medical, -/obj/effect/turf_decal/siding/white, -/obj/item/food/popsicle/creamsicle_orange, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/kitchen_coldroom, -/area/station/medical/coldroom) "dIK" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -9698,13 +9771,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"dIL" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/white/smooth_edge, -/area/station/medical/medbay/central) "dIO" = ( /turf/closed/wall, /area/station/commons/toilet/restrooms) @@ -9766,17 +9832,6 @@ /obj/structure/cable, /turf/open/space/basic, /area/space/nearstation) -"dJP" = ( -/obj/structure/table/reinforced, -/obj/item/clipboard, -/obj/item/paper/monitorkey, -/obj/item/computer_disk/engineering, -/obj/item/computer_disk/engineering, -/obj/item/computer_disk/engineering, -/obj/item/computer_disk/atmos, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/station/command/heads_quarters/ce) "dJT" = ( /obj/item/reagent_containers/cup/rag, /obj/structure/table/wood, @@ -9849,6 +9904,15 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"dLn" = ( +/obj/structure/rack, +/obj/item/wrench/medical, +/obj/effect/turf_decal/siding/white, +/obj/item/food/popsicle/creamsicle_orange, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/turf/open/floor/iron/kitchen_coldroom, +/area/station/medical/coldroom) "dLq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -10054,6 +10118,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/entry) +"dPm" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 5 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) "dPy" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -10165,6 +10237,7 @@ "dRj" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, +/obj/structure/closet/secure_closet/atmospherics, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "dRp" = ( @@ -10279,6 +10352,12 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"dTp" = ( +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/dark, +/area/station/command/gateway) "dTq" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/hatch{ @@ -10619,6 +10698,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) +"dYG" = ( +/obj/structure/sign/poster/official/anniversary_vintage_reprint/directional/north, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "dYK" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/siding/wood{ @@ -10687,23 +10774,6 @@ }, /turf/open/floor/plating, /area/station/cargo/storage) -"dZU" = ( -/obj/machinery/door/poddoor/preopen{ - id = "medsecprivacy"; - name = "Privacy Shutter" - }, -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/brigdoor/right/directional/north{ - req_access = list("brig_entrance") - }, -/obj/item/folder/red{ - pixel_x = 4; - pixel_y = 2 - }, -/obj/item/paper, -/turf/open/floor/plating, -/area/station/security/checkpoint/medical) "eaa" = ( /obj/structure/sign/painting/library{ pixel_y = -32 @@ -10897,6 +10967,17 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/commons/dorms) +"edr" = ( +/obj/item/flashlight/flare/candle{ + pixel_x = 1; + pixel_y = 10 + }, +/obj/machinery/light_switch/directional/north, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "edu" = ( /turf/closed/wall/r_wall, /area/station/maintenance/solars/starboard/aft) @@ -10980,6 +11061,16 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"eeT" = ( +/obj/machinery/vending/hydroseeds{ + slogan_delay = 700 + }, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "efa" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, @@ -11066,8 +11157,8 @@ /turf/open/floor/iron/dark, /area/station/security/prison/safe) "egk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) "egn" = ( @@ -11116,16 +11207,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"egZ" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Medbay Main Hallway - South"; - network = list("ss13","medbay") - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "ehg" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 6 @@ -11341,6 +11422,17 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/plating, /area/station/maintenance/disposal) +"eky" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "ekB" = ( /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, @@ -11609,6 +11701,9 @@ /obj/effect/turf_decal/stripes/corner{ dir = 4 }, +/obj/effect/turf_decal/siding/purple{ + dir = 8 + }, /turf/open/floor/iron/white, /area/station/science/cytology) "epv" = ( @@ -11693,10 +11788,12 @@ /obj/structure/sign/poster/contraband/random/directional/west, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"eqz" = ( -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) +"eqS" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/mob/living/basic/spider/giant/sgt_araneus, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hos) "eqU" = ( /obj/machinery/light/small/directional/north, /obj/machinery/firealarm/directional/north, @@ -11744,14 +11841,6 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/general, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"erG" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "erM" = ( /obj/structure/table/wood, /obj/effect/mapping_helpers/broken_floor, @@ -11796,17 +11885,6 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/wood, /area/station/service/library) -"erU" = ( -/obj/machinery/chem_master, -/obj/structure/noticeboard/directional/south, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, -/obj/machinery/button/door/directional/south{ - id = "pharmacy_shutters_2"; - name = "pharmacy shutters control"; - req_access = list("pharmacy") - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) "esd" = ( /obj/item/reagent_containers/cup/glass/drinkingglass{ pixel_x = 4; @@ -11999,6 +12077,13 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/white, /area/station/science/research) +"euT" = ( +/obj/structure/lattice/catwalk, +/obj/structure/sign/nanotrasen{ + pixel_x = 32 + }, +/turf/open/space/basic, +/area/space/nearstation) "euX" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, @@ -12176,12 +12261,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) -"eyy" = ( -/obj/machinery/computer/operating{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "eyD" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, @@ -12195,11 +12274,6 @@ }, /turf/open/floor/iron/white, /area/station/security/prison) -"eze" = ( -/obj/structure/closet/emcloset, -/obj/structure/sign/warning/vacuum/external/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/port) "ezg" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -12402,6 +12476,16 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/engineering/atmos/storage/gas) +"eEG" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/morgue) "eEH" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -12431,22 +12515,30 @@ /obj/item/clothing/mask/breath/medical, /turf/open/floor/iron/white, /area/station/science/robotics/lab) -"eEV" = ( -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" - }, -/obj/machinery/portable_atmospherics/canister/anesthetic_mix, -/obj/effect/turf_decal/siding/white{ - dir = 1 - }, -/obj/machinery/light/cold/dim/directional/south, -/turf/open/floor/iron/kitchen_coldroom, -/area/station/medical/coldroom) "eFC" = ( /obj/machinery/bluespace_vendor/directional/south, /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/commons/locker) +"eFG" = ( +/obj/item/storage/medkit/regular{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/storage/medkit/fire{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/medkit/fire, +/obj/item/storage/medkit/fire{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/structure/table/reinforced, +/obj/structure/window/spawner/directional/south, +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "eFJ" = ( /obj/structure/extinguisher_cabinet/directional/west, /obj/item/kirbyplants/organic/plant3, @@ -12463,10 +12555,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, /area/station/commons/storage/tools) -"eFU" = ( -/obj/structure/chair/sofa/left/brown, -/turf/open/floor/carpet, -/area/station/medical/psychology) "eFX" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12567,6 +12655,18 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/white, /area/station/science/research) +"eJh" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/structure/sign/poster/contraband/random/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) "eJo" = ( /obj/machinery/firealarm/directional/east, /obj/structure/table/wood, @@ -12621,15 +12721,6 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/qm) -"eKr" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/cryo) "eKv" = ( /obj/machinery/portable_atmospherics/canister, /obj/structure/cable, @@ -12789,14 +12880,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"eMU" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "eMW" = ( /obj/structure/flora/bush/pale/style_random, /obj/structure/flora/bush/ferny/style_random, @@ -12827,6 +12910,11 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/general, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"eNl" = ( +/obj/machinery/newscaster/directional/north, +/obj/machinery/vending/wardrobe/coroner_wardrobe, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "eNq" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -12890,6 +12978,18 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron, /area/station/security/brig) +"eOv" = ( +/obj/structure/table/reinforced, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 8 + }, +/obj/machinery/light/small/directional/north, +/obj/item/storage/backpack/duffelbag/coroner/surgery, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 8 + }, +/area/station/medical/morgue) "eOJ" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/cable, @@ -12908,6 +13008,13 @@ }, /turf/open/floor/engine/co2, /area/station/engineering/atmos) +"ePg" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "ePu" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, @@ -12924,13 +13031,6 @@ }, /turf/open/floor/iron/freezer, /area/station/commons/fitness/recreation) -"ePM" = ( -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "ePN" = ( /obj/structure/chair{ dir = 8 @@ -13026,7 +13126,7 @@ /turf/open/floor/iron/white, /area/station/medical/cryo) "eRn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/r_wall, /area/station/science/ordnance/burnchamber) "eRR" = ( @@ -13241,6 +13341,15 @@ }, /turf/open/floor/iron, /area/station/command/teleporter) +"eWp" = ( +/obj/machinery/suit_storage_unit/cmo, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/machinery/light/small/directional/east, +/obj/machinery/vending/wallmed/directional/east, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/cmo) "eWq" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 @@ -13414,12 +13523,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/dark, /area/station/security/lockers) -"eZb" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "eZe" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -13629,6 +13732,20 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) +"fdQ" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/effect/spawner/random/armory/disablers, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/machinery/requests_console/directional/west{ + department = "Security"; + name = "Security Requests Console" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) "fdX" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -13966,6 +14083,11 @@ /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/port) +"fjq" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/aft) "fjv" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -14168,17 +14290,28 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/port) +"flX" = ( +/obj/structure/disposaloutlet{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/effect/turf_decal/tile/neutral/half, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 1 + }, +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 4 + }, +/area/station/medical/morgue) "fma" = ( /turf/closed/wall/r_wall, /area/station/science/robotics/lab) -"fmc" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/junction{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "fmn" = ( /obj/machinery/airalarm/directional/south, /obj/machinery/holopad, @@ -14314,6 +14447,24 @@ dir = 1 }, /area/station/engineering/atmos/storage/gas) +"fod" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/white/smooth_large, +/area/station/medical/medbay/central) +"foB" = ( +/obj/structure/closet/secure_closet/hydroponics, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/light_switch/directional/west, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/service/hydroponics) "foP" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -14335,6 +14486,15 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) +"fpg" = ( +/obj/structure/table/glass, +/obj/item/retractor, +/obj/item/hemostat, +/obj/item/cautery, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) "fpj" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -14405,6 +14565,27 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"frm" = ( +/obj/structure/bodycontainer/crematorium{ + dir = 1; + id = "crematoriumChapel" + }, +/obj/effect/turf_decal/trimline/dark_red/mid_joiner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_red/mid_joiner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_red/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_red/line{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/service/chapel/office) "frs" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -14675,6 +14856,11 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) +"fyK" = ( +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "fyY" = ( /obj/machinery/atmospherics/components/binary/pump/on{ dir = 1; @@ -14811,27 +14997,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/central) -"fBG" = ( -/obj/item/book/manual/wiki/chemistry{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/book/manual/wiki/grenades, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil, -/obj/item/clothing/glasses/science, -/obj/item/clothing/glasses/science, -/obj/item/book/manual/wiki/plumbing{ - pixel_x = 4; - pixel_y = -4 - }, -/obj/item/reagent_containers/dropper, -/obj/structure/table, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "fBJ" = ( /obj/effect/turf_decal/siding/white{ dir = 8 @@ -15103,9 +15268,10 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "fGN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ + dir = 8 + }, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "fGP" = ( @@ -15194,6 +15360,10 @@ /obj/machinery/telecomms/server/presets/supply, /turf/open/floor/circuit/telecomms/mainframe, /area/station/tcommsat/server) +"fIR" = ( +/obj/structure/sign/warning/secure_area/directional/north, +/turf/open/space/basic, +/area/space) "fIS" = ( /obj/machinery/airalarm/directional/south, /obj/structure/disposalpipe/segment{ @@ -15387,6 +15557,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/central) +"fMy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "fMN" = ( /obj/machinery/firealarm/directional/west, /obj/structure/disposalpipe/segment{ @@ -15609,17 +15788,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/commons/toilet/auxiliary) -"fRP" = ( -/obj/structure/sign/poster/official/anniversary_vintage_reprint/directional/north, -/obj/machinery/light/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "fRS" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -15806,6 +15974,15 @@ /obj/structure/closet/secure_closet/chemical, /turf/open/floor/iron/white, /area/station/medical/pharmacy) +"fWc" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "fWl" = ( /obj/machinery/restaurant_portal/restaurant, /obj/effect/turf_decal/siding/wood{ @@ -15825,6 +16002,16 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/white, /area/station/security/prison/safe) +"fWw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "fWA" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/greater) @@ -15951,17 +16138,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"fYI" = ( -/obj/structure/table/glass, -/obj/item/clothing/accessory/armband/hydro, -/obj/item/clothing/suit/apron, -/obj/item/wrench, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/sign/poster/random/directional/east, -/turf/open/floor/iron, -/area/station/service/hydroponics) "fYJ" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/structure/cable, @@ -16132,18 +16308,27 @@ }, /turf/open/floor/grass, /area/station/science/research) +"gda" = ( +/obj/structure/sign/nanotrasen{ + pixel_x = 32 + }, +/turf/open/space/basic, +/area/space) "gdb" = ( /turf/closed/wall/r_wall, /area/station/security/range) -"gdz" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 6 +"gdp" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{ + dir = 1 + }, +/turf/open/floor/iron/white/smooth_half, +/area/station/medical/cryo) "gdF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/stripes/line, @@ -16240,11 +16425,6 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/command/heads_quarters/hos) -"gfo" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "gfD" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -16302,6 +16482,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"ggO" = ( +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "ggU" = ( /obj/machinery/firealarm/directional/south, /obj/structure/disposalpipe/segment{ @@ -16361,12 +16545,12 @@ /obj/machinery/atmospherics/components/binary/pump{ dir = 1 }, -/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ - dir = 4 - }, /obj/machinery/airlock_sensor/incinerator_ordmix{ pixel_x = -24 }, +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) "gip" = ( @@ -16588,11 +16772,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/fore) -"gmp" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "gms" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -16617,6 +16796,12 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central) +"gmN" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "gmS" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -16701,12 +16886,6 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) -"goj" = ( -/obj/effect/turf_decal/siding/white{ - dir = 1 - }, -/turf/open/floor/iron/kitchen_coldroom, -/area/station/medical/coldroom) "gon" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/machinery/airalarm/directional/west, @@ -16896,6 +17075,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/central) +"grm" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/medical/cryo) "grw" = ( /obj/structure/chair{ dir = 1 @@ -17003,6 +17192,15 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"gtR" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron, +/area/station/service/hydroponics) "gtU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -17028,14 +17226,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"gui" = ( -/obj/structure/bodycontainer/morgue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "guo" = ( /obj/machinery/door/poddoor/incinerator_atmos_main, /turf/open/floor/engine, @@ -17065,6 +17255,10 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/reagent_containers/cup/bucket{ + pixel_x = -6; + pixel_y = 27 + }, /turf/open/floor/iron, /area/station/service/janitor) "guR" = ( @@ -17269,8 +17463,8 @@ name = "Xenobio Pen 8 Blast Door" }, /obj/machinery/door/window/left/directional/east{ - req_access = list("xenobiology"); - name = "Containment Pen #8" + name = "Containment Pen #8"; + req_access = list("xenobiology") }, /turf/open/floor/iron, /area/station/science/xenobiology) @@ -17469,16 +17663,22 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/primary/central) -"gCU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/dim/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) "gCW" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/wood, /area/station/commons/vacant_room/office) +"gDh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "gDv" = ( /obj/item/kirbyplants, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -17607,14 +17807,6 @@ /obj/machinery/rnd/production/protolathe/department/science, /turf/open/floor/iron/dark, /area/station/science/lab) -"gFD" = ( -/obj/structure/table, -/obj/item/book/manual/hydroponics_pod_people, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) "gFL" = ( /obj/effect/turf_decal/tile/green{ dir = 4 @@ -17854,6 +18046,19 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"gJD" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/noticeboard/directional/north, +/obj/item/paper/guides/jobs/medical/morgue{ + pixel_y = 31 + }, +/obj/structure/bed/roller, +/obj/machinery/iv_drip, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "gJV" = ( /obj/machinery/light/small/directional/south, /obj/effect/turf_decal/tile/purple, @@ -17984,6 +18189,14 @@ /obj/item/stock_parts/micro_laser, /turf/open/floor/iron, /area/station/science/lab) +"gLY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/roller, +/obj/item/roller, +/obj/item/toy/figure/md, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) "gMg" = ( /obj/structure/table, /obj/item/storage/medkit/regular, @@ -18103,6 +18316,15 @@ /obj/effect/spawner/random/maintenance/three, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"gOa" = ( +/obj/structure/table, +/obj/item/book/manual/hydroponics_pod_people, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/sign/poster/random/directional/east, +/turf/open/floor/iron, +/area/station/service/hydroponics) "gOb" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -18166,6 +18388,17 @@ /obj/structure/table/wood, /turf/open/floor/wood, /area/station/commons/lounge) +"gPl" = ( +/obj/structure/table/optable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/requests_console/directional/west{ + department = "Morgue"; + name = "Morgue Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "gPA" = ( /obj/structure/table/wood, /obj/structure/cable, @@ -18238,10 +18471,12 @@ /obj/machinery/rnd/server/master, /turf/open/floor/circuit/telecomms/server, /area/station/science/server) -"gSN" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) +"gSW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "gTh" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -18356,9 +18591,9 @@ "gUY" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/chair/stool/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "gVj" = ( @@ -18607,12 +18842,6 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/white, /area/station/science/lab) -"gZD" = ( -/obj/structure/table/glass, -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "gZG" = ( /obj/effect/turf_decal/delivery, /obj/structure/closet/secure_closet/engineering_electrical, @@ -18719,6 +18948,17 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) +"hbO" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "hbQ" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/effect/turf_decal/bot, @@ -18787,9 +19027,9 @@ /turf/open/floor/plating, /area/station/maintenance/port/fore) "hcP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/closed/wall/r_wall, -/area/station/maintenance/starboard/greater) +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "hcR" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -18828,6 +19068,10 @@ }, /turf/open/floor/engine, /area/station/engineering/atmospherics_engine) +"hdk" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "hdp" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /turf/closed/wall, @@ -18842,11 +19086,6 @@ /obj/structure/sign/warning/electric_shock, /turf/open/floor/engine, /area/station/science/xenobiology) -"hdF" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/suit_storage_unit/medical, -/turf/open/floor/iron/white, -/area/station/medical/storage) "hdI" = ( /obj/machinery/light_switch/directional/north, /obj/effect/turf_decal/tile/yellow/half/contrasted{ @@ -18983,6 +19222,14 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/white, /area/station/science/ordnance/testlab) +"hgB" = ( +/obj/machinery/vending/wardrobe/chem_wardrobe, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "hgE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/railing, @@ -19031,19 +19278,11 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/commons/lounge) -"hhU" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/obj/structure/sign/departments/psychology/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) +"hif" = ( +/obj/structure/mannequin/skeleton, +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "hio" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -19068,7 +19307,7 @@ "hiy" = ( /obj/machinery/igniter/incinerator_atmos, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "hiB" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -19107,22 +19346,34 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "hjw" = ( -/turf/open/floor/iron/white, -/area/station/science/cytology) -"hjF" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/door/window/right/directional/west{ - name = "Corpse Arrivals"; - req_access = list("morgue_secure") +/obj/structure/table/glass, +/obj/item/book/manual/wiki/cytology{ + pixel_x = -4; + pixel_y = 4 }, -/obj/effect/turf_decal/delivery/white{ - color = "#52B4E9" +/obj/item/biopsy_tool{ + pixel_x = 8; + pixel_y = 2 }, -/obj/structure/disposalpipe/segment{ +/obj/effect/turf_decal/siding/purple{ dir = 4 }, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/iron/dark, +/turf/open/floor/iron/white, +/area/station/science/cytology) +"hjx" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"hjG" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Morgue Maintenance" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/access/all/medical/morgue, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/station/medical/morgue) "hjH" = ( /obj/machinery/light/small/directional/north, @@ -19277,13 +19528,6 @@ }, /turf/open/floor/engine/vacuum, /area/space/nearstation) -"hlX" = ( -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/machinery/vending/wardrobe/medi_wardrobe, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "hmf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -19312,14 +19556,6 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/white, /area/station/security/prison/mess) -"hmI" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/service/hydroponics) "hnn" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ dir = 4 @@ -19433,17 +19669,6 @@ }, /turf/open/floor/iron, /area/station/science/robotics/mechbay) -"hpM" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) "hqb" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/burnt_floor, @@ -19510,6 +19735,22 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) +"hse" = ( +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/trimline/dark_red/end{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_red/mid_joiner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_red/mid_joiner{ + dir = 8 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/service/chapel/office) "hsp" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -19657,6 +19898,16 @@ /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, /area/station/command/teleporter) +"huy" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "huF" = ( /obj/item/clothing/suit/costume/snowman, /obj/item/clothing/head/costume/snowman, @@ -19839,6 +20090,17 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/xenobiology/hallway) +"hxw" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron, +/area/station/service/hydroponics) "hxz" = ( /obj/item/reagent_containers/spray/plantbgone{ pixel_y = 3 @@ -19908,6 +20170,16 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"hyh" = ( +/obj/machinery/shower/directional/south{ + name = "emergency shower" + }, +/obj/effect/turf_decal/trimline/blue/end, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "hyn" = ( /obj/machinery/airalarm/directional/west, /obj/effect/spawner/random/vending/snackvend, @@ -19961,13 +20233,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"hzi" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/chair/office/tactical{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "hzt" = ( /obj/structure/transit_tube/curved/flipped, /obj/effect/turf_decal/tile/blue{ @@ -20049,14 +20314,6 @@ }, /turf/open/floor/engine, /area/station/command/heads_quarters/rd) -"hBh" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) "hBm" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/south, @@ -20229,6 +20486,17 @@ }, /turf/open/floor/plating, /area/station/medical/pharmacy) +"hEq" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/mining_weather_monitor/directional/east, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/entry) "hEr" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20525,6 +20793,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"hKB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "hKG" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -20533,16 +20808,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"hKP" = ( -/obj/machinery/firealarm/directional/north, -/obj/structure/tank_holder/extinguisher, -/obj/machinery/camera/directional/east{ - c_tag = "Medbay Cryogenics"; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/cryo) "hKV" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -20637,8 +20902,8 @@ name = "Xenobio Pen 1 Blast Door" }, /obj/machinery/door/window/left/directional/east{ - req_access = list("xenobiology"); - name = "Containment Pen #1" + name = "Containment Pen #1"; + req_access = list("xenobiology") }, /turf/open/floor/iron, /area/station/science/xenobiology) @@ -20700,11 +20965,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) -"hNV" = ( -/obj/machinery/chem_master, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, -/turf/open/floor/iron/white/smooth_large, -/area/station/medical/chemistry) "hOh" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/trimline/brown/filled/warning, @@ -20731,6 +20991,15 @@ }, /turf/open/floor/iron/freezer, /area/station/security/prison/shower) +"hPk" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "hPu" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/hidden{ dir = 5 @@ -20790,12 +21059,6 @@ dir = 1 }, /area/station/service/chapel) -"hQT" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "hQY" = ( /obj/machinery/door/window/right/directional/north{ name = "Petting Zoo" @@ -20951,6 +21214,16 @@ /obj/structure/sign/warning/vacuum/external/directional/north, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"hSQ" = ( +/obj/structure/bodycontainer/morgue/beeper_off{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/warning, +/obj/effect/turf_decal/trimline/neutral/mid_joiner, +/turf/open/floor/iron/dark/smooth_half{ + dir = 4 + }, +/area/station/medical/morgue) "hTn" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -21048,15 +21321,10 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"hVg" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) "hVn" = ( /obj/machinery/door/window/right/directional/east{ - req_access = list("xenobiology"); - name = "Containment Pen #8" + name = "Containment Pen #8"; + req_access = list("xenobiology") }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -21317,14 +21585,6 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) -"hYN" = ( -/obj/item/kirbyplants/random, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) "hZn" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/wood{ @@ -21333,6 +21593,21 @@ /obj/machinery/light/floor, /turf/open/floor/wood/large, /area/station/commons/lounge) +"hZy" = ( +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) +"hZA" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/morgue) "hZO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21397,6 +21672,13 @@ }, /turf/open/floor/iron, /area/station/service/kitchen) +"iaT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "iaZ" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=16-Fore"; @@ -21519,6 +21801,12 @@ /obj/structure/sign/warning/electric_shock, /turf/open/floor/engine, /area/station/science/xenobiology) +"idL" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "idR" = ( /obj/structure/table, /obj/item/food/dough, @@ -21957,6 +22245,10 @@ }, /turf/open/floor/carpet, /area/station/medical/psychology) +"ikY" = ( +/obj/structure/sign/warning/secure_area/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "ikZ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -22054,6 +22346,22 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron, /area/station/cargo/warehouse) +"ims" = ( +/obj/machinery/vending/wardrobe/medi_wardrobe, +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"imt" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 9 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) "imw" = ( /obj/machinery/door/window/left/directional/west{ name = "Containment Pen #3"; @@ -22061,6 +22369,17 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"imy" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave{ + pixel_y = 6 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) "imU" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -22337,16 +22656,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"irW" = ( -/obj/machinery/vending/coffee, -/obj/structure/sign/map/left{ - desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; - icon_state = "map-left-MS"; - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) "irY" = ( /obj/machinery/power/emitter/welded, /obj/structure/cable, @@ -22365,6 +22674,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) +"isk" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "isl" = ( /obj/machinery/light/small/broken/directional/south, /turf/open/floor/plating, @@ -22393,6 +22714,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, /turf/open/floor/iron/checker, /area/station/maintenance/aft/lesser) "isO" = ( @@ -22409,22 +22733,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/disposal) -"isQ" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Central Primary Hallway - Aft-Port Corner" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/filled/corner, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "isV" = ( /turf/open/floor/engine/n2, /area/station/engineering/atmos) @@ -22631,6 +22939,12 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"iwj" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "iwt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall, @@ -22653,6 +22967,14 @@ /obj/item/clothing/glasses/welding, /turf/open/floor/iron, /area/station/science/robotics/lab) +"iwL" = ( +/obj/effect/spawner/structure/window/reinforced/tinted, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/medical/morgue) "iwO" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -22738,11 +23060,6 @@ /obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) -"iyi" = ( -/obj/effect/spawner/random/entertainment/arcade, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) "iyj" = ( /obj/effect/landmark/generic_maintenance_landmark, /obj/effect/mapping_helpers/broken_floor, @@ -22885,18 +23202,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"izX" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/obj/machinery/camera/directional/north{ - c_tag = "Science Research Office"; - network = list("ss13","rd") - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/lab) "izZ" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 4 @@ -23132,6 +23437,11 @@ /obj/structure/reagent_dispensers/plumbed, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"iEv" = ( +/obj/structure/closet, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/aft) "iEE" = ( /obj/structure/table, /obj/effect/spawner/random/entertainment/deck, @@ -23234,6 +23544,16 @@ /obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) +"iGT" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/camera/directional/north{ + c_tag = "Science Research Office"; + network = list("ss13","rd") + }, +/turf/open/floor/iron, +/area/station/science/lab) "iHc" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -23313,11 +23633,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) -"iIW" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "iJd" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp/green{ @@ -23379,12 +23694,6 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron, /area/station/security/execution/transfer) -"iJB" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) "iJC" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -23588,12 +23897,6 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"iME" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/gateway) "iMF" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/trunk, @@ -23651,8 +23954,8 @@ /area/station/command/heads_quarters/cmo) "iNi" = ( /obj/item/shard, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating/airless, /area/space/nearstation) "iNk" = ( @@ -23733,15 +24036,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"iOf" = ( -/obj/structure/closet/crate/freezer/blood, -/obj/effect/turf_decal/siding/white, -/obj/machinery/camera/directional/north{ - c_tag = "Medbay Cold Storage"; - network = list("ss13","medbay") - }, -/turf/open/floor/iron/kitchen_coldroom, -/area/station/medical/coldroom) "iOm" = ( /obj/machinery/portable_atmospherics/canister, /turf/open/floor/plating, @@ -23986,6 +24280,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"iRy" = ( +/obj/structure/table/reinforced, +/obj/machinery/cell_charger, +/obj/item/radio/intercom/directional/west, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "iRR" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24049,8 +24350,8 @@ pixel_y = 2 }, /obj/item/reagent_containers/cup/soda_cans/monkey_energy{ - pixel_y = 7; - pixel_x = -7 + pixel_x = -7; + pixel_y = 7 }, /turf/open/floor/iron/white/smooth_half, /area/station/commons/fitness) @@ -24218,14 +24519,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"iVB" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "iVE" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -24427,6 +24720,17 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/construction/mining/aux_base) +"iYW" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "iZd" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 10 @@ -24573,15 +24877,6 @@ /obj/effect/spawner/random/armory/laser_gun, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) -"jcd" = ( -/obj/machinery/firealarm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) "jcw" = ( /obj/machinery/atmospherics/components/tank, /turf/open/floor/iron/dark, @@ -24647,6 +24942,16 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/engineering/main) +"jdH" = ( +/obj/structure/closet/crate/freezer/blood, +/obj/effect/turf_decal/siding/white, +/obj/machinery/camera/directional/north{ + c_tag = "Medbay Cold Storage"; + network = list("ss13","medbay") + }, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/turf/open/floor/iron/kitchen_coldroom, +/area/station/medical/coldroom) "jdR" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -24687,14 +24992,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/primary/central) -"jet" = ( -/obj/structure/closet/secure_closet/chief_medical, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/item/screwdriver, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/cmo) "jew" = ( /obj/effect/turf_decal/stripes/red/line{ dir = 4 @@ -24717,15 +25014,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/iron/dark, /area/station/medical/cryo) -"jeX" = ( -/obj/machinery/light/directional/east, -/obj/structure/disposalpipe/segment, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "jfa" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/machinery/vending/games, @@ -25006,6 +25294,9 @@ dir = 4 }, /obj/effect/turf_decal/tile/purple/fourcorners, +/obj/effect/turf_decal/siding/purple/corner{ + dir = 1 + }, /turf/open/floor/iron/white, /area/station/science/cytology) "jjn" = ( @@ -25116,6 +25407,7 @@ dir = 5 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/item/soap, /turf/open/floor/iron/white, /area/station/science/xenobiology/hallway) "jld" = ( @@ -25330,12 +25622,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"jov" = ( -/obj/machinery/shower/directional/west, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) "joP" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/wood{ @@ -25405,16 +25691,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, /area/station/security/holding_cell) -"jpY" = ( -/obj/machinery/smartfridge/chemistry/preloaded, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 8; - id = "chem_lockdown"; - name = "Chemistry Shutters" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "jqa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -25531,8 +25807,18 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/effect/turf_decal/siding/purple/corner{ + dir = 8 + }, /turf/open/floor/iron/white, /area/station/science/cytology) +"jsj" = ( +/obj/machinery/shower/directional/west, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/iron/white/textured, +/area/station/medical/surgery/theatre) "jso" = ( /obj/structure/cable, /obj/machinery/door/firedoor, @@ -25641,14 +25927,6 @@ /obj/item/circuitboard/mecha/ripley/peripherals, /turf/open/floor/iron, /area/station/science/robotics/lab) -"jtZ" = ( -/obj/structure/table/reinforced, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) "juf" = ( /obj/machinery/telecomms/bus/preset_two, /turf/open/floor/circuit/telecomms/mainframe, @@ -25719,7 +25997,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ dir = 1 }, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "jvo" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, @@ -26180,6 +26458,18 @@ /obj/structure/sign/poster/contraband/random/directional/south, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"jBU" = ( +/obj/structure/chair/office/tactical{ + dir = 1 + }, +/obj/effect/landmark/start/coroner, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 8 + }, +/area/station/medical/morgue) "jBY" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/bot, @@ -26215,6 +26505,7 @@ /obj/machinery/atmospherics/components/tank/plasma{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "jCM" = ( @@ -26286,14 +26577,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"jEY" = ( -/obj/structure/table, -/obj/item/phone{ - pixel_x = 6; - pixel_y = -2 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "jFi" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -26470,6 +26753,16 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/security/office) +"jHQ" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) "jHW" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/effect/turf_decal/trimline/brown/filled/warning, @@ -26480,7 +26773,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, -/turf/open/floor/holofloor/dark, +/turf/open/floor/iron/dark/textured_large, /area/station/science/cytology) "jIg" = ( /obj/structure/table, @@ -26692,6 +26985,13 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space/nearstation) +"jLy" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "jLD" = ( /obj/effect/landmark/event_spawn, /obj/structure/cable, @@ -26864,6 +27164,11 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) +"jOw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "jOF" = ( /obj/structure/rack, /obj/item/gun/energy/laser/practice{ @@ -26951,10 +27256,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/white, /area/station/medical/virology) -"jPo" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/central) "jPp" = ( /obj/effect/landmark/generic_maintenance_landmark, /obj/effect/turf_decal/stripes/line{ @@ -27053,6 +27354,13 @@ dir = 1 }, /area/station/engineering/storage_shared) +"jRc" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "jRg" = ( /turf/open/floor/engine/co2, /area/station/engineering/atmos) @@ -27217,10 +27525,10 @@ /area/station/science/lobby) "jUi" = ( /obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/airlock_sensor/incinerator_atmos{ pixel_y = 24 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) "jUj" = ( @@ -27477,6 +27785,12 @@ /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /turf/open/floor/iron/white, /area/station/medical/surgery/aft) +"jYr" = ( +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/iron/dark, +/area/station/command/gateway) "jYu" = ( /mob/living/basic/cow{ name = "Betsy"; @@ -27528,15 +27842,6 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark, /area/station/command/bridge) -"jZl" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) "jZz" = ( /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible, /turf/open/floor/iron, @@ -27546,10 +27851,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/space, /area/space/nearstation) -"jZO" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "jZP" = ( /obj/effect/turf_decal/siding/purple{ dir = 5 @@ -27644,22 +27945,35 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/engine, /area/station/science/xenobiology) +"kbB" = ( +/obj/structure/chair/sofa/corp/right, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) "kbN" = ( /obj/effect/decal/cleanable/dirt, /obj/item/storage/box/mousetraps{ - pixel_x = -3; - pixel_y = 8 + pixel_x = -5; + pixel_y = 14 }, /obj/structure/table, /obj/item/storage/box/mousetraps{ - pixel_x = -3; - pixel_y = 8 - }, -/obj/item/clothing/gloves/color/orange{ - pixel_x = 4; - pixel_y = -2 + pixel_x = 12; + pixel_y = 15 }, /obj/item/radio/intercom/directional/north, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = -7; + pixel_y = 6 + }, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = -1; + pixel_y = 3 + }, /turf/open/floor/iron, /area/station/service/janitor) "kbR" = ( @@ -27741,6 +28055,19 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"kcZ" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/gloves/latex/nitrile, +/obj/item/clothing/gloves/latex/nitrile, +/obj/item/clothing/gloves/latex/nitrile, +/obj/item/clothing/gloves/latex/nitrile, +/obj/item/wrench/medical, +/obj/machinery/camera/directional/north{ + c_tag = "Medbay Storage"; + network = list("ss13","medbay") + }, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "kdx" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=8.1-Aft-to-Escape"; @@ -27875,6 +28202,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/gateway) +"kgx" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/medical/morgue) "kgy" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -28000,18 +28331,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/lockers) -"kjj" = ( -/obj/machinery/duct, -/obj/effect/turf_decal/trimline/blue/filled/corner, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/light/floor, -/turf/open/floor/iron/white, -/area/station/medical/cryo) "kjG" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -28202,12 +28521,6 @@ /obj/machinery/status_display/evac, /turf/closed/wall, /area/station/commons/lounge) -"kms" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/mob/living/basic/giant_spider/sgt_araneus, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hos) "kmN" = ( /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) @@ -28344,6 +28657,16 @@ "kor" = ( /turf/closed/wall, /area/station/maintenance/department/science/central) +"kou" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "koW" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=10.2-Aft-Port-Corner"; @@ -28355,6 +28678,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central) +"kpi" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/status_display/ai/directional/west, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "kpB" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -28381,6 +28711,14 @@ /obj/structure/sign/warning/vacuum/external/directional/north, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"kpV" = ( +/obj/machinery/computer/operating{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) "kqm" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/blue/filled/warning{ @@ -28390,11 +28728,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"kqP" = ( -/obj/structure/table/reinforced, -/obj/item/storage/backpack/duffelbag/coroner/surgery, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "kqZ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -28475,28 +28808,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/gateway) -"kss" = ( -/obj/structure/table, -/obj/item/folder/white{ - pixel_x = 3; - pixel_y = 4 - }, -/obj/item/reagent_containers/cup/beaker/large{ - pixel_x = -4; - pixel_y = 7 - }, -/obj/item/reagent_containers/cup/beaker{ - pixel_x = 7 - }, -/obj/item/reagent_containers/dropper{ - pixel_x = -3; - pixel_y = -6 - }, -/obj/machinery/airalarm/directional/north, -/obj/structure/cable, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/station/science/lab) "ksT" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -28507,6 +28818,25 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) +"ksZ" = ( +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Security Post - Medbay"; + network = list("ss13","medbay") + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/light/small/directional/north, +/obj/structure/table/reinforced, +/obj/machinery/requests_console/directional/north{ + department = "Security"; + name = "Security Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/effect/mapping_helpers/requests_console/supplies, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/medical) "ktl" = ( /obj/structure/sink/directional/east, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ @@ -28544,6 +28874,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload_foyer) +"ktw" = ( +/obj/structure/sign/warning/electric_shock/directional/north, +/turf/open/space/basic, +/area/space) "ktz" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -28600,10 +28934,6 @@ /obj/effect/turf_decal/trimline/blue/filled/corner, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"kul" = ( -/obj/machinery/vending/cigarette, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/aft) "kuD" = ( /obj/structure/lattice, /obj/machinery/atmospherics/components/unary/passive_vent{ @@ -28733,6 +29063,12 @@ "kwZ" = ( /turf/open/floor/engine/vacuum, /area/station/engineering/atmos) +"kxa" = ( +/obj/machinery/chem_master, +/obj/structure/noticeboard/directional/south, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) "kxq" = ( /obj/machinery/status_display/evac/directional/north, /obj/machinery/porta_turret/ai, @@ -28807,6 +29143,11 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"kys" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "kyt" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -28973,15 +29314,11 @@ /area/station/science/genetics) "kBQ" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/electrolyzer, /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, +/obj/structure/closet/radiation, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"kBR" = ( -/obj/structure/bodycontainer/morgue/beeper_off, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "kBS" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/spawner/random/structure/closet_maintenance, @@ -29005,7 +29342,10 @@ /area/station/engineering/main) "kCr" = ( /obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/holofloor/dark, +/obj/machinery/plumbing/input{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured_large, /area/station/science/cytology) "kCt" = ( /obj/machinery/status_display/door_timer{ @@ -29035,6 +29375,17 @@ "kCZ" = ( /turf/closed/wall, /area/station/service/hydroponics) +"kDa" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Medbay Main Hallway - South"; + network = list("ss13","medbay") + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "kDk" = ( /obj/machinery/door/airlock/security/glass{ name = "Permabrig Visitation" @@ -29251,12 +29602,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"kHV" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/table/reinforced, -/obj/machinery/computer/records/medical/laptop, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "kIG" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance/two, @@ -29308,6 +29653,17 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"kKh" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/structure/chair{ + dir = 4 + }, +/obj/structure/sign/poster/official/help_others/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "kKk" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -29333,15 +29689,6 @@ "kKr" = ( /turf/open/floor/iron, /area/station/hallway/primary/port) -"kKu" = ( -/obj/machinery/reagentgrinder, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/structure/table/glass, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) "kKv" = ( /obj/structure/lattice, /obj/machinery/atmospherics/components/unary/passive_vent, @@ -29437,16 +29784,6 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/white, /area/station/science/xenobiology/hallway) -"kLZ" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Medbay Primary Treatment Centre East"; - network = list("ss13","medbay") - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "kMd" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -29461,6 +29798,28 @@ }, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) +"kMk" = ( +/obj/item/book/manual/wiki/chemistry{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/book/manual/wiki/grenades, +/obj/item/stack/cable_coil, +/obj/item/stack/cable_coil, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science, +/obj/item/book/manual/wiki/plumbing{ + pixel_x = 4; + pixel_y = -4 + }, +/obj/item/reagent_containers/dropper, +/obj/structure/table, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/obj/structure/sign/poster/official/periodic_table/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "kMl" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -29497,6 +29856,11 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"kNA" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood/parquet, +/area/station/medical/psychology) "kNO" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/trimline/yellow/filled/corner{ @@ -29546,10 +29910,6 @@ "kOK" = ( /turf/open/floor/plating, /area/station/hallway/primary/port) -"kOM" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/medical/morgue) "kON" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -29566,9 +29926,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"kOR" = ( -/turf/closed/wall, -/area/station/hallway/primary/aft) "kOX" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -29766,16 +30123,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) -"kRR" = ( -/obj/structure/table/wood, -/obj/machinery/fax{ - fax_name = "Law Office"; - name = "Law Office Fax Machine" - }, -/obj/machinery/light/small/directional/south, -/obj/machinery/button/door/directional/west, -/turf/open/floor/wood, -/area/station/service/lawoffice) "kRV" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -29999,6 +30346,11 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/foyer) +"kWE" = ( +/obj/machinery/smartfridge/organ, +/obj/effect/turf_decal/tile/dark_blue/full, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/morgue) "kWL" = ( /obj/structure/sign/directions/command{ dir = 4; @@ -30057,16 +30409,6 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron, /area/station/commons/toilet/auxiliary) -"kXl" = ( -/obj/item/radio/intercom/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "kXp" = ( /obj/machinery/camera/autoname{ dir = 5 @@ -30189,6 +30531,14 @@ "kYG" = ( /turf/closed/wall/r_wall, /area/station/engineering/supermatter/room) +"kYH" = ( +/obj/machinery/light/directional/east, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "kYP" = ( /obj/machinery/light/small/dim/directional/west, /turf/open/floor/plating, @@ -30215,29 +30565,6 @@ /obj/structure/chair/stool/directional/north, /turf/open/floor/wood, /area/station/commons/lounge) -"kZp" = ( -/obj/machinery/door/window/right/directional/south{ - dir = 1; - name = "First Aid Supplies"; - req_access = list("medical") - }, -/obj/item/storage/medkit/regular{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/storage/medkit/toxin{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/medkit/toxin, -/obj/item/storage/medkit/toxin{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/structure/table/reinforced, -/obj/structure/window/spawner/directional/west, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "kZq" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -30335,25 +30662,6 @@ /obj/effect/mapping_helpers/airlock/access/all/service/kitchen, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen/coldroom) -"laW" = ( -/obj/structure/table, -/obj/machinery/microwave, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 6 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Kitchen" - }, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "lbh" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -30601,6 +30909,18 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"lgw" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/machinery/camera/directional/east{ + c_tag = "Medbay Main Hallway - CMO"; + network = list("ss13","medbay") + }, +/obj/structure/noticeboard/cmo{ + dir = 4; + pixel_x = 32 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "lgC" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/co2{ @@ -30834,10 +31154,44 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/break_room) +"lmk" = ( +/obj/item/radio/intercom/directional/south, +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) "lmn" = ( /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) +"lmx" = ( +/obj/machinery/light_switch/directional/west, +/obj/effect/decal/cleanable/cobweb, +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/food/grown/poppy{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/food/grown/poppy{ + pixel_x = 7; + pixel_y = 7 + }, +/obj/item/flashlight/flare/candle{ + pixel_x = 12; + pixel_y = 4 + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "lmF" = ( /obj/effect/turf_decal/bot_white/right, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -31280,6 +31634,16 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) +"luB" = ( +/obj/machinery/computer/department_orders/medical{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) "luE" = ( /obj/structure/rack, /obj/item/integrated_circuit/loaded/hello_world, @@ -31296,6 +31660,12 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central) +"luN" = ( +/obj/machinery/airalarm/directional/west, +/obj/structure/closet/secure_closet/security/med, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/medical) "luV" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -31422,23 +31792,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) -"lxw" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) -"lxC" = ( -/obj/item/radio/intercom/directional/south, -/obj/structure/chair/sofa/corp/left{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) "lxM" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -31447,18 +31800,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, /area/station/maintenance/port) -"lxT" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"lyf" = ( -/obj/structure/closet/l3closet, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) "lyu" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -31627,6 +31968,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"lDj" = ( +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 8 + }, +/obj/structure/closet/l3closet, +/turf/open/floor/iron/white, +/area/station/medical/virology) "lDo" = ( /obj/item/radio/off, /obj/effect/turf_decal/stripes/line{ @@ -31699,17 +32047,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/commons/vacant_room/office) -"lFt" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/obj/item/stack/sheet/mineral/plasma{ - pixel_y = 10 - }, -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "lFZ" = ( /obj/structure/chair/pew/right, /turf/open/floor/iron/chapel{ @@ -31789,17 +32126,6 @@ /obj/machinery/atmospherics/components/unary/thermomachine/freezer, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) -"lIi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "lIB" = ( /obj/structure/table/reinforced, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -31914,12 +32240,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/engineering/gravity_generator) -"lKS" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Chapel Office - Backroom" - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) "lKZ" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/red{ @@ -32000,6 +32320,19 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"lMh" = ( +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/trimline/neutral/end, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/service/chapel/office) "lMq" = ( /turf/open/misc/asteroid/basalt/airless, /area/space/nearstation) @@ -32118,12 +32451,6 @@ /obj/machinery/meter, /turf/open/floor/iron, /area/station/engineering/atmos) -"lOf" = ( -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) "lOg" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -32172,15 +32499,6 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"lOV" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/modular_computer/preset/cargochat/medical{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) "lOZ" = ( /obj/machinery/power/port_gen/pacman/pre_loaded, /turf/open/floor/plating, @@ -32344,16 +32662,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"lRN" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white/corner, -/area/station/hallway/secondary/entry) "lRS" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible, /obj/effect/spawner/structure/window/reinforced, @@ -32437,23 +32745,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/eva) -"lTP" = ( -/obj/structure/table/glass, -/obj/machinery/light_switch/directional/north, -/obj/machinery/vending/wallmed/directional/west, -/obj/item/storage/secure/briefcase{ - pixel_x = 3; - pixel_y = 5 - }, -/obj/item/storage/medkit/regular{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) "lTR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -32520,10 +32811,10 @@ /turf/open/floor/iron, /area/station/engineering/break_room) "lUD" = ( -/obj/machinery/space_heater, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/effect/spawner/random/structure/chair_flipped, /turf/open/floor/iron/checker, /area/station/maintenance/aft/lesser) "lUI" = ( @@ -32546,14 +32837,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"lUP" = ( -/obj/machinery/button/crematorium{ - id = "crematoriumChapel"; - pixel_x = -26 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) "lUS" = ( /obj/structure/table, /turf/open/floor/plating, @@ -32645,19 +32928,6 @@ /obj/item/stamp/law, /turf/open/floor/wood, /area/station/service/lawoffice) -"lWj" = ( -/obj/structure/bodycontainer/morgue{ - dir = 1 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Morgue"; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "lWm" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -32675,12 +32945,6 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"lWI" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) "lWM" = ( /obj/machinery/camera/directional/east{ c_tag = "Xenobiology Lab - Pen #6"; @@ -32842,15 +33106,6 @@ }, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) -"lZC" = ( -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "lZM" = ( /obj/structure/table/wood, /obj/item/reagent_containers/cup/glass/shaker, @@ -32901,13 +33156,6 @@ }, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"mav" = ( -/obj/machinery/door/airlock/medical{ - name = "Medical Cold Room" - }, -/obj/effect/mapping_helpers/airlock/access/all/medical/surgery, -/turf/open/floor/iron, -/area/station/medical/coldroom) "maB" = ( /obj/structure/destructible/cult/item_dispenser/archives/library, /obj/item/clothing/under/suit/red, @@ -33113,6 +33361,20 @@ /obj/machinery/light/floor, /turf/open/floor/iron, /area/station/engineering/atmos) +"meK" = ( +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) "meL" = ( /obj/machinery/light_switch/directional/south, /obj/structure/cable, @@ -33236,9 +33498,14 @@ /turf/open/floor/iron, /area/station/maintenance/department/science/xenobiology) "mhl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/closed/wall/r_wall, /area/station/service/janitor) +"mhm" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/storage) "mhA" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, @@ -33624,15 +33891,6 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics/garden) -"moD" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "moF" = ( /obj/effect/turf_decal/siding/purple{ dir = 5 @@ -33657,15 +33915,6 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/space, /area/space/nearstation) -"moK" = ( -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/disposal/bin, -/obj/machinery/light/cold/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) "moQ" = ( /obj/effect/turf_decal/trimline/brown/filled/line, /turf/open/floor/iron, @@ -33686,6 +33935,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai_upload) +"mpk" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/camera/directional/east{ + c_tag = "Medbay Primary Treatment Centre East"; + network = list("ss13","medbay") + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"mpw" = ( +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "mpJ" = ( /obj/item/radio/intercom/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -33713,6 +33975,15 @@ /obj/machinery/duct, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) +"mqz" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "mqK" = ( /obj/effect/landmark/blobstart, /obj/structure/cable, @@ -33790,6 +34061,14 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/engine, /area/station/engineering/supermatter) +"msC" = ( +/obj/machinery/computer/operating{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) "msJ" = ( /obj/structure/table/reinforced, /obj/item/folder/red, @@ -34008,6 +34287,15 @@ /obj/machinery/light/floor, /turf/open/floor/iron, /area/station/engineering/atmos) +"mvN" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood/parquet, +/area/station/medical/psychology) "mvR" = ( /turf/closed/wall/r_wall, /area/station/science/lab) @@ -34053,6 +34341,13 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/hos) +"mwm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "mww" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -34146,26 +34441,12 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"myg" = ( -/obj/machinery/firealarm/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Chemistry North"; - network = list("ss13","medbay") - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "myr" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, /obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/holofloor/dark, +/turf/open/floor/iron/dark/textured_large, /area/station/science/cytology) "myB" = ( /obj/structure/chair, @@ -34305,13 +34586,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"mBb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/office) "mBf" = ( /obj/structure/table/wood, /obj/machinery/recharger, @@ -34384,6 +34658,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/bridge) +"mBW" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/food/grown/poppy{ + pixel_x = -8; + pixel_y = 7 + }, +/obj/item/food/grown/poppy{ + pixel_y = 2 + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "mCi" = ( /obj/effect/turf_decal/bot_white/left, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -34829,24 +35115,6 @@ }, /turf/open/floor/iron, /area/station/construction/storage_wing) -"mJp" = ( -/obj/item/storage/medkit/regular{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/storage/medkit/o2{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/medkit/o2, -/obj/item/storage/medkit/o2{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/structure/table/reinforced, -/obj/structure/window/spawner/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "mJE" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -35064,6 +35332,27 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"mME" = ( +/obj/structure/table, +/obj/item/folder/white{ + pixel_x = 3; + pixel_y = 4 + }, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_x = -4; + pixel_y = 7 + }, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = 7 + }, +/obj/item/reagent_containers/dropper{ + pixel_x = -3; + pixel_y = -6 + }, +/obj/machinery/airalarm/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/science/lab) "mMK" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -35241,6 +35530,19 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron, /area/station/engineering/atmos/storage/gas) +"mQo" = ( +/obj/structure/table/wood, +/obj/machinery/fax{ + fax_name = "Law Office"; + name = "Law Office Fax Machine" + }, +/obj/machinery/light/small/directional/south, +/obj/machinery/button/door/directional/west{ + id = "lawyer_shutters"; + name = "Privacy Shutters" + }, +/turf/open/floor/wood, +/area/station/service/lawoffice) "mQr" = ( /turf/open/floor/iron/dark/side{ dir = 1 @@ -35357,19 +35659,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central) -"mSs" = ( -/obj/structure/cable, -/obj/machinery/camera/directional/south{ - c_tag = "Chief Medical Officer's Office"; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/obj/machinery/requests_console/directional/south, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, -/obj/effect/mapping_helpers/requests_console/announcement, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) "mSB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -35505,15 +35794,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) -"mVj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/roller, -/obj/item/roller, -/obj/item/toy/figure/md, -/obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) "mVp" = ( /obj/machinery/power/port_gen/pacman/pre_loaded, /obj/effect/mapping_helpers/broken_floor, @@ -35685,6 +35965,15 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"mXn" = ( +/obj/machinery/door/airlock/grunge{ + name = "Morgue" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/medical/general, +/obj/effect/mapping_helpers/airlock/access/all/medical/morgue, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "mXz" = ( /obj/effect/landmark/generic_maintenance_landmark, /obj/effect/turf_decal/stripes/line, @@ -35692,18 +35981,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"mXK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "mXX" = ( /obj/structure/table/reinforced, /obj/item/paper_bin{ @@ -35805,6 +36082,27 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"mZz" = ( +/obj/machinery/light/directional/west, +/obj/structure/table, +/obj/item/grenade/chem_grenade/smart_metal_foam{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/item/grenade/chem_grenade/smart_metal_foam{ + pixel_x = 4; + pixel_y = 2 + }, +/obj/item/grenade/chem_grenade/smart_metal_foam{ + pixel_x = 8 + }, +/obj/item/grenade/chem_grenade/smart_metal_foam{ + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/eva) "mZC" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -35896,14 +36194,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) -"nbm" = ( -/obj/structure/cable, -/obj/structure/bodycontainer/morgue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "nbJ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -35985,6 +36275,18 @@ /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, /area/station/maintenance/port) +"ncV" = ( +/obj/machinery/vending/coffee, +/obj/structure/sign/map/left{ + desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; + icon_state = "map-left-MS"; + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) "ndk" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -36038,16 +36340,15 @@ "ndS" = ( /turf/closed/wall/r_wall, /area/station/hallway/secondary/command) -"ned" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 +"ner" = ( +/obj/machinery/door/airlock/grunge{ + name = "Morgue" }, -/obj/machinery/computer/department_orders/medical{ - dir = 1 - }, -/obj/machinery/light/small/directional/south, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/medical/morgue, +/obj/structure/cable, /turf/open/floor/iron/dark, -/area/station/medical/medbay/central) +/area/station/medical/morgue) "neG" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -36162,15 +36463,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/security/prison) -"ngV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/showcase/machinery/cloning_pod{ - desc = "An old decommissioned scanner, permanently scuttled."; - icon_state = "scanner"; - name = "decommissioned cloning scanner" - }, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) "ngY" = ( /obj/structure/table, /obj/item/stack/sheet/iron/fifty, @@ -36259,6 +36551,21 @@ /obj/structure/closet/emcloset, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"niz" = ( +/obj/item/radio/intercom/directional/west, +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) "niY" = ( /obj/structure/disposalpipe/segment, /obj/structure/lattice/catwalk, @@ -36291,7 +36598,7 @@ /area/station/maintenance/port/aft) "njs" = ( /obj/item/stack/cable_coil/five, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/engine/vacuum, /area/space/nearstation) "njB" = ( @@ -36568,12 +36875,6 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/checker, /area/station/science/research) -"nor" = ( -/obj/structure/sink/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "nov" = ( /obj/structure/cable, /obj/structure/lattice/catwalk, @@ -36648,6 +36949,16 @@ /obj/structure/window/spawner/directional/east, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"npO" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/item/clothing/gloves/latex, +/obj/item/clothing/suit/apron/surgical, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) "npY" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -36719,6 +37030,25 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) +"nra" = ( +/obj/machinery/newscaster/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Chapel - Fore" + }, +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/food/grown/poppy{ + pixel_y = 11 + }, +/obj/item/book/bible{ + pixel_y = 3 + }, +/obj/item/food/grown/harebell{ + pixel_x = -11; + pixel_y = 2 + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "nre" = ( /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/broken_floor, @@ -37418,6 +37748,10 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/surgery/aft) +"nCr" = ( +/obj/machinery/status_display/ai/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "nCu" = ( /obj/structure/chair/office{ dir = 1 @@ -37467,6 +37801,15 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/security/prison) +"nCL" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "nCQ" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible{ dir = 4 @@ -37622,6 +37965,12 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) +"nGd" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white/smooth_large, +/area/station/medical/medbay/central) "nGp" = ( /obj/structure/table, /obj/effect/spawner/random/entertainment/dice, @@ -37704,17 +38053,9 @@ /obj/structure/chair/office/light{ dir = 8 }, +/obj/effect/turf_decal/siding/purple/corner, /turf/open/floor/iron/white, /area/station/science/cytology) -"nHK" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/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/dark, -/area/station/medical/morgue) "nIj" = ( /obj/structure/easel, /turf/open/floor/plating, @@ -37800,9 +38141,8 @@ /turf/open/floor/iron/white, /area/station/science/robotics/lab) "nJL" = ( -/obj/structure/closet, -/obj/effect/spawner/random/maintenance/two, /obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/machinery/atmospherics/components/tank/air, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) "nJM" = ( @@ -38239,6 +38579,17 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) +"nRU" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "nRZ" = ( /turf/closed/wall/r_wall, /area/station/security/medical) @@ -38266,13 +38617,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) -"nSS" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "nTd" = ( /obj/structure/rack, /obj/effect/spawner/random/food_or_drink/seed, @@ -38591,7 +38935,7 @@ /area/station/service/library) "nZL" = ( /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_ordmix{ - dir = 4 + dir = 8 }, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) @@ -38866,6 +39210,21 @@ dir = 4 }, /area/station/security/prison) +"ocN" = ( +/obj/structure/rack, +/obj/item/book/manual/wiki/infections{ + pixel_y = 7 + }, +/obj/item/reagent_containers/syringe/antiviral, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/spray/cleaner, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/virology) "ocP" = ( /obj/machinery/airalarm/directional/west, /turf/open/floor/iron, @@ -38953,6 +39312,21 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/main) +"ofm" = ( +/obj/structure/table, +/obj/structure/cable, +/obj/item/disk/tech_disk{ + pixel_x = -6 + }, +/obj/item/disk/tech_disk{ + pixel_x = 6 + }, +/obj/item/disk/tech_disk{ + pixel_y = 6 + }, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/iron, +/area/station/science/lab) "ofQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, @@ -38969,15 +39343,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/armory, /turf/open/floor/iron/dark, /area/station/security/lockers) -"ofZ" = ( -/obj/machinery/vending/hydroseeds{ - slogan_delay = 700 - }, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "ogb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39241,6 +39606,13 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) +"onv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "onD" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -39380,9 +39752,7 @@ /turf/open/floor/engine/n2, /area/station/engineering/atmos) "oqc" = ( -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, +/obj/effect/spawner/random/structure/table, /turf/open/floor/iron/checker, /area/station/maintenance/aft/lesser) "oqe" = ( @@ -39513,24 +39883,6 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/space, /area/space/nearstation) -"osD" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"osM" = ( -/obj/machinery/shower/directional/south{ - name = "emergency shower" - }, -/obj/effect/turf_decal/trimline/blue/end, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "ota" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39600,6 +39952,15 @@ /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, +/obj/machinery/holopad, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "otM" = ( /obj/structure/closet/crate, /obj/item/stack/license_plates/empty/fifty, @@ -39629,7 +39990,11 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, -/turf/open/floor/holofloor/dark, +/obj/item/plunger{ + pixel_x = -7; + pixel_y = 20 + }, +/turf/open/floor/iron/dark/textured_large, /area/station/science/cytology) "ouj" = ( /obj/structure/bed/roller, @@ -39655,14 +40020,6 @@ /obj/effect/turf_decal/tile/bar, /turf/open/floor/iron, /area/station/hallway/primary/central) -"oum" = ( -/obj/item/flashlight/flare/candle, -/obj/machinery/light_switch/directional/north, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "out" = ( /obj/structure/lattice, /obj/item/reagent_containers/cup/glass/bottle/goldschlager, @@ -39726,6 +40083,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"ouY" = ( +/obj/structure/table, +/obj/item/stack/sheet/plasteel{ + amount = 10 + }, +/obj/item/stack/rods/fifty, +/obj/effect/spawner/random/trash/janitor_supplies, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/obj/machinery/mining_weather_monitor/directional/east, +/turf/open/floor/iron, +/area/station/construction/mining/aux_base) "ouZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/siding/purple{ @@ -39763,7 +40131,7 @@ /turf/open/floor/wood, /area/station/command/heads_quarters/hop) "ovX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) "owf" = ( @@ -39948,14 +40316,6 @@ /obj/item/kirbyplants/organic/plant14, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) -"oAj" = ( -/obj/structure/chair/sofa/corp/left, -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) "oAu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40226,6 +40586,24 @@ dir = 8 }, /area/station/engineering/atmos) +"oFG" = ( +/obj/machinery/door/poddoor/preopen{ + id = "medsecprivacy"; + name = "Privacy Shutter" + }, +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/brigdoor/right/directional/north{ + req_access = list("brig_entrance") + }, +/obj/item/folder/red{ + pixel_x = 4; + pixel_y = 2 + }, +/obj/item/paper, +/obj/item/pen, +/turf/open/floor/plating, +/area/station/security/checkpoint/medical) "oFH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -40553,17 +40931,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/tcommsat/computer) -"oKD" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/disposaloutlet{ - dir = 8 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "oKI" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -40667,6 +41034,17 @@ "oNs" = ( /turf/open/floor/engine, /area/station/engineering/supermatter) +"oNy" = ( +/obj/machinery/smartfridge/chemistry/preloaded, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "chem_lockdown"; + name = "Chemistry Shutters" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/yellow/full, +/turf/open/floor/iron/white/smooth_large, +/area/station/medical/chemistry) "oNP" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -40817,11 +41195,11 @@ /turf/open/floor/iron, /area/station/hallway/primary/fore) "oQk" = ( -/obj/effect/turf_decal/box/corners, -/obj/effect/turf_decal/box/corners{ - dir = 8 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/floor/holofloor/dark, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/textured_large, /area/station/science/cytology) "oQx" = ( /obj/effect/decal/cleanable/dirt, @@ -40842,6 +41220,14 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron, /area/station/science/xenobiology) +"oQN" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/smooth_large, +/area/station/service/chapel/office) "oQS" = ( /obj/machinery/cell_charger, /obj/item/stock_parts/cell/crap, @@ -40916,14 +41302,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/execution/education) -"oSh" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "oSo" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -41105,6 +41483,16 @@ }, /turf/open/floor/wood, /area/station/service/bar/backroom) +"oWQ" = ( +/obj/structure/rack, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/stack/sheet/iron/twenty, +/obj/structure/sign/poster/contraband/random/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) "oWT" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command{ @@ -41168,14 +41556,6 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/dark, /area/station/security/office) -"oXM" = ( -/obj/structure/closet/secure_closet/hydroponics, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron, -/area/station/service/hydroponics) "oXR" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -41185,15 +41565,6 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/fore) -"oXT" = ( -/obj/machinery/button/door/directional/north{ - id = "hop"; - name = "Privacy Shutters Control"; - req_access = list("kitchen") - }, -/obj/machinery/computer/accounting, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) "oYg" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -41254,16 +41625,6 @@ "oYZ" = ( /turf/closed/wall, /area/station/command/heads_quarters/rd) -"oZi" = ( -/obj/effect/spawner/random/vending/snackvend, -/obj/structure/sign/map/right{ - desc = "A framed picture of the station. Clockwise from security in red at the top, you see engineering in yellow, science in purple, escape in checkered red-and-white, medbay in green, arrivals in checkered red-and-blue, and then cargo in brown."; - icon_state = "map-right-MS"; - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) "oZj" = ( /obj/structure/table/wood, /obj/item/storage/photo_album/library, @@ -41324,13 +41685,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall/r_wall, /area/station/ai_monitored/aisat/exterior) -"pap" = ( -/obj/machinery/vending/wardrobe/coroner_wardrobe, -/obj/effect/turf_decal/trimline/neutral/filled/warning{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "pav" = ( /obj/structure/chair/stool/directional/west, /obj/machinery/camera/directional/north{ @@ -41342,11 +41696,6 @@ }, /turf/open/floor/iron, /area/station/security/brig) -"paQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) "pbb" = ( /obj/structure/table, /obj/machinery/microwave, @@ -41756,6 +42105,14 @@ "piB" = ( /turf/open/floor/iron, /area/station/cargo/sorting) +"piJ" = ( +/obj/machinery/suit_storage_unit/medical, +/obj/effect/turf_decal/bot_red, +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "piM" = ( /obj/structure/rack, /obj/item/clothing/under/color/red, @@ -41875,6 +42232,26 @@ "pma" = ( /turf/closed/wall/r_wall, /area/station/maintenance/solars/port/fore) +"pmb" = ( +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/obj/machinery/portable_atmospherics/canister/anesthetic_mix, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/machinery/light/cold/dim/directional/south, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/kitchen_coldroom, +/area/station/medical/coldroom) +"pmc" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/landmark/start/chaplain, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark/smooth_large, +/area/station/service/chapel/office) "pmj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, @@ -42047,10 +42424,8 @@ /area/station/command/bridge) "ppC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, +/obj/machinery/hydroponics/soil, +/turf/open/floor/grass, /area/station/science/cytology) "ppG" = ( /obj/structure/table/glass, @@ -42136,11 +42511,6 @@ /obj/machinery/module_duplicator, /turf/open/floor/iron/white, /area/station/science/explab) -"pqu" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/landmark/start/chaplain, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) "pqz" = ( /obj/machinery/door/airlock/maintenance{ name = "Storage Room" @@ -42157,6 +42527,17 @@ /obj/item/fish_feed, /turf/open/space/basic, /area/space/nearstation) +"prc" = ( +/obj/machinery/firealarm/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Chemistry North"; + network = list("ss13","medbay") + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "prg" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -42166,13 +42547,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) -"pri" = ( -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/structure/closet/l3closet, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "prv" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -42305,8 +42679,8 @@ /area/station/science/lab) "psU" = ( /obj/machinery/door/window/right/directional/east{ - req_access = list("xenobiology"); - name = "Containment Pen #1" + name = "Containment Pen #1"; + req_access = list("xenobiology") }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -42334,6 +42708,15 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron/dark, /area/station/security/lockers) +"pts" = ( +/obj/machinery/light_switch/directional/west, +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 9 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) "ptH" = ( /obj/effect/turf_decal/siding/purple{ dir = 4 @@ -42540,12 +42923,6 @@ /obj/item/gavelhammer, /turf/open/floor/iron, /area/station/security/courtroom) -"pyd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) "pyh" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -42593,6 +42970,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) +"pyU" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/status_display/ai/directional/east, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "pyY" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -42766,6 +43150,14 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/cafeteria, /area/station/security/prison) +"pCl" = ( +/obj/structure/chair/sofa/corp/left, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) "pCt" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -42776,6 +43168,12 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) +"pCw" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "pCJ" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 4 @@ -43313,13 +43711,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/engine/n2, /area/station/engineering/atmos) -"pMs" = ( -/obj/structure/table/reinforced, -/obj/machinery/cell_charger, -/obj/machinery/firealarm/directional/north, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "pMy" = ( /obj/machinery/computer/prisoner/management{ dir = 8 @@ -43547,11 +43938,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron, /area/station/security/prison/safe) -"pPU" = ( -/obj/effect/landmark/start/paramedic, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "pQj" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -43587,7 +43973,8 @@ "pQy" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, -/obj/structure/closet/secure_closet/atmospherics, +/obj/machinery/atmospherics/components/tank/air, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "pQC" = ( @@ -43738,13 +44125,6 @@ }, /turf/open/floor/iron, /area/station/engineering/main) -"pTx" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "pTL" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43933,6 +44313,17 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/iron/white, /area/station/science/explab) +"pXl" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Hydroponics - Aft" + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/iron, +/area/station/service/hydroponics) "pXA" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -43961,11 +44352,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"pYo" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/smartfridge/organ, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "pYw" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -44027,6 +44413,13 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) +"pZW" = ( +/obj/structure/lattice, +/obj/structure/sign/nanotrasen{ + pixel_x = 32 + }, +/turf/open/space/basic, +/area/space/nearstation) "qaf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/large, @@ -44482,6 +44875,15 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, /area/station/security/holding_cell) +"qhA" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 1 + }, +/obj/effect/mapping_helpers/dead_body_placer, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) "qhE" = ( /obj/machinery/light/small/dim/directional/west, /turf/open/floor/plating, @@ -44645,9 +45047,9 @@ /area/station/medical/psychology) "qkX" = ( /obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/airlock/maintenance/glass, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) "qlc" = ( @@ -44819,6 +45221,19 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"qpf" = ( +/obj/structure/table/reinforced, +/obj/item/defibrillator/loaded{ + pixel_y = 6 + }, +/obj/item/defibrillator/loaded{ + pixel_y = 3 + }, +/obj/item/defibrillator/loaded, +/obj/structure/window/spawner/directional/west, +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "qph" = ( /obj/effect/decal/cleanable/blood/old, /obj/effect/spawner/random/medical/patient_stretcher, @@ -44836,14 +45251,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) -"qpu" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/bodycontainer/morgue{ - dir = 1 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "qpD" = ( /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, @@ -44852,16 +45259,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/wood, /area/station/commons/lounge) -"qpT" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/poster/contraband/random/directional/north, -/obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) "qqg" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -45079,6 +45476,15 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/disposal) +"qvP" = ( +/obj/item/kirbyplants/random, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/structure/sign/calendar/directional/west, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) "qvQ" = ( /obj/machinery/door/window/left/directional/west{ name = "Containment Pen #4"; @@ -45091,15 +45497,6 @@ /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"qvZ" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/cryo) "qwh" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -46210,6 +46607,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"qOO" = ( +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/disposal/bin, +/obj/machinery/light/cold/directional/west, +/obj/machinery/status_display/ai/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) "qOP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -46646,6 +47053,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) +"qWg" = ( +/obj/structure/lattice, +/obj/structure/sign/warning/secure_area/directional/east, +/turf/open/space/basic, +/area/space/nearstation) "qWm" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -46752,6 +47164,20 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"qXu" = ( +/obj/machinery/light_switch/directional/east, +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/machinery/fax{ + fax_name = "Psychology Office"; + name = "Psychology Office Fax Machine" + }, +/obj/machinery/light/small/directional/south, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/wood/parquet, +/area/station/medical/psychology) "qXw" = ( /obj/structure/filingcabinet/chestdrawer, /mob/living/simple_animal/parrot/poly, @@ -46786,9 +47212,8 @@ /turf/open/floor/plating, /area/station/service/lawoffice) "qXW" = ( -/obj/effect/spawner/random/structure/chair_maintenance{ - dir = 1 - }, +/obj/effect/spawner/random/maintenance/two, +/obj/structure/closet, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) "qYd" = ( @@ -46866,17 +47291,6 @@ "qZI" = ( /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"qZM" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Morgue Maintenance" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/access/all/medical/morgue, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/medical/morgue) "qZO" = ( /obj/effect/landmark/event_spawn, /obj/structure/cable, @@ -46925,6 +47339,26 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"rar" = ( +/obj/item/storage/medkit/regular{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/storage/medkit/o2{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/medkit/o2, +/obj/item/storage/medkit/o2{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/structure/table/reinforced, +/obj/structure/window/spawner/directional/north, +/obj/machinery/status_display/ai/directional/east, +/obj/structure/sign/clock/directional/south, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "raz" = ( /obj/structure/cable, /turf/open/floor/plating/airless, @@ -47055,6 +47489,22 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) +"rdk" = ( +/obj/structure/table/reinforced, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/obj/item/book/manual/wiki/surgery{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/book/manual/wiki/medicine{ + pixel_x = 2; + pixel_y = 3 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) "rdt" = ( /obj/structure/sign/warning/vacuum/external/directional/north, /turf/open/floor/plating, @@ -47316,6 +47766,11 @@ dir = 1 }, /area/station/commons/fitness) +"rjy" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/recharge_station, +/turf/open/floor/iron/white, +/area/station/medical/storage) "rjz" = ( /obj/machinery/power/shieldwallgen, /obj/structure/extinguisher_cabinet/directional/west, @@ -47449,17 +47904,6 @@ /obj/structure/table, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) -"rmD" = ( -/obj/effect/turf_decal/trimline/neutral/filled/warning{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "rmF" = ( /obj/machinery/door/airlock/maintenance{ name = "Law Office Maintenance" @@ -47958,8 +48402,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /obj/machinery/door/window/left/directional/east{ - req_access = list("xenobiology"); - name = "Maximum Security Test Chamber" + name = "Maximum Security Test Chamber"; + req_access = list("xenobiology") }, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -48087,11 +48531,11 @@ /area/station/medical/storage) "rxG" = ( /obj/machinery/door/airlock/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /obj/effect/mapping_helpers/airlock/unres{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) "rxH" = ( @@ -48099,7 +48543,6 @@ /turf/open/floor/plating/airless, /area/station/solars/starboard/aft) "rxP" = ( -/obj/item/radio/intercom/directional/north, /obj/machinery/computer/security, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -48191,12 +48634,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/security/prison/visit) -"ryQ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "rza" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -48384,7 +48821,7 @@ "rDm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_atmos{ - dir = 8 + dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/engine, @@ -48477,6 +48914,14 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron, /area/station/commons/storage/tools) +"rEt" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "rEz" = ( /obj/machinery/light/directional/east, /obj/machinery/firealarm/directional/east, @@ -48579,10 +49024,6 @@ "rGC" = ( /turf/open/floor/iron/dark, /area/station/security/courtroom) -"rGK" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "rHh" = ( /obj/structure/table/reinforced, /obj/item/book/manual/wiki/security_space_law{ @@ -49169,14 +49610,6 @@ /obj/item/assembly/flash/handheld, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) -"rQB" = ( -/obj/item/flashlight/flare/candle, -/obj/machinery/light_switch/directional/west, -/obj/effect/decal/cleanable/cobweb, -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "rQS" = ( /obj/structure/table, /obj/item/storage/box/evidence{ @@ -49698,16 +50131,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/medical/storage) -"saa" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "sab" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -49953,14 +50376,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"sdL" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner, -/obj/machinery/camera/directional/east{ - c_tag = "Medbay Main Hallway - CMO"; - network = list("ss13","medbay") - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "sdW" = ( /obj/structure/sign/warning/radiation/rad_area/directional/north, /obj/effect/turf_decal/bot_white, @@ -49998,13 +50413,6 @@ /obj/structure/sign/warning/electric_shock/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"sfl" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/structure/bodycontainer/morgue{ - dir = 2 - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) "sfn" = ( /obj/effect/spawner/random/structure/grille, /obj/effect/mapping_helpers/broken_floor, @@ -50156,13 +50564,6 @@ }, /turf/open/floor/iron, /area/station/engineering/main) -"shY" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/landmark/start/coroner, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "sie" = ( /obj/effect/turf_decal/stripes/corner, /obj/structure/cable, @@ -50245,6 +50646,8 @@ "sjB" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/l3closet/janitor, +/obj/machinery/light/small/directional/east, +/obj/item/clothing/gloves/color/orange, /turf/open/floor/iron, /area/station/service/janitor) "sjM" = ( @@ -50281,6 +50684,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/science/lab) +"skW" = ( +/obj/effect/spawner/structure/window/reinforced/tinted, +/turf/open/floor/plating, +/area/station/medical/morgue) "slc" = ( /obj/effect/decal/cleanable/dirt, /obj/vehicle/ridden/janicart, @@ -50337,7 +50744,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /obj/machinery/door/airlock/public/glass/incinerator/atmos_exterior, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "smt" = ( /obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{ @@ -50534,13 +50941,8 @@ /turf/open/floor/plating, /area/station/maintenance/port/aft) "sri" = ( -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/turf/open/floor/holofloor/dark, +/obj/machinery/duct, +/turf/open/floor/iron/dark/textured_large, /area/station/science/cytology) "srk" = ( /obj/structure/sign/warning/electric_shock, @@ -50557,13 +50959,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/central) -"sru" = ( -/obj/item/radio/intercom/directional/west, -/obj/structure/bodycontainer/morgue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "srK" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 8 @@ -50674,6 +51069,16 @@ }, /turf/open/floor/carpet, /area/station/commons/vacant_room/office) +"stZ" = ( +/obj/structure/table/glass, +/obj/machinery/light_switch/directional/west, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/camera/directional/west{ + c_tag = "Medbay Primary Treatment Centre West"; + network = list("ss13","medbay") + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) "suj" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/binary/pump{ @@ -50746,6 +51151,11 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/engine) +"svp" = ( +/obj/effect/landmark/start/paramedic, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/white/smooth_large, +/area/station/medical/medbay/central) "svK" = ( /obj/machinery/power/terminal{ dir = 1 @@ -51285,6 +51695,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"sEv" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "sEx" = ( /obj/machinery/button/door/directional/east{ id = "kitchen_counter"; @@ -51344,6 +51763,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"sFo" = ( +/obj/machinery/button/crematorium{ + id = "crematoriumChapel"; + pixel_x = -26 + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) "sFw" = ( /turf/open/floor/iron/chapel, /area/station/service/chapel) @@ -51375,6 +51801,18 @@ }, /turf/open/floor/iron, /area/station/service/kitchen) +"sFY" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/structure/sign/departments/psychology/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "sGm" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -51559,8 +51997,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/holofloor/dark, +/obj/machinery/plumbing/growing_vat{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_large, /area/station/science/cytology) "sKs" = ( /obj/structure/closet/bombcloset/security, @@ -51585,16 +52025,6 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) -"sKG" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "sKJ" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -51629,6 +52059,22 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/hallway/primary/central) +"sLF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Science Research"; + network = list("ss13","rd") + }, +/obj/machinery/light/small/directional/south, +/obj/structure/noticeboard/rd{ + pixel_y = -32 + }, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/science/lab) "sLN" = ( /obj/effect/landmark/start/ai/secondary, /obj/item/radio/intercom/directional/north{ @@ -51688,6 +52134,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) +"sMo" = ( +/obj/structure/sign/poster/official/cleanliness/directional/west, +/obj/structure/sink/directional/south, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 1 + }, +/obj/structure/mirror/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/virology) "sMB" = ( /obj/machinery/door/window/brigdoor/security/cell{ id = "Cell 1"; @@ -51860,6 +52315,15 @@ /obj/effect/mapping_helpers/airlock/access/all/security/hos, /turf/open/floor/wood, /area/station/command/heads_quarters/hos) +"sPq" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "sPy" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -51952,6 +52416,7 @@ /area/station/maintenance/port) "sRa" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/white, /area/station/science/cytology) "sRf" = ( @@ -51991,6 +52456,14 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"sRL" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "sRT" = ( /obj/structure/cable, /turf/open/floor/wood, @@ -52007,6 +52480,20 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) +"sRY" = ( +/obj/machinery/vending/dinnerware, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 5 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "sSh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -52080,19 +52567,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/primary/central) -"sTe" = ( -/obj/structure/table, -/obj/machinery/camera/directional/north{ - c_tag = "Medbay Paramedic Dispatch"; - name = "medical camera"; - network = list("ss13","medical") - }, -/obj/machinery/fax{ - fax_name = "Medical"; - name = "Medical Fax Machine" - }, -/turf/open/floor/iron/dark, -/area/station/medical/office) "sTh" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -52114,14 +52588,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"sTD" = ( -/obj/machinery/vending/wardrobe/sec_wardrobe, -/obj/effect/turf_decal/tile/red/anticorner/contrasted, -/obj/machinery/requests_console/directional/east, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs) "sTK" = ( /obj/item/radio/intercom/directional/south, /obj/effect/turf_decal/tile/blue/half/contrasted, @@ -52138,6 +52604,13 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"sTW" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "sTY" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -52147,13 +52620,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"sUi" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/obj/machinery/newscaster/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) "sUm" = ( /obj/structure/cable, /obj/effect/landmark/start/hangover, @@ -52162,6 +52628,14 @@ "sUo" = ( /turf/open/floor/engine/air, /area/station/engineering/atmos) +"sUx" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "sUy" = ( /obj/structure/table/wood, /obj/structure/sign/picture_frame/showroom/one{ @@ -52783,12 +53257,6 @@ dir = 4 }, /area/station/service/chapel) -"teR" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/table/optable, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "teY" = ( /obj/machinery/light/directional/east, /obj/machinery/camera/autoname/directional/east, @@ -52868,6 +53336,13 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"tgn" = ( +/obj/machinery/vending/medical, +/obj/machinery/light/cold/directional/south, +/obj/machinery/newscaster/directional/south, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "tgo" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -52895,6 +53370,12 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) +"tgI" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central) "thc" = ( /obj/machinery/camera/directional/east{ c_tag = "Gravity Generator Room" @@ -52913,6 +53394,22 @@ dir = 1 }, /area/station/engineering/atmos/pumproom) +"thw" = ( +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) "thQ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -52983,14 +53480,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"tjs" = ( -/obj/structure/chair/sofa/corp/right, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) "tju" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -53188,20 +53677,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/toilet/auxiliary) -"tmJ" = ( -/obj/structure/rack, -/obj/item/book/manual/wiki/infections{ - pixel_y = 7 - }, -/obj/item/reagent_containers/syringe/antiviral, -/obj/item/reagent_containers/dropper, -/obj/item/reagent_containers/spray/cleaner, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) "tmK" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -53267,16 +53742,6 @@ /obj/effect/spawner/random/decoration/glowstick, /turf/open/floor/iron/white, /area/station/medical/abandoned) -"tnN" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Medbay Storage"; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/storage) "tnP" = ( /obj/machinery/firealarm/directional/east, /obj/machinery/camera/directional/east{ @@ -53310,7 +53775,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/holofloor/dark, +/turf/open/floor/iron/dark/textured_large, /area/station/science/cytology) "toV" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, @@ -53342,14 +53807,6 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"tpC" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/junction{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) "tpD" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -53382,6 +53839,12 @@ /obj/effect/mapping_helpers/airlock/access/all/service/kitchen, /turf/open/floor/iron/cafeteria, /area/station/hallway/secondary/service) +"tqh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/dim/directional/east, +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) "tql" = ( /obj/structure/rack, /obj/item/clothing/mask/animal/horsehead, @@ -53525,6 +53988,25 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"ttF" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 6 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Kitchen" + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "ttG" = ( /obj/item/clothing/gloves/color/rainbow, /obj/item/clothing/shoes/sneakers/rainbow, @@ -53542,9 +54024,11 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "ttW" = ( -/obj/effect/spawner/random/structure/chair_flipped, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/atmospherics/components/binary/pump/on/supply/hidden/layer4{ + dir = 8 + }, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) "ttX" = ( @@ -53661,19 +54145,15 @@ /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 4 }, +/obj/effect/turf_decal/siding/purple{ + dir = 1 + }, /turf/open/floor/iron/white, /area/station/science/cytology) "twy" = ( /obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"twF" = ( -/obj/effect/turf_decal/siding/white{ - dir = 8 - }, -/obj/machinery/recharge_station, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "twN" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -53760,7 +54240,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/holofloor/dark, +/turf/open/floor/iron/dark/textured_large, /area/station/science/cytology) "tyy" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -54127,13 +54607,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"tGu" = ( -/obj/machinery/computer/operating{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) "tGI" = ( /obj/machinery/light_switch/directional/west, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -54323,6 +54796,14 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) +"tJo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/medical/coldroom) "tJr" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -54479,26 +54960,6 @@ }, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) -"tLo" = ( -/obj/machinery/light/directional/west, -/obj/structure/table, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = -4; - pixel_y = 6 - }, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = 4; - pixel_y = 2 - }, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = 8 - }, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_y = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) "tLv" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -54524,20 +54985,6 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/hos) -"tMb" = ( -/obj/structure/table, -/obj/structure/cable, -/obj/item/disk/tech_disk{ - pixel_x = -6 - }, -/obj/item/disk/tech_disk{ - pixel_x = 6 - }, -/obj/item/disk/tech_disk{ - pixel_y = 6 - }, -/turf/open/floor/iron, -/area/station/science/lab) "tMe" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /obj/machinery/light/small/directional/east, @@ -54588,6 +55035,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"tMS" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/contraband/random/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "tNg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -54612,11 +55066,6 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/engine, /area/station/science/xenobiology) -"tNw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) "tNC" = ( /obj/structure/table/wood, /obj/structure/sign/picture_frame/showroom/three{ @@ -54737,19 +55186,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) -"tOU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Science Research"; - network = list("ss13","rd") - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/science/lab) "tOV" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -55003,19 +55439,17 @@ "tUn" = ( /turf/closed/wall, /area/station/maintenance/starboard/lesser) -"tUo" = ( -/obj/machinery/recharger{ - pixel_y = 4 +"tUt" = ( +/obj/structure/table/glass, +/obj/item/clothing/accessory/armband/hydro, +/obj/item/clothing/suit/apron, +/obj/item/wrench, +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/obj/machinery/camera/directional/north{ - c_tag = "Security Post - Medbay"; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/light/small/directional/north, -/obj/structure/table/reinforced, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/medical) +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron, +/area/station/service/hydroponics) "tUu" = ( /obj/structure/disposalpipe/junction{ dir = 4 @@ -55441,6 +55875,7 @@ dir = 4 }, /obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "uaN" = ( @@ -55453,6 +55888,27 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/engine, /area/station/science/cytology) +"uaS" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 8 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/service/chapel/office) "ubd" = ( /obj/structure/sink/directional/west, /turf/open/floor/iron/white, @@ -55514,6 +55970,27 @@ }, /turf/open/floor/iron, /area/station/commons/storage/tools) +"ubF" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/item/reagent_containers/cup/beaker/large, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/cup/bottle/epinephrine{ + pixel_x = -4; + pixel_y = 12 + }, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = 7; + pixel_y = 12 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/machinery/light/small/directional/south, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "ubQ" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -55858,6 +56335,12 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) +"uiw" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/medical/morgue) "uiB" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -55873,6 +56356,30 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/service/bar) +"uiM" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"uiR" = ( +/obj/machinery/portable_atmospherics/canister/anesthetic_mix, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/kitchen_coldroom, +/area/station/medical/coldroom) "ujk" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /obj/effect/turf_decal/siding/purple{ @@ -55952,15 +56459,6 @@ }, /turf/open/floor/iron, /area/station/service/bar) -"ukN" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white/smooth_large, -/area/station/medical/medbay/central) "ulv" = ( /obj/effect/turf_decal/stripes/white/line, /obj/effect/turf_decal/stripes/white/line{ @@ -56042,6 +56540,16 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"unt" = ( +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/obj/machinery/light/directional/east, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "unw" = ( /obj/effect/landmark/generic_maintenance_landmark, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -56077,14 +56585,6 @@ }, /turf/open/floor/wood, /area/station/commons/vacant_room/office) -"uod" = ( -/obj/effect/turf_decal/siding/white{ - dir = 8 - }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "uoe" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -56209,6 +56709,10 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/white, /area/station/science/research) +"uqA" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "uqL" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -56754,8 +57258,8 @@ /obj/structure/lattice, /obj/structure/chair/sofa/corp/left{ desc = "Looks like someone threw it out. Covered in donut crumbs."; - name = "couch"; - dir = 4 + dir = 4; + name = "couch" }, /turf/open/space/basic, /area/space/nearstation) @@ -57013,6 +57517,18 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, /area/station/maintenance/port) +"uET" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "uFf" = ( /obj/machinery/holopad, /obj/effect/spawner/random/engineering/tracking_beacon, @@ -57039,6 +57555,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"uFr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) "uFw" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -57181,6 +57710,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/brig) +"uGE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "uGX" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, @@ -57250,15 +57788,6 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"uId" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "uIe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -57317,6 +57846,15 @@ /obj/item/storage/fancy/cigarettes, /turf/open/floor/carpet, /area/station/security/detectives_office) +"uJx" = ( +/obj/machinery/button/door/directional/north{ + id = "hop"; + name = "Privacy Shutters Control"; + req_access = list("hop") + }, +/obj/machinery/computer/accounting, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) "uJz" = ( /obj/effect/turf_decal/bot, /obj/structure/rack, @@ -57407,8 +57945,8 @@ name = "Xenobio Pen 2 Blast Door" }, /obj/machinery/door/window/right/directional/south{ - req_access = list("xenobiology"); - name = "Containment Pen #2" + name = "Containment Pen #2"; + req_access = list("xenobiology") }, /turf/open/floor/iron, /area/station/science/xenobiology) @@ -57430,6 +57968,19 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark, /area/station/medical/storage) +"uLv" = ( +/obj/structure/table/reinforced, +/obj/item/folder/blue{ + pixel_y = 2 + }, +/obj/item/pen, +/obj/machinery/light/small/directional/west, +/obj/machinery/requests_console/directional/west{ + department = "AI Chamber"; + name = "AI Chamber Requests Console" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "uLz" = ( /obj/machinery/light/small/directional/east, /obj/machinery/camera/directional/east{ @@ -57529,14 +58080,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/engine) -"uNq" = ( -/obj/structure/sign/poster/official/get_your_legs/directional/north, -/obj/structure/chair/sofa/right/brown, -/obj/item/toy/plush/moth{ - name = "Mender Moff" - }, -/turf/open/floor/carpet, -/area/station/medical/psychology) "uNs" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor, @@ -57555,9 +58098,14 @@ /area/station/science/xenobiology) "uND" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/restraints/legcuffs/beartrap, -/obj/item/restraints/legcuffs/beartrap, /obj/structure/cable, +/obj/item/restraints/legcuffs/beartrap{ + pixel_x = -5 + }, +/obj/item/restraints/legcuffs/beartrap{ + pixel_x = 2; + pixel_y = -5 + }, /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron, /area/station/service/janitor) @@ -57589,6 +58137,16 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron, /area/station/commons/storage/primary) +"uOo" = ( +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/machinery/light_switch/directional/east, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/kitchen_coldroom, +/area/station/medical/coldroom) "uOp" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -57607,14 +58165,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port) -"uOS" = ( -/obj/machinery/door/airlock/grunge{ - name = "Morgue" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/medical/morgue, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "uOX" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -57629,6 +58179,19 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"uPi" = ( +/obj/machinery/duct, +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/machinery/light/floor, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/white, +/area/station/medical/cryo) "uPp" = ( /obj/effect/spawner/random/structure/chair_maintenance{ dir = 4 @@ -57688,7 +58251,9 @@ /turf/open/floor/iron, /area/station/engineering/main) "uQH" = ( -/obj/structure/reagent_dispensers/watertank, +/obj/effect/spawner/random/structure/chair_maintenance{ + dir = 1 + }, /turf/open/floor/iron/checker, /area/station/maintenance/aft/lesser) "uQK" = ( @@ -57773,6 +58338,15 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"uSz" = ( +/obj/structure/table, +/obj/item/phone{ + pixel_x = 6; + pixel_y = -2 + }, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "uSL" = ( /obj/machinery/camera/motion/directional/south{ c_tag = "Vault"; @@ -57855,6 +58429,16 @@ /obj/effect/mapping_helpers/airlock/access/any/command/minisat, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) +"uUb" = ( +/obj/machinery/reagentgrinder, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/obj/structure/table/glass, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) "uUg" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, @@ -57943,6 +58527,12 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"uVx" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/blue/filled/warning, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "uVE" = ( /obj/effect/turf_decal/siding/purple/corner{ dir = 1 @@ -57964,18 +58554,6 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) -"uWj" = ( -/obj/structure/table/reinforced, -/obj/item/defibrillator/loaded{ - pixel_y = 6 - }, -/obj/item/defibrillator/loaded{ - pixel_y = 3 - }, -/obj/item/defibrillator/loaded, -/obj/structure/window/spawner/directional/west, -/turf/open/floor/iron/dark, -/area/station/medical/storage) "uWk" = ( /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, @@ -58040,11 +58618,6 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/maintenance/port/aft) -"uWM" = ( -/obj/effect/landmark/generic_maintenance_landmark, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "uWN" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -58157,11 +58730,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port) -"uYG" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "uYH" = ( /obj/structure/reflector/double/anchored{ dir = 5 @@ -58169,19 +58737,24 @@ /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) "uYI" = ( -/obj/machinery/vending/dinnerware, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 5 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/bar{ +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"uYL" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 5 + }, +/turf/open/floor/iron/dark/smooth_half{ dir = 8 }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) +/area/station/medical/morgue) "uYP" = ( /obj/structure/cable, /obj/machinery/door/window/left/directional/north{ @@ -58409,40 +58982,6 @@ /obj/machinery/rnd/experimentor, /turf/open/floor/engine, /area/station/science/explab) -"vdJ" = ( -/obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/o_plus{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/item/reagent_containers/blood/o_minus, -/obj/item/reagent_containers/blood/b_plus, -/obj/item/reagent_containers/blood/b_minus, -/obj/item/reagent_containers/blood/a_plus, -/obj/item/reagent_containers/blood/a_minus, -/obj/item/reagent_containers/blood/lizard, -/obj/item/reagent_containers/blood/ethereal, -/obj/item/reagent_containers/blood{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/reagent_containers/blood{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/reagent_containers/blood{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) "vdL" = ( /obj/machinery/camera{ c_tag = "Xenobiology Lab - Pen #8"; @@ -58453,13 +58992,21 @@ /area/station/science/xenobiology) "veo" = ( /obj/structure/weightmachine/weightlifter{ + color = "#f5a183"; desc = "A rusty old bench press machine, who dumped this out here?"; - name = "rusty bench press"; - color = "#f5a183" + name = "rusty bench press" }, /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating/airless, /area/space/nearstation) +"ver" = ( +/obj/structure/closet/l3closet, +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "veO" = ( /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ dir = 8 @@ -58646,6 +59193,14 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/plating, /area/station/maintenance/disposal) +"via" = ( +/obj/machinery/door/airlock/medical{ + name = "Medical Cold Room" + }, +/obj/effect/mapping_helpers/airlock/access/all/medical/surgery, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/medical/coldroom) "vif" = ( /obj/machinery/holopad, /turf/open/floor/iron, @@ -58690,6 +59245,14 @@ }, /turf/open/floor/iron, /area/station/security/prison/garden) +"viS" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/machinery/newscaster/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) "viU" = ( /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/iron, @@ -58777,15 +59340,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) -"vke" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "vkj" = ( /obj/structure/chair{ dir = 8 @@ -59040,6 +59594,26 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) +"vow" = ( +/obj/machinery/door/window/right/directional/west{ + name = "Corpse Arrivals"; + req_access = list("morgue_secure") + }, +/obj/effect/turf_decal/delivery/white{ + color = "#52B4E9" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/effect/turf_decal/tile/neutral/half, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 4 + }, +/area/station/medical/morgue) "voQ" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -59096,18 +59670,6 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/customs) -"vpB" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/cryo) "vpM" = ( /obj/structure/sign/map/right{ desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; @@ -59154,16 +59716,6 @@ }, /turf/open/floor/iron, /area/station/construction/storage_wing) -"vqi" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Hydroponics - Aft" - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) "vqj" = ( /obj/machinery/computer/atmos_alert{ dir = 1 @@ -59232,6 +59784,11 @@ /obj/structure/sink/directional/west, /turf/open/floor/iron/white, /area/station/science/research) +"vru" = ( +/obj/machinery/chem_master, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "vrF" = ( /obj/structure/table/reinforced, /obj/structure/desk_bell{ @@ -59316,6 +59873,23 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white/smooth_large, /area/station/medical/medbay/central) +"vtm" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"vtn" = ( +/obj/machinery/vending/wardrobe/sec_wardrobe, +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/mapping_helpers/requests_console/assistance, +/obj/machinery/requests_console/directional/east{ + department = "Security"; + name = "Security Requests Console" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) "vtp" = ( /obj/structure/disposalpipe/sorting/mail, /obj/effect/landmark/start/station_engineer, @@ -59364,27 +59938,21 @@ "vtI" = ( /obj/effect/decal/cleanable/dirt, /obj/item/storage/box/lights/mixed{ - pixel_x = 6; - pixel_y = 8 + pixel_x = -4; + pixel_y = 18 }, /obj/item/storage/box/lights/mixed{ pixel_x = 6; - pixel_y = 8 - }, -/obj/item/reagent_containers/spray/cleaner, -/obj/item/grenade/chem_grenade/cleaner{ - pixel_x = -7; pixel_y = 12 }, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = 3; + pixel_y = 3 + }, /obj/item/grenade/chem_grenade/cleaner{ pixel_x = -7; pixel_y = 12 }, -/obj/item/grenade/chem_grenade/cleaner{ - pixel_x = -7; - pixel_y = 12 - }, -/obj/machinery/light/small/directional/north, /obj/structure/table, /turf/open/floor/iron, /area/station/service/janitor) @@ -59416,6 +59984,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/wood, /area/station/service/lawoffice) +"vuh" = ( +/obj/structure/table/reinforced, +/obj/item/clipboard, +/obj/item/paper/monitorkey, +/obj/item/computer_disk/engineering, +/obj/item/computer_disk/engineering, +/obj/item/computer_disk/engineering, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron, +/area/station/command/heads_quarters/ce) "vun" = ( /turf/closed/wall, /area/station/medical/storage) @@ -59462,13 +60040,6 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron, /area/station/science/xenobiology) -"vvd" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "vvp" = ( /obj/machinery/firealarm/directional/south, /obj/effect/turf_decal/tile/neutral{ @@ -59622,16 +60193,6 @@ /obj/structure/sign/warning/secure_area, /turf/closed/wall/r_wall, /area/station/command/corporate_showroom) -"vyl" = ( -/obj/item/book/bible, -/obj/machinery/newscaster/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Chapel - Fore" - }, -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel) "vyv" = ( /obj/structure/table, /obj/machinery/status_display/ai/directional/west, @@ -59774,22 +60335,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"vAc" = ( -/obj/structure/sign/poster/official/cleanliness/directional/west, -/obj/structure/sink/directional/south, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"vAF" = ( -/obj/structure/table/glass, -/obj/item/retractor, -/obj/item/hemostat, -/obj/item/cautery, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) "vAH" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -59806,6 +60351,11 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/storage) +"vAX" = ( +/obj/structure/chair/sofa/left/brown, +/obj/structure/sign/poster/official/get_your_legs/directional/north, +/turf/open/floor/carpet, +/area/station/medical/psychology) "vBe" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -59853,6 +60403,12 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/space, /area/space/nearstation) +"vCc" = ( +/obj/effect/spawner/random/entertainment/arcade, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) "vCh" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59875,6 +60431,16 @@ /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/iron, /area/station/commons/toilet/auxiliary) +"vCC" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/structure/sign/poster/contraband/random/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "vCN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -60196,9 +60762,9 @@ /obj/machinery/button/door/directional/south{ id = "qmprivacy"; name = "Privacy Shutters Control"; - req_access = list("qm"); + pixel_x = 8; pixel_y = -26; - pixel_x = 8 + req_access = list("qm") }, /turf/open/floor/wood, /area/station/command/heads_quarters/qm) @@ -60225,9 +60791,20 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "vIm" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/station/maintenance/starboard/greater) +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/space_heater, +/turf/open/floor/iron/checker, +/area/station/maintenance/aft/lesser) +"vIn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/white, +/area/station/medical/office) "vIt" = ( /obj/structure/disposaloutlet{ dir = 1 @@ -60347,6 +60924,13 @@ /obj/effect/spawner/random/clothing/costume, /turf/open/floor/plating, /area/station/maintenance/port) +"vKd" = ( +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) "vKm" = ( /obj/structure/rack, /obj/item/clothing/suit/hazardvest, @@ -60402,6 +60986,14 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"vLo" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) "vLA" = ( /obj/structure/disposalpipe/junction/flip{ dir = 4 @@ -60460,6 +61052,18 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/break_room) +"vMV" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "vMX" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -60543,17 +61147,19 @@ /obj/machinery/duct, /turf/closed/wall, /area/station/commons/fitness/recreation) +"vPf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "vPm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/white, /area/station/science/lab) -"vPp" = ( -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/obj/structure/sign/poster/official/safety_eye_protection/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/chemistry) "vPq" = ( /obj/structure/chair{ dir = 8 @@ -60567,9 +61173,10 @@ "vPu" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, -/obj/structure/closet/radiation, /obj/machinery/airalarm/directional/west, /obj/effect/mapping_helpers/airalarm/all_access, +/obj/machinery/electrolyzer, +/obj/machinery/atmospherics/components/binary/pump/on/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "vPy" = ( @@ -60584,13 +61191,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/engineering/atmos) -"vPH" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "vPO" = ( /obj/machinery/computer/crew{ dir = 4 @@ -60658,7 +61258,7 @@ /turf/closed/wall, /area/station/service/chapel/office) "vQh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) "vQs" = ( @@ -60740,9 +61340,9 @@ "vRi" = ( /obj/structure/lattice, /obj/structure/chair/sofa/corp/corner{ + desc = "Looks like someone threw it out. Covered in donut crumbs."; dir = 1; - name = "couch"; - desc = "Looks like someone threw it out. Covered in donut crumbs." + name = "couch" }, /turf/open/space/basic, /area/space/nearstation) @@ -60894,6 +61494,14 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) +"vTV" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 10 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 4 + }, +/area/station/medical/morgue) "vTX" = ( /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) @@ -60942,19 +61550,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"vVc" = ( +/obj/structure/closet/crate/freezer/blood, +/obj/effect/turf_decal/siding/white, +/obj/machinery/status_display/ai/directional/north, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/turf/open/floor/iron/kitchen_coldroom, +/area/station/medical/coldroom) "vVr" = ( /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"vVu" = ( -/obj/structure/rack, -/obj/item/stack/sheet/glass/fifty{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/stack/sheet/iron/twenty, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) "vVw" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -61084,15 +61690,6 @@ }, /turf/open/floor/circuit/green/off, /area/station/science/research) -"vXc" = ( -/obj/structure/table/glass, -/obj/machinery/camera/directional/west{ - c_tag = "Medbay Primary Treatment Centre West"; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) "vXt" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 9 @@ -61325,6 +61922,23 @@ /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"waF" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Central Primary Hallway - Aft-Port Corner" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "waH" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -61400,18 +62014,6 @@ }, /turf/open/floor/wood, /area/station/service/library) -"wcM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/item/clothing/gloves/color/blue{ - desc = "An old pair of nitrile gloves, with no sterile properties."; - name = "old nitrile gloves" - }, -/obj/item/clothing/mask/surgical, -/obj/item/clothing/suit/apron/surgical, -/obj/item/reagent_containers/cup/rag, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) "wcN" = ( /obj/machinery/airalarm/directional/east, /obj/structure/disposalpipe/segment, @@ -61538,11 +62140,6 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/service/hydroponics/garden) -"wfa" = ( -/obj/effect/mapping_helpers/dead_body_placer, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "wfm" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -61676,11 +62273,6 @@ /obj/item/stock_parts/matter_bin, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"whb" = ( -/obj/structure/closet/crate/freezer/blood, -/obj/effect/turf_decal/siding/white, -/turf/open/floor/iron/kitchen_coldroom, -/area/station/medical/coldroom) "whr" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -61877,15 +62469,6 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) -"wlt" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/warning, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white/smooth_large, -/area/station/medical/medbay/central) "wlx" = ( /obj/machinery/camera/directional/west{ c_tag = "Engineering - Foyer - Shared Storage" @@ -61970,15 +62553,6 @@ dir = 1 }, /area/station/engineering/atmos/storage/gas) -"wnR" = ( -/obj/machinery/vending/wardrobe/hydro_wardrobe, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/light/small/directional/north, -/obj/structure/sign/poster/official/random/directional/east, -/turf/open/floor/iron, -/area/station/service/hydroponics) "wnT" = ( /obj/machinery/light/small/directional/east, /obj/machinery/door/window{ @@ -61991,6 +62565,14 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) +"wnW" = ( +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/turf/open/floor/iron/dark/smooth_half{ + dir = 8 + }, +/area/station/medical/morgue) "wnY" = ( /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/engine, @@ -62154,13 +62736,6 @@ "wrn" = ( /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"wrE" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron/white/smooth_large, -/area/station/medical/chemistry) "wrG" = ( /obj/structure/rack, /obj/item/circuitboard/machine/exoscanner{ @@ -62245,16 +62820,6 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/iron, /area/station/science/robotics/mechbay) -"wsF" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "wsI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -62416,6 +62981,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/commons/dorms) +"wvh" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/aft) "wvo" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -62432,6 +63002,19 @@ }, /turf/open/floor/plating, /area/station/maintenance/port) +"wvB" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/firealarm/directional/north, +/obj/item/storage/box/bodybags, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/pushbroom, +/obj/structure/closet{ + name = "janitorial supplies" + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "wvF" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -62971,11 +63554,6 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/central) -"wGk" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "wGz" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/light_construct/directional/east, @@ -63072,6 +63650,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall/r_wall, /area/station/engineering/atmos) +"wIF" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "wIM" = ( /obj/machinery/holopad, /turf/open/floor/iron, @@ -63294,7 +63881,6 @@ "wOy" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sink/directional/west, -/obj/item/reagent_containers/cup/bucket, /obj/item/mop, /turf/open/floor/iron, /area/station/service/janitor) @@ -63560,15 +64146,6 @@ /obj/structure/window/spawner/directional/west, /turf/open/floor/grass, /area/station/service/hydroponics/garden) -"wRI" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) "wRL" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -63577,7 +64154,7 @@ c_tag = "Cytology Lab - Worklab"; network = list("ss13","rd","xeno") }, -/turf/open/floor/holofloor/dark, +/turf/open/floor/iron/dark/textured_large, /area/station/science/cytology) "wRP" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ @@ -63809,16 +64386,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"wVf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) "wVo" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -63829,6 +64396,15 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/dark, /area/station/security/office) +"wVy" = ( +/obj/structure/sink/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) "wVO" = ( /obj/item/reagent_containers/cup/bottle/toxin{ pixel_x = 4; @@ -63866,6 +64442,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"wWo" = ( +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 9 + }, +/obj/machinery/light/small/directional/north, +/obj/structure/sign/poster/official/report_crimes/directional/north, +/turf/open/floor/iron/dark/smooth_half{ + dir = 4 + }, +/area/station/medical/morgue) "wWs" = ( /obj/effect/turf_decal/siding/white{ dir = 8 @@ -63930,6 +64516,34 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"wYi" = ( +/obj/machinery/door/window/right/directional/south{ + dir = 1; + name = "First Aid Supplies"; + req_access = list("medical") + }, +/obj/item/storage/medkit/regular{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/storage/medkit/toxin{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/medkit/toxin, +/obj/item/storage/medkit/toxin{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/structure/table/reinforced, +/obj/structure/window/spawner/directional/west, +/obj/machinery/requests_console/directional/south{ + department = "Medbay"; + name = "Medbay Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/iron/dark, +/area/station/medical/storage) "wYl" = ( /obj/effect/spawner/random/trash/mess, /turf/open/floor/plating, @@ -64025,8 +64639,8 @@ "xaj" = ( /obj/structure/table/reinforced, /obj/item/storage/box/gloves{ - pixel_y = 9; - pixel_x = 2 + pixel_x = 2; + pixel_y = 9 }, /obj/item/assembly/igniter{ pixel_y = -3 @@ -64119,9 +64733,6 @@ /obj/structure/cable, /turf/open/floor/iron/white/smooth_large, /area/station/command/heads_quarters/cmo) -"xcp" = ( -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "xcz" = ( /obj/effect/turf_decal/stripes/corner, /obj/structure/reagent_dispensers/watertank, @@ -64226,12 +64837,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port) -"xeT" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/mannequin/skeleton, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "xff" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -64247,14 +64852,7 @@ dir = 1 }, /obj/structure/table/glass, -/obj/item/biopsy_tool{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/book/manual/wiki/cytology{ - pixel_x = -4; - pixel_y = 4 - }, +/obj/structure/microscope, /turf/open/floor/iron/white, /area/station/science/cytology) "xfx" = ( @@ -64478,6 +65076,13 @@ "xiL" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/science/xenobiology) +"xiW" = ( +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "xjb" = ( /obj/effect/landmark/start/ai/secondary, /obj/item/radio/intercom/directional/north{ @@ -64599,16 +65204,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) -"xkT" = ( -/obj/structure/table/reinforced, -/obj/item/folder/blue{ - pixel_y = 2 - }, -/obj/item/pen, -/obj/machinery/light/small/directional/west, -/obj/machinery/requests_console/directional/west, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "xkV" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, /turf/open/floor/iron, @@ -64739,10 +65334,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) -"xnA" = ( -/obj/structure/cable, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) "xnT" = ( /obj/structure/cable, /obj/machinery/airalarm/directional/south, @@ -64778,16 +65369,6 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/mining, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"xoj" = ( -/obj/structure/table/reinforced, -/obj/machinery/microwave{ - pixel_y = 6 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) "xor" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -64844,6 +65425,15 @@ /obj/machinery/bluespace_vendor/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/central) +"xpL" = ( +/obj/structure/closet/secure_closet/chief_medical, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/item/screwdriver, +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/cmo) "xpX" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/iron, @@ -64852,7 +65442,7 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/incinerator_input{ dir = 1 }, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "xpZ" = ( /obj/machinery/camera/directional/east{ @@ -64971,11 +65561,6 @@ /obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/white, /area/station/science/ordnance/testlab) -"xsv" = ( -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "xsy" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/yellow{ @@ -65127,7 +65712,8 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "xuV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/closed/wall/r_wall, /area/station/maintenance/aft/lesser) "xvd" = ( @@ -65215,17 +65801,6 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/grass, /area/station/science/genetics) -"xwT" = ( -/obj/structure/rack, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 4 - }, -/obj/effect/spawner/random/armory/disablers, -/obj/machinery/requests_console/directional/west, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) "xwV" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -65699,6 +66274,13 @@ /obj/item/pen, /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) +"xCT" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Chapel Office - Backroom" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) "xDa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, @@ -65754,6 +66336,17 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/engine/plasma, /area/station/engineering/atmos) +"xEr" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/structure/sign/map/right{ + desc = "A framed picture of the station. Clockwise from security in red at the top, you see engineering in yellow, science in purple, escape in checkered red-and-white, medbay in green, arrivals in checkered red-and-blue, and then cargo in brown."; + icon_state = "map-right-MS"; + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) "xEt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -65848,13 +66441,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/courtroom) -"xGk" = ( -/obj/machinery/computer/operating{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) "xGm" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -65929,6 +66515,16 @@ /obj/structure/sign/departments/medbay/alt, /turf/closed/wall, /area/station/medical/medbay/lobby) +"xII" = ( +/obj/machinery/vending/wardrobe/hydro_wardrobe, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/light/small/directional/north, +/obj/structure/sign/poster/official/random/directional/east, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron, +/area/station/service/hydroponics) "xIK" = ( /obj/structure/table, /obj/item/reagent_containers/condiment/enzyme{ @@ -66332,7 +66928,6 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "xRf" = ( -/obj/effect/spawner/random/structure/table, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) @@ -66347,6 +66942,29 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/plating, /area/station/engineering/atmos) +"xRR" = ( +/obj/structure/bodycontainer/morgue/beeper_off, +/obj/structure/bodycontainer/morgue/beeper_off{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/warning{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/mid_joiner{ + dir = 1 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/iron/dark/smooth_half{ + dir = 4 + }, +/area/station/medical/morgue) +"xRY" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "xRZ" = ( /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) @@ -66416,6 +67034,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/dorms) +"xUm" = ( +/obj/machinery/computer/operating{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/clock/directional/west, +/obj/item/radio/intercom/directional/north, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "xUu" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -66722,8 +67350,8 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "xYQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "xYV" = ( @@ -66750,14 +67378,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, /area/station/security/courtroom) -"xZi" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/item/radio/intercom/directional/south, -/obj/structure/bodycontainer/morgue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "xZu" = ( /obj/structure/sink/kitchen/directional/east{ desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; @@ -67031,13 +67651,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"ydz" = ( -/obj/structure/closet/l3closet/virology, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) "ydG" = ( /obj/effect/turf_decal/arrows/red{ dir = 4; @@ -67163,10 +67776,6 @@ }, /turf/open/floor/engine/n2o, /area/station/engineering/atmos) -"yfI" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, -/turf/closed/wall/r_wall, -/area/station/maintenance/disposal/incinerator) "yfL" = ( /turf/closed/wall, /area/station/ai_monitored/command/storage/eva) @@ -67227,6 +67836,12 @@ /obj/effect/turf_decal/tile/bar, /turf/open/floor/iron, /area/station/construction/storage_wing) +"ygS" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central) "yhm" = ( /obj/machinery/airalarm/directional/west, /obj/structure/disposaloutlet{ @@ -67298,16 +67913,39 @@ /obj/structure/marker_beacon/purple, /turf/open/space/basic, /area/space/nearstation) -"yih" = ( -/obj/machinery/shower/directional/west, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) +"yij" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/white/smooth_large, +/area/station/medical/chemistry) +"yim" = ( +/obj/structure/table, +/obj/machinery/camera/directional/north{ + c_tag = "Medbay Paramedic Dispatch"; + name = "medical camera"; + network = list("ss13","medical") + }, +/obj/machinery/fax{ + fax_name = "Medical"; + name = "Medical Fax Machine" + }, +/obj/structure/noticeboard/directional/north, +/obj/structure/sign/clock/directional/west, +/turf/open/floor/iron/dark, +/area/station/medical/office) "yis" = ( /obj/machinery/mech_bay_recharge_port, /obj/structure/sign/poster/official/safety_report/directional/south, /turf/open/floor/plating, /area/station/cargo/warehouse) +"yiJ" = ( +/obj/structure/chair/sofa/right/brown, +/obj/item/toy/plush/moth{ + name = "Mender Moff" + }, +/turf/open/floor/carpet, +/area/station/medical/psychology) "yiN" = ( /obj/effect/spawner/random/maintenance, /obj/structure/cable, @@ -67359,11 +67997,6 @@ /obj/structure/window/spawner/directional/west, /turf/open/floor/carpet, /area/station/service/theater) -"ykH" = ( -/obj/effect/turf_decal/bot, -/obj/effect/landmark/blobstart, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "ykI" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/engine{ @@ -79953,7 +80586,7 @@ pOa aox aox aox -aox +euT aox aaa aaa @@ -80432,7 +81065,7 @@ aDa aDa iYU xLR -dhb +ouY aDb dIP nPf @@ -80465,7 +81098,7 @@ nQz xyM sTq pOa -eze +dlL qgf uTw jUb @@ -81004,19 +81637,19 @@ aox lMJ aaa aaa -lMJ -aaa +qWg aaa aaa aaa aaa aaa +bxr aaa aaa lZV aaa aaa -lMJ +qWg aaa aaa aaa @@ -81217,7 +81850,7 @@ hxD rBU rzq xOV -lRN +hEq dXg dXg dXg @@ -81519,7 +82152,7 @@ lMJ aaa aaa xjH -vdJ +akA wpi kVg tgD @@ -81772,7 +82405,7 @@ aaa aaa lMJ aox -lMJ +pZW aaa aaa xjH @@ -82033,7 +82666,7 @@ jUb lMJ lMJ xjH -ydz +dFi dno tIl bYm @@ -82046,7 +82679,7 @@ qPC rKQ xjH xjH -aaa +fIR aaa aaa lMJ @@ -82804,7 +83437,7 @@ rjB jUb aaa xjH -tmJ +ocN ark uGq iam @@ -83011,7 +83644,7 @@ fxQ fcq wsQ pTm -sTD +vtn xjh ccP bTj @@ -83074,7 +83707,7 @@ rKQ rKQ xjH xjH -aaa +ktw aaa aaa lMJ @@ -84102,7 +84735,7 @@ rKQ rKQ xjH xjH -aaa +fIR aaa aaa aaa @@ -84346,9 +84979,9 @@ shK jUb tzt xjH -vAc +sMo sOM -lyf +lDj xjH aaa aaa @@ -84846,8 +85479,8 @@ fhv liC jUb aRz -jEY -vVu +uSz +oWQ vJy njc ctq @@ -85131,7 +85764,7 @@ gAf tSw tSw aaa -aaa +gda aaa aaa sGL @@ -85364,17 +85997,17 @@ xUu mue xUu kIR +tMS xUu -moD gjk kIR ecq xUu xUu -xUu +nCL iCX oGf -ryQ +sPq rab iTH bhS @@ -85633,7 +86266,7 @@ jUb gll azE xxU -iVB +bxq lpN sWZ qEf @@ -85644,9 +86277,9 @@ tSw aBQ qEf qEf -qEf +aIl gXF -gmS +atk bhS cxi uAC @@ -85873,27 +86506,27 @@ rke jUb nTn jUb -vAF +fpg snb -tGu -moK +kpV +qOO gGK snb -vAF +dyq jUb iEm kym jUb -dIA -paQ -caC +dLn +tJo +uiR hbv xTw erF xTw bhS fqR -ajM +mwm fje tSw jsq @@ -85909,7 +86542,7 @@ gnL ckz dWA ecz -aaa +fIR aaa lMJ aaa @@ -86141,9 +86774,9 @@ jUb iEm kym jUb -whb +vVc cqD -eEV +pmb bLQ tXx tzE @@ -86396,18 +87029,18 @@ oZO bMS jUb dqN -kym +vCC jUb -iOf +jdH oBv -goj -mav +uOo +via myc wSv fuA aPq fVa -wVf +uFr vZb tBJ tnG @@ -86642,7 +87275,7 @@ dqN qKs jUb jUb -tpC +mqz pHv veS dGv @@ -86659,7 +87292,7 @@ jUb jUb jUb jUb -lIi +aJb oBO ieH vDc @@ -86667,12 +87300,12 @@ miX bfg iAu tBJ -ngV +cxw oxj gms wov jUA -wcM +dim tSw vUM tSw @@ -86901,8 +87534,8 @@ jUb kpB dIK jUb -jov -yih +jsj +bNa ixv jml wRZ @@ -86933,8 +87566,8 @@ yje tSw gOp bCM -lOf -drm +vKd +ikY tSw lMJ aaa @@ -87174,14 +87807,14 @@ jUb sje jUb tck -tFr +kHg nMf vDc -amb +npO nCc -xGk +msC tBJ -mVj +gLY jTR mru faL @@ -87410,31 +88043,31 @@ uYD sSn nDT lYG -fmc +uiM nVq dIK jUb -vXc -gZD +kpi +stZ tuC rDJ guC fTE hBY vVI -ppG +gmN vun -pMs +iRy uLs wFa iov nwl vun lyx -wGk -ukN +tFr +nGd vDc -jtZ +rdk pFg jXQ tBJ @@ -87681,11 +88314,11 @@ jfO wDq hgu vun -csH +kcZ dMN ejg ehX -dEM +tgn vun rtX tFr @@ -87705,11 +88338,11 @@ tSw tSw vUM tSw -sfl -eqz -lUP -hVg -dgN +uaS +lMh +sFo +hse +frm vQg kvN aGD @@ -87926,7 +88559,7 @@ jwp qCL uIM ahg -qvZ +grm sSp wvP wUQ @@ -87938,11 +88571,11 @@ oPv nKE xtu rvb -pri +ver elb sja elb -hlX +ims rvb jGt tFr @@ -87952,10 +88585,10 @@ duw hyn wUH lYx -hYN +qvP cyX jhv -gCU +tqh tDn xmD tSw @@ -87963,9 +88596,9 @@ qjy sMD khD pvm -pqu -lKS -hBh +pmc +xCT +oQN jVG vQg gYU @@ -88181,7 +88814,7 @@ vXH pOa wKe aez -vpB +ajK aSe jeL jxc @@ -88438,8 +89071,8 @@ nPt qSk pBs lgC -aZq -kjj +avb +uPi sfF wsv hcU @@ -88452,11 +89085,11 @@ wUQ jGG agZ rvb -tnN +mhm eih foP sRm -hdF +rjy rvb myc tFr @@ -88466,7 +89099,7 @@ nGr aST tBs vRN -xoj +imy rOF ryf vnV @@ -88695,7 +89328,7 @@ tWq pOa qIP jkT -eKr +gdp eRc qNi jxc @@ -88726,9 +89359,9 @@ gKO uYp rOF uaj -lWI -xnA -jZl +cZi +kNA +mvN uXG efC hLZ @@ -88950,7 +89583,7 @@ clp etn ayH pOa -hKP +bjK jqQ mbV hEA @@ -88966,22 +89599,22 @@ iMv nKE xtu rvb -uod +wIF wWs fOu fBJ -twF +piJ rvb nsD tFr nMf -lOV +dub uYp -tjs +kbB cpR -lxC +jHQ uYp -uNq +yiJ sfA eQO xjI @@ -89227,18 +89860,18 @@ mWC uTj usC ehX -kZp +wYi vun gQG tFr oqi -ned +luB uYp -oAj +pCl qOV qQu uYp -eFU +vAX sfA dvn qkJ @@ -89452,8 +90085,8 @@ flx ntX xyq sVY -jPo -apB +uCq +ygS ooP sVY sVY @@ -89463,28 +90096,28 @@ sVY xxk ahr bMY -sTe +yim rvq fFi iWD vDz pBN sSp -ppG +iwj ppG nuO xQC -kLZ +ckE iUJ bJk -ppG -ppG +mpk +pyU vun -cvd -uWj +eFG +qpf hwe iZn -mJp +rar vun uzJ aUt @@ -89499,7 +90132,7 @@ ikS cnc igP sjx -axR +qXu tSw tAH fKP @@ -89975,19 +90608,19 @@ gUt gUt dvZ qQm -isQ +waF bMY bMY nur jfr -mBb +vIn pYw irL oNP -wRI +rEt xST -nor -eMU +wVy +dpI ttE aPm sZH @@ -90004,15 +90637,15 @@ lgT hDp sOn xUb -eMI +ePg eMI jfN eMI -ctO -egZ -hhU +kDa +onv +sFY xar -chx +kKh tSw fje swP @@ -90223,9 +90856,9 @@ mPh cmC fDk fDk -oSh +sUx fDk -jeX +kYH avq wcN uyr @@ -90247,8 +90880,8 @@ jCn uHt uHt gTn -eZb -wlt +fod +uVx jso qWR iFi @@ -90271,12 +90904,12 @@ fYx xSQ rGB qEK -pyd +fMy pTL rJI taX tSw -rQB +lmx gmX lHK woz @@ -90498,11 +91131,11 @@ bax ghc cxt oNP -auH +gDh tFr nmQ ije -sdL +lgw pFS uEz nWy @@ -90521,19 +91154,19 @@ dVt iHn ubd rUp -nmQ +ggO nmQ nmQ qZa -xQh -nSS +nCr +sEv tSw tSw tSw tSw xtz tSw -vyl +nra iJj uZD hKv @@ -90724,7 +91357,7 @@ lVH vtF oIa pJR -oXT +uJx sRT vsU gaU @@ -90739,7 +91372,7 @@ tOh lTM dYb psv -tLo +mZz cCN dYb dYb @@ -90755,7 +91388,7 @@ bTm ylf tzI bMY -dAx +uET iZF qyr pKP @@ -90775,7 +91408,7 @@ yfg bqX iMr pyM -jpY +oNy bqX bqX bqX @@ -90790,7 +91423,7 @@ xaj tSw xtz tSw -dEp +mBW iJj jAm lFZ @@ -91016,7 +91649,7 @@ ePX svQ duu pKP -lTP +aWR rQd cJm jGw @@ -91260,9 +91893,9 @@ ukk rGm gqX htd -oGK +vMV qPJ -don +luN wde jJd rqc @@ -91287,14 +91920,14 @@ iqz iqz iqz iqz -iqz dVN -uqL -jgT +dVN +iqz +iqz vZF xCR -dIL -pPU +kiz +svp fxW mkO tyy @@ -91304,7 +91937,7 @@ kNO hav xGX tSw -bJc +bRq iZi kVN hKv @@ -91519,7 +92152,7 @@ gqX htd oGK qPJ -tUo +ksZ waH vbV ixr @@ -91544,14 +92177,14 @@ dkx dkx dkx dkx -dkx -dVN -tqd -aeF -hNV +jOw +uqL +hdk +jgT +vru lrZ -kiz -jZO +jRc +nmQ fck aec ett @@ -91781,7 +92414,7 @@ nsb izD evY sli -dZU +oFG lsJ gQG tFr @@ -91791,7 +92424,7 @@ jgs uyw pcM cNk -mSs +bEA bqX bqX jYy @@ -91801,15 +92434,15 @@ iqz iqz iqz iqz -iqz dVN -vPp +iqz +iqz +iqz +ubF hZV -hZV -hZV -nZm -nZm -aeB +skW +mXn +iwL nZm nZm tSw @@ -91818,7 +92451,7 @@ tSw tSw xWF tSw -oum +edr iZi kVN laa @@ -92044,13 +92677,13 @@ gQG oBO jNl pKP -jet -aix +xpL +eWp hGl kha dbD bqX -saa +ulR ffj iqz iqz @@ -92058,17 +92691,17 @@ iqz iqz wOl skx -lxw -dVN -jtl +bjy +iqz +tqd +pbz +dpl hZV -kBR -kBR -nZm -dyh +bAI +idL iJC -gfo -sru +pts +niz tSw juV bsZ @@ -92307,25 +92940,25 @@ xga eIO eIO fvE -osM +hyh iqz tqd -iIW +hFD pbz vfU mAb mAb -ePM -dVN -jtl +uYI +iqz +hjx hZV -gSN -gSN -kOM -xsv -wsF -gSN -dGi +hZV +hZV +nZm +gJD +eEG +dPm +thw tSw vpP tSw @@ -92564,7 +93197,7 @@ iQj qaT tAD fvE -kXl +xiW iqz jtl iqz @@ -92572,22 +93205,22 @@ iqz iqz mAb mAb -ePM -dVN +uYI +iqz bxE hZV -xcp -xcp -kOM -osD +xUm +gPl +nZm +wvB hvR fgA -vPH -qZM -aID +vtm +hjG +isk iUm -aoL -vke +bVx +fWc muZ jay mRy @@ -92821,7 +93454,7 @@ eIO eIO xit fvE -myg +prc iqz fmo vfU @@ -92829,22 +93462,22 @@ qXL hFD mAb mAb -ePM -dVN +uYI +iqz iaK hZV -pap -bMh -kOM -kOM -rmD -gSN -nbm +eOv +jBU +kgx +kgx +nRU +imt +meK tSw nNJ iUm -iJB -hQT +bNc +hPk nSe nSe xMz @@ -93071,14 +93704,14 @@ xJI tIx wmT hCt -kKu +uUb rXW bSs rla eIO sGn fvE -fRP +dYG iqz iqz iqz @@ -93086,22 +93719,22 @@ iqz iqz lWd cBg -uId -dVN +hbO +iqz ogk hZV -xeT -lxT -pYo -kOM -sKG -uWM -cpb +daa +uiw +kys +kWE +eky +vLo +wnW tSw oBD iUm -iyi -hQT +vCc +hPk xMz xMz xMz @@ -93335,30 +93968,30 @@ kzj qhG iqq qWK -mXK +cdk +uqA +uqA +uqA +uqA +uqA +pCw iqz +jOw iqz -iqz -iqz -iqz -iqz -iqz -iqz -dVN -wrE +fyK hZV -kHV -shY -gdz +hif +otI +fWw pdV -nHK -ykH -lWj +cjv +qhA +dwk tSw agR iUm iUm -erG +iYW tMA nSe nSe @@ -93598,24 +94231,24 @@ iqz fnc bCo bCo +vPf bCo -bCo -bCo -bCo +dVN +yij jtl hZV -teR -hzi -vvd -kOM -uYG -wfa -gui +eNl +hZA +jLy +kgx +hKB +vLo +aAb tSw dbX iUm -sUi -dzM +viS +huy iWJ ePN izG @@ -93845,7 +94478,7 @@ mVE hxq nJn nqB -erU +kxa eIO hKG fvE @@ -93855,24 +94488,24 @@ iqz iqz iqz iqz -tqd +sTW cYx -pbz +cXH joj dWI hZV -eyy -kqP -hjF -kOM -pTx -gSN -qpu +wWo +vTV +vow +nZm +cuk +vLo +hZy tSw iDN iUm -irW -gmp +ncV +sRL pmW iUm jdg @@ -94107,29 +94740,29 @@ eIO wKC fvE kKT -fBG +kMk wPH xyA -drW +hgB jxm -lFt +unt bqX bqX bqX bqX hZV +xRR +hSQ +flX nZm -nZm -oKD -kOM -rGK -gSN -xZi +mpw +uYL +lmk tSw fdX iUm -oZi -bfl +xEr +xRY chV eje eje @@ -94284,7 +94917,7 @@ aeq xCo loY tTP -xwT +fdQ uou agc apM @@ -94371,22 +95004,22 @@ bqX bqX bqX cJL -kul -ati -kOR -bod -bod +fjq +wvh +iEv nZm nZm nZm -uOS +nZm +nZm +ner nZm nZm tSw tmL iUm -lZC -bfl +aDo +kou dbA nSe nSe @@ -94630,14 +95263,14 @@ eGm qQY njX njX -jcd -tNw +njX +gSW oAu bxf njX +cRw +uGE njX -njX -jcd vNv oAu wrg @@ -96686,7 +97319,7 @@ gwf gfZ gqm jZP -cWk +aIO jrb vEC eOo @@ -98161,7 +98794,7 @@ iJd nVy tGI daC -kRR +mQo xNU eFJ usP @@ -98190,7 +98823,7 @@ cnA nNw dmK tvE -iME +dTp fPh kgr mnq @@ -98200,9 +98833,9 @@ kwp wZw htd saU -ooP +tgI mvR -izX +iGT bPi gpB sky @@ -98448,7 +99081,7 @@ vQe iJl tvE wNH -fIo +jYr kso lcG ngg @@ -98459,7 +99092,7 @@ htd saU ooP mvR -kss +mME iQi fGv knY @@ -98717,7 +99350,7 @@ dhU dkW mvR bgn -tMb +ofm rHE dbd aBJ @@ -98982,7 +99615,7 @@ dlG ipM rsD qos -tOU +sLF kZx oBz gTo @@ -99484,7 +100117,7 @@ nnR wah wpx htd -saU +iaT tUn tUn tUn @@ -99745,7 +100378,7 @@ ddO sLE cEv iQO -ofZ +eeT tUn hKV fWK @@ -100044,7 +100677,7 @@ xRf qXW dKC rzx -nFa +hcP kYP tvg dKC @@ -100188,7 +100821,7 @@ aaa rrt aaa rrg -kms +eqS lfu ilR kcg @@ -100558,7 +101191,7 @@ oJu dKC lUD isI -isI +vIm dKC qdw dKC @@ -101544,7 +102177,7 @@ xlF xlF xlF pdl -hpM +hxw tUn hKV wXF @@ -101801,7 +102434,7 @@ byW byW byW nDO -hmI +gtR tUn hKV wXF @@ -102302,8 +102935,8 @@ mal rFO pmZ qdI -laW -uYI +ttF +sRY wDh uIs amu @@ -102574,7 +103207,7 @@ xlF was eur tUn -ari +eJh wXF wXF wXF @@ -103086,9 +103719,9 @@ rwd cOa cOa eKD -vqi +pXl tUn -qpT +brX tUn tUn tUn @@ -104113,8 +104746,8 @@ kCZ nKI bZq vrn -fYI -gFD +tUt +gOa unL unL ouR @@ -104623,7 +105256,7 @@ apt huG bJp wYB -oXM +foB siz pCL unL @@ -105394,7 +106027,7 @@ cCR unL aLu unL -wnR +xII ltX kbR vOK @@ -106169,13 +106802,13 @@ tXk itW kGv izp -hcP -vIm +fWA +fWA mhl mhl mhl mhl -aJm +wXF lMJ lMJ lMJ @@ -106424,9 +107057,9 @@ tHk unL hLs enf -izp -xZb -hcP +hCl +aJm +hum jCx cZF uaG @@ -106683,7 +107316,7 @@ xZb fFq izp jJk -hcP +fWA kBQ lWq lWq @@ -106940,7 +107573,7 @@ mEx mWA isl fWA -hcP +fWA dRj lWq fBi @@ -107164,7 +107797,7 @@ iBm uXd sqE fOn -dJP +vuh bfO pCt vYK @@ -107974,7 +108607,7 @@ wIB viH nng nng -yfI +pnH fGN pnH guo @@ -110044,7 +110677,7 @@ aaa oMA sKf sri -oQk +sri kCr tsy sRa @@ -110300,7 +110933,7 @@ aaa aaa uaR jHX -toR +oQk toR toR syV @@ -121560,7 +122193,7 @@ lro aWN aVl jGa -xkT +uLv bjQ bjQ bjQ diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index c7944804fec..98136e8fcfb 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -259,6 +259,7 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 }, +/obj/machinery/mining_weather_monitor/directional/north, /turf/open/floor/iron/dark/smooth_edge, /area/mine/production) "cb" = ( @@ -1799,6 +1800,7 @@ /obj/effect/turf_decal/tile/bar/opposingcorners{ dir = 1 }, +/obj/machinery/mining_weather_monitor/directional/west, /turf/open/floor/iron/checker, /area/mine/cafeteria) "kV" = ( @@ -2501,6 +2503,7 @@ /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 }, +/obj/machinery/mining_weather_monitor/directional/south, /turf/open/floor/iron/dark, /area/mine/laborcamp/security) "nA" = ( @@ -3496,8 +3499,8 @@ /turf/open/floor/carpet/neon/simple/red/nodots, /area/mine/cafeteria) "tZ" = ( -/obj/machinery/vending/sustenance, /obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/sustenance/labor_camp, /turf/open/floor/iron/smooth_edge{ dir = 8 }, @@ -3712,6 +3715,7 @@ /obj/effect/turf_decal/trimline/red/filled/line{ dir = 9 }, +/obj/machinery/mining_weather_monitor/directional/north, /turf/open/floor/iron/dark, /area/mine/laborcamp/security) "vp" = ( @@ -7016,6 +7020,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, +/obj/machinery/mining_weather_monitor/directional/south, /turf/open/floor/iron/smooth_edge{ dir = 1 }, diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index c189dd8ded2..c79d779b52d 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -115,6 +115,23 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) +"abk" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Genetics Desk" + }, +/obj/effect/turf_decal/siding/purple{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/airalarm/directional/east, +/obj/item/storage/box/gloves{ + pixel_x = 5; + pixel_y = 1 + }, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "abl" = ( /obj/effect/mapping_helpers/airlock/access/all/science/rd, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -381,18 +398,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard) -"aey" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "aeF" = ( /obj/machinery/conveyor_switch/oneway{ id = "coffinbelt"; @@ -402,13 +407,6 @@ }, /turf/open/floor/carpet/orange, /area/station/service/chapel/funeral) -"aeI" = ( -/obj/effect/turf_decal/siding/white/corner{ - color = null - }, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/rd) "aeL" = ( /obj/effect/spawner/random/trash/botanical_waste, /turf/open/floor/pod/light, @@ -419,7 +417,7 @@ dir = 1 }, /obj/structure/table/reinforced/rglass, -/obj/machinery/computer/records/medical/laptop, +/obj/item/storage/box/bodybags, /turf/open/floor/iron/dark, /area/station/medical/morgue) "aeW" = ( @@ -584,19 +582,6 @@ /obj/machinery/duct, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/starboard) -"ahe" = ( -/obj/effect/turf_decal/tile/dark/half/contrasted{ - dir = 8 - }, -/obj/effect/turf_decal/siding/purple, -/obj/machinery/camera/directional/south{ - c_tag = "Genetics Lab" - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "aho" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ @@ -699,6 +684,15 @@ /obj/structure/sign/departments/restroom/directional/east, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/floor3/fore) +"aip" = ( +/obj/effect/turf_decal/siding/wideplating_new{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/corner{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "air" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -839,11 +833,6 @@ /obj/structure/disposalpipe/trunk, /turf/open/space/basic, /area/space/nearstation) -"akl" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/machinery/hydroponics/constructable, -/turf/open/floor/iron/white, -/area/station/science/research/abandoned) "akr" = ( /obj/machinery/button/door/directional/south{ id = "captain_privacy"; @@ -942,6 +931,12 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) +"alu" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/science/xenobiology) "alE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible, /obj/effect/turf_decal/stripes/line, @@ -993,16 +988,6 @@ "amt" = ( /turf/closed/wall, /area/station/service/library/lounge) -"amA" = ( -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/paper_bin, -/obj/item/pen, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/effect/turf_decal/siding/white/corner{ - color = null - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/rd) "amK" = ( /obj/machinery/door/poddoor/shutters{ id = "aux_base_shutters"; @@ -1014,13 +999,6 @@ /obj/machinery/light/floor, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"amU" = ( -/obj/structure/closet/secure_closet/research_director, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) "anb" = ( /obj/machinery/vending/wardrobe/hydro_wardrobe, /obj/effect/turf_decal/tile/green/full, @@ -1171,6 +1149,22 @@ /obj/effect/landmark/start/scientist, /turf/open/floor/iron/dark/smooth_large, /area/station/science/lobby) +"aoG" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/office/light{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "aoM" = ( /obj/structure/grille, /turf/open/floor/plating, @@ -1234,19 +1228,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) -"apu" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Science - Radshelter" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/smooth_large, -/area/station/maintenance/radshelter/sci) "apw" = ( /obj/effect/turf_decal/stripes, /obj/structure/sign/departments/psychology/directional/west, @@ -1546,18 +1527,6 @@ /obj/effect/mapping_helpers/airlock/access/all/science/general, /turf/open/floor/iron/white, /area/station/science/lobby) -"atn" = ( -/obj/effect/turf_decal/siding/white{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "ato" = ( /obj/effect/decal/cleanable/dirt, /obj/item/rack_parts, @@ -1831,18 +1800,6 @@ /obj/machinery/light/directional/west, /turf/open/floor/grass, /area/station/security/courtroom) -"awT" = ( -/obj/structure/window/spawner/directional/west, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 8 - }, -/obj/structure/disposalpipe/trunk, -/obj/machinery/disposal/bin, -/turf/open/floor/wood, -/area/station/science/research/abandoned) "awU" = ( /obj/structure/closet/emcloset, /turf/open/floor/pod/dark, @@ -1968,16 +1925,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/green/visible, /turf/open/space/basic, /area/space/nearstation) -"ayD" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "ayJ" = ( /obj/structure/sign/warning/docking, /turf/closed/wall/r_wall, @@ -2031,23 +1978,6 @@ /obj/item/ammo_casing/shotgun/dart, /turf/open/floor/iron/checker, /area/station/service/bar) -"azC" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/siding/purple{ - dir = 9 - }, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) -"azF" = ( -/obj/effect/turf_decal/siding/purple/corner{ - dir = 1 - }, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "azI" = ( /obj/machinery/camera/autoname/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2065,11 +1995,6 @@ /obj/structure/bookcase/random/religion, /turf/open/floor/iron/white/textured_large, /area/station/service/chapel) -"azX" = ( -/obj/effect/turf_decal/box, -/obj/machinery/light/cold/no_nightlight/directional/west, -/turf/open/floor/engine, -/area/station/science/cytology) "aAc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2098,6 +2023,11 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos) +"aAE" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/mob/living/basic/cow, +/turf/open/floor/grass, +/area/station/science/cytology) "aAK" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/trimline/purple/warning, @@ -2133,18 +2063,6 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/disposal/incinerator) -"aBC" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "aBK" = ( /turf/closed/wall/r_wall, /area/station/medical/virology) @@ -2178,6 +2096,14 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor4/fore) +"aCd" = ( +/obj/effect/turf_decal/siding/white, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/cytology) "aCl" = ( /obj/structure/table/reinforced, /obj/item/book/manual/wiki/chemistry, @@ -2252,7 +2178,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/airalarm/directional/north, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "aDi" = ( @@ -2297,15 +2222,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/floor4/port/aft) -"aDs" = ( -/obj/effect/turf_decal/tile/dark/half/contrasted{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "aDx" = ( /turf/open/floor/iron, /area/station/engineering/atmos/hfr_room) @@ -2351,12 +2267,6 @@ /obj/item/wrench, /turf/open/floor/pod, /area/station/maintenance/floor4/port/fore) -"aEf" = ( -/obj/structure/chair/office/light{ - dir = 1 - }, -/turf/open/floor/iron/smooth_edge, -/area/station/science/research/abandoned) "aEh" = ( /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, @@ -2397,17 +2307,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/fore) -"aEE" = ( -/obj/machinery/door/airlock/science{ - name = "Cytology" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/science/xenobio, -/turf/open/floor/iron/white, -/area/station/science/cytology) "aEH" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -2433,17 +2332,6 @@ /obj/structure/chair/sofa/corp/left, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) -"aER" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/dark/fourcorners, -/obj/effect/turf_decal/siding/purple, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "aES" = ( /obj/structure/table/wood, /obj/effect/spawner/random/food_or_drink/seed, @@ -2754,6 +2642,15 @@ /obj/structure/grille, /turf/open/floor/plating, /area/station/maintenance/floor1/port) +"aIY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/checker{ + dir = 1 + }, +/area/station/science/genetics) "aJb" = ( /obj/effect/mapping_helpers/mail_sorting/service/chapel, /obj/effect/mapping_helpers/mail_sorting/service/dormitories, @@ -3039,16 +2936,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/third) -"aNH" = ( -/obj/structure/table, -/obj/item/plate, -/obj/item/food/donkpocket/warm/berry, -/obj/item/knife/plastic{ - pixel_x = 16 - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/kitchen, -/area/station/command/heads_quarters/rd) "aNQ" = ( /obj/structure/transit_tube/station/dispenser{ dir = 4 @@ -3092,13 +2979,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) -"aOB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/contraband/landmine, -/turf/open/floor/engine{ - icon_state = "podfloor_light" - }, -/area/station/maintenance/floor4/port) "aOD" = ( /obj/effect/turf_decal/stripes{ dir = 5 @@ -3144,6 +3024,14 @@ /obj/structure/cable, /turf/open/floor/circuit/green, /area/station/science/robotics/mechbay) +"aPf" = ( +/obj/effect/turf_decal/siding/white, +/obj/effect/turf_decal/trimline/purple/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/cytology) "aPg" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/delivery, @@ -3162,10 +3050,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"aPq" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron, -/area/station/science/genetics) "aPu" = ( /obj/effect/turf_decal/stripes/end, /turf/open/floor/plating/reinforced{ @@ -3763,10 +3647,6 @@ }, /turf/open/misc/beach/sand, /area/station/hallway/floor2/fore) -"aWG" = ( -/obj/structure/lattice, -/turf/open/openspace, -/area/station/maintenance/floor3/starboard) "aWH" = ( /obj/machinery/door/airlock/grunge{ name = "Mech Bay" @@ -3778,6 +3658,11 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/science/robotics/mechbay) +"aWJ" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/science/cytology) "aWO" = ( /obj/effect/turf_decal/trimline/green/filled/arrow_cw{ dir = 9 @@ -3839,19 +3724,6 @@ dir = 4 }, /area/station/science/lobby) -"aXr" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/stripes, -/obj/item/storage/box/monkeycubes{ - pixel_x = -5 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/item/storage/box/monkeycubes, -/obj/item/storage/box/monkeycubes{ - pixel_x = 5 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "aXC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3970,6 +3842,13 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port/aft) +"aYs" = ( +/obj/machinery/power/shieldwallgen/xenobiologyaccess, +/obj/effect/turf_decal/stripes{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "aYv" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -4040,12 +3919,6 @@ /obj/effect/decal/cleanable/glass, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard) -"aZj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/smooth_half, -/area/station/maintenance/radshelter/sci) "aZl" = ( /obj/structure/sign/poster/official/do_not_question/directional/south, /obj/effect/turf_decal/tile/dark_red/fourcorners, @@ -4190,6 +4063,18 @@ dir = 4 }, /area/station/science/robotics/mechbay) +"baN" = ( +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/science/cytology) "bbb" = ( /obj/effect/decal/cleanable/blood/tracks{ dir = 6 @@ -4279,6 +4164,10 @@ dir = 8 }, /area/station/hallway/floor2/aft) +"bcr" = ( +/obj/item/shard, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/floor2/starboard/aft) "bcx" = ( /obj/effect/turf_decal/trimline/purple/warning{ dir = 1 @@ -4288,6 +4177,17 @@ dir = 1 }, /area/station/hallway/floor2/fore) +"bcC" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "bcD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -4335,6 +4235,14 @@ /obj/structure/chair/bronze, /turf/open/floor/bronze/filled, /area/station/maintenance/floor1/starboard) +"bdD" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/paper_bin, +/obj/item/pen, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/corner, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/rd) "bdN" = ( /obj/structure/table, /obj/item/stack/sheet/iron/fifty, @@ -4664,6 +4572,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/corner, /area/station/engineering/lobby) +"bhy" = ( +/obj/structure/sign/warning/biohazard/directional/east, +/obj/machinery/light/cold/no_nightlight/directional/east, +/turf/open/floor/engine{ + initial_gas_mix = "o2=22;bz=82;TEMP=293.15" + }, +/area/station/science/xenobiology) "bhz" = ( /obj/effect/turf_decal/trimline/brown/warning{ dir = 4 @@ -4744,6 +4659,13 @@ dir = 1 }, /area/station/hallway/floor3/aft) +"bir" = ( +/obj/effect/turf_decal/trimline/purple/warning{ + dir = 6 + }, +/obj/effect/spawner/random/engineering/canister, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor2/starboard) "biz" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/machinery/door/airlock/medical{ @@ -4789,6 +4711,12 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) +"biJ" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/misc/sandy_dirt, +/area/station/science/cytology) "biM" = ( /obj/structure/railing{ dir = 1 @@ -5171,6 +5099,11 @@ /obj/structure/railing, /turf/open/floor/iron/white/side, /area/station/science/robotics/lab) +"bmf" = ( +/obj/structure/window/spawner/directional/south, +/obj/structure/closet/secure_closet/research_director, +/turf/open/floor/carpet/green, +/area/station/command/heads_quarters/rd) "bml" = ( /obj/structure/lattice/catwalk, /obj/structure/ladder, @@ -5206,6 +5139,12 @@ dir = 1 }, /area/station/hallway/floor4/fore) +"bmE" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/floor2/starboard/aft) "bmG" = ( /obj/effect/turf_decal/tile/green/half, /obj/structure/table, @@ -5629,14 +5568,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/medical/abandoned) -"bsm" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/obj/machinery/light/small/directional/west, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/smooth_large, -/area/station/maintenance/radshelter/sci) "bsq" = ( /obj/effect/turf_decal/stripes, /turf/open/floor/plating, @@ -5670,6 +5601,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/science/lobby) +"bsB" = ( +/obj/machinery/door/airlock/science{ + name = "Changing Room" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/turf/open/floor/iron/white, +/area/station/science/lower) "bsC" = ( /obj/effect/landmark/start/hangover, /obj/structure/disposalpipe/segment{ @@ -5758,12 +5698,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"bto" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 10 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "btp" = ( /obj/structure/table, /obj/item/storage/backpack/science{ @@ -5802,15 +5736,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/fore) -"btD" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/landmark/start/geneticist, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "btL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/stripes/corner{ @@ -5942,11 +5867,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"bva" = ( -/obj/structure/ladder, -/obj/effect/turf_decal/trimline/purple/warning, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor3/starboard) "bvc" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -6691,16 +6611,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/side, /area/station/command/bridge) -"bEf" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ - dir = 4 - }, -/obj/effect/baseturf_helper/reinforced_plating/ceiling, -/turf/open/floor/engine/airless, -/area/station/engineering/atmos/pumproom) "bEp" = ( /obj/effect/turf_decal/tile/bar/opposingcorners{ dir = 1 @@ -6749,14 +6659,6 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, /area/station/science/auxlab) -"bFv" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "bFD" = ( /obj/structure/cable, /turf/open/floor/catwalk_floor, @@ -6783,14 +6685,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/prison/safe) -"bFZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/floor2/aft) "bGb" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -6851,20 +6745,6 @@ dir = 8 }, /area/station/ai_monitored/command/storage/eva) -"bGv" = ( -/obj/machinery/door/airlock/hatch{ - name = "Shelter" - }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/radshelter/sci) "bGV" = ( /obj/machinery/door/window/brigdoor{ dir = 1 @@ -6872,14 +6752,6 @@ /mob/living/basic/pet/fox, /turf/open/floor/noslip, /area/station/maintenance/floor1/port) -"bHh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general, -/turf/open/floor/iron/white, -/area/station/science/cytology) "bHw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6936,6 +6808,12 @@ /obj/effect/turf_decal/trimline/green/filled/line, /turf/open/floor/iron/dark, /area/station/medical/virology) +"bID" = ( +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/science/cytology) "bIG" = ( /obj/effect/turf_decal/tile/green/half, /obj/machinery/newscaster/directional/north, @@ -7127,6 +7005,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/smooth_large, /area/station/service/kitchen/abandoned) +"bLi" = ( +/obj/effect/turf_decal/siding/wideplating_new{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "bLm" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -7159,16 +7046,6 @@ /obj/effect/turf_decal/siding/thinplating_new, /turf/open/floor/catwalk_floor/iron_dark, /area/station/ai_monitored/command/storage/eva) -"bMb" = ( -/obj/machinery/door/airlock/science{ - name = "Genetics Office" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/science/genetics, -/turf/open/floor/iron, -/area/station/science/genetics) "bMd" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Bulkhead" @@ -7215,6 +7092,14 @@ /obj/machinery/light/floor, /turf/open/floor/wood/tile, /area/station/service/library) +"bMu" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/computer/security/telescreen/rd{ + pixel_x = -30 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/rd) "bMz" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/girder, @@ -7541,6 +7426,7 @@ /obj/machinery/door/firedoor/border_only{ dir = 8 }, +/obj/machinery/atmospherics/components/tank/air, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/starboard/fore) "bRl" = ( @@ -7565,11 +7451,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) -"bRH" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/iron/white, -/area/station/science/cytology) +"bRx" = ( +/obj/structure/frame/machine, +/obj/item/circuitboard/machine/telecomms/receiver, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "bRI" = ( /obj/effect/turf_decal/stripes{ dir = 4 @@ -7633,9 +7520,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/service/chapel/funeral) -"bSh" = ( -/turf/open/floor/grass, -/area/station/hallway/secondary/service) "bSi" = ( /obj/machinery/door/airlock/external{ name = "Labor Camp Shuttle Airlock"; @@ -7750,6 +7634,10 @@ "bTu" = ( /turf/open/floor/iron, /area/station/service/chapel) +"bTy" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "bTK" = ( /obj/machinery/door/window/brigdoor/right/directional/west{ name = "Judge's Stand"; @@ -8005,6 +7893,17 @@ /obj/machinery/duct, /turf/open/floor/iron/dark/textured, /area/station/commons/fitness) +"bXd" = ( +/obj/effect/turf_decal/trimline/purple/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/iron/white, +/area/station/science/xenobiology/hallway) "bXe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -8108,6 +8007,13 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/medical/storage) +"bYJ" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Xenobio - Port Pens" + }, +/obj/structure/sign/poster/official/nanotrasen_logo/directional/south, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "bYP" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 4 @@ -8206,10 +8112,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/command/teleporter) -"cas" = ( -/obj/structure/cable, +"can" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 8 + }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/white, -/area/station/science/lower) +/area/station/science/cytology) "cau" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/hidden/layer1{ dir = 10 @@ -8248,6 +8157,14 @@ dir = 4 }, /area/station/hallway/floor2/aft) +"caP" = ( +/obj/structure/rack, +/obj/effect/spawner/random/bureaucracy/briefcase{ + spawn_loot_count = 2; + spawn_loot_split = 1 + }, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "caQ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -8327,13 +8244,6 @@ /obj/effect/turf_decal/trimline/yellow/warning, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/aft) -"cbN" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "ccc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8412,6 +8322,27 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured, /area/station/hallway/floor2/aft) +"cdd" = ( +/obj/effect/turf_decal/stripes{ + dir = 6 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/button/ignition{ + id = "Xenobio"; + pixel_x = 24; + pixel_y = 5 + }, +/obj/machinery/button/door/directional/east{ + id = "Xenolab"; + name = "Test Chamber Blast Doors"; + pixel_y = -5; + req_access = list("xenobiology") + }, +/obj/machinery/light/cold/no_nightlight/directional/east, +/obj/machinery/power/shieldwallgen/xenobiologyaccess, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "cdf" = ( /obj/structure/chair/office, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8810,6 +8741,14 @@ "chP" = ( /turf/closed/wall/mineral/plastitanium, /area/station/maintenance/floor4/starboard/aft) +"chT" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Xenobio - Holding Pen" + }, +/turf/open/floor/engine{ + initial_gas_mix = "o2=22;bz=82;TEMP=293.15" + }, +/area/station/science/xenobiology) "chY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -9465,16 +9404,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/smooth_edge, /area/station/science/robotics/mechbay) -"cqT" = ( -/obj/effect/turf_decal/siding/purple, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "cqV" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/delivery, @@ -9509,13 +9438,6 @@ /obj/structure/window/reinforced/tinted/fulltile, /turf/open/floor/plating, /area/station/maintenance/floor1/starboard) -"crl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light/red/dim/directional/north, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/starboard) "crn" = ( /obj/structure/table/reinforced, /turf/open/floor/iron/dark, @@ -9789,6 +9711,10 @@ }, /turf/open/floor/iron/white, /area/station/medical/office) +"cuK" = ( +/obj/machinery/photocopier, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hop) "cuL" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -9807,6 +9733,16 @@ /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, /area/station/hallway/secondary/entry) +"cuT" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "cuX" = ( /obj/effect/turf_decal/trimline/green/line, /obj/effect/turf_decal/trimline/green/line{ @@ -9901,6 +9837,10 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) +"cvK" = ( +/obj/structure/water_source/puddle, +/turf/open/floor/grass, +/area/station/science/cytology) "cvM" = ( /obj/machinery/door/airlock/public/glass{ name = "Garden" @@ -10027,19 +9967,6 @@ dir = 1 }, /area/station/hallway/secondary/entry) -"cxC" = ( -/obj/machinery/door/airlock/science{ - name = "Abandoned Science Lab" - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/access/all/science/general, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "cxH" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/machinery/door/airlock/hatch{ @@ -10115,14 +10042,6 @@ }, /turf/open/floor/iron, /area/station/hallway/floor1/aft) -"cyz" = ( -/obj/structure/sink/greyscale{ - dir = 8; - pixel_x = 12; - pixel_y = -5 - }, -/turf/open/floor/iron/kitchen, -/area/station/command/heads_quarters/rd) "cyF" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, @@ -10176,11 +10095,13 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/service/bar) -"czW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/smooth_half, -/area/station/maintenance/radshelter/sci) +"czZ" = ( +/obj/machinery/door/window/left/directional/north{ + name = "Pen 1"; + req_access = list("xenobiology") + }, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "cAf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, /obj/item/radio/intercom/directional/east, @@ -10349,6 +10270,13 @@ }, /turf/open/floor/engine/hull, /area/space/nearstation) +"cCK" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/light_switch/directional/west, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/service) "cCO" = ( /obj/structure/railing{ dir = 8 @@ -10404,25 +10332,6 @@ /obj/structure/sign/departments/cargo/directional/north, /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) -"cDo" = ( -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 8 - }, -/obj/machinery/keycard_auth/directional/east{ - pixel_y = 20 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Command - Research Director's Office" - }, -/obj/machinery/requests_console/directional/east{ - department = "Research Director's Desk"; - name = "Research Director's Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) "cDq" = ( /obj/effect/turf_decal/trimline/green/warning{ dir = 10 @@ -10455,13 +10364,6 @@ dir = 4 }, /area/station/service/hydroponics/garden) -"cEl" = ( -/obj/machinery/door/window/left/directional/south{ - name = "Pen 4"; - req_access = list("xenobiology") - }, -/turf/open/floor/grass, -/area/station/science/xenobiology) "cEt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -10510,6 +10412,10 @@ dir = 1 }, /area/station/engineering/lobby) +"cFg" = ( +/obj/machinery/chem_master, +/turf/open/floor/circuit, +/area/station/science/xenobiology) "cFq" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/reagent_dispensers/fueltank, @@ -10529,19 +10435,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) -"cFC" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/item/storage/pill_bottle/mutadone{ - pixel_x = -9 - }, -/obj/item/toy/figure/geneticist, -/obj/machinery/camera/directional/east{ - c_tag = "Genetics Desk" - }, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/iron, -/area/station/science/genetics) "cFF" = ( /obj/effect/turf_decal/tile/red/diagonal_edge, /obj/effect/decal/cleanable/dirt, @@ -10641,6 +10534,16 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"cHd" = ( +/obj/effect/turf_decal/siding/white, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "cHf" = ( /obj/structure/sign/poster/official/random/directional/south, /obj/effect/turf_decal/siding/wood{ @@ -10973,6 +10876,10 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) +"cLA" = ( +/obj/structure/railing, +/turf/open/floor/grass, +/area/station/science/cytology) "cLC" = ( /obj/structure/table, /obj/machinery/newscaster/directional/north, @@ -10984,6 +10891,16 @@ /obj/effect/decal/remains/human, /turf/open/floor/pod/dark, /area/station/service/kitchen/abandoned) +"cLI" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/white, +/area/station/science/cytology) "cLQ" = ( /obj/machinery/door/airlock{ name = "Locker Room" @@ -11036,10 +10953,6 @@ }, /turf/open/floor/iron/smooth_large, /area/station/hallway/secondary/entry) -"cMm" = ( -/obj/structure/table/reinforced, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/maintenance/radshelter/sci) "cMA" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -11254,12 +11167,6 @@ }, /turf/open/floor/iron, /area/station/hallway/floor3/aft) -"cQg" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/science/cytology) "cQj" = ( /obj/effect/spawner/random/structure/chair_maintenance{ dir = 8 @@ -11273,6 +11180,13 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) +"cQo" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/wood/tile, +/area/station/science/xenobiology/hallway) "cQr" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11396,6 +11310,15 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel/funeral) +"cRU" = ( +/obj/machinery/sparker/directional/north{ + id = "Xenobio" + }, +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/science/cytology) "cRY" = ( /obj/machinery/door/airlock/public/glass/incinerator/atmos_interior, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer2{ @@ -11451,13 +11374,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/service/chapel) -"cSw" = ( -/obj/effect/turf_decal/siding/white/corner, -/obj/structure/chair/stool/bar/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/large, -/area/station/command/heads_quarters/rd) "cSF" = ( /obj/effect/turf_decal/siding/wood{ dir = 9 @@ -11990,12 +11906,6 @@ dir = 9 }, /area/station/security/prison) -"cYY" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/airalarm/directional/east, -/obj/machinery/holopad, -/turf/open/floor/iron/white, -/area/station/science/cytology) "cYZ" = ( /obj/structure/chair/sofa/bench{ dir = 1 @@ -12065,6 +11975,16 @@ }, /turf/open/floor/iron, /area/station/security/prison) +"cZS" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "daa" = ( /obj/machinery/camera/motion/directional/north{ c_tag = "Minisat North" @@ -12306,6 +12226,19 @@ initial_gas_mix = "TEMP=2.7" }, /area/station/science/ordnance/bomb) +"ddO" = ( +/obj/effect/turf_decal/siding/wideplating_new/corner, +/obj/effect/turf_decal/siding/wideplating_new/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/corner{ + dir = 8 + }, +/obj/machinery/newscaster/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/cytology) "ddT" = ( /obj/structure/closet/radiation, /obj/effect/turf_decal/siding/thinplating_new/dark, @@ -12522,11 +12455,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) -"dgQ" = ( -/obj/machinery/door/airlock/highsecurity, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/starboard) "dgU" = ( /obj/structure/cable, /obj/machinery/light/red/dim/directional/north, @@ -12541,6 +12469,17 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/abandoned) +"dhb" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/public/glass{ + name = "Petting Zoo" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white, +/area/station/science/cytology) "dhs" = ( /obj/structure/table/wood/fancy/royalblack, /obj/item/modular_computer/laptop/preset/civilian, @@ -12553,13 +12492,6 @@ }, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) -"dhF" = ( -/obj/structure/girder/reinforced, -/obj/effect/spawner/structure/window/hollow/reinforced/middle, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) "dhJ" = ( /obj/effect/turf_decal/trimline/purple/line, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -12688,6 +12620,17 @@ /obj/effect/turf_decal/trimline/green/warning, /turf/open/floor/pod, /area/station/maintenance/floor3/starboard) +"djH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/science/genetics, +/obj/structure/cable, +/obj/machinery/door/airlock/science{ + name = "Genetics" + }, +/turf/open/floor/iron, +/area/station/science/genetics) "djJ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, @@ -12900,17 +12843,6 @@ "dnU" = ( /turf/closed/wall, /area/station/security/office) -"dnV" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/item/folder, -/obj/item/pen{ - pixel_x = -2; - pixel_y = 5 - }, -/obj/item/infuser_book, -/turf/open/floor/iron, -/area/station/science/genetics) "dog" = ( /obj/structure/showcase/cyborg/old{ dir = 8; @@ -12931,13 +12863,6 @@ /obj/structure/stairs/south, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port) -"dos" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/stripes, -/turf/open/floor/iron/white, -/area/station/science/auxlab/firing_range) "dou" = ( /obj/effect/decal/cleanable/ash, /obj/effect/mapping_helpers/broken_floor, @@ -12949,11 +12874,11 @@ /turf/open/floor/iron/freezer, /area/station/service/chapel) "doC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/spawner/structure/window/hollow/plasma/middle{ dir = 4 }, /obj/structure/girder/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) "doJ" = ( @@ -13024,19 +12949,11 @@ name = "boxing ring" }, /area/station/commons/fitness) -"dpN" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wideplating_new{ - dir = 8 - }, -/obj/machinery/shieldgen, -/turf/open/floor/engine, -/area/station/maintenance/floor2/starboard) +"dpP" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/closet/firecloset/full, +/turf/open/floor/iron, +/area/station/science/cytology) "dpQ" = ( /obj/structure/filingcabinet/security, /turf/open/floor/iron/dark/corner{ @@ -13133,17 +13050,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) -"dqN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "dqQ" = ( /turf/closed/wall/r_wall, /area/station/security/medical) @@ -13168,6 +13074,14 @@ dir = 4 }, /area/station/hallway/floor3/fore) +"drm" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/chair/office{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/science/cytology) "dro" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/dim/directional/east, @@ -13323,6 +13237,15 @@ /obj/effect/mapping_helpers/airlock/access/all/service/crematorium, /turf/open/floor/mineral/silver, /area/station/service/chapel/funeral) +"dtm" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Cytology - Cytology Containment" + }, +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/science/cytology) "dts" = ( /obj/effect/turf_decal/trimline/purple/arrow_ccw, /obj/effect/turf_decal/trimline/green/arrow_cw{ @@ -13406,15 +13329,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/checker, /area/station/commons/vacant_room/commissary) -"dut" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/camera/emp_proof/directional/east, -/turf/open/floor/iron/dark/textured_edge{ - dir = 8 - }, -/area/station/medical/chemistry) "duu" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -13598,11 +13512,6 @@ }, /turf/open/floor/plating, /area/station/cargo/sorting) -"dxB" = ( -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/telecomms/relay, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/fore) "dxD" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 9 @@ -13670,15 +13579,19 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor3/starboard/aft) -"dys" = ( -/obj/machinery/holopad, -/turf/open/floor/wood, -/area/station/science/research/abandoned) "dyt" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"dyE" = ( +/obj/machinery/plumbing/growing_vat{ + dir = 4 + }, +/obj/machinery/light/cold/no_nightlight/directional/north, +/obj/machinery/status_display/ai/directional/north, +/turf/open/misc/dirt/jungle, +/area/station/science/cytology) "dyG" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/disposalpipe/segment, @@ -13785,16 +13698,6 @@ /obj/structure/cable, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) -"dzL" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Security Entrance" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/engine{ - icon_state = "textured_dark" - }, -/area/station/maintenance/floor2/starboard/aft) "dzM" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -13906,13 +13809,10 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"dAT" = ( -/obj/machinery/suit_storage_unit/rd, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) +"dAN" = ( +/obj/machinery/light_switch/directional/west, +/turf/open/floor/iron, +/area/station/commons/locker) "dAU" = ( /obj/effect/decal/cleanable/blood/tracks, /turf/open/floor/plating, @@ -13965,13 +13865,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/floor3/aft) -"dBI" = ( -/obj/effect/turf_decal/stripes, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/turf_decal/trimline/purple/line, -/obj/machinery/chem_master, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "dBO" = ( /obj/effect/turf_decal/siding/wideplating, /obj/structure/table/reinforced, @@ -14110,12 +14003,6 @@ /obj/structure/barricade/wooden/crude, /turf/open/floor/plating, /area/station/maintenance/floor2/port/aft) -"dDP" = ( -/obj/item/shard, -/turf/open/floor/engine{ - icon_state = "textured_dark" - }, -/area/station/maintenance/floor2/starboard/aft) "dDR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -14207,18 +14094,6 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/floor3/fore) -"dFf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/science{ - name = "Science Hall" - }, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock_note_placer{ - note_info = "THIS IS PUBLIC. IT'S MEANT TO BE. PLEASE. GOD. WE KNOW. STOP. TELLING US. - Yours Truly and Forever Faithfully, The Desk Of The Chief Engineer" - }, -/turf/open/floor/catwalk_floor, -/area/station/science/lower) "dFj" = ( /obj/effect/turf_decal/tile/green/full, /obj/machinery/button/door/directional/east{ @@ -14296,6 +14171,11 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/starboard/fore) +"dGa" = ( +/obj/effect/turf_decal/stripes, +/obj/effect/decal/cleanable/xenoblood, +/turf/open/floor/engine, +/area/station/science/cytology) "dGe" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/reinforced, @@ -14306,18 +14186,14 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark, /area/station/security/lockers) +"dGo" = ( +/turf/open/floor/engine/hull/reinforced, +/area/station/science/xenobiology) "dGp" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) -"dGB" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/stripes, -/turf/open/floor/iron/white, -/area/station/science/auxlab/firing_range) "dGF" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -14363,21 +14239,12 @@ /obj/item/pipe_dispenser, /turf/open/floor/iron, /area/station/engineering/atmos) -"dHA" = ( -/obj/structure/table, -/obj/item/storage/box/bodybags{ - pixel_x = -4; - pixel_y = 9 - }, -/obj/item/storage/box/disks{ - pixel_x = 6; - pixel_y = 3 - }, -/obj/effect/turf_decal/siding/purple, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) +"dHn" = ( +/obj/structure/closet/emcloset, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "dHD" = ( /obj/structure/grille, /obj/effect/decal/cleanable/dirt, @@ -14450,16 +14317,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/ordnance/testlab) -"dIL" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/structure/table/wood, -/obj/item/flashlight/lamp/bananalamp{ - pixel_y = 5 - }, -/turf/open/floor/iron/grimy, -/area/station/science/xenobiology/hallway) "dIO" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -14649,6 +14506,13 @@ dir = 4 }, /area/station/hallway/floor2/aft) +"dKU" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/science/cytology) "dLe" = ( /obj/structure/chair/sofa/bench/left{ dir = 4 @@ -14941,27 +14805,6 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"dOY" = ( -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing/corner{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"dPb" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ - dir = 4 - }, -/turf/open/floor/engine/airless, -/area/station/engineering/atmos/pumproom) "dPf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -15067,15 +14910,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) -"dRf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "dRn" = ( /obj/machinery/status_display/ai/directional/north, /turf/open/floor/iron/dark/side{ @@ -15249,12 +15083,6 @@ /obj/effect/turf_decal/trimline/red/filled/corner, /turf/open/floor/iron/dark/side, /area/station/hallway/floor4/fore) -"dTG" = ( -/obj/item/storage/toolbox/mechanical, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "dTJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15701,15 +15529,13 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron, /area/station/engineering/atmos/project) -"dYx" = ( -/obj/structure/bodycontainer/morgue{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ +"dYq" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/stripes{ dir = 1 }, -/turf/open/floor/plating, -/area/station/science/genetics) +/turf/open/floor/mineral/plastitanium, +/area/station/maintenance/floor2/starboard) "dYB" = ( /obj/effect/turf_decal/tile/green/anticorner, /obj/structure/rack, @@ -15978,23 +15804,6 @@ /obj/machinery/light/red/dim/directional/south, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/aft) -"ecV" = ( -/obj/effect/turf_decal/trimline/purple/warning{ - dir = 6 - }, -/obj/effect/turf_decal/stripes{ - dir = 6 - }, -/obj/machinery/light/red/dim/directional/north, -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor2/starboard) -"ecX" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "ede" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -16224,6 +16033,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/floor3/fore) +"efX" = ( +/obj/effect/turf_decal/siding/wideplating_new{ + dir = 8 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/white, +/area/station/science/cytology) "efY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -16251,14 +16067,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/lobby) -"egC" = ( -/obj/structure/closet/secure_closet/personal, -/obj/item/clothing/under/misc/assistantformal, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/winterboots, -/obj/machinery/bluespace_vendor/directional/east, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "egD" = ( /obj/structure/railing{ dir = 10 @@ -16312,6 +16120,15 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/dark, /area/station/security/courtroom) +"ehl" = ( +/obj/effect/turf_decal/trimline/purple/warning, +/obj/machinery/light/red/dim/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/effect/spawner/random/maintenance, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor2/starboard) "ehm" = ( /obj/structure/railing{ dir = 4 @@ -16867,15 +16684,6 @@ /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/engine, /area/station/maintenance/floor4/starboard/aft) -"ena" = ( -/obj/machinery/door/window/left/directional/south{ - name = "Pen 2"; - req_access = list("xenobiology") - }, -/obj/effect/turf_decal/stripes, -/obj/effect/turf_decal/trimline/purple/line, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "enl" = ( /obj/effect/turf_decal/delivery, /obj/machinery/disposal/bin, @@ -17126,10 +16934,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/smooth_large, /area/station/hallway/secondary/entry) -"eqO" = ( -/obj/structure/flora/tree/jungle/small/style_random, -/turf/open/floor/grass, -/area/station/science/genetics) "eqQ" = ( /obj/structure/cable, /turf/open/floor/iron/smooth, @@ -17202,15 +17006,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/medical/virology/isolation) -"esw" = ( -/obj/machinery/computer/security/telescreen/entertainment/directional/south, -/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/station/science/research/abandoned) "esx" = ( /obj/machinery/suit_storage_unit/atmos, /obj/machinery/light/directional/east, @@ -17283,13 +17078,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) -"etJ" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron/white, -/area/station/science/cytology) "etV" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -17326,14 +17114,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor1/starboard/fore) -"eur" = ( -/obj/effect/mapping_helpers/airlock/access/any/supply/mining, -/obj/machinery/door/airlock/glass_large{ - name = "Xenoflora" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/textured_large, -/area/station/cargo/miningdock) "euu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -17382,6 +17162,17 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/port) +"evi" = ( +/obj/machinery/door/airlock/science{ + name = "Monkey Atrium" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/access/all/science/genetics, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "evn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/light, @@ -17519,6 +17310,18 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port) +"ewK" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 4 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/cytology) "ewM" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrogen_output, /obj/effect/turf_decal/trimline/red/line, @@ -17712,6 +17515,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) +"ezQ" = ( +/obj/structure/railing/corner/end{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "ezR" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, @@ -17798,6 +17610,25 @@ /obj/structure/sign/poster/official/random/directional/east, /turf/open/floor/carpet/blue, /area/station/cargo/miningdock) +"eBf" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/purple{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/storage/box/beakers{ + pixel_x = 12; + pixel_y = 6 + }, +/obj/item/flashlight/lamp{ + pixel_x = -7; + pixel_y = 5 + }, +/turf/open/floor/iron, +/area/station/science/cytology) "eBg" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -17881,6 +17712,13 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/aft) +"eCz" = ( +/obj/machinery/door/window/left/directional/south{ + name = "Pen 4"; + req_access = list("xenobiology") + }, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "eCJ" = ( /obj/structure/railing, /obj/structure/table, @@ -17958,6 +17796,11 @@ }, /turf/open/floor/iron/dark/textured, /area/station/medical/surgery/fore) +"eDt" = ( +/obj/effect/turf_decal/trimline/purple/warning, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/light, +/area/station/maintenance/floor2/starboard) "eDC" = ( /obj/machinery/light/cold/directional/south, /turf/open/openspace, @@ -18100,18 +17943,13 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard) +"eFO" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/turf/open/floor/grass, +/area/station/science/cytology) "eFY" = ( /turf/open/floor/plating, /area/station/maintenance/floor1/starboard) -"eGg" = ( -/obj/item/stack/sheet/iron, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/engine{ - icon_state = "textured_dark" - }, -/area/station/maintenance/floor2/starboard/aft) "eGl" = ( /obj/machinery/space_heater, /obj/machinery/firealarm/directional/north, @@ -18138,6 +17976,14 @@ }, /turf/open/floor/iron/smooth_large, /area/station/hallway/secondary/entry) +"eGF" = ( +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 8 + }, +/obj/machinery/light/cold/no_nightlight/directional/south, +/obj/structure/closet/radiation, +/turf/open/floor/iron/white, +/area/station/science/lower) "eGK" = ( /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) @@ -18164,6 +18010,10 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/science/genetics) +"eHf" = ( +/obj/machinery/light/floor, +/turf/open/floor/engine, +/area/station/science/cytology) "eHk" = ( /obj/effect/decal/cleanable/oil, /obj/effect/turf_decal/stripes{ @@ -18307,6 +18157,14 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"eIU" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/corner, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "eIW" = ( /obj/effect/decal/cleanable/blood/old, /obj/effect/spawner/random/maintenance, @@ -18318,6 +18176,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/solars/starboard/aft) +"eJd" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "eJl" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18404,9 +18272,29 @@ dir = 8 }, /area/station/hallway/floor3/fore) +"eKB" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/sink/directional/north, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "eKC" = ( /turf/closed/wall, /area/station/science/xenobiology/hallway) +"eKD" = ( +/obj/structure/railing{ + dir = 5 + }, +/turf/open/floor/grass, +/area/station/science/cytology) +"eKY" = ( +/obj/effect/turf_decal/trimline/purple/corner{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology/hallway) "eLd" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron/dark/side{ @@ -18457,6 +18345,15 @@ /obj/structure/disposalpipe/junction, /turf/open/floor/iron/white, /area/station/science/lobby) +"eLF" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer2{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/station/engineering/supermatter/waste) "eLK" = ( /obj/structure/railing{ dir = 6 @@ -18666,13 +18563,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/construction/mining/aux_base) -"ePX" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/turf/open/floor/iron/smooth_large, -/area/station/maintenance/radshelter/sci) "ePY" = ( /obj/effect/turf_decal/trimline/red/warning{ dir = 4 @@ -18705,10 +18595,6 @@ }, /turf/open/floor/wood, /area/station/medical/psychology) -"eQw" = ( -/obj/machinery/firealarm/directional/north, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor3/starboard) "eQD" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/turf_decal/bot, @@ -18737,14 +18623,6 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/medical/office) -"eQW" = ( -/obj/effect/turf_decal/trimline/purple/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/junction/yjunction, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "eQZ" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible/layer2{ dir = 4 @@ -18784,12 +18662,6 @@ dir = 1 }, /area/station/security/brig) -"eRW" = ( -/obj/structure/rack, -/obj/effect/spawner/random/clothing/costume, -/obj/item/clothing/mask/balaclava, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "eRZ" = ( /obj/effect/spawner/random/maintenance/two, /obj/effect/decal/cleanable/dirt, @@ -18832,6 +18704,15 @@ /obj/structure/girder, /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) +"eSJ" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "eSX" = ( /obj/structure/flora/bush/sparsegrass/style_random, /obj/structure/flora/bush/flowers_br/style_random, @@ -18914,6 +18795,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/ordnance/testlab) +"eUn" = ( +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/line, +/turf/open/floor/iron/white, +/area/station/science/cytology) "eUp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -18935,6 +18823,17 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/dark/textured, /area/station/medical/virology/isolation) +"eUx" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/closet/l3closet/scientist, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "eUJ" = ( /obj/effect/turf_decal/trimline/neutral/warning{ dir = 1 @@ -18992,19 +18891,27 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) +"eVl" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 6 + }, +/obj/structure/closet/crate/science{ + name = "Protein Collection Supplies" + }, +/obj/item/clothing/gloves/butchering, +/obj/item/knife/hunting, +/obj/item/gun/energy/laser/retro/old, +/obj/item/paper{ + default_raw_text = "Just do what comes natural -J"; + name = "odd note" + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "eVo" = ( /obj/machinery/suit_storage_unit/captain, /obj/machinery/light/directional/north, /turf/open/floor/wood/tile, /area/station/command/heads_quarters/captain/private) -"eVs" = ( -/obj/item/kirbyplants/random/dead/research_director, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/computer/security/telescreen/rd{ - pixel_x = -30 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/rd) "eVN" = ( /obj/structure/grille/broken, /obj/effect/decal/cleanable/dirt, @@ -19074,14 +18981,6 @@ /obj/machinery/duct, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) -"eWY" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/science/genetics) "eXg" = ( /obj/effect/turf_decal/trimline/neutral/warning{ dir = 1 @@ -19097,37 +18996,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"eXn" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 8 - }, -/obj/machinery/door/window/left/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/wood, -/area/station/science/research/abandoned) "eXp" = ( /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/textured_large, /area/station/medical/chemistry) -"eXs" = ( -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/machinery/holopad, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "eXy" = ( /turf/closed/wall, /area/station/science/breakroom) @@ -19276,19 +19148,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/floor4/port/fore) -"eZN" = ( -/obj/structure/table, -/obj/item/folder/white, -/obj/item/folder/yellow{ - pixel_x = 4; - pixel_y = 2 - }, -/obj/item/folder/red{ - pixel_x = -3; - pixel_y = 4 - }, -/turf/open/floor/iron/smooth_edge, -/area/station/science/research/abandoned) "eZQ" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -19398,16 +19257,6 @@ /obj/structure/rack, /turf/open/floor/iron/dark, /area/station/security/brig) -"fbq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/structure/table/glass, -/obj/item/storage/box/syringes{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/reagent_containers/dropper, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "fbt" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 5 @@ -19491,6 +19340,12 @@ }, /turf/open/floor/engine/n2o, /area/station/engineering/atmos) +"fdp" = ( +/obj/effect/turf_decal/stripes, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "fdr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -19548,13 +19403,13 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/floor1/fore) -"feF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/effect/turf_decal/stripes/end{ +"feP" = ( +/obj/effect/turf_decal/trimline/purple/line, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, /turf/open/floor/iron/white, -/area/station/science/xenobiology) +/area/station/science/cytology) "feR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/side{ @@ -19570,6 +19425,16 @@ "ffe" = ( /turf/closed/wall/r_wall, /area/station/security/holding_cell) +"ffi" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/item/cultivator, +/obj/item/stack/cable_coil, +/obj/item/clothing/glasses/science, +/turf/open/floor/iron/white, +/area/station/science/cytology) "ffv" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 @@ -19761,6 +19626,11 @@ /obj/structure/cable, /turf/open/floor/iron/dark/side, /area/station/hallway/floor1/fore) +"fij" = ( +/obj/effect/spawner/structure/window/hollow/middle, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard) "fio" = ( /obj/structure/railing/corner, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -19779,6 +19649,12 @@ /obj/item/stack/tile/light, /turf/open/floor/carpet/neon/simple/pink/nodots, /area/station/maintenance/floor2/port/fore) +"fiA" = ( +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "fiI" = ( /obj/structure/closet, /obj/effect/turf_decal/trimline/green/line{ @@ -20006,6 +19882,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/psychology) +"fli" = ( +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/duct, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "flk" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/thinplating_new{ @@ -20112,15 +19997,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor1/starboard/aft) -"fmQ" = ( -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/light/cold/no_nightlight/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) "fna" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -20134,11 +20010,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) -"fns" = ( -/obj/structure/lattice, -/obj/effect/spawner/random/maintenance, -/turf/open/openspace, -/area/station/maintenance/floor3/starboard) "fnB" = ( /obj/effect/turf_decal/bot, /obj/machinery/light/small/directional/west, @@ -20291,11 +20162,6 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) -"fpk" = ( -/obj/structure/filingcabinet, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/iron/dark/smooth_large, -/area/station/service/library/printer) "fpn" = ( /obj/structure/chair/office, /turf/open/floor/iron/dark, @@ -20414,6 +20280,21 @@ /obj/structure/sign/poster/random/directional/west, /turf/open/floor/catwalk_floor/iron, /area/station/cargo/miningdock) +"frv" = ( +/obj/effect/turf_decal/box/corners, +/turf/open/floor/engine{ + initial_gas_mix = "o2=22;bz=82;TEMP=293.15" + }, +/area/station/science/xenobiology) +"frw" = ( +/obj/effect/turf_decal/siding/wideplating_new{ + dir = 8 + }, +/obj/machinery/plumbing/input{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "fry" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20432,20 +20313,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/virology) -"frD" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/modular_computer/preset/civilian{ - dir = 8 - }, -/obj/item/radio/intercom/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Science - Cytology - Deck 3" - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) "frL" = ( /turf/closed/wall, /area/station/engineering/gravity_generator) @@ -20521,13 +20388,6 @@ dir = 1 }, /area/station/hallway/floor4/fore) -"fti" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) "ftp" = ( /obj/structure/table, /obj/item/grenade/chem_grenade/antiweed, @@ -20717,9 +20577,6 @@ /obj/structure/sign/departments/cargo/directional/west, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/floor1/aft) -"fvR" = ( -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) "fvS" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -20848,32 +20705,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, /area/station/cargo/drone_bay) -"fyp" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/structure/table, -/obj/item/storage/box/monkeycubes{ - pixel_x = 6; - pixel_y = 9 - }, -/obj/item/storage/box/gloves{ - pixel_x = 5; - pixel_y = 1 - }, -/obj/item/radio/headset/headset_medsci{ - pixel_x = -7; - pixel_y = 4 - }, -/obj/machinery/airalarm/directional/north, -/obj/item/sequence_scanner{ - pixel_x = -2; - pixel_y = -1 - }, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "fyQ" = ( /obj/effect/turf_decal/trimline/red/warning{ dir = 1 @@ -21044,15 +20875,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port) -"fBd" = ( -/obj/structure/rack, -/obj/effect/spawner/random/bureaucracy/briefcase{ - spawn_loot_count = 2; - spawn_loot_split = 1 - }, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/service) "fBf" = ( /obj/effect/turf_decal/trimline/yellow/warning, /obj/machinery/button/elevator/directional/east{ @@ -21086,14 +20908,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/carpet/blue, /area/station/command/heads_quarters/hop) -"fBy" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/railing, -/obj/effect/turf_decal/stripes/box, -/turf/open/floor/pod/light, -/area/station/science/cytology) "fBA" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/turf_decal/trimline/white/filled/line{ @@ -21234,13 +21048,6 @@ }, /turf/open/floor/plating, /area/station/security/prison/work) -"fCY" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/science/genetics) "fDq" = ( /obj/structure/sign/poster/contraband/atmosia_independence/directional/west, /turf/open/floor/pod/light, @@ -21438,12 +21245,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/carpet/orange, /area/station/command/heads_quarters/qm) -"fFR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "fFY" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -21796,6 +21597,12 @@ "fKi" = ( /turf/open/floor/iron/textured_large, /area/station/engineering/gravity_generator) +"fKr" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/station/command/heads_quarters/rd) "fKs" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -21927,6 +21734,18 @@ "fMs" = ( /turf/open/floor/plating/airless, /area/station/maintenance/floor3/port/aft) +"fMu" = ( +/obj/structure/girder/reinforced, +/obj/structure/cable, +/obj/effect/spawner/structure/window/hollow/reinforced/plasma/middle{ + dir = 4 + }, +/obj/machinery/door/poddoor/preopen{ + id = "Xenolab"; + name = "Test Chamber Blast Door" + }, +/turf/open/floor/plating, +/area/station/science/cytology) "fMB" = ( /obj/effect/turf_decal/trimline/red/line{ dir = 8 @@ -21935,15 +21754,6 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) -"fMD" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ - dir = 6 - }, -/turf/open/floor/engine/airless, -/area/station/engineering/atmos/pumproom) "fMY" = ( /obj/effect/turf_decal/tile/green/full, /obj/structure/railing/corner{ @@ -22096,6 +21906,10 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/dark, /area/station/security/holding_cell) +"fOH" = ( +/obj/machinery/monkey_recycler, +/turf/open/floor/circuit, +/area/station/science/xenobiology) "fOI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -22284,16 +22098,6 @@ /obj/effect/turf_decal/trimline/neutral/filled/corner, /turf/open/floor/iron, /area/station/hallway/floor2/fore) -"fRc" = ( -/obj/machinery/computer/scan_consolenew, -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "fRd" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/effect/turf_decal/trimline/neutral/filled/corner{ @@ -22411,6 +22215,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/engineering/gravity_generator) +"fSV" = ( +/obj/effect/turf_decal/trimline/purple/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/junction/yjunction, +/obj/structure/noticeboard/directional/north, +/turf/open/floor/iron/white, +/area/station/science/xenobiology/hallway) "fSX" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -22547,20 +22360,6 @@ /obj/structure/sign/poster/official/report_crimes/directional/west, /turf/open/floor/wood, /area/station/hallway/floor4/fore) -"fUs" = ( -/obj/effect/turf_decal/siding/white{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"fUD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "fUM" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -22592,24 +22391,6 @@ /obj/structure/sign/poster/random/directional/east, /turf/open/floor/iron, /area/station/service/hydroponics/garden/abandoned) -"fVk" = ( -/obj/effect/turf_decal/stripes{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) -"fVo" = ( -/obj/machinery/modular_computer/preset/civilian{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/item/radio/intercom/directional/north, -/obj/machinery/status_display/ai/directional/east, -/turf/open/floor/iron/smooth_large, -/area/station/maintenance/radshelter/sci) "fVq" = ( /obj/structure/chair/sofa/bench/right{ dir = 8 @@ -22662,6 +22443,13 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/plating, /area/station/engineering/supermatter/room) +"fWf" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/engine/air, +/area/station/engineering/supermatter/waste) "fWh" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 5 @@ -22784,6 +22572,12 @@ /obj/machinery/door/firedoor, /turf/open/floor/plating, /area/station/engineering/atmos/office) +"fXR" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "fXU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -23096,21 +22890,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"gby" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1 - }, -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/obj/effect/turf_decal/stripes{ - dir = 4 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Xenobiology" - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "gbL" = ( /obj/structure/chair/plastic{ dir = 4 @@ -23214,14 +22993,6 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/security/detectives_office) -"gcS" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/west, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/starboard) "gdg" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 4 @@ -23375,6 +23146,12 @@ dir = 10 }, /area/station/hallway/floor4/fore) +"gfg" = ( +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "gfn" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -23562,6 +23339,13 @@ /obj/effect/spawner/random/trash/mess, /turf/open/floor/engine, /area/station/maintenance/floor4/starboard/aft) +"gih" = ( +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/floor2/starboard) "gip" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/status_display/ai/directional/south, @@ -23576,6 +23360,17 @@ /obj/item/food/boiledrice, /turf/open/floor/iron/kitchen/herringbone, /area/station/service/kitchen) +"giq" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron, +/area/station/science/cytology) "gir" = ( /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/dark/side{ @@ -23822,13 +23617,6 @@ /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) -"gme" = ( -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/engine, -/area/station/science/xenobiology) "gmg" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line, @@ -23920,13 +23708,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/side, /area/station/cargo/lobby) -"gnf" = ( -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 8 - }, -/obj/machinery/light/cold/no_nightlight/directional/south, -/turf/open/floor/iron/white, -/area/station/science/lower) "gni" = ( /obj/structure/rack, /obj/effect/spawner/random/techstorage/arcade_boards, @@ -24457,11 +24238,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/textured_large, /area/station/cargo/storage) -"guA" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/effect/landmark/start/scientist, +"gup" = ( +/obj/structure/frame{ + anchored = 1 + }, +/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, +/turf/open/floor/circuit, /area/station/science/cytology) "guF" = ( /obj/machinery/camera/autoname/directional/west, @@ -24498,6 +24281,10 @@ }, /turf/open/floor/iron/cafeteria, /area/station/service/theater) +"gvj" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/directional, +/turf/open/floor/plating, +/area/station/science/xenobiology) "gvn" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24556,9 +24343,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plastic, /area/station/security/prison/shower) -"gvW" = ( -/turf/closed/wall, -/area/station/science/cytology) "gvX" = ( /obj/structure/sign/poster/official/random/directional/east, /turf/open/floor/iron/dark/side{ @@ -24585,6 +24369,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) +"gws" = ( +/obj/structure/railing, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/station/science/cytology) "gwz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24860,6 +24651,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/tcommsat/computer) +"gzU" = ( +/obj/effect/decal/cleanable/garbage, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "gAd" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/structure/cable, @@ -25006,6 +24802,12 @@ /obj/effect/spawner/random/entertainment/plushie, /turf/open/floor/plating, /area/station/maintenance/floor1/port/fore) +"gBN" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/grass, +/area/station/science/cytology) "gBU" = ( /obj/item/radio/intercom/directional/north, /obj/structure/sign/poster/official/random/directional/west, @@ -25198,9 +25000,22 @@ /obj/item/stock_parts/cell/high, /obj/machinery/cell_charger, /obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/airalarm/directional/north, +/obj/machinery/airalarm/directional/east, /turf/open/floor/iron/dark, /area/station/command/bridge) +"gEv" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Genetics Lab" + }, +/obj/effect/turf_decal/siding/purple{ + dir = 10 + }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "gEB" = ( /obj/structure/railing{ dir = 8 @@ -25226,16 +25041,6 @@ /obj/effect/turf_decal/siding/white, /turf/open/floor/iron/dark/textured, /area/station/medical/cryo) -"gFb" = ( -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/noticeboard/directional/south, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/iron/white, -/area/station/science/cytology) "gFh" = ( /obj/effect/spawner/random/engineering/tank, /obj/effect/turf_decal/trimline/dark_blue/end{ @@ -25319,6 +25124,16 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/hallway/floor4/aft) +"gGt" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ + dir = 4 + }, +/obj/effect/baseturf_helper/reinforced_plating/ceiling, +/turf/open/floor/engine/airless, +/area/station/engineering/supermatter/waste) "gGx" = ( /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -25406,6 +25221,19 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/side, /area/station/hallway/floor4/fore) +"gHu" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/white/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "gHw" = ( /obj/machinery/exodrone_launcher, /obj/item/exodrone, @@ -25471,6 +25299,12 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor2/starboard) +"gIb" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "gId" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -25645,6 +25479,13 @@ /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"gKa" = ( +/obj/effect/turf_decal/tile/dark/half/contrasted, +/obj/effect/turf_decal/tile/dark/half/contrasted, +/obj/structure/disposalpipe/segment, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/white, +/area/station/science/xenobiology/hallway) "gKg" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, @@ -25986,6 +25827,12 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port/fore) +"gQa" = ( +/obj/machinery/firealarm/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/engineering/canister, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor3/starboard) "gQh" = ( /obj/effect/turf_decal/trimline/red/line{ dir = 4 @@ -26296,18 +26143,6 @@ "gUs" = ( /turf/open/floor/engine/air, /area/station/engineering/atmos) -"gUD" = ( -/obj/effect/turf_decal/siding/white/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 5 - }, -/obj/effect/turf_decal/siding/white{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "gUH" = ( /obj/effect/turf_decal/bot, /obj/structure/rack, @@ -26472,6 +26307,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"gXd" = ( +/obj/machinery/camera/autoname/directional/north, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/structure/table/reinforced/rglass, +/obj/item/storage/backpack/duffelbag/coroner/surgery, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "gXi" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -26505,6 +26350,11 @@ }, /turf/open/floor/iron/textured_large, /area/station/hallway/secondary/exit/departure_lounge) +"gXH" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "gXM" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26682,15 +26532,6 @@ /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/iron, /area/station/engineering/atmos) -"hae" = ( -/obj/effect/decal/cleanable/oil, -/obj/structure/sign/poster/official/random/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "hah" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/smooth_corner{ @@ -26833,18 +26674,6 @@ /obj/effect/spawner/random/structure/tank_holder, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/fore) -"hbr" = ( -/obj/machinery/atmospherics/components/binary/valve/layer2{ - name = "scrubbers access" - }, -/obj/machinery/atmospherics/components/binary/valve/layer4{ - name = "distro access" - }, -/obj/effect/turf_decal/stripes/end{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/science/cytology) "hbs" = ( /obj/effect/turf_decal/trimline/green/corner{ dir = 1 @@ -27060,6 +26889,18 @@ dir = 8 }, /area/station/cargo/lobby) +"hep" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ + dir = 10 + }, +/turf/open/floor/engine/airless, +/area/station/engineering/supermatter/waste) "heq" = ( /obj/machinery/light/red/dim/directional/north, /turf/open/floor/plating/foam, @@ -27075,6 +26916,12 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor3/fore) +"heC" = ( +/obj/structure/rack, +/obj/effect/spawner/random/clothing/costume, +/obj/item/clothing/mask/balaclava, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "heF" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -27150,6 +26997,17 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard) +"hfC" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "hfD" = ( /obj/machinery/atmospherics/components/binary/pump, /turf/open/floor/plating, @@ -27180,13 +27038,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard/fore) -"hgp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/hallway/floor2/aft) "hgB" = ( /obj/effect/turf_decal/trimline/green/warning, /obj/effect/turf_decal/stripes, @@ -27242,6 +27093,16 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) +"hhb" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ + dir = 4 + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/engine/airless, +/area/station/engineering/supermatter/waste) "hhf" = ( /obj/structure/cable, /turf/open/floor/catwalk_floor, @@ -27382,12 +27243,6 @@ /obj/structure/cable, /turf/open/floor/wood/tile, /area/station/service/library) -"hjo" = ( -/obj/effect/spawner/random/structure/tank_holder, -/obj/effect/turf_decal/trimline/purple/warning, -/obj/effect/turf_decal/stripes, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor2/starboard) "hjr" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, @@ -27441,6 +27296,15 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/medical/psychology) +"hjN" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "hjP" = ( /obj/structure/chair/office{ dir = 4 @@ -27458,6 +27322,7 @@ /obj/effect/turf_decal/tile/red/anticorner{ dir = 4 }, +/obj/vehicle/ridden/secway, /turf/open/floor/iron/dark, /area/station/security/eva) "hke" = ( @@ -27723,13 +27588,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white/textured, /area/station/medical/break_room) -"hnK" = ( -/obj/machinery/camera/autoname/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "hnL" = ( /obj/structure/table/reinforced, /obj/item/flashlight/lamp, @@ -27797,6 +27655,14 @@ dir = 8 }, /area/station/hallway/floor2/aft) +"hoo" = ( +/obj/effect/turf_decal/siding/white/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "hoy" = ( /obj/structure/table/reinforced, /obj/item/paper_bin{ @@ -27830,6 +27696,13 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) +"hoM" = ( +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/security/glass{ + name = "Security Entrance" + }, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/floor2/starboard/aft) "hoW" = ( /obj/machinery/door/airlock/silver/glass{ name = "Kitchen" @@ -27938,6 +27811,12 @@ }, /turf/open/floor/carpet/red, /area/station/service/library/lounge) +"hqD" = ( +/obj/machinery/atmospherics/components/unary/passive_vent{ + name = "killroom vent" + }, +/turf/open/floor/engine/hull/reinforced, +/area/station/science/xenobiology) "hqG" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -28012,6 +27891,11 @@ /obj/structure/sign/poster/contraband/syndicate_pistol, /turf/closed/wall, /area/station/maintenance/floor3/port/aft) +"hrL" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "hse" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -28200,6 +28084,16 @@ /obj/structure/stairs/east, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) +"huz" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/reagent_dispensers/plumbed{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/science/genetics) "huJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -28406,21 +28300,6 @@ /obj/machinery/shower/directional/south, /turf/open/floor/iron/white, /area/station/command/heads_quarters/rd) -"hxt" = ( -/obj/structure/table, -/obj/machinery/button/ticket_machine{ - pixel_x = -32 - }, -/obj/item/stamp/head/hop{ - pixel_y = 5; - pixel_x = 8 - }, -/obj/item/flashlight/lamp{ - pixel_x = -4; - pixel_y = 3 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hop) "hxy" = ( /obj/structure/hedge, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -28779,10 +28658,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/commons/locker) -"hBX" = ( -/mob/living/simple_animal/slime, -/turf/open/floor/grass, -/area/station/science/xenobiology) "hCh" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/trimline/blue/warning, @@ -28855,10 +28730,28 @@ /obj/structure/table, /turf/open/floor/iron/dark, /area/station/commons/storage/primary) +"hCV" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/item/storage/pill_bottle/mutadone{ + pixel_x = -9 + }, +/obj/item/toy/figure/geneticist, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron, +/area/station/science/genetics) "hDa" = ( /obj/effect/turf_decal/stripes, /turf/open/floor/plating/elevatorshaft, /area/station/cargo/drone_bay) +"hDb" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/obj/machinery/duct, +/turf/open/floor/grass, +/area/station/science/cytology) "hDf" = ( /obj/structure/cable, /turf/open/floor/iron/textured_large, @@ -28920,24 +28813,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/starboard/fore) -"hEA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/door/airlock/science/glass{ - name = "Slime Enrichment Center" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/science/xenobio, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "hED" = ( /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/warden) +"hEM" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Xenobio - Kill Room" + }, +/obj/structure/sign/warning/cold_temp/directional/east, +/turf/open/floor/engine/hull/reinforced, +/area/station/science/xenobiology) "hEO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29248,6 +29134,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) +"hIn" = ( +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/grass, +/area/station/science/genetics) "hIp" = ( /obj/item/skillchip/light_remover, /obj/structure/closet/crate, @@ -29437,11 +29328,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard/aft) -"hKI" = ( -/obj/machinery/smartfridge/organ, -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/station/science/cytology) "hKN" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/qm) @@ -29571,14 +29457,6 @@ "hMd" = ( /turf/closed/wall, /area/station/security/prison/visit) -"hMe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "hMg" = ( /obj/effect/turf_decal/trimline/blue/warning, /obj/structure/disposalpipe/segment, @@ -29602,6 +29480,12 @@ /obj/effect/spawner/random/food_or_drink/refreshing_beverage, /turf/open/floor/pod/light, /area/station/maintenance/solars/port/aft) +"hML" = ( +/obj/structure/railing{ + dir = 9 + }, +/turf/open/floor/grass, +/area/station/science/cytology) "hMU" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/contraband/random/directional/west, @@ -29610,15 +29494,6 @@ "hMV" = ( /turf/open/floor/iron/stairs/medium, /area/station/science/lobby) -"hMX" = ( -/obj/machinery/portable_atmospherics/canister/bz, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/end, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "hNf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29743,11 +29618,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"hOZ" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/power/shieldwallgen/xenobiologyaccess, -/turf/open/floor/iron/white, -/area/station/science/cytology) "hPf" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -29818,6 +29688,14 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/hallway) +"hQl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor2/starboard) "hQp" = ( /obj/structure/girder/reinforced, /obj/structure/cable, @@ -29905,6 +29783,14 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) +"hRp" = ( +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "hRH" = ( /obj/structure/table, /turf/open/floor/iron/checker, @@ -29920,13 +29806,6 @@ dir = 4 }, /area/station/security/prison) -"hRO" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/junction{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/lower) "hRP" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 @@ -30026,6 +29905,15 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/catwalk_floor, /area/station/hallway/floor2/fore) +"hSP" = ( +/obj/structure/railing/corner, +/obj/machinery/door/firedoor/border_only, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "hSQ" = ( /obj/structure/filingcabinet/employment, /obj/machinery/status_display/ai/directional/east, @@ -30046,13 +29934,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/checker, /area/station/commons/vacant_room/commissary) -"hTf" = ( -/obj/effect/landmark/start/medical_doctor, -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/station/commons/vacant_room/commissary) "hTj" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 10 @@ -30169,6 +30050,12 @@ /obj/effect/mapping_helpers/airlock/access/any/command/teleporter, /turf/open/floor/iron/dark, /area/station/command/teleporter) +"hUT" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/science/xenobiology) "hUX" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -30238,12 +30125,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"hWh" = ( -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "hWn" = ( /obj/effect/spawner/random/vending/colavend, /turf/open/floor/iron/dark/side{ @@ -30343,6 +30224,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard/aft) +"hXp" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/obj/structure/girder, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/turf/open/floor/engine/hull/reinforced, +/area/station/science/xenobiology) "hXr" = ( /obj/structure/chair/sofa/bench/right{ dir = 8 @@ -30397,15 +30284,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/closed/wall/r_wall, /area/station/engineering/atmos) -"hXR" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "hYb" = ( /obj/machinery/light/small/red/directional/east, /turf/open/floor/catwalk_floor, @@ -30521,6 +30399,15 @@ /obj/effect/turf_decal/siding/blue, /turf/open/floor/carpet/neon/simple/pink/nodots, /area/station/maintenance/floor2/port/fore) +"iaf" = ( +/obj/structure/table, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/item/knife/shiv, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/checker{ + dir = 1 + }, +/area/station/science/genetics) "iag" = ( /obj/machinery/computer/records/security{ dir = 4 @@ -30620,9 +30507,6 @@ "ibw" = ( /turf/closed/wall, /area/station/science/genetics) -"ibz" = ( -/turf/open/openspace, -/area/station/science/cytology) "ibE" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron, @@ -31060,19 +30944,6 @@ /obj/structure/closet/crate/engineering, /turf/open/floor/plating, /area/station/engineering/lobby) -"ihB" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/any/engineering/general, -/obj/machinery/door/airlock/engineering{ - name = "Science Substation" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/turf/open/floor/iron/smooth_large, -/area/station/maintenance/floor2/starboard) "ihC" = ( /obj/item/stack/sheet/iron, /turf/open/floor/plating, @@ -31228,17 +31099,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/science/auxlab) -"ijU" = ( -/obj/machinery/atmospherics/components/binary/valve/layer2{ - name = "scrubbers access" - }, -/obj/machinery/atmospherics/components/binary/valve/layer4{ - name = "distro access" - }, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/box, -/turf/open/floor/plating, -/area/station/science/cytology) "ijX" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/hollow/directional, @@ -31288,12 +31148,6 @@ }, /turf/open/floor/iron/textured_large, /area/station/engineering/lobby) -"ikt" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/science/research/abandoned) "iky" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -31470,13 +31324,6 @@ /obj/structure/grille/broken, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) -"imx" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/science/research/abandoned) "imI" = ( /obj/effect/turf_decal/trimline/blue/warning{ dir = 1 @@ -31547,10 +31394,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/aft) -"inG" = ( -/obj/effect/turf_decal/box/corners, -/turf/open/floor/engine, -/area/station/science/xenobiology) "inJ" = ( /obj/machinery/washing_machine, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -31626,6 +31469,20 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/carpet, /area/station/medical/psychology) +"iot" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/door/window/left/directional/west{ + name = "Xenocytology Desk"; + req_access = list("xenobiology") + }, +/obj/structure/desk_bell{ + pixel_x = 6; + pixel_y = 10 + }, +/turf/open/floor/iron, +/area/station/science/cytology) "iow" = ( /obj/structure/table/wood, /obj/structure/disposalpipe/segment{ @@ -31634,13 +31491,6 @@ /obj/machinery/computer/records/medical/laptop, /turf/open/floor/carpet, /area/station/security/detectives_office) -"ioD" = ( -/obj/effect/turf_decal/stripes, -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor2/starboard) "ioL" = ( /obj/effect/decal/cleanable/ash, /turf/open/floor/plating/foam, @@ -31696,14 +31546,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/security/prison) -"ipB" = ( -/obj/structure/sign/poster/official/random/directional/north, -/obj/effect/landmark/start/medical_doctor, -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/station/commons/vacant_room/commissary) "ipI" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/structure/cable, @@ -31796,6 +31638,15 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat_interior) +"iqC" = ( +/obj/effect/turf_decal/siding/purple{ + dir = 4 + }, +/obj/machinery/dna_scannernew, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "iqD" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/portable_atmospherics/scrubber, @@ -31814,6 +31665,22 @@ /obj/effect/spawner/random/armory/shotgun, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"irb" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/rack, +/obj/item/mop, +/obj/item/reagent_containers/cup/bucket, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/item/storage/box/gloves{ + pixel_x = 5; + pixel_y = -8 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "irf" = ( /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/dark/side{ @@ -31891,14 +31758,6 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) -"irW" = ( -/obj/machinery/photocopier, -/obj/machinery/requests_console/directional/north{ - department = "Head of Personnel's Desk"; - name = "Head of Personnel's Requests Console" - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hop) "isd" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ dir = 4 @@ -31924,16 +31783,6 @@ /obj/structure/railing/corner, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard/aft) -"isl" = ( -/obj/machinery/door/airlock/hatch{ - name = "Shelter" - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/maintenance/radshelter/sci) "isp" = ( /obj/machinery/computer/security/telescreen{ name = "\improper Engine Waste Monitor"; @@ -31985,13 +31834,6 @@ dir = 6 }, /area/station/hallway/secondary/exit) -"isM" = ( -/obj/effect/turf_decal/stripes, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/newscaster/directional/south, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/cytology) "isO" = ( /obj/machinery/firealarm/directional/south, /obj/effect/turf_decal/trimline/green/warning{ @@ -32161,6 +32003,12 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) +"ivo" = ( +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "ivs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32227,14 +32075,6 @@ /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron/white, /area/station/command/heads_quarters/rd) -"iwh" = ( -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/structure/chair/stool/bar/directional/west, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/large, -/area/station/command/heads_quarters/rd) "iwj" = ( /turf/open/floor/iron/smooth_large, /area/station/science/robotics/mechbay) @@ -32345,21 +32185,10 @@ /obj/structure/closet/secure_closet/personal/cabinet, /turf/open/floor/iron, /area/station/commons/dorms/room1) -"iyF" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/light/cold/no_nightlight/directional/east, -/obj/machinery/power/shieldwallgen/xenobiologyaccess, -/turf/open/floor/iron/white, -/area/station/science/cytology) "iyK" = ( /obj/structure/table/reinforced, /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/floor1/fore) -"iyP" = ( -/obj/structure/rack, -/obj/item/storage/bag/construction, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "iyR" = ( /obj/effect/turf_decal/tile/red/diagonal_edge, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -32556,6 +32385,24 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hos) +"iAt" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/table, +/obj/item/transfer_valve{ + pixel_x = -5 + }, +/obj/item/transfer_valve{ + pixel_x = 5 + }, +/obj/item/transfer_valve{ + pixel_x = -5 + }, +/obj/item/transfer_valve{ + pixel_x = 5 + }, +/obj/item/transfer_valve, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/testlab) "iAH" = ( /obj/machinery/power/shuttle_engine/heater{ icon_state = "router" @@ -32579,6 +32426,10 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/engineering/atmos/office) +"iAZ" = ( +/obj/machinery/smartfridge/extract/preloaded, +/turf/open/floor/circuit, +/area/station/science/xenobiology) "iBb" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 @@ -32591,6 +32442,13 @@ /obj/structure/cable/layer3, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"iBj" = ( +/obj/effect/turf_decal/siding/wideplating_new{ + dir = 8 + }, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/white, +/area/station/science/cytology) "iBl" = ( /obj/machinery/airalarm/directional/north, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -32654,6 +32512,20 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/iron/white/textured_large, /area/station/service/chapel) +"iCi" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/landmark/start/geneticist, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/science/genetics) "iCk" = ( /obj/machinery/door/poddoor/shutters/radiation/preopen{ id = "radshutnorth" @@ -32682,6 +32554,12 @@ /obj/item/toy/beach_ball, /turf/open/floor/grass, /area/station/medical/virology) +"iCE" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/grass, +/area/station/science/cytology) "iCG" = ( /turf/open/floor/iron/dark, /area/station/security/holding_cell) @@ -33041,16 +32919,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"iIj" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "iIm" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Hatch" @@ -33347,6 +33215,13 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"iMX" = ( +/obj/effect/turf_decal/trimline/purple/warning{ + dir = 6 + }, +/obj/effect/decal/cleanable/garbage, +/turf/open/floor/pod/light, +/area/station/maintenance/floor2/starboard) "iNp" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 10 @@ -33820,13 +33695,6 @@ /obj/item/stack/rods/two, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) -"iSr" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/medipen_refiller, -/turf/open/floor/plating/elevatorshaft, -/area/station/science/research/abandoned) "iSs" = ( /obj/structure/rack, /obj/item/weldingtool, @@ -34221,20 +34089,6 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/white, /area/station/cargo/miningdock) -"iYo" = ( -/turf/open/floor/engine{ - icon_state = "textured_dark" - }, -/area/station/maintenance/floor2/starboard/aft) -"iYq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/item/seeds/random, -/obj/structure/rack, -/obj/item/cultivator, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "iYA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -34857,11 +34711,6 @@ /obj/structure/sign/departments/holy/directional/north, /turf/open/floor/grass, /area/station/hallway/floor3/aft) -"jgW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/purple/visible, -/obj/effect/spawner/structure/window/reinforced/plasma, -/turf/open/floor/engine/air, -/area/station/engineering/atmos/pumproom) "jgY" = ( /obj/machinery/door/airlock/external/glass, /obj/effect/turf_decal/stripes/line{ @@ -34878,11 +34727,6 @@ /obj/structure/closet/firecloset, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"jhe" = ( -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/telecomms/receiver, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/fore) "jhk" = ( /obj/effect/turf_decal/bot, /obj/machinery/hydroponics/constructable, @@ -34944,15 +34788,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard/aft) -"jiu" = ( -/obj/machinery/dna_scannernew, -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "jiD" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 @@ -35131,6 +34966,14 @@ /obj/effect/spawner/random/trash/garbage, /turf/open/floor/pod/light, /area/station/maintenance/floor3/port/aft) +"jlE" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "jlJ" = ( /obj/structure/railing{ dir = 8 @@ -35167,10 +35010,9 @@ "jmc" = ( /turf/closed/wall, /area/station/service/hydroponics/garden) -"jmf" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/holopad, -/turf/open/floor/iron/white, +"jml" = ( +/obj/effect/turf_decal/box/corners, +/turf/open/floor/iron/dark, /area/station/science/cytology) "jmm" = ( /obj/structure/railing/corner{ @@ -35327,11 +35169,6 @@ /obj/machinery/light/cold/directional/east, /turf/open/floor/iron/textured_large, /area/station/medical/chemistry) -"joy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "joE" = ( /obj/structure/railing{ dir = 1 @@ -35378,6 +35215,15 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/dark, /area/station/medical/virology) +"joU" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/checker{ + dir = 1 + }, +/area/station/science/genetics) "joV" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 8 @@ -35472,29 +35318,22 @@ /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/maintenance/floor3/starboard/fore) -"jqz" = ( -/obj/effect/turf_decal/trimline/purple/line, -/obj/structure/disposalpipe/junction/flip{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "jqD" = ( /turf/open/floor/iron/dark/smooth_large, /area/station/science/lobby) "jqJ" = ( /turf/open/floor/plating/foam, /area/station/maintenance/floor2/port) -"jrh" = ( -/obj/effect/turf_decal/siding/purple/corner{ +"jqP" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Xenobio - Computers Pens" + }, +/obj/machinery/computer/camera_advanced/xenobio{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) +/obj/machinery/newscaster/directional/west, +/turf/open/floor/circuit, +/area/station/science/xenobiology) "jrl" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/structure/cable, @@ -35706,10 +35545,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/floor2/port/aft) -"jtQ" = ( -/obj/machinery/light/cold/no_nightlight/directional/south, -/turf/open/floor/grass, -/area/station/hallway/secondary/service) "juf" = ( /obj/machinery/door/poddoor/shutters/radiation/preopen{ id = "radshutsouth" @@ -35900,12 +35735,6 @@ }, /turf/open/floor/iron/white/small, /area/station/commons/fitness/recreation) -"jwY" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/science/research/abandoned) "jxa" = ( /obj/structure/railing{ dir = 1 @@ -36380,6 +36209,13 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor2/port) +"jBR" = ( +/obj/effect/turf_decal/trimline/purple/line, +/obj/effect/turf_decal/siding/white/corner{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "jCi" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor/heavy, @@ -36706,6 +36542,16 @@ /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/iron/dark/side, /area/station/engineering/storage/tech) +"jGf" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/cytology) "jGg" = ( /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/pod/light, @@ -36715,6 +36561,13 @@ /obj/structure/sign/poster/random/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/service/library/printer) +"jGl" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "jGn" = ( /obj/structure/table/wood/poker, /obj/effect/turf_decal/trimline/blue/filled/line, @@ -36766,13 +36619,6 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) -"jHp" = ( -/obj/effect/spawner/structure/window/reinforced/plasma, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine/air, -/area/station/engineering/atmos/pumproom) "jHr" = ( /obj/structure/railing{ dir = 1 @@ -37296,12 +37142,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"jOL" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/fore) "jON" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /turf/open/floor/iron/white, @@ -37329,13 +37169,6 @@ /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/aft) -"jOZ" = ( -/obj/structure/table, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "jPd" = ( /obj/effect/turf_decal/bot, /obj/structure/rack, @@ -37635,18 +37468,6 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/white, /area/station/hallway/floor2/aft) -"jTd" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ - dir = 10 - }, -/turf/open/floor/engine/airless, -/area/station/engineering/atmos/pumproom) "jTj" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 6 @@ -37688,12 +37509,24 @@ /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"jTM" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/purple{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/science/cytology) "jTO" = ( /obj/machinery/airalarm/directional/east, /obj/structure/table/wood, /obj/structure/reagent_dispensers/beerkeg, /turf/open/floor/wood, /area/station/service/bar) +"jTS" = ( +/obj/effect/spawner/random/contraband/landmine, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/floor2/starboard/aft) "jUf" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor/heavy, @@ -37796,12 +37629,6 @@ /obj/structure/sign/poster/official/random/directional/east, /turf/open/floor/iron/dark, /area/station/security/holding_cell) -"jVJ" = ( -/obj/effect/turf_decal/siding/white/corner{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "jVK" = ( /turf/closed/wall/r_wall, /area/station/security/prison) @@ -37824,6 +37651,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/cargo/lobby) +"jVT" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/science/genetics) "jVW" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/pew/right{ @@ -37864,6 +37701,15 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) +"jWv" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer4{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/station/engineering/supermatter/waste) "jWz" = ( /obj/structure/railing/corner, /obj/effect/turf_decal/trimline/purple/warning, @@ -38421,6 +38267,17 @@ /obj/machinery/microwave, /turf/open/floor/catwalk_floor/iron, /area/station/cargo/storage) +"kdA" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/structure/table/wood, +/obj/item/flashlight/lamp/bananalamp{ + pixel_y = 5 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/grimy, +/area/station/science/xenobiology/hallway) "kdK" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Hatch" @@ -38446,6 +38303,17 @@ }, /turf/open/floor/iron, /area/station/maintenance/floor1/port/aft) +"kdU" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "keg" = ( /obj/machinery/light_switch/directional/south, /obj/structure/cable, @@ -38559,6 +38427,13 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/plating, /area/station/medical/abandoned) +"keX" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor4/starboard/fore) "kfb" = ( /obj/effect/turf_decal/trimline/yellow/line{ dir = 8 @@ -38609,16 +38484,6 @@ /obj/machinery/light/broken/directional/north, /turf/open/floor/iron/kitchen, /area/station/service/kitchen/abandoned) -"kfO" = ( -/obj/effect/turf_decal/trimline/purple/corner{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "kga" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -38862,6 +38727,21 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/white, /area/station/science/lobby) +"kjo" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/science/genetics, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/science/glass{ + name = "Genetics Office" + }, +/turf/open/floor/iron, +/area/station/science/genetics) "kjz" = ( /obj/machinery/door/airlock/grunge{ name = "Cell 1" @@ -39084,21 +38964,6 @@ }, /turf/open/floor/wood/tile, /area/station/service/library) -"knq" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer2, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ - dir = 9 - }, -/obj/machinery/camera/preset/ordnance{ - c_tag = "Supermatter Waste"; - light_range = 0; - network = list("waste","engine") - }, -/turf/open/floor/engine/airless, -/area/station/engineering/atmos/pumproom) "knA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39119,16 +38984,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) -"knN" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ - dir = 4 - }, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/engine/airless, -/area/station/engineering/atmos/pumproom) "knO" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 10 @@ -39664,6 +39519,18 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/xenobiology/hallway) +"ktM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock_note_placer{ + note_info = "THIS IS PUBLIC. IT'S MEANT TO BE. PLEASE. GOD. WE KNOW. STOP. TELLING US. - Yours Truly and Forever Faithfully, The Desk Of The Chief Engineer" + }, +/obj/machinery/door/airlock/science/glass{ + name = "Science Hall" + }, +/turf/open/floor/catwalk_floor, +/area/station/science/lower) "ktN" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/structure/disposalpipe/segment{ @@ -39695,6 +39562,17 @@ name = "boxing ring" }, /area/station/commons/fitness) +"kuh" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 8 + }, +/obj/effect/turf_decal/siding/white/corner, +/obj/machinery/airalarm/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "kum" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39800,6 +39678,10 @@ /obj/structure/stairs/north, /turf/open/floor/iron/smooth, /area/station/hallway/floor3/fore) +"kwf" = ( +/obj/machinery/light/cold/no_nightlight/directional/south, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "kwl" = ( /turf/open/floor/iron/dark/side{ dir = 9 @@ -39843,6 +39725,15 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/textured_large, /area/station/cargo/storage) +"kwL" = ( +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/obj/machinery/recharger, +/obj/structure/table, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "kxf" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -39866,14 +39757,6 @@ /obj/machinery/light/broken/directional/west, /turf/open/floor/carpet/green, /area/station/service/abandoned_gambling_den) -"kxA" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/camera/directional/south{ - c_tag = "Science - Cytology Lower" - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/white, -/area/station/science/cytology) "kxJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -40033,18 +39916,6 @@ "kzK" = ( /turf/open/floor/iron, /area/station/hallway/floor2/aft) -"kzN" = ( -/obj/machinery/door/airlock/science{ - name = "Genetics" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/science/genetics, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/science/genetics) "kzP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40094,20 +39965,6 @@ /obj/item/storage/box/masks, /turf/open/floor/iron/dark/textured, /area/station/medical/virology/isolation) -"kAq" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) -"kAt" = ( -/obj/machinery/light/small/dim/directional/north, -/turf/open/floor/grass, -/area/station/science/xenobiology) "kAu" = ( /obj/structure/disposalpipe/trunk{ dir = 4 @@ -40318,16 +40175,17 @@ /obj/structure/railing/corner, /turf/open/floor/wood/tile, /area/station/service/library) -"kCm" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/holopad, -/turf/open/floor/iron, -/area/station/science/genetics) "kCA" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, /area/station/medical/office) +"kCR" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Xenobio - Starboard Pens" + }, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "kDg" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2{ dir = 1 @@ -40858,11 +40716,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/atmos/pumproom) -"kIV" = ( -/obj/structure/filingcabinet/medical, -/obj/machinery/status_display/ai/directional/east, -/turf/open/floor/wood, -/area/station/science/research/abandoned) "kJg" = ( /obj/effect/turf_decal/trimline/purple/line{ dir = 1 @@ -41184,6 +41037,17 @@ }, /turf/open/floor/iron, /area/station/maintenance/floor4/starboard) +"kNn" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/duct, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "kNA" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -41267,15 +41131,6 @@ /obj/effect/turf_decal/tile/green/full, /turf/open/floor/iron, /area/station/service/hydroponics) -"kOJ" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ - dir = 5 - }, -/turf/open/floor/engine/airless, -/area/station/engineering/atmos/pumproom) "kON" = ( /obj/machinery/light/small/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -41460,6 +41315,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) +"kRn" = ( +/obj/structure/mirror/directional/west, +/obj/machinery/light/small/directional/south, +/obj/structure/sink/directional/east, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/rd) "kRo" = ( /obj/item/stock_parts/subspace/analyzer, /obj/item/stock_parts/subspace/amplifier, @@ -41482,6 +41344,11 @@ /obj/structure/sink/kitchen/directional/west, /turf/open/floor/iron/dark, /area/station/security/execution/education) +"kRG" = ( +/obj/effect/spawner/random/structure/tank_holder, +/obj/effect/turf_decal/trimline/purple/warning, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor2/starboard) "kRI" = ( /obj/structure/chair/plastic{ dir = 4 @@ -42135,16 +42002,6 @@ }, /turf/open/floor/wood/tile, /area/station/service/library) -"kZT" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "kZV" = ( /obj/structure/railing/corner, /obj/structure/cable, @@ -42308,6 +42165,10 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"lbJ" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end, +/turf/open/floor/plating, +/area/station/science/xenobiology) "lbK" = ( /obj/structure/chair/stool/bar/directional/south, /obj/effect/decal/cleanable/confetti, @@ -42316,6 +42177,23 @@ }, /turf/open/floor/eighties, /area/station/commons/fitness/recreation/entertainment) +"lbO" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/syringes{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/item/storage/box/beakers{ + pixel_x = -3; + pixel_y = 4 + }, +/obj/item/reagent_containers/dropper, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "lbT" = ( /obj/structure/table, /obj/machinery/computer/libraryconsole/bookmanagement{ @@ -42401,6 +42279,12 @@ }, /turf/open/floor/carpet/orange, /area/station/service/chapel/office) +"lcT" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/grass, +/area/station/science/cytology) "lcU" = ( /obj/effect/landmark/carpspawn, /turf/open/floor/engine/hull/reinforced, @@ -42483,12 +42367,6 @@ }, /turf/open/floor/wood, /area/station/service/bar/atrium) -"ldQ" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/maintenance/radshelter/sci) "ldV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/holopad, @@ -42565,17 +42443,6 @@ /obj/structure/closet/emcloset, /turf/open/floor/iron, /area/station/hallway/floor3/fore) -"leJ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/machinery/modular_computer/preset/civilian{ - dir = 8 - }, -/turf/open/floor/iron/smooth_edge{ - dir = 1 - }, -/area/station/science/research/abandoned) "leY" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 6 @@ -42735,6 +42602,12 @@ /obj/effect/mapping_helpers/airlock/access/any/command/teleporter, /turf/open/floor/iron/dark, /area/station/command/teleporter) +"lgY" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/science/xenobiology/hallway) "lgZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -42758,13 +42631,6 @@ /obj/structure/rack, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/aft) -"lhq" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/closet/firecloset/full, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron/white, -/area/station/science/cytology) "lhv" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 @@ -42791,15 +42657,6 @@ }, /turf/open/floor/iron/checker, /area/station/commons/vacant_room/commissary) -"lhB" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/machinery/computer/records/medical/laptop, -/obj/structure/table, -/turf/open/floor/iron, -/area/station/science/genetics) "lhO" = ( /obj/structure/chair{ dir = 1 @@ -42814,6 +42671,18 @@ name = "lab floor" }, /area/station/science/robotics/lab) +"lhS" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/white/corner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "lhT" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ @@ -42986,9 +42855,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/commons/dorms/apartment2) -"lkQ" = ( -/turf/closed/wall/r_wall, -/area/station/maintenance/radshelter/sci) "lkV" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ dir = 9 @@ -43078,14 +42944,6 @@ }, /turf/open/floor/iron, /area/station/hallway/floor2/fore) -"llO" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron/white, -/area/station/science/cytology) "llQ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -43171,11 +43029,6 @@ /obj/machinery/door/window/right, /turf/open/misc/beach/sand, /area/station/hallway/secondary/entry) -"lmP" = ( -/obj/structure/bonfire, -/obj/item/melee/moonlight_greatsword, -/turf/open/floor/stone, -/area/station/maintenance/floor3/starboard/fore) "lmU" = ( /obj/structure/table/reinforced, /obj/effect/spawner/random/entertainment/lighter, @@ -43364,27 +43217,6 @@ /obj/structure/bookcase/random/nonfiction, /turf/open/floor/carpet/royalblack, /area/station/service/library) -"lpv" = ( -/obj/effect/turf_decal/siding/white/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/purple/corner, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"lpA" = ( -/obj/effect/turf_decal/siding/purple, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "lpB" = ( /obj/machinery/modular_computer/preset/civilian{ dir = 4 @@ -43450,21 +43282,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/surgery/fore) -"lqE" = ( -/obj/effect/turf_decal/siding/white/corner{ - dir = 4 - }, -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/purple/corner{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "lqI" = ( /obj/machinery/light/small/directional/east, /obj/structure/toilet{ @@ -44038,6 +43855,10 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/fore) +"lzp" = ( +/obj/structure/sign/poster/official/wtf_is_co2/directional/west, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "lzq" = ( /obj/structure/railing{ dir = 6 @@ -44132,10 +43953,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos) -"lBs" = ( -/obj/effect/landmark/blobstart, -/turf/open/floor/engine, -/area/station/science/cytology) "lBv" = ( /obj/effect/spawner/random/structure/table, /turf/open/floor/plating, @@ -44477,6 +44294,14 @@ /obj/machinery/duct, /turf/open/floor/iron/showroomfloor, /area/station/service/kitchen/diner) +"lFJ" = ( +/obj/structure/sign/poster/official/random/directional/north, +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/iron/checker, +/area/station/commons/vacant_room/commissary) "lFL" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 4 @@ -44551,19 +44376,6 @@ }, /turf/open/floor/iron, /area/station/hallway/floor2/aft) -"lGH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/table/glass, -/obj/item/storage/box/beakers, -/obj/item/knife, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/item/biopsy_tool{ - pixel_x = 8; - pixel_y = 2 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) "lGJ" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -44621,6 +44433,26 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/starboard/fore) +"lIh" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 8 + }, +/obj/machinery/keycard_auth/directional/east{ + pixel_x = 25; + pixel_y = 16 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Command - Research Director's Office" + }, +/obj/machinery/requests_console/directional/east{ + department = "Research Director's Desk"; + name = "Research Director's Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/rd) "lIm" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/white/corner, @@ -44771,12 +44603,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/aft) -"lJG" = ( -/obj/structure/window/spawner/directional/south, -/obj/structure/rack, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/iron/smooth, -/area/station/science/research/abandoned) "lJN" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -44933,6 +44759,17 @@ }, /turf/open/floor/iron/dark/textured, /area/station/medical/pharmacy) +"lLL" = ( +/obj/effect/turf_decal/siding/white/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/table/glass, +/obj/machinery/fax{ + fax_name = "Research Director's Office"; + name = "Research Director's Fax Machine" + }, +/turf/open/floor/iron/large, +/area/station/command/heads_quarters/rd) "lLO" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -44969,17 +44806,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard/fore) -"lMz" = ( -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/smooth_edge{ - dir = 1 - }, -/area/station/science/research/abandoned) "lMC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/trimline/blue/filled/warning{ @@ -45291,6 +45117,14 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/carpet/red, /area/station/service/theater) +"lQb" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "lQc" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -45677,6 +45511,20 @@ dir = 4 }, /area/station/medical/chemistry) +"lUO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/door/airlock/science/glass{ + name = "Slime Enrichment Center" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/science/xenobio, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology/hallway) "lUY" = ( /obj/effect/turf_decal/bot, /obj/effect/spawner/random/structure/crate, @@ -45796,31 +45644,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) -"lWR" = ( -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/airalarm/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) -"lWU" = ( -/obj/machinery/door/window/left/directional/south{ - name = "Pen 3"; - req_access = list("xenobiology") - }, -/obj/effect/turf_decal/stripes{ - dir = 6 - }, -/obj/structure/sink/directional/west, -/obj/machinery/requests_console/directional/east{ - department = "Xenobiology"; - name = "Xenobiology Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/ore_update, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "lXb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/sign/gym/mirrored{ @@ -45965,6 +45788,12 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/station/service/bar) +"lYt" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "lYu" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -46060,19 +45889,16 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/iron, /area/station/hallway/floor2/fore) -"lZQ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/starboard) "lZS" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor/heavy, /obj/machinery/digital_clock/directional/north, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) +"maf" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "map" = ( /obj/structure/door_assembly/door_assembly_med, /obj/machinery/door/firedoor, @@ -46159,20 +45985,6 @@ /obj/machinery/space_heater, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard) -"mbr" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/obj/structure/frame/machine, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron, -/area/station/science/research/abandoned) -"mbt" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/science/cytology) "mbv" = ( /obj/machinery/vending/coffee, /obj/effect/turf_decal/siding/wood, @@ -46356,6 +46168,11 @@ /obj/effect/turf_decal/tile/green/opposingcorners, /turf/open/floor/iron/white, /area/station/medical/virology) +"mcO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/garbage, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "mcU" = ( /obj/structure/closet/athletic_mixed, /obj/effect/landmark/start/hangover/closet, @@ -46520,11 +46337,6 @@ /obj/machinery/duct, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/cmo) -"meK" = ( -/obj/structure/closet/emcloset, -/obj/structure/cable, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/fore) "meU" = ( /obj/machinery/airalarm/directional/west, /turf/open/floor/pod/dark, @@ -47044,15 +46856,6 @@ /obj/structure/lattice/catwalk, /turf/open/space/openspace, /area/station/solars/starboard/aft) -"mlV" = ( -/obj/item/kirbyplants/random, -/obj/machinery/light/small/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Command - Research Director's Quarters #1" - }, -/obj/effect/baseturf_helper/reinforced_plating/ceiling, -/turf/open/floor/iron/large, -/area/station/command/heads_quarters/rd) "mlX" = ( /obj/structure/chair/comfy/brown, /obj/effect/landmark/start/assistant, @@ -47070,11 +46873,6 @@ /obj/structure/sign/poster/contraband/clown, /turf/closed/wall, /area/station/service/theater) -"mmq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_white, -/area/station/science/cytology) "mms" = ( /obj/machinery/space_heater/improvised_chem_heater, /obj/effect/turf_decal/tile/blue/half, @@ -47101,6 +46899,9 @@ }, /turf/open/floor/iron, /area/station/cargo/miningdock) +"mmz" = ( +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/floor2/starboard/aft) "mmA" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/structure/extinguisher_cabinet/directional/west, @@ -47150,16 +46951,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark/textured, /area/station/commons/fitness) -"mng" = ( -/obj/machinery/plumbing/synthesizer{ - reagent_id = /datum/reagent/water - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "mni" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -47196,15 +46987,6 @@ dir = 4 }, /area/station/hallway/secondary/exit/departure_lounge) -"mnq" = ( -/obj/effect/decal/cleanable/blood/gibs/old, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/engine{ - icon_state = "textured_dark" - }, -/area/station/maintenance/floor2/starboard/aft) "mnE" = ( /obj/structure/table/wood, /obj/item/folder/red, @@ -47218,17 +47000,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/commons/fitness) -"mnI" = ( -/obj/machinery/door/window/left/directional/south{ - name = "Pen 1"; - req_access = list("xenobiology") - }, -/obj/effect/turf_decal/stripes, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 10 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "mnM" = ( /obj/machinery/door_buttons/access_button{ idDoor = "virology_airlock_interior"; @@ -47434,12 +47205,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/textured_large, /area/station/cargo/storage) -"mqv" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/science/genetics) "mqx" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -47520,11 +47285,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/white, /area/station/science/lower) -"mrq" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth_corner, -/area/station/maintenance/floor2/starboard) "mrs" = ( /obj/structure/grille, /obj/item/shard, @@ -47657,23 +47417,6 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/starboard) -"msG" = ( -/obj/effect/turf_decal/stripes{ - dir = 4 - }, -/obj/structure/rack, -/obj/item/storage/box/petridish{ - pixel_x = -5; - pixel_y = 8 - }, -/obj/item/storage/box/beakers, -/obj/item/storage/box/gloves{ - pixel_x = 5; - pixel_y = -8 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/station/science/cytology) "msL" = ( /obj/effect/decal/cleanable/blood/drip, /turf/open/floor/pod/light, @@ -47828,14 +47571,6 @@ /obj/effect/mapping_helpers/requests_console/assistance, /turf/open/floor/iron/dark, /area/station/security/checkpoint/third) -"mvc" = ( -/obj/machinery/atmospherics/components/unary/passive_vent{ - name = "killroom vent" - }, -/obj/structure/window/reinforced/plasma/spawner/directional/south, -/obj/machinery/light/small/directional/north, -/turf/open/floor/engine/telecomms, -/area/station/science/xenobiology) "mve" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47924,6 +47659,16 @@ /obj/structure/cable, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) +"mwB" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/duct, +/obj/machinery/camera/directional/south{ + c_tag = "Cytology - Petting Zoo" + }, +/turf/open/misc/sandy_dirt, +/area/station/science/cytology) "mwD" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -48003,6 +47748,14 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"mxJ" = ( +/obj/effect/turf_decal/siding/white/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "mxN" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/structure/closet/secure_closet/medical3, @@ -48228,6 +47981,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) +"mAI" = ( +/obj/effect/turf_decal/siding/white{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/research_director, +/obj/structure/chair/stool/bar/directional/west, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/large, +/area/station/command/heads_quarters/rd) "mAJ" = ( /obj/structure/railing{ dir = 8 @@ -48241,15 +48005,6 @@ }, /turf/open/floor/wood/tile, /area/station/service/library) -"mAQ" = ( -/obj/effect/turf_decal/trimline/purple/warning{ - dir = 10 - }, -/obj/effect/turf_decal/stripes{ - dir = 10 - }, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor2/starboard) "mAZ" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/pod/light, @@ -48498,13 +48253,6 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/wood, /area/station/command/heads_quarters/ce) -"mEF" = ( -/obj/machinery/atmospherics/components/unary/passive_vent{ - name = "killroom vent" - }, -/obj/structure/window/reinforced/plasma/spawner/directional/south, -/turf/open/floor/engine/telecomms, -/area/station/science/xenobiology) "mEK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -48969,11 +48717,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"mKw" = ( -/obj/effect/decal/cleanable/xenoblood, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/engine, -/area/station/science/cytology) "mKO" = ( /obj/machinery/door/airlock/research/glass/incinerator/ordmix_interior{ name = "Burn Chamber Interior Airlock" @@ -49181,15 +48924,6 @@ /obj/item/shard/plasma, /turf/open/floor/plating/foam, /area/station/maintenance/floor1/port/aft) -"mMC" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/machinery/dna_scannernew, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "mMD" = ( /obj/structure/closet/firecloset/full, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -49332,6 +49066,11 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/science/robotics/lab) +"mOK" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/flowers_yw/style_random, +/turf/open/floor/grass, +/area/station/hallway/secondary/service) "mOO" = ( /obj/structure/window/reinforced/tinted/spawner/directional/south, /obj/structure/mirror/directional/east, @@ -49343,6 +49082,7 @@ /area/station/commons/dorms/apartment2) "mOT" = ( /obj/machinery/light/directional/north, +/obj/machinery/airalarm/directional/north, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "mPs" = ( @@ -49632,6 +49372,11 @@ /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, /area/station/maintenance/floor4/port/fore) +"mTo" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/closet/secure_closet/cytology, +/turf/open/floor/iron, +/area/station/science/cytology) "mTs" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, @@ -49838,16 +49583,6 @@ /obj/structure/closet/emcloset/anchored, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"mVz" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/machinery/computer/scan_consolenew, -/obj/machinery/light/cold/no_nightlight/directional/north, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "mVC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -49870,10 +49605,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_corner, /area/station/maintenance/floor1/starboard/aft) -"mVP" = ( -/obj/item/toy/beach_ball, -/turf/open/floor/pod/light, -/area/station/maintenance/floor2/starboard) "mVR" = ( /obj/effect/spawner/structure/window/hollow/end{ dir = 1 @@ -49972,6 +49703,13 @@ /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) +"mWW" = ( +/obj/item/stack/sheet/iron, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/floor2/starboard/aft) "mXg" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 @@ -50394,15 +50132,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"ncS" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/landmark/start/geneticist, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "ncX" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -50648,6 +50377,10 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/holding_cell) +"nfR" = ( +/obj/machinery/shower/directional/west, +/turf/open/floor/noslip, +/area/station/science/genetics) "nfU" = ( /obj/structure/railing{ dir = 1 @@ -50726,13 +50459,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/wood/tile, /area/station/service/library) -"ngy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "ngD" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2{ dir = 8 @@ -50755,16 +50481,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/office) -"ngQ" = ( -/obj/structure/railing/corner, -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/effect/turf_decal/stripes{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/science/cytology) "ngT" = ( /obj/structure/dresser, /turf/open/floor/wood/tile, @@ -50966,6 +50682,24 @@ /obj/effect/decal/cleanable/food/tomato_smudge, /turf/open/floor/iron, /area/station/security/prison) +"niK" = ( +/obj/structure/table, +/obj/item/storage/box/monkeycubes{ + pixel_x = 6; + pixel_y = 9 + }, +/obj/item/radio/headset/headset_medsci{ + pixel_x = -7; + pixel_y = 4 + }, +/obj/item/sequence_scanner{ + pixel_x = -2; + pixel_y = -1 + }, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "niM" = ( /obj/machinery/light_switch/directional/north, /obj/effect/landmark/start/assistant, @@ -50979,21 +50713,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor3/port/fore) -"niS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron/white, -/area/station/science/lower) -"niT" = ( -/obj/effect/turf_decal/trimline/purple/line, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "njc" = ( /obj/structure/stairs/north, /obj/structure/sign/poster/official/random/directional/north, @@ -51013,16 +50732,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/breakroom) -"njj" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 9 - }, -/obj/machinery/dna_scannernew, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "njk" = ( /obj/machinery/door/airlock/public/glass{ name = "Cafeteria" @@ -51199,17 +50908,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/engineering/lobby) -"nlo" = ( -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/stripes{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) "nlu" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -51243,43 +50941,15 @@ }, /turf/open/floor/wood/parquet, /area/station/medical/break_room) -"nlM" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 6 - }, -/obj/machinery/vending/wardrobe/gene_wardrobe, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "nlN" = ( /turf/closed/wall, /area/station/maintenance/floor2/port/aft) -"nlZ" = ( -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/window/right/directional/west{ - name = "Containment"; - req_access = list("xenobiology") - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) "nmq" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/tank_holder, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) -"nmw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/smooth_edge{ - dir = 1 - }, -/area/station/science/research/abandoned) "nmB" = ( /obj/structure/table/wood, /obj/effect/spawner/random/entertainment/musical_instrument, @@ -51397,13 +51067,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/cargo/storage) -"nop" = ( -/obj/effect/turf_decal/trimline/purple/end{ - dir = 4 - }, -/obj/effect/turf_decal/siding/white, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "nor" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -51484,6 +51147,20 @@ /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/white/textured_large, /area/station/service/chapel/office) +"npu" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/purple{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "npD" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -51493,6 +51170,14 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/port/aft) +"npF" = ( +/obj/effect/turf_decal/siding/wideplating_new{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating_new, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/science/cytology) "npK" = ( /obj/structure/closet/firecloset/full, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -51541,6 +51226,13 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/explab) +"nqi" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "nqj" = ( /turf/open/floor/wood/tile, /area/station/commons/fitness/recreation) @@ -51549,17 +51241,9 @@ dir = 5 }, /area/station/hallway/floor3/fore) -"nqo" = ( -/turf/closed/wall, -/area/station/science/research/abandoned) "nqr" = ( /turf/closed/wall, /area/station/hallway/floor3/aft) -"nqs" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/fore) "nqt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -51789,6 +51473,10 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor4/starboard) +"ntl" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/end, +/turf/open/floor/plating, +/area/station/science/cytology) "ntn" = ( /obj/machinery/door/airlock/command/glass{ name = "Abandoned Ship Storage" @@ -51857,6 +51545,17 @@ /obj/item/food/grown/mushroom/reishi, /turf/open/floor/iron/kitchen, /area/station/service/kitchen/abandoned) +"ntU" = ( +/obj/machinery/light/cold/no_nightlight/directional/east, +/obj/effect/turf_decal/siding/purple{ + dir = 4 + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/machinery/requests_console/auto_name/directional/east, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "ntW" = ( /obj/structure/altar_of_gods, /obj/effect/turf_decal/siding/white, @@ -51960,14 +51659,6 @@ "nvy" = ( /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"nvA" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/structure/table/glass, -/obj/item/experi_scanner, -/turf/open/floor/iron/white, -/area/station/science/lower) "nvE" = ( /obj/machinery/autolathe, /obj/effect/turf_decal/siding/thinplating_new{ @@ -51985,6 +51676,13 @@ /obj/structure/cable, /turf/open/floor/bamboo/tatami/black, /area/station/commons/storage/art) +"nvT" = ( +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 1; + name = "killroom vent" + }, +/turf/open/floor/engine/hull/reinforced, +/area/station/science/xenobiology) "nwa" = ( /obj/effect/turf_decal/siding/wideplating_new{ dir = 8 @@ -52007,14 +51705,6 @@ /obj/structure/sign/warning/vacuum/external/directional/south, /turf/open/floor/iron/dark, /area/station/security/execution/transfer) -"nwg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sink/directional/east, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "nwh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/stripes/corner{ @@ -52075,6 +51765,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) +"nxe" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/purple{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/iron, +/area/station/science/cytology) "nxm" = ( /obj/structure/chair/sofa/bench/left{ dir = 1 @@ -52149,12 +51848,14 @@ /obj/item/storage/bag/trash, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) -"nyc" = ( -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 4 +"nyg" = ( +/obj/structure/chair/office/light{ + dir = 1 }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "nyh" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/engine/air, @@ -52330,9 +52031,6 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/pod, /area/station/maintenance/floor3/starboard) -"nAj" = ( -/turf/closed/wall, -/area/station/science/xenobiology) "nAm" = ( /obj/effect/turf_decal/bot, /obj/effect/spawner/random/structure/crate, @@ -52387,9 +52085,6 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/white, /area/station/medical/psychology) -"nBg" = ( -/turf/open/floor/grass, -/area/station/science/xenobiology) "nBh" = ( /obj/structure/dresser, /turf/open/floor/carpet/neon/simple/white, @@ -52470,15 +52165,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/side, /area/station/hallway/secondary/exit/departure_lounge) -"nCd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/starboard) "nCg" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/reagent_containers/pill/happinesspsych{ @@ -52577,6 +52263,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_dark, /area/station/maintenance/floor3/port) +"nDm" = ( +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/turf/open/floor/engine{ + initial_gas_mix = "o2=22;bz=82;TEMP=293.15" + }, +/area/station/science/xenobiology) "nDn" = ( /obj/effect/turf_decal/trimline/green/warning, /obj/effect/turf_decal/stripes/line{ @@ -52653,6 +52347,12 @@ /obj/effect/spawner/random/structure/girder, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) +"nEi" = ( +/obj/effect/turf_decal/box/corners{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "nEj" = ( /obj/structure/curtain/cloth, /turf/open/floor/eighties, @@ -52673,10 +52373,6 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark, /area/station/command/gateway) -"nEC" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/grass, -/area/station/science/xenobiology) "nED" = ( /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/dark/side{ @@ -52871,13 +52567,6 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/dark, /area/station/command/bridge) -"nHd" = ( -/obj/machinery/duct, -/obj/structure/sign/departments/botany{ - pixel_x = -32 - }, -/turf/open/floor/catwalk_floor/iron_white, -/area/station/science/research/abandoned) "nHf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -53032,15 +52721,15 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/wood/large, /area/station/command/heads_quarters/hop) -"nIL" = ( -/obj/effect/turf_decal/siding/purple, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" +"nIJ" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ + dir = 6 }, -/area/station/science/genetics) +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ + dir = 6 + }, +/turf/open/floor/engine/airless, +/area/station/engineering/supermatter/waste) "nIQ" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 @@ -53239,20 +52928,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard/fore) -"nLF" = ( -/obj/effect/turf_decal/trimline/purple/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/camera/directional/north{ - c_tag = "Science - Deck 3 Hall" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "nLL" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -53371,10 +53046,6 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/starboard/fore) -"nNQ" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/grass, -/area/station/science/xenobiology) "nNT" = ( /obj/machinery/door/airlock/public{ name = "Showers" @@ -53427,6 +53098,14 @@ }, /turf/open/floor/plating, /area/station/hallway/floor2/aft) +"nOR" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/dark/fourcorners, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "nOX" = ( /obj/machinery/camera/directional/east{ c_tag = "Law Office" @@ -53469,10 +53148,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/iron, /area/station/engineering/engine_smes) -"nPn" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/science/xenobiology) "nPp" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/yellow, @@ -53500,15 +53175,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark/textured, /area/station/medical/pharmacy) -"nPH" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "nPN" = ( /obj/machinery/computer/message_monitor{ dir = 4 @@ -53522,9 +53188,6 @@ }, /turf/open/floor/iron/smooth, /area/station/tcommsat/computer) -"nPQ" = ( -/turf/open/floor/engine, -/area/station/science/xenobiology) "nPS" = ( /obj/structure/mirror/directional/south, /obj/machinery/duct, @@ -53569,19 +53232,6 @@ dir = 1 }, /area/station/security/prison) -"nQG" = ( -/obj/machinery/power/smes/engineering{ - input_attempt = 0; - input_level = 60000; - inputting = 0; - output_attempt = 0; - output_level = 60000; - outputting = 0 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth_large, -/area/station/maintenance/floor2/starboard) "nQN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -53964,6 +53614,13 @@ /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, /area/station/maintenance/floor3/port) +"nVT" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/computer/records/medical/laptop, +/obj/structure/table, +/obj/machinery/light/cold/no_nightlight/directional/north, +/turf/open/floor/iron, +/area/station/science/genetics) "nVW" = ( /obj/structure/chair/office{ dir = 1 @@ -54508,15 +54165,12 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard/fore) -"odd" = ( -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 9 +"ocX" = ( +/obj/effect/turf_decal/trimline/purple/warning{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer2{ - dir = 8 - }, -/turf/closed/wall/r_wall, -/area/station/engineering/atmos/pumproom) +/turf/open/floor/pod/light, +/area/station/maintenance/floor2/starboard) "odk" = ( /obj/machinery/light/directional/east, /obj/machinery/status_display/ai/directional/east, @@ -54831,6 +54485,15 @@ }, /turf/open/floor/iron/smooth, /area/station/hallway/floor1/fore) +"oig" = ( +/obj/effect/turf_decal/siding/purple, +/obj/structure/chair/office/light{ + dir = 4 + }, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "oih" = ( /obj/structure/rack, /obj/item/storage/toolbox/mechanical, @@ -55093,6 +54756,13 @@ /obj/effect/spawner/random/engineering/material_cheap, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) +"olC" = ( +/obj/effect/landmark/blobstart, +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/science/cytology) "olM" = ( /obj/effect/turf_decal/trimline/yellow/line{ dir = 9 @@ -55124,6 +54794,11 @@ /obj/structure/ladder, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) +"ome" = ( +/obj/effect/spawner/random/maintenance, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor3/starboard) "omg" = ( /obj/structure/safe/floor, /obj/effect/spawner/random/entertainment/money_large, @@ -55380,6 +55055,7 @@ /obj/structure/cable, /obj/machinery/newscaster/directional/north, /obj/effect/turf_decal/tile/red/fourcorners, +/obj/item/key/security, /turf/open/floor/iron/dark, /area/station/security/warden) "ooY" = ( @@ -55542,6 +55218,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/security/execution/education) +"oqU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/food/popcorn, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor2/starboard) "oqW" = ( /obj/machinery/conveyor/inverted{ dir = 9; @@ -55625,11 +55307,6 @@ /obj/structure/hedge, /turf/open/floor/carpet/green, /area/station/service/kitchen/diner) -"ota" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/effect/turf_decal/siding/white, -/turf/open/floor/iron/white, -/area/station/science/cytology) "ote" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -55676,6 +55353,13 @@ dir = 8 }, /area/station/maintenance/solars/starboard/fore) +"otR" = ( +/obj/machinery/door/window/left/directional/south{ + name = "Pen 5"; + req_access = list("xenobiology") + }, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "otX" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/effect/turf_decal/siding/white/end{ @@ -55703,12 +55387,6 @@ /obj/structure/kitchenspike, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) -"oue" = ( -/obj/structure/mirror/directional/west, -/obj/machinery/light/small/directional/south, -/obj/structure/sink/directional/east, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/rd) "ouk" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -55785,6 +55463,10 @@ }, /turf/open/floor/iron/textured_large, /area/station/cargo/sorting) +"ovJ" = ( +/obj/machinery/light/cold/no_nightlight/directional/north, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "ovK" = ( /turf/open/floor/carpet/neon/simple/white, /area/station/commons/dorms/room3) @@ -55814,17 +55496,6 @@ /obj/structure/grille, /turf/open/floor/plating, /area/station/maintenance/floor4/port) -"owf" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/turf_decal/stripes/end{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/portables_connector{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/canister/hydrogen, -/turf/open/floor/iron/white, -/area/station/science/cytology) "owh" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -55971,6 +55642,16 @@ "oyh" = ( /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"oyv" = ( +/obj/machinery/light_switch/directional/east, +/obj/effect/turf_decal/siding/purple{ + dir = 4 + }, +/obj/machinery/dna_scannernew, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "oyy" = ( /obj/machinery/duct, /obj/machinery/light_switch/directional/south{ @@ -56015,6 +55696,13 @@ /obj/structure/sign/warning/biohazard/directional/west, /turf/open/floor/iron/white, /area/station/hallway/floor2/aft) +"oyW" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/iron/checker, +/area/station/commons/vacant_room/commissary) "oyZ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -56206,16 +55894,6 @@ }, /turf/open/floor/wood/tile, /area/station/service/chapel/office) -"oBF" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/machinery/computer/scan_consolenew, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "oBK" = ( /obj/structure/chair/comfy{ dir = 8 @@ -56460,15 +56138,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard/aft) -"oFw" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/effect/turf_decal/stripes{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/science/cytology) "oFF" = ( /obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -56480,6 +56149,19 @@ }, /turf/open/floor/iron/smooth_half, /area/station/tcommsat/server) +"oFH" = ( +/obj/structure/frame{ + anchored = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/circuit, +/area/station/science/cytology) +"oFI" = ( +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "oFM" = ( /obj/effect/spawner/structure/window/hollow/reinforced/directional, /obj/structure/cable, @@ -56544,14 +56226,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos) -"oGm" = ( -/obj/machinery/modular_computer/preset/civilian{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron, -/area/station/science/genetics) +"oGo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/door/firedoor, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor2/starboard) "oGt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56565,6 +56246,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/starboard/aft) +"oGF" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/mapping_helpers/airlock/access/all/science/genetics, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/science/glass{ + name = "Genetics Office" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/science/genetics) "oGL" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor/heavy, @@ -56638,18 +56334,6 @@ /obj/structure/broken_flooring/singular/directional/south, /turf/open/floor/plating, /area/station/maintenance/floor1/port) -"oHz" = ( -/obj/structure/girder/reinforced, -/obj/structure/cable, -/obj/effect/spawner/structure/window/hollow/reinforced/plasma/middle{ - dir = 4 - }, -/obj/machinery/door/poddoor/preopen{ - id = "Xenolab"; - name = "Test Chamber Blast Door" - }, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) "oHC" = ( /obj/structure/hedge/opaque, /obj/structure/window/reinforced/spawner/directional/east, @@ -56796,6 +56480,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/grass, /area/station/medical/virology) +"oJr" = ( +/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/machinery/door/poddoor/shutters/preopen{ @@ -56806,15 +56494,14 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/command/heads_quarters/cmo) -"oJF" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 +"oJH" = ( +/obj/effect/turf_decal/box/corners{ + dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/turf/open/floor/engine{ + initial_gas_mix = "o2=22;bz=82;TEMP=293.15" }, -/turf/open/floor/plating, -/area/station/science/genetics) +/area/station/science/xenobiology) "oJO" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/pod/dark, @@ -56841,15 +56528,6 @@ }, /turf/open/floor/wood, /area/station/security/detectives_office) -"oKH" = ( -/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer4{ - dir = 4 - }, -/obj/machinery/airalarm/directional/north{ - req_access = list("engineering") - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/pumproom) "oKK" = ( /obj/effect/turf_decal/trimline/yellow/line{ dir = 6 @@ -56965,6 +56643,11 @@ /obj/structure/railing, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) +"oMv" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/garbage, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "oMz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/camera/directional/west, @@ -56990,17 +56673,6 @@ dir = 8 }, /area/station/hallway/secondary/exit/departure_lounge) -"oMU" = ( -/obj/structure/rack, -/obj/item/circuitboard/machine/biogenerator{ - pixel_y = 6 - }, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/servo, -/obj/item/stack/cable_coil, -/obj/item/stack/sheet/glass/fifty, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "oMV" = ( /obj/structure/cable, /obj/machinery/light/red/dim/directional/east, @@ -57137,6 +56809,11 @@ dir = 8 }, /area/station/hallway/floor1/fore) +"oOR" = ( +/obj/structure/table/glass, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron/white, +/area/station/science/lower) "oOW" = ( /obj/structure/rack, /obj/item/gun/energy/e_gun/dragnet, @@ -57322,6 +56999,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/textured_large, /area/station/cargo/storage) +"oRq" = ( +/obj/machinery/door/window/left/directional/north{ + name = "Pen 3"; + req_access = list("xenobiology") + }, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "oRw" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -57454,15 +57138,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) -"oSD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/holopad, -/turf/open/floor/iron/white, -/area/station/science/cytology) "oSL" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Bulkhead" @@ -57608,6 +57283,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/silver, /area/station/service/chapel/funeral) +"oUu" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "oUE" = ( /obj/machinery/vending/wallmed/directional/north, /obj/structure/disposalpipe/segment{ @@ -57624,26 +57309,6 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/iron, /area/station/cargo/storage) -"oUN" = ( -/obj/machinery/door/airlock/science{ - name = "Genetics" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/science/genetics, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) -"oUW" = ( -/mob/living/simple_animal/slime, -/obj/machinery/camera/directional/south{ - c_tag = "Xenobiology - Slime Pens" - }, -/obj/machinery/light/cold/no_nightlight/directional/south, -/turf/open/floor/grass, -/area/station/science/xenobiology) "oVa" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -57735,13 +57400,6 @@ name = "boxing ring" }, /area/station/commons/fitness) -"oWv" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) "oWA" = ( /obj/machinery/light/red/dim/directional/west, /turf/open/floor/plating, @@ -57794,6 +57452,10 @@ /obj/structure/railing/corner, /turf/open/space/openspace, /area/space/nearstation) +"oXE" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron, +/area/station/science/cytology) "oXN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/siding/white{ @@ -57860,6 +57522,13 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/carpet/green, /area/station/commons/dorms/apartment1) +"oYI" = ( +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "oYL" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -58025,6 +57694,14 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/white, /area/station/science/xenobiology/hallway) +"pbk" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/holopad, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/science/cytology) "pbr" = ( /obj/machinery/light/directional/east, /obj/machinery/deepfryer, @@ -58226,6 +57903,13 @@ }, /turf/open/floor/iron/checker, /area/station/commons/vacant_room/commissary) +"pep" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "per" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -58374,15 +58058,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard/fore) -"pgT" = ( -/obj/machinery/photocopier, -/obj/structure/window/spawner/directional/south, -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 8 - }, -/turf/open/floor/iron/smooth, -/area/station/science/research/abandoned) "pgU" = ( /obj/effect/turf_decal/trimline/brown/filled/corner, /obj/structure/cable, @@ -58522,6 +58197,11 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) +"piJ" = ( +/turf/open/floor/engine{ + initial_gas_mix = "o2=22;bz=82;TEMP=293.15" + }, +/area/station/science/xenobiology) "piO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -58640,17 +58320,20 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) -"pko" = ( -/obj/machinery/airalarm/directional/east, -/obj/machinery/camera/emp_proof/directional/east, -/turf/open/floor/iron, -/area/station/engineering/atmos) "pkr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, /area/station/service/kitchen/abandoned) +"pkH" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/stripes, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/white, +/area/station/science/auxlab/firing_range) "pkR" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -58679,6 +58362,10 @@ dir = 1 }, /area/station/security/courtroom) +"plz" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "plC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -58885,6 +58572,13 @@ "pog" = ( /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard) +"pov" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/duct, +/turf/open/floor/grass, +/area/station/science/cytology) "poD" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -59244,12 +58938,6 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/wood, /area/station/service/kitchen/diner) -"psv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_white, -/area/station/science/cytology) "psJ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -59601,6 +59289,17 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/pod/light, /area/station/maintenance/solars/port/aft) +"pxL" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 9 + }, +/obj/structure/railing/corner/end/flip{ + dir = 1 + }, +/obj/machinery/light/cold/no_nightlight/directional/west, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/white, +/area/station/science/cytology) "pxQ" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, @@ -59672,6 +59371,12 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) +"pyO" = ( +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "pyQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59712,6 +59417,12 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/security/prison) +"pzb" = ( +/obj/effect/turf_decal/siding/wideplating_new{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "pzd" = ( /obj/effect/turf_decal/bot_white/left, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -59848,6 +59559,11 @@ /obj/machinery/meter, /turf/closed/wall/r_wall, /area/station/engineering/atmos) +"pAV" = ( +/obj/structure/flora/rock/pile/style_2, +/obj/machinery/duct, +/turf/open/misc/sandy_dirt, +/area/station/science/cytology) "pAY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59916,6 +59632,17 @@ "pCc" = ( /turf/open/floor/iron/showroomfloor, /area/station/service/theater) +"pCf" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/purple/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "pCg" = ( /obj/machinery/door/firedoor/heavy, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -60028,6 +59755,14 @@ /obj/machinery/duct, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) +"pDL" = ( +/obj/structure/closet/secure_closet/personal, +/obj/item/clothing/under/misc/assistantformal, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/shoes/winterboots, +/obj/machinery/bluespace_vendor/directional/east, +/turf/open/floor/iron/dark, +/area/station/commons/locker) "pDQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60143,15 +59878,21 @@ /obj/structure/closet/crate/trashcart, /turf/open/floor/pod/light, /area/station/maintenance/floor3/starboard/aft) -"pGc" = ( -/obj/item/kirbyplants/random, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 +"pGb" = ( +/obj/structure/table/glass, +/obj/item/camera_film{ + pixel_x = -6; + pixel_y = 5 }, -/obj/structure/sign/poster/official/random/directional/north, -/obj/machinery/light/small/directional/east, +/obj/item/camera, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, -/area/station/science/lower) +/area/station/science/cytology) "pGf" = ( /obj/structure/curtain/cloth/fancy, /obj/effect/mapping_helpers/airlock/access/any/service/kitchen, @@ -60458,12 +60199,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) -"pJZ" = ( -/obj/effect/spawner/random/contraband/landmine, -/turf/open/floor/engine{ - icon_state = "textured_dark" - }, -/area/station/maintenance/floor2/starboard/aft) "pKd" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -60491,6 +60226,12 @@ dir = 4 }, /area/station/hallway/floor1/aft) +"pKA" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/science/genetics) "pKD" = ( /obj/effect/turf_decal/trimline/red/line{ dir = 4 @@ -60504,6 +60245,11 @@ }, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) +"pKO" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/corner, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/rd) "pLe" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/pod/light, @@ -60921,6 +60667,10 @@ }, /turf/open/floor/iron/white/small, /area/station/commons/fitness/recreation) +"pQP" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/light, +/area/station/maintenance/floor2/starboard) "pQW" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -61241,9 +60991,6 @@ dir = 4 }, /area/station/hallway/floor2/fore) -"pVN" = ( -/turf/open/floor/iron, -/area/station/maintenance/floor4/starboard) "pVP" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -61338,6 +61085,17 @@ /obj/effect/turf_decal/trimline/dark_blue/filled/corner, /turf/open/floor/iron/dark/corner, /area/station/hallway/floor3/aft) +"pXR" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/checker{ + dir = 1 + }, +/area/station/science/genetics) "pXT" = ( /obj/structure/chair/plastic{ dir = 4 @@ -61810,11 +61568,6 @@ }, /turf/open/floor/iron, /area/station/hallway/floor1/aft) -"qdO" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) "qdV" = ( /turf/open/floor/plating/airless, /area/station/solars/starboard/fore) @@ -61866,15 +61619,6 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/carbon_input, /turf/open/floor/engine/co2, /area/station/engineering/atmos) -"qel" = ( -/obj/effect/turf_decal/stripes{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/closet/secure_closet/cytology, -/turf/open/floor/plating, -/area/station/science/cytology) "qem" = ( /obj/machinery/door/airlock/wood{ name = "Bedroom" @@ -62043,13 +61787,6 @@ }, /turf/open/floor/iron/white, /area/station/science/circuits) -"qgR" = ( -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/engine, -/area/station/science/xenobiology) "qgT" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/heat_exchanging/manifold, @@ -62067,14 +61804,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/port/fore) -"qhn" = ( -/obj/effect/turf_decal/stripes, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "qhp" = ( /obj/machinery/camera/directional/east{ c_tag = "MiniSAT Access Staircase" @@ -62154,14 +61883,6 @@ /obj/machinery/atmospherics/pipe/multiz/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/hallway/floor3/fore) -"qjg" = ( -/obj/effect/turf_decal/trimline/purple/line, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "qjj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62573,22 +62294,6 @@ /obj/machinery/light/directional/west, /turf/open/floor/wood, /area/station/service/kitchen/diner) -"qpa" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/button/ignition{ - id = "Xenobio"; - pixel_x = -4; - pixel_y = 24 - }, -/obj/machinery/button/door/directional/north{ - id = "Xenolab"; - name = "Test Chamber Blast Doors"; - pixel_x = 6; - req_access = list("xenobiology") - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) "qpb" = ( /obj/structure/window/reinforced/plasma/spawner/directional/south, /obj/structure/foamedmetal, @@ -62660,14 +62365,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) -"qqI" = ( -/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/station/science/research/abandoned) "qqY" = ( /obj/effect/turf_decal/trimline/green/line{ dir = 4 @@ -62704,6 +62401,10 @@ }, /turf/open/floor/engine/co2, /area/station/engineering/atmos) +"qrx" = ( +/obj/machinery/hydroponics/constructable, +/turf/open/floor/circuit, +/area/station/science/cytology) "qry" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -62873,6 +62574,16 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port) +"qtp" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/science/genetics) "qty" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -62960,15 +62671,6 @@ dir = 1 }, /area/station/hallway/floor3/fore) -"qtY" = ( -/obj/structure/cable, -/obj/machinery/power/smes/engineering{ - input_level = 60000; - output_level = 60000 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth_large, -/area/station/maintenance/floor2/starboard) "qun" = ( /turf/closed/wall/r_wall, /area/station/science/genetics) @@ -63018,15 +62720,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/psychology) -"qvb" = ( -/obj/effect/turf_decal/trimline/purple/line{ +"quW" = ( +/obj/machinery/button/ignition{ + id = "Xenobio"; + pixel_x = -4; + pixel_y = 24 + }, +/obj/machinery/button/door/directional/north{ + id = "Xenolab"; + name = "Test Chamber Blast Doors"; + pixel_x = 6; + req_access = list("xenobiology") + }, +/obj/effect/turf_decal/stripes{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) +/turf/open/floor/iron/dark, +/area/station/science/cytology) "qvc" = ( /obj/structure/chair/stool/bar/directional/north, /obj/item/stack/arcadeticket, @@ -63224,6 +62934,9 @@ initial_gas_mix = "TEMP=2.7" }, /area/station/science/ordnance/bomb) +"qxh" = ( +/turf/closed/wall/r_wall, +/area/station/science/lower) "qxr" = ( /obj/machinery/door/firedoor/border_only{ dir = 1 @@ -63249,6 +62962,12 @@ dir = 6 }, /area/station/service/library/private) +"qxI" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "qxJ" = ( /obj/effect/turf_decal/siding/white{ dir = 10 @@ -63357,10 +63076,8 @@ /turf/open/floor/iron/checker, /area/station/cargo/miningdock) "qyH" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ - dir = 4 - }, /obj/machinery/atmospherics/components/binary/pump/off/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) "qyJ" = ( @@ -63423,6 +63140,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/smooth_corner, /area/station/cargo/miningdock) +"qzo" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white, +/area/station/science/cytology) "qzx" = ( /obj/structure/bookcase/random/fiction, /turf/open/floor/carpet/royalblack, @@ -63473,6 +63197,13 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/starboard) +"qAa" = ( +/obj/machinery/door/window/left/directional/north{ + name = "Pen 2"; + req_access = list("xenobiology") + }, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "qAd" = ( /obj/structure/railing{ dir = 4 @@ -63632,11 +63363,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/side, /area/station/hallway/secondary/exit/escape_pod) -"qBR" = ( -/obj/effect/spawner/structure/window/reinforced/tinted, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) "qBW" = ( /obj/structure/table, /obj/item/ai_module/reset, @@ -63746,16 +63472,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/office) -"qCY" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Auxillary Slime Pen" - }, -/obj/machinery/door/window/left/directional/south{ - name = "Pen 5"; - req_access = list("xenobiology") - }, -/turf/open/floor/grass, -/area/station/science/xenobiology) "qCZ" = ( /obj/structure/table/reinforced, /obj/item/surgical_drapes{ @@ -63857,6 +63573,15 @@ }, /turf/open/openspace, /area/station/maintenance/floor2/port/aft) +"qEb" = ( +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/cytology) "qEe" = ( /obj/structure/table, /obj/effect/spawner/random/food_or_drink/donkpockets, @@ -63883,6 +63608,21 @@ dir = 10 }, /area/station/security/courtroom) +"qEw" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ + dir = 4 + }, +/turf/open/floor/engine/airless, +/area/station/engineering/supermatter/waste) +"qEy" = ( +/obj/effect/turf_decal/trimline/purple/warning{ + dir = 9 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor2/starboard) "qEA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -64181,6 +63921,10 @@ }, /turf/open/floor/iron/dark/textured, /area/station/command/heads_quarters/ce) +"qIv" = ( +/obj/effect/turf_decal/trimline/purple/warning, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor3/starboard) "qIz" = ( /obj/effect/turf_decal/trimline/yellow/line{ dir = 8 @@ -64191,12 +63935,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) -"qID" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/holopad, -/turf/open/floor/iron/smooth_half, -/area/station/maintenance/radshelter/sci) "qIM" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64221,15 +63959,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron/checker, /area/station/service/bar) -"qJa" = ( -/obj/structure/closet{ - name = "janitorial supplies" - }, -/obj/item/pushbroom, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "qJj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -64301,6 +64030,11 @@ /obj/effect/spawner/random/mod/maint, /turf/open/floor/wood, /area/station/maintenance/floor3/starboard/aft) +"qKI" = ( +/obj/item/stack/sheet/iron, +/obj/effect/spawner/random/structure/furniture_parts, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/floor2/starboard/aft) "qKN" = ( /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/iron/dark, @@ -64441,6 +64175,13 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/carpet/red, /area/station/commons/dorms/room1) +"qNG" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/modular_computer/preset/civilian, +/obj/machinery/airalarm/directional/west, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/science/genetics) "qNK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -64763,6 +64504,11 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/wood/parquet, /area/station/commons/dorms/room2) +"qQS" = ( +/obj/effect/landmark/start/cyborg, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat) "qRi" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor/heavy, @@ -64869,6 +64615,16 @@ /obj/structure/ladder, /turf/open/floor/catwalk_floor, /area/station/hallway/floor2/aft) +"qSv" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "qSz" = ( /obj/effect/turf_decal/trimline/purple/filled/corner, /obj/machinery/camera/directional/south{ @@ -64919,6 +64675,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) +"qTw" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/white, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "qTA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -65037,13 +64798,17 @@ }, /turf/open/floor/wood/large, /area/station/medical/virology/isolation) -"qVx" = ( -/obj/machinery/newscaster/directional/west, -/obj/structure/chair/comfy/shuttle{ - dir = 4 +"qVO" = ( +/obj/structure/railing{ + dir = 1 }, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/maintenance/radshelter/sci) +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "qVV" = ( /obj/machinery/mecha_part_fabricator, /turf/open/floor/iron/dark, @@ -65139,11 +64904,21 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plating, /area/station/maintenance/floor1/port/fore) -"qXh" = ( -/obj/machinery/smartfridge/extract/preloaded, -/obj/machinery/newscaster/directional/west, +"qXi" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/corner, /turf/open/floor/iron/white, -/area/station/science/xenobiology) +/area/station/command/heads_quarters/rd) +"qXj" = ( +/obj/structure/railing{ + dir = 10 + }, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/station/science/cytology) "qXk" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 4 @@ -65225,19 +65000,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/prison/garden) -"qXx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) "qXy" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable/layer3, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat) +"qXE" = ( +/obj/structure/table, +/obj/item/plate, +/obj/item/knife/plastic{ + pixel_x = 16 + }, +/obj/item/food/donkpocket/warm/berry{ + pixel_y = 7 + }, +/turf/open/floor/iron/kitchen, +/area/station/command/heads_quarters/rd) "qXQ" = ( /mob/living/carbon/human/species/monkey{ name = "Banana" @@ -65352,6 +65131,15 @@ /obj/structure/cable, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port/fore) +"qZA" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/science/lower) "qZF" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, @@ -65391,10 +65179,6 @@ "rac" = ( /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/cmo) -"rad" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron/white, -/area/station/science/cytology) "rag" = ( /obj/machinery/atmospherics/pipe/layer_manifold/purple/visible, /obj/machinery/camera{ @@ -65683,11 +65467,6 @@ }, /turf/open/floor/glass/reinforced, /area/station/service/library) -"rdv" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/grass, -/area/station/science/xenobiology) "rdx" = ( /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible{ dir = 4 @@ -65752,12 +65531,6 @@ }, /turf/open/floor/glass/reinforced, /area/station/service/library) -"rdZ" = ( -/obj/structure/cable, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/hallway/secondary/exit) "rec" = ( /obj/structure/cable, /turf/open/floor/iron/dark/side{ @@ -66109,6 +65882,10 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/miningdock) +"rip" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "riy" = ( /obj/effect/turf_decal/trimline/yellow/warning, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66161,6 +65938,12 @@ dir = 4 }, /area/station/maintenance/floor1/starboard/aft) +"rjm" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/light_switch/directional/south, +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/science/genetics) "rjp" = ( /obj/effect/turf_decal/trimline/yellow/corner{ dir = 8 @@ -66323,6 +66106,11 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) +"rms" = ( +/obj/effect/spawner/random/structure/crate, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "rmz" = ( /obj/structure/chair/sofa/bench/left{ dir = 8 @@ -66467,9 +66255,23 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/hallway/floor2/aft) +"rom" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/closet/radiation, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "roo" = ( /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/floor3/aft) +"rov" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace, +/area/station/maintenance/floor3/starboard) "roy" = ( /obj/item/toy/plush/beeplushie{ desc = "Maybe hugging this will make you feel better about yourself."; @@ -66728,6 +66530,10 @@ "rrR" = ( /turf/open/floor/iron, /area/station/commons/locker) +"rrW" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "rrX" = ( /turf/open/floor/iron/dark, /area/station/command/bridge) @@ -66781,6 +66587,16 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard/aft) +"rsT" = ( +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer4{ + dir = 4 + }, +/obj/item/paper{ + default_raw_text = "Once you have gas coming in from the SM to the containment chamber, you'll need to cool it.-
To set up the waste gas cooling loop, follow these steps:
  1. Wrench in the plasma can.
2. Turn on the waste Cooling Gas pump and set the thermomachines to cold.
3. Set up the scrubbers in the chamber using the air alarm.
4. Turn on the filter to the canisters or replace it.
5. Turn on the Supermatter Waste To Port pump.

Once everything on that list is complete, make sure that gas isn't building up inside the chamber or the pipes and you are done."; + name = "HOW TO SET UP THE SM WASTE" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/pumproom) "rsW" = ( /turf/open/floor/carpet/blue, /area/station/maintenance/floor3/port/aft) @@ -66845,15 +66661,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) -"rtG" = ( -/obj/item/radio/intercom/directional/south, -/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/station/science/research/abandoned) "rtH" = ( /obj/machinery/vending/boozeomat/all_access, /obj/effect/decal/cleanable/dirt, @@ -66927,6 +66734,14 @@ }, /turf/open/floor/iron/dark/side, /area/station/hallway/floor4/fore) +"rwc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/moisture_trap, +/obj/effect/turf_decal/stripes{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/station/maintenance/floor2/starboard) "rwh" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/wood, @@ -66999,25 +66814,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) -"rwP" = ( -/obj/effect/turf_decal/siding/white/corner{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"rwV" = ( -/obj/structure/rack, -/obj/item/mod/core/standard{ - pixel_x = 4; - pixel_y = -4 - }, -/obj/item/mod/core/standard, -/obj/item/mod/core/standard{ - pixel_x = -4; - pixel_y = 4 - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/science/robotics/lab) "rwY" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/modular_computer/preset/civilian{ @@ -67258,6 +67054,15 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/wood, /area/station/command/meeting_room) +"rAm" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ + dir = 5 + }, +/turf/open/floor/engine/airless, +/area/station/engineering/supermatter/waste) "rAu" = ( /obj/structure/cable, /obj/machinery/computer/operating{ @@ -67327,6 +67132,13 @@ /obj/structure/table/wood/fancy/red, /turf/open/floor/carpet/royalblack, /area/station/service/kitchen/diner) +"rBF" = ( +/obj/structure/stairs/north, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "rBI" = ( /obj/machinery/door/airlock/science/glass{ name = "Laboratory B" @@ -67341,6 +67153,11 @@ }, /turf/open/floor/iron/white, /area/station/science/circuits) +"rBK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/purple/visible, +/obj/effect/spawner/structure/window/reinforced/plasma, +/turf/open/floor/engine/air, +/area/station/engineering/supermatter/waste) "rBP" = ( /turf/closed/wall/r_wall, /area/station/engineering/lobby) @@ -67579,10 +67396,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) -"rFt" = ( -/obj/machinery/light/cold/no_nightlight/directional/east, -/turf/open/openspace, -/area/station/science/cytology) "rFy" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -67842,15 +67655,6 @@ /obj/effect/spawner/random/medical/memeorgans, /turf/open/floor/iron/kitchen, /area/station/service/kitchen/abandoned) -"rJr" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/station/maintenance/floor2/starboard) "rJv" = ( /obj/structure/table/glass, /obj/item/storage/box/rxglasses, @@ -67860,6 +67664,13 @@ "rJy" = ( /turf/open/floor/pod, /area/station/cargo/miningdock) +"rJC" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/science/cytology) "rJF" = ( /turf/closed/wall, /area/station/security/prison/safe) @@ -67892,6 +67703,13 @@ }, /turf/open/floor/iron, /area/station/science/auxlab) +"rKc" = ( +/obj/structure/cable, +/obj/machinery/mining_weather_monitor/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/hallway/secondary/exit) "rKg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -68074,6 +67892,17 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/textured_large, /area/station/cargo/sorting) +"rMC" = ( +/obj/effect/turf_decal/siding/white/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "rMD" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/textured_large, @@ -68126,14 +67955,6 @@ /obj/machinery/status_display/ai/directional/north, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) -"rNm" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/engine{ - icon_state = "textured_dark" - }, -/area/station/maintenance/floor2/starboard/aft) "rNo" = ( /turf/closed/wall, /area/station/service/chapel) @@ -68299,6 +68120,13 @@ /obj/item/shard, /turf/open/floor/engine, /area/station/maintenance/floor1/port/aft) +"rQc" = ( +/obj/machinery/computer/camera_advanced/xenobio{ + dir = 4 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/circuit, +/area/station/science/xenobiology) "rQd" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 9 @@ -68337,13 +68165,24 @@ /turf/open/floor/iron, /area/station/hallway/floor3/aft) "rQx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor/border_only{ dir = 8 }, +/obj/machinery/atmospherics/components/binary/pump/on/supply/hidden/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/starboard/fore) +"rQG" = ( +/obj/machinery/chem_master{ + name = "CytoMaster 3000" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/circuit, +/area/station/science/cytology) "rQV" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/aisat/hallway) @@ -68454,6 +68293,9 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"rSD" = ( +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "rSJ" = ( /obj/structure/chair/plastic{ dir = 8 @@ -68649,6 +68491,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) +"rUJ" = ( +/obj/effect/turf_decal/siding/purple{ + dir = 1 + }, +/obj/structure/table, +/obj/item/storage/box/monkeycubes{ + pixel_x = 4 + }, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "rUN" = ( /obj/structure/disposalpipe/segment, /obj/structure/railing/corner/end/flip, @@ -68781,6 +68635,12 @@ /obj/machinery/light/floor, /turf/open/floor/pod, /area/station/hallway/secondary/entry) +"rXg" = ( +/obj/effect/turf_decal/stripes{ + dir = 5 + }, +/turf/open/floor/engine, +/area/station/science/cytology) "rXp" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/random/directional/north, @@ -68932,10 +68792,6 @@ /obj/structure/reagent_dispensers/watertank/high, /turf/open/floor/iron, /area/station/service/janitor) -"rZu" = ( -/obj/effect/landmark/start/cyborg, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat) "rZC" = ( /obj/structure/showcase/cyborg/old{ dir = 4; @@ -69157,11 +69013,32 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron, /area/station/maintenance/floor2/starboard/aft) +"sdg" = ( +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, +/turf/open/floor/engine{ + initial_gas_mix = "o2=22;bz=82;TEMP=293.15" + }, +/area/station/science/xenobiology) "sdh" = ( /obj/structure/cable, /obj/effect/spawner/random/structure/grille, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port) +"sdi" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "sdo" = ( /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/siding/thinplating_new/dark, @@ -69355,6 +69232,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/hallway/floor3/fore) +"sgc" = ( +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/line, +/obj/machinery/firealarm/directional/south, +/obj/machinery/camera/directional/south{ + c_tag = "Cytology - Lab" + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "sgm" = ( /obj/structure/chair/office{ dir = 1 @@ -69400,6 +69288,15 @@ }, /turf/open/floor/iron/white, /area/station/medical/abandoned) +"sgT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sink/directional/east, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/checker{ + dir = 1 + }, +/area/station/science/genetics) "shd" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -69527,6 +69424,14 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/bamboo/tatami/black, /area/station/commons/storage/art) +"sjf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/checker{ + dir = 1 + }, +/area/station/science/genetics) "sjs" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/ce, /obj/machinery/door/airlock/engineering{ @@ -69557,6 +69462,11 @@ /obj/effect/mapping_helpers/airlock/access/any/service/theatre, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port/aft) +"sjW" = ( +/obj/structure/closet, +/obj/effect/spawner/random/maintenance/five, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor2/starboard) "sjX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -69701,6 +69611,13 @@ }, /turf/open/floor/iron/white, /area/station/science/lower) +"smx" = ( +/obj/structure/table, +/obj/item/pai_card{ + pixel_y = 6 + }, +/turf/open/floor/iron/checker, +/area/station/commons/vacant_room/commissary) "smJ" = ( /turf/open/floor/plating, /area/station/maintenance/floor3/port/fore) @@ -69871,13 +69788,6 @@ /obj/effect/turf_decal/tile/blue/full, /turf/open/floor/iron/dark/smooth_large, /area/station/engineering/storage/tech) -"spo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/engine{ - icon_state = "textured_dark" - }, -/area/station/maintenance/floor2/starboard/aft) "spr" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/station/maintenance/floor2/starboard/aft) @@ -70167,11 +70077,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) -"suh" = ( -/obj/structure/table, -/obj/machinery/microwave, -/turf/open/floor/iron/kitchen, -/area/station/command/heads_quarters/rd) "sui" = ( /obj/structure/railing{ dir = 4 @@ -70216,6 +70121,13 @@ /obj/effect/spawner/random/trash/grime, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) +"suv" = ( +/obj/machinery/processor/slime, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/circuit, +/area/station/science/xenobiology) "suB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -70318,18 +70230,14 @@ "svX" = ( /turf/closed/wall, /area/station/commons/locker) -"swe" = ( -/obj/machinery/modular_computer/preset/engineering{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating_new/corner{ +"swk" = ( +/obj/item/kirbyplants/random, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/noticeboard/directional/west, -/obj/structure/cable, -/turf/open/floor/iron/smooth_edge, -/area/station/science/research/abandoned) +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white, +/area/station/science/lower) "swm" = ( /obj/machinery/air_sensor/nitrogen_tank, /obj/effect/turf_decal/trimline/red/line, @@ -70677,6 +70585,9 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor2/port) +"sAH" = ( +/turf/closed/wall/r_wall, +/area/station/engineering/supermatter/waste) "sAI" = ( /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, @@ -70810,6 +70721,12 @@ /obj/item/kirbyplants/photosynthetic, /turf/open/floor/pod/dark, /area/station/maintenance/floor4/starboard) +"sCH" = ( +/obj/structure/frame/machine, +/obj/item/circuitboard/machine/telecomms/relay, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "sDg" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 8 @@ -70982,17 +70899,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/fakebasalt, /area/station/maintenance/floor3/port) +"sEU" = ( +/obj/structure/closet/firecloset, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "sFa" = ( /turf/open/floor/wood, /area/station/command/meeting_room) -"sFb" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/effect/turf_decal/siding/white/corner, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) "sFe" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -71049,6 +70963,13 @@ /obj/structure/sign/nanotrasen, /turf/closed/wall/r_wall, /area/station/command/bridge) +"sGh" = ( +/obj/machinery/door/airlock/hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/xenobio, +/turf/open/floor/plating, +/area/station/science/cytology) "sGu" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -71491,12 +71412,36 @@ /obj/effect/spawner/structure/window/hollow/end, /turf/open/floor/plating, /area/station/maintenance/floor2/starboard) +"sLm" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Science - Deck 3 Hall" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/corner{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/sign/warning/xeno_mining/directional/north, +/turf/open/floor/iron/white, +/area/station/science/xenobiology/hallway) "sLq" = ( /obj/machinery/door/firedoor/border_only{ dir = 8 }, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) +"sLE" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security Entrance" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/floor2/starboard/aft) "sLF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ @@ -71514,25 +71459,17 @@ dir = 1 }, /area/station/hallway/floor2/aft) -"sLL" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 +"sLX" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/purple{ + dir = 10 }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" }, -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -6; - pixel_y = 6 - }, -/obj/item/pen{ - pixel_x = -6; - pixel_y = 7 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/smooth, -/area/station/science/research/abandoned) +/area/station/science/genetics) "sLY" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/broken/directional/east, @@ -71855,6 +71792,12 @@ /obj/structure/sign/directions/evac/directional/west, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"sQT" = ( +/obj/effect/turf_decal/stripes, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor2/starboard) "sRd" = ( /obj/effect/mapping_helpers/airlock/access/all/command/captain, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71894,16 +71837,6 @@ }, /turf/open/floor/iron/white, /area/station/science/lobby) -"sRE" = ( -/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer4{ - dir = 4 - }, -/obj/item/paper{ - default_raw_text = "Once you have gas coming in from the SM to the containment chamber, you'll need to cool it.
In this order:
1. Wrench in the plasma can.
2. Turn on the Waste Cooling Gas pump and turn the thermomachines to cold.
3. Set up the scrubbers in the chamber using the air alarm.
4. Turn on/replace the filter to the canisters.
5. Decide if you want to send the gas to atmos with the Supermatter Waste To Port pump, or waste it by sending it to space with the Emergency Release Valve."; - name = "HOW TO SET UP THE SM WASTE" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/pumproom) "sRG" = ( /obj/effect/turf_decal/trimline/blue/corner{ dir = 4 @@ -71922,6 +71855,7 @@ /obj/effect/turf_decal/tile/red/half{ dir = 1 }, +/obj/vehicle/ridden/secway, /turf/open/floor/iron/dark, /area/station/security/eva) "sRO" = ( @@ -71934,14 +71868,6 @@ "sRR" = ( /turf/closed/wall, /area/station/medical/paramedic) -"sRY" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "sRZ" = ( /obj/effect/turf_decal/tile/purple/fourcorners, /obj/item/kirbyplants/random, @@ -72015,11 +71941,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint) -"sTC" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/science/cytology) "sTD" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -72029,19 +71950,6 @@ /obj/structure/table/glass, /turf/open/floor/wood/tile, /area/station/command/heads_quarters/captain/private) -"sTN" = ( -/obj/effect/turf_decal/siding/white{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/landmark/start/scientist, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "sTQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -72053,6 +71961,14 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/aft) +"sTT" = ( +/obj/structure/table/glass, +/obj/item/food/grown/carrot, +/obj/item/food/grown/wheat, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/cytology) "sTU" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -72857,22 +72773,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/wood/large, /area/station/security/prison/safe) -"tdd" = ( -/obj/structure/table, -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/item/clothing/gloves/latex{ - pixel_x = 4; - pixel_y = 9 - }, -/obj/item/storage/box/monkeycubes{ - pixel_x = 4 - }, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "tde" = ( /obj/effect/spawner/random/trash/garbage{ spawn_scatter_radius = 1 @@ -72892,12 +72792,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white/textured, /area/station/medical/office) -"tdw" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/science/cytology) "tdz" = ( /obj/effect/turf_decal/trimline/brown/filled/line, /obj/effect/turf_decal/trimline/brown/filled/mid_joiner, @@ -73149,15 +73043,22 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/carpet/green, /area/station/service/abandoned_gambling_den) -"tgM" = ( -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 10 +"tgF" = ( +/obj/effect/turf_decal/stripes{ + dir = 9 }, -/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer4{ - dir = 8 +/obj/item/stack/sheet/glass{ + amount = 30 }, -/turf/closed/wall/r_wall, -/area/station/engineering/atmos/pumproom) +/obj/structure/closet/crate/science{ + name = "Chamber Supplies" + }, +/obj/item/stack/ducts/fifty, +/obj/item/storage/toolbox/mechanical, +/obj/item/electronics/airlock, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "tgP" = ( /obj/effect/turf_decal/tile/green/full, /obj/effect/decal/cleanable/dirt, @@ -73199,17 +73100,6 @@ /obj/structure/closet/firecloset/full, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard/aft) -"thj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "thq" = ( /obj/structure/railing{ dir = 5 @@ -73268,15 +73158,6 @@ "tic" = ( /turf/open/floor/wood, /area/station/commons/dorms/apartment2) -"tid" = ( -/obj/structure/table/glass, -/obj/machinery/newscaster/directional/west, -/obj/machinery/fax{ - fax_name = "Research Director's Office"; - name = "Research Director's Fax Machine" - }, -/turf/open/floor/iron/large, -/area/station/command/heads_quarters/rd) "til" = ( /obj/structure/sign/poster/contraband/grey_tide, /turf/closed/wall, @@ -73364,6 +73245,15 @@ /obj/effect/spawner/random/decoration/glowstick, /turf/open/floor/pod, /area/station/maintenance/floor4/starboard/aft) +"tjM" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/table, +/obj/machinery/microwave, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/kitchen, +/area/station/command/heads_quarters/rd) "tjN" = ( /turf/open/floor/iron, /area/station/maintenance/solars/starboard/fore) @@ -73405,26 +73295,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard/fore) -"tkc" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 8; - volume_rate = 200 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer4{ - dir = 8 - }, -/turf/open/floor/engine/airless, -/area/station/engineering/atmos/pumproom) -"tko" = ( -/obj/item/stack/sheet/iron, -/obj/effect/spawner/random/structure/furniture_parts, -/turf/open/floor/engine{ - icon_state = "textured_dark" - }, -/area/station/maintenance/floor2/starboard/aft) "tkq" = ( /turf/closed/wall, /area/station/solars/starboard/aft) @@ -73479,6 +73349,12 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/port/aft) +"tlb" = ( +/mob/living/simple_animal/slime, +/turf/open/floor/engine{ + initial_gas_mix = "o2=22;bz=82;TEMP=293.15" + }, +/area/station/science/xenobiology) "tld" = ( /obj/structure/table/reinforced, /obj/item/stack/sheet/mineral/plasma/five, @@ -73506,6 +73382,16 @@ /obj/structure/chair/stool, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"tll" = ( +/obj/structure/sign/poster/official/random/directional/north, +/obj/effect/turf_decal/siding/purple{ + dir = 5 + }, +/obj/machinery/dna_scannernew, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "tlq" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east{ @@ -73536,18 +73422,17 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/floor4/port) -"tlF" = ( -/obj/machinery/atmospherics/components/binary/pump/off{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/effect/landmark/start/scientist, -/turf/open/floor/iron/white, -/area/station/science/cytology) "tlJ" = ( /obj/machinery/camera/autoname/directional/east, /turf/open/space/openspace, /area/space) +"tlK" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/circuit, +/area/station/science/xenobiology) "tlX" = ( /obj/machinery/modular_computer/preset/civilian{ dir = 8 @@ -73682,6 +73567,12 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/textured_large, /area/station/cargo/miningdock) +"tnA" = ( +/obj/machinery/light/cold/no_nightlight/directional/south, +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/station/hallway/secondary/service) "tnC" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -73892,6 +73783,11 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/science/lobby) +"tpV" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/science/genetics) "tpW" = ( /obj/effect/turf_decal/tile/green/opposingcorners, /obj/effect/baseturf_helper/reinforced_plating/ceiling, @@ -74015,6 +73911,15 @@ /obj/structure/grille, /turf/open/floor/plating, /area/station/maintenance/floor3/port/aft) +"trP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/camera/emp_proof/directional/east, +/turf/open/floor/iron/dark/textured_edge{ + dir = 8 + }, +/area/station/medical/chemistry) "trV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -74022,14 +73927,6 @@ /obj/machinery/light/red/dim/directional/west, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/port/fore) -"trZ" = ( -/obj/effect/turf_decal/trimline/purple/warning, -/obj/machinery/light/red/dim/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/closet_maintenance, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor2/starboard) "tsi" = ( /obj/structure/table/wood, /obj/item/book/manual/wiki/security_space_law, @@ -74199,12 +74096,6 @@ }, /turf/open/floor/iron, /area/station/hallway/floor4/fore) -"tuA" = ( -/obj/machinery/monkey_recycler, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/circuit, -/area/station/science/xenobiology) "tuB" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/grille/broken, @@ -74232,6 +74123,15 @@ }, /turf/open/floor/iron, /area/station/hallway/floor2/fore) +"tuX" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/science/lower) "tve" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -74317,6 +74217,18 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor2/starboard/aft) +"twv" = ( +/obj/machinery/requests_console/directional/east{ + department = "Xenobiology"; + name = "Xenobiology Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/ore_update, +/obj/machinery/shower/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/noslip, +/area/station/science/xenobiology) "twx" = ( /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) @@ -74371,19 +74283,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port) -"twT" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ - dir = 8; - initialize_directions = 4; - name = "euthanization chamber freezer" - }, -/obj/effect/turf_decal/stripes{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "twZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -74405,6 +74304,9 @@ /obj/item/reagent_containers/spray/cleaner, /turf/open/floor/iron/white/textured, /area/station/medical/treatment_center) +"txu" = ( +/turf/open/floor/iron/dark, +/area/station/science/cytology) "txv" = ( /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 4 @@ -74420,17 +74322,24 @@ "txA" = ( /turf/open/floor/plating/foam, /area/station/maintenance/floor2/starboard/fore) +"txB" = ( +/obj/effect/turf_decal/siding/white, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/white/corner{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "txC" = ( /obj/machinery/light/red/dim/directional/east, /turf/open/floor/plating, /area/station/maintenance/floor3/port/fore) -"txM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/effect/decal/cleanable/oil/streak, -/turf/open/floor/plating/elevatorshaft, -/area/station/science/research/abandoned) +"txF" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance/two, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "txP" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -74807,6 +74716,12 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port) +"tDp" = ( +/obj/structure/bonfire, +/obj/item/melee/moonlight_greatsword, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/stone, +/area/station/maintenance/floor3/starboard/fore) "tDs" = ( /turf/open/floor/iron, /area/station/hallway/floor4/aft) @@ -74931,13 +74846,6 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron/dark/textured, /area/station/medical/virology/isolation) -"tEN" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/lower) "tEW" = ( /obj/machinery/camera/autoname/directional/west, /obj/machinery/light/floor, @@ -74993,11 +74901,6 @@ }, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"tFM" = ( -/obj/effect/turf_decal/stripes, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor2/starboard) "tFO" = ( /obj/effect/turf_decal/tile/red/half/contrasted, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -75066,6 +74969,18 @@ "tGE" = ( /turf/open/floor/iron/textured, /area/station/command/heads_quarters/qm) +"tGS" = ( +/obj/machinery/computer/scan_consolenew{ + dir = 8 + }, +/obj/effect/turf_decal/siding/purple{ + dir = 6 + }, +/obj/structure/sign/poster/official/random/directional/east, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "tGW" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/caution/stand_clear/white{ @@ -75177,25 +75092,6 @@ /obj/machinery/shower/directional/west, /turf/open/floor/noslip, /area/station/science/lobby) -"tIF" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/structure/table, -/obj/item/flashlight/lamp/green{ - pixel_x = 8; - pixel_y = 16 - }, -/obj/item/papercutter, -/obj/item/toy/figure/qm{ - pixel_x = 8; - pixel_y = -2 - }, -/turf/open/floor/iron/smooth, -/area/station/science/research/abandoned) "tIG" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Bulkhead" @@ -75245,10 +75141,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/execution/transfer) -"tJd" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/fore) "tJi" = ( /obj/effect/turf_decal/trimline/yellow/line{ dir = 1 @@ -75272,21 +75164,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"tJq" = ( -/obj/effect/turf_decal/siding/white, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/line, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"tJs" = ( -/obj/structure/closet/secure_closet/freezer/empty, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/kitchen, -/area/station/command/heads_quarters/rd) "tJu" = ( /turf/open/floor/iron/dark/side{ dir = 5 @@ -75419,18 +75296,6 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/hallway) -"tKQ" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/table, -/obj/item/transfer_valve{ - pixel_x = -5 - }, -/obj/item/transfer_valve{ - pixel_x = 5 - }, -/obj/item/transfer_valve, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) "tKU" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -75448,6 +75313,18 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron, /area/station/hallway/floor1/aft) +"tLb" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) +"tLf" = ( +/obj/effect/spawner/random/contraband/landmine, +/turf/open/floor/iron, +/area/station/maintenance/floor4/starboard) "tLg" = ( /obj/effect/turf_decal/trimline/green/filled/end, /turf/open/floor/iron, @@ -75718,12 +75595,6 @@ }, /turf/open/floor/carpet/red, /area/station/service/theater) -"tOQ" = ( -/obj/structure/window/spawner/directional/south, -/obj/structure/filingcabinet/employment, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/iron/smooth, -/area/station/science/research/abandoned) "tOS" = ( /obj/effect/mapping_helpers/burnt_floor, /obj/machinery/portable_atmospherics/canister, @@ -75743,6 +75614,20 @@ /obj/machinery/defibrillator_mount/directional/north, /turf/open/floor/iron/white/textured, /area/station/medical/treatment_center) +"tPj" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/table/glass, +/obj/effect/turf_decal/siding/purple{ + dir = 1 + }, +/obj/structure/microscope, +/obj/structure/disposalpipe/segment, +/obj/item/biopsy_tool{ + pixel_x = -10; + pixel_y = 3 + }, +/turf/open/floor/iron, +/area/station/science/cytology) "tPk" = ( /turf/open/misc/sandy_dirt, /area/station/maintenance/floor1/starboard) @@ -75859,6 +75744,11 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/dark, /area/station/security/courtroom) +"tRi" = ( +/obj/structure/filingcabinet, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/dark/smooth_large, +/area/station/service/library/printer) "tRj" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, @@ -76064,11 +75954,17 @@ /obj/effect/mapping_helpers/airlock/access/all/science/research, /turf/open/floor/iron/white, /area/station/science/lab) -"tUn" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/white, -/area/station/science/cytology) +"tUq" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/purple/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "tUx" = ( /obj/structure/chair{ dir = 1 @@ -76256,6 +76152,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor2/starboard/fore) +"tXB" = ( +/obj/effect/turf_decal/siding/white, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "tXF" = ( /obj/machinery/power/shuttle_engine/propulsion/burst{ dir = 4 @@ -76324,6 +76230,15 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) +"tYg" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/science/lower) "tYl" = ( /obj/machinery/door/poddoor/shutters/radiation/preopen{ id = "radshutnorth" @@ -76376,17 +76291,6 @@ dir = 8 }, /area/station/hallway/floor4/fore) -"tZh" = ( -/obj/machinery/door/airlock/science{ - name = "Monkey Pen" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/all/science/genetics, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "tZq" = ( /obj/structure/chair/stool/directional/south, /obj/effect/turf_decal/stripes, @@ -76421,15 +76325,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/dark, /area/station/maintenance/floor4/starboard) -"tZR" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "tZX" = ( /obj/machinery/door/airlock/security{ name = "Permabrig Visitation" @@ -76488,13 +76383,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/starboard/aft) -"uaH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash/graffiti, -/turf/open/floor/engine{ - icon_state = "podfloor_light" - }, -/area/station/maintenance/floor2/port/aft) "uaJ" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, @@ -76509,6 +76397,13 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron/white, /area/station/science/server) +"uaV" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/science/genetics) "uaX" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -76525,14 +76420,6 @@ /obj/machinery/duct, /turf/open/floor/iron/showroomfloor, /area/station/service/kitchen/diner) -"ubb" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/effect/turf_decal/siding/white/corner{ - color = null - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/rd) "ubi" = ( /obj/structure/railing/corner{ dir = 1 @@ -76605,15 +76492,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/wood/tile, /area/station/science/xenobiology/hallway) -"ucx" = ( -/obj/effect/turf_decal/siding/white{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/research_director, -/turf/open/floor/iron/large, -/area/station/command/heads_quarters/rd) "ucA" = ( /turf/open/space/openspace, /area/space) @@ -76625,12 +76503,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/neon/simple/pink/nodots, /area/station/maintenance/floor2/port/fore) -"ucD" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/structure/chair/office/light, -/obj/effect/landmark/start/geneticist, -/turf/open/floor/iron, -/area/station/science/genetics) "ucN" = ( /obj/machinery/door/poddoor/massdriver_chapel, /turf/open/floor/mineral/silver, @@ -76722,6 +76594,11 @@ }, /turf/open/floor/plating/foam, /area/station/maintenance/floor2/starboard/fore) +"uek" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/station/hallway/secondary/service) "uep" = ( /obj/structure/railing/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -76803,14 +76680,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor3/port) -"ueY" = ( -/obj/machinery/door/airlock/science{ - name = "Changing Room" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/lower) "ufl" = ( /turf/closed/wall, /area/station/commons/storage/art) @@ -76885,10 +76754,6 @@ /obj/structure/table/wood, /turf/open/floor/bamboo/tatami/black, /area/station/commons/storage/art) -"ufZ" = ( -/obj/structure/cable, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/fore) "ugb" = ( /obj/structure/marker_beacon/burgundy, /obj/effect/turf_decal/trimline/brown/warning{ @@ -76933,15 +76798,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/engineering/atmos) -"ugM" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) "ugP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -77057,6 +76913,10 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/white/herringbone, /area/station/medical/patients_rooms) +"uim" = ( +/obj/structure/closet/crate/mod, +/turf/open/floor/iron/dark/smooth_large, +/area/station/science/robotics/lab) "uit" = ( /obj/machinery/door/airlock/hatch{ name = "Maintenance Access" @@ -77221,18 +77081,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"ukm" = ( -/obj/machinery/seed_extractor, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/research/abandoned) -"uko" = ( -/obj/structure/table, -/obj/item/pai_card, -/turf/open/floor/iron/checker, -/area/station/commons/vacant_room/commissary) "ukr" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -77244,6 +77092,10 @@ /obj/structure/grille, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) +"ukI" = ( +/obj/structure/flora/tree/jungle/small/style_2, +/turf/open/floor/grass, +/area/station/science/genetics) "ukK" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 10 @@ -77340,16 +77192,13 @@ }, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) -"umf" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 1 +"umb" = ( +/obj/machinery/door/window/left/directional/south{ + name = "Pen 6"; + req_access = list("xenobiology") }, -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "umg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -77418,6 +77267,19 @@ /obj/structure/table/reinforced, /turf/open/floor/iron/kitchen/herringbone, /area/station/service/kitchen) +"una" = ( +/obj/effect/turf_decal/siding/wideplating_new/corner{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating_new/corner{ + dir = 1 + }, +/obj/machinery/light/cold/no_nightlight/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "unb" = ( /obj/structure/cable, /obj/machinery/holopad, @@ -77504,16 +77366,6 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/holding_cell) -"uoG" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/iron/white, -/area/station/science/cytology) "uoS" = ( /obj/effect/turf_decal/siding/wood{ dir = 9 @@ -77581,6 +77433,17 @@ }, /turf/open/floor/eighties, /area/station/commons/fitness/recreation/entertainment) +"uqv" = ( +/obj/effect/turf_decal/siding/wideplating_new{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/science/cytology) "uqz" = ( /obj/structure/rack, /obj/effect/spawner/random/techstorage/service_all, @@ -77597,6 +77460,21 @@ /obj/machinery/vending/wallmed/directional/west, /turf/open/floor/iron/white, /area/station/hallway/floor2/fore) +"uqF" = ( +/obj/structure/table, +/obj/machinery/button/ticket_machine{ + pixel_x = -32 + }, +/obj/item/stamp/head/hop{ + pixel_x = 8; + pixel_y = 5 + }, +/obj/item/flashlight/lamp{ + pixel_x = -4; + pixel_y = 3 + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hop) "uqT" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 6 @@ -77645,15 +77523,16 @@ /obj/machinery/status_display/ai/directional/north, /turf/open/floor/iron/dark, /area/station/security/courtroom) -"urY" = ( -/obj/effect/turf_decal/stripes{ - dir = 5 +"usa" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Command - Research Director's Quarters #1" }, -/obj/machinery/sparker/directional/north{ - id = "Xenobio" - }, -/turf/open/floor/engine, -/area/station/science/cytology) +/obj/effect/baseturf_helper/reinforced_plating/ceiling, +/obj/machinery/newscaster/directional/west, +/obj/item/kirbyplants/random/dead/research_director, +/turf/open/floor/iron/large, +/area/station/command/heads_quarters/rd) "use" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 @@ -78212,15 +78091,6 @@ /obj/structure/closet, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) -"uzw" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth_corner{ - dir = 4 - }, -/area/station/maintenance/floor2/starboard) "uzB" = ( /obj/structure/table/reinforced, /obj/item/screwdriver, @@ -78233,6 +78103,13 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor3/fore) +"uzH" = ( +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/machinery/light/cold/no_nightlight/directional/west, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "uzK" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -78299,6 +78176,11 @@ }, /turf/open/floor/iron, /area/station/hallway/floor3/fore) +"uBE" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/iron/dark/small, +/area/station/science/xenobiology) "uBG" = ( /obj/structure/rack, /obj/item/soap, @@ -78332,18 +78214,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"uBW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/railing{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/starboard) "uCb" = ( /obj/effect/turf_decal/trimline/green/corner, /obj/structure/sign/poster/official/random/directional/west, @@ -78372,6 +78242,11 @@ }, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) +"uCn" = ( +/obj/structure/window/spawner/directional/south, +/obj/machinery/suit_storage_unit/rd, +/turf/open/floor/carpet/green, +/area/station/command/heads_quarters/rd) "uCo" = ( /obj/effect/spawner/structure/window/hollow/reinforced/directional{ dir = 1 @@ -78476,6 +78351,11 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/wood, /area/station/command/meeting_room) +"uDB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor2/starboard) "uDD" = ( /obj/effect/turf_decal/trimline/white/line{ dir = 4 @@ -78553,19 +78433,21 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) -"uEw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/purple/corner{ - dir = 1 +"uEu" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber{ + dir = 4 }, -/obj/structure/disposalpipe/segment{ - dir = 5 +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer2, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ + dir = 9 }, -/obj/structure/sign/departments/xenobio/directional/south, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) +/obj/machinery/camera/preset/ordnance{ + c_tag = "Supermatter Waste"; + light_range = 0; + network = list("waste","engine") + }, +/turf/open/floor/engine/airless, +/area/station/engineering/supermatter/waste) "uED" = ( /obj/effect/turf_decal/tile/yellow/half, /obj/machinery/light/small/directional/east, @@ -78834,6 +78716,10 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/xenobiology/hallway) +"uHZ" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "uIi" = ( /obj/effect/turf_decal/bot, /obj/machinery/portable_atmospherics/pump, @@ -79002,6 +78888,11 @@ }, /turf/open/floor/wood/tile, /area/station/command/heads_quarters/captain/private) +"uJD" = ( +/obj/structure/table/wood, +/obj/item/food/grown/banana/bunch, +/turf/open/floor/grass, +/area/station/science/genetics) "uJE" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/turf_decal/siding/thinplating_new, @@ -79170,6 +79061,19 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port/aft) +"uLB" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 8; + volume_rate = 200 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer4{ + dir = 8 + }, +/turf/open/floor/engine/airless, +/area/station/engineering/supermatter/waste) "uLH" = ( /obj/structure/table/wood, /obj/item/modular_computer/laptop/preset/civilian, @@ -79233,11 +79137,6 @@ }, /turf/open/floor/carpet/red, /area/station/service/library/lounge) -"uMB" = ( -/obj/structure/table/wood, -/obj/structure/window/spawner/directional/south, -/turf/open/floor/carpet/green, -/area/station/command/heads_quarters/rd) "uMK" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 @@ -79421,14 +79320,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod, /area/station/maintenance/floor4/starboard/aft) -"uOq" = ( -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/floor2/starboard) "uOx" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -79485,6 +79376,12 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/hallway/floor3/aft) +"uOY" = ( +/obj/structure/railing{ + dir = 6 + }, +/turf/open/floor/grass, +/area/station/science/cytology) "uPc" = ( /obj/structure/bed{ dir = 1 @@ -79513,12 +79410,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"uPv" = ( -/obj/structure/cable, -/obj/structure/closet/l3closet/scientist, -/obj/structure/noticeboard/directional/north, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "uPA" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -79603,21 +79494,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard/aft) -"uQJ" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 10 - }, -/obj/structure/rack, -/obj/machinery/requests_console/directional/west{ - department = "Genetics"; - name = "Genetics Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/item/reagent_containers/dropper, -/turf/open/floor/iron/showroomfloor{ - name = "lab floor" - }, -/area/station/science/genetics) "uQK" = ( /obj/structure/bed{ dir = 4 @@ -79721,10 +79597,6 @@ /obj/structure/cable/layer3, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat) -"uSr" = ( -/obj/structure/filingcabinet/security, -/turf/open/floor/wood, -/area/station/science/research/abandoned) "uSw" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/structure/cable, @@ -80083,6 +79955,14 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/wood, /area/station/medical/psychology) +"uXi" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/stripes, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/white, +/area/station/science/auxlab/firing_range) "uXl" = ( /turf/open/floor/iron/showroomfloor{ name = "lab floor" @@ -80240,15 +80120,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/kitchen/diner) -"uZq" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/security/glass{ - name = "Security Entrance" - }, -/turf/open/floor/engine{ - icon_state = "textured_dark" - }, -/area/station/maintenance/floor2/starboard/aft) "uZr" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -80279,12 +80150,6 @@ }, /turf/open/floor/iron, /area/station/science/robotics/lab) -"vad" = ( -/obj/structure/rack, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/station/maintenance/radshelter/sci) "vae" = ( /obj/structure/ladder, /turf/open/floor/pod/dark, @@ -80327,9 +80192,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, /area/station/cargo/miningdock) -"vav" = ( -/turf/open/floor/iron/kitchen, -/area/station/command/heads_quarters/rd) "vay" = ( /obj/machinery/chem_master{ name = "Hydroanalysis Device" @@ -80451,14 +80313,24 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/smooth, /area/station/cargo/office) -"vbF" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/grass, -/area/station/science/xenobiology) "vbP" = ( /obj/structure/flora/bush/flowers_yw/style_random, /turf/open/floor/grass, /area/station/science/genetics) +"vbQ" = ( +/obj/machinery/door/airlock/science{ + name = "Xenocytology" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/xenobio, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/science/cytology) "vbT" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/corner, @@ -80916,6 +80788,19 @@ /obj/item/flashlight/flare/candle, /turf/open/floor/carpet/orange, /area/station/service/chapel/office) +"vjT" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white, +/area/station/science/xenobiology/hallway) +"vjX" = ( +/obj/effect/turf_decal/trimline/purple/corner{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "vkb" = ( /turf/open/floor/iron/dark/side{ dir = 8 @@ -81117,13 +81002,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) -"vmN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/starboard) "vmX" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -81189,6 +81067,17 @@ }, /turf/open/floor/iron/textured_large, /area/station/hallway/secondary/exit/departure_lounge) +"vnG" = ( +/obj/effect/turf_decal/siding/white/corner, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/white/corner{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "vnI" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/iron/dark, @@ -81368,11 +81257,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"vps" = ( -/obj/structure/lattice/catwalk, -/obj/structure/hedge, -/turf/open/openspace, -/area/station/science/cytology) "vpy" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -81415,16 +81299,6 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/iron/dark, /area/station/security/office) -"vpJ" = ( -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/iron/white, -/area/station/science/cytology) "vqb" = ( /obj/structure/bed{ dir = 4 @@ -81438,6 +81312,11 @@ }, /turf/open/floor/iron/dark/textured, /area/station/medical/surgery/aft) +"vqe" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/contraband/landmine, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/port) "vqp" = ( /obj/structure/closet/secure_closet/hydroponics, /obj/effect/turf_decal/tile/green/full, @@ -81621,6 +81500,14 @@ dir = 8 }, /area/station/hallway/secondary/exit/departure_lounge) +"vsk" = ( +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/line, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/science/cytology) "vsn" = ( /obj/effect/turf_decal/trimline/purple/line{ dir = 1 @@ -81657,12 +81544,6 @@ }, /turf/open/floor/wood/large, /area/station/service/library/lounge) -"vsz" = ( -/obj/effect/turf_decal/tile/dark/half/contrasted, -/obj/effect/turf_decal/tile/dark/half/contrasted, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "vsK" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/showroomfloor, @@ -81827,13 +81708,6 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron/dark, /area/station/hallway/floor3/fore) -"vuH" = ( -/obj/effect/turf_decal/trimline/purple/line, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "vuI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -81898,6 +81772,26 @@ /obj/structure/flora/bush/lavendergrass/style_random, /turf/open/floor/grass, /area/station/service/library/garden) +"vvm" = ( +/obj/structure/closet{ + name = "janitorial supplies" + }, +/obj/item/pushbroom, +/obj/item/mop, +/obj/item/reagent_containers/cup/bucket, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/checker{ + dir = 1 + }, +/area/station/science/genetics) +"vvs" = ( +/obj/machinery/duct, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/closet/radiation, +/turf/open/floor/plating, +/area/station/science/genetics) "vvx" = ( /obj/effect/mapping_helpers/airlock/access/any/service/hydroponics, /obj/structure/cable, @@ -82281,13 +82175,9 @@ /obj/structure/bookcase/random/fiction, /turf/open/floor/wood/large, /area/station/medical/virology/isolation) -"vAa" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/hydroponics/constructable, -/obj/machinery/light/cold/no_nightlight/directional/west, -/turf/open/floor/iron/white, -/area/station/science/research/abandoned) +"vzZ" = ( +/turf/open/misc/dirt/jungle, +/area/station/science/cytology) "vAd" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -82359,6 +82249,14 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"vAS" = ( +/obj/effect/mapping_helpers/airlock/access/any/supply/mining, +/obj/machinery/door/airlock/multi_tile/public/glass{ + name = "Xenoflora" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/textured_large, +/area/station/cargo/miningdock) "vAU" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 @@ -82372,14 +82270,6 @@ }, /turf/open/floor/carpet/red, /area/station/service/theater) -"vAX" = ( -/obj/effect/turf_decal/trimline/purple/line, -/obj/item/radio/intercom/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) "vBa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -82460,14 +82350,6 @@ }, /turf/open/floor/plating/elevatorshaft, /area/station/hallway/floor2/fore) -"vCm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/lower) "vCy" = ( /obj/effect/spawner/random/structure/table_fancy, /obj/structure/sign/painting/large/library_private{ @@ -82616,9 +82498,6 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron/dark, /area/station/security/brig) -"vFB" = ( -/turf/open/floor/engine, -/area/station/science/cytology) "vFC" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 4 @@ -82792,6 +82671,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/aft) +"vIa" = ( +/obj/effect/turf_decal/trimline/purple/corner, +/turf/open/floor/iron/white, +/area/station/science/cytology) "vIb" = ( /obj/effect/turf_decal/trimline/white/line{ dir = 8 @@ -82920,7 +82803,9 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 }, -/obj/item/storage/box/bodybags, +/obj/machinery/computer/records/medical/laptop{ + dir = 4 + }, /turf/open/floor/iron/dark, /area/station/medical/morgue) "vJH" = ( @@ -82980,6 +82865,17 @@ }, /turf/open/floor/iron/dark, /area/station/security/brig) +"vKB" = ( +/obj/structure/chair/office/light{ + dir = 4 + }, +/obj/effect/turf_decal/siding/purple/corner{ + dir = 4 + }, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "vKY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -83007,17 +82903,6 @@ /obj/effect/decal/cleanable/xenoblood, /turf/open/floor/engine, /area/station/science/cytology) -"vLj" = ( -/obj/effect/spawner/random/decoration/generic, -/obj/structure/rack, -/obj/structure/railing{ - dir = 8 - }, -/obj/effect/turf_decal/stripes{ - dir = 9 - }, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor2/starboard) "vLx" = ( /obj/machinery/ai_slipper{ uses = 8 @@ -83488,15 +83373,6 @@ /obj/structure/disposalpipe/trunk/multiz, /turf/open/floor/plating, /area/station/maintenance/floor3/port/fore) -"vRI" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "vRO" = ( /turf/open/openspace, /area/station/hallway/floor4/aft) @@ -83628,11 +83504,6 @@ }, /turf/open/floor/catwalk_floor/iron_dark, /area/station/cargo/drone_bay) -"vTF" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/smooth_half, -/area/station/maintenance/radshelter/sci) "vTL" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -83800,6 +83671,18 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor1/fore) +"vWg" = ( +/obj/machinery/computer/scan_consolenew{ + dir = 8 + }, +/obj/effect/turf_decal/siding/purple{ + dir = 5 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "vWj" = ( /obj/structure/railing{ dir = 1 @@ -83980,12 +83863,6 @@ /obj/effect/mapping_helpers/requests_console/supplies, /turf/open/floor/iron/dark/textured, /area/station/medical/pharmacy) -"vYn" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/kitchen, -/area/station/command/heads_quarters/rd) "vYw" = ( /obj/effect/turf_decal/trimline/neutral/warning, /obj/effect/spawner/random/trash/moisture_trap, @@ -83997,6 +83874,14 @@ /obj/structure/grille, /turf/open/floor/plating, /area/station/maintenance/floor1/port/aft) +"vYE" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "vYH" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible/layer1{ dir = 6 @@ -84134,13 +84019,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor3/port/aft) -"vZV" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 1 - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "wat" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ dir = 8 @@ -84162,6 +84040,14 @@ /obj/structure/sign/poster/official/random/directional/east, /turf/open/floor/iron/dark/textured, /area/station/medical/cryo) +"waI" = ( +/obj/effect/turf_decal/stripes, +/obj/machinery/atmospherics/components/binary/pump/off{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "waJ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -84216,12 +84102,6 @@ dir = 8 }, /area/station/commons/dorms/room1) -"wbn" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "wbo" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/access/any/engineering/external, @@ -84359,6 +84239,15 @@ dir = 1 }, /area/station/security/prison) +"wcG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/hallway/floor2/aft) "wcH" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -84431,14 +84320,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured, /area/station/medical/virology/isolation) -"wdl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "wdq" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -84481,6 +84362,17 @@ }, /turf/open/floor/iron, /area/station/cargo/miningdock) +"wdS" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "wdX" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/effect/spawner/random/contraband/prison, @@ -84513,16 +84405,6 @@ }, /turf/open/floor/iron, /area/station/hallway/floor3/aft) -"wey" = ( -/obj/machinery/camera/autoname/directional/north, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/structure/table/reinforced/rglass, -/obj/item/storage/backpack/duffelbag/coroner/surgery, -/obj/machinery/digital_clock/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "weO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, @@ -84612,6 +84494,14 @@ dir = 4 }, /area/station/command/bridge) +"wfG" = ( +/obj/machinery/plumbing/growing_vat{ + dir = 4 + }, +/obj/machinery/light/cold/no_nightlight/directional/south, +/obj/machinery/status_display/evac/directional/south, +/turf/open/misc/sandy_dirt, +/area/station/science/cytology) "wfI" = ( /obj/machinery/light_switch/directional/west, /turf/open/floor/wood, @@ -84620,13 +84510,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/commons/dorms/apartment2) -"wfS" = ( -/obj/effect/turf_decal/trimline/purple/warning, -/obj/machinery/airalarm/directional/north, -/obj/effect/spawner/random/structure/crate, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor2/starboard) "wfT" = ( /turf/closed/wall, /area/station/engineering/atmos/office) @@ -84685,6 +84568,12 @@ /obj/machinery/door/window/brigdoor, /turf/open/misc/sandy_dirt, /area/station/maintenance/floor1/starboard) +"whw" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/misc/dirt/jungle, +/area/station/science/cytology) "whF" = ( /obj/machinery/shower/directional/east, /turf/open/floor/catwalk_floor/iron_dark, @@ -84925,10 +84814,6 @@ /obj/item/clothing/head/helmet/old, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) -"wke" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "wkf" = ( /obj/structure/chair/comfy/brown, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -85004,12 +84889,6 @@ /obj/item/book/manual/chef_recipes, /turf/open/floor/iron, /area/station/security/prison) -"wlb" = ( -/obj/machinery/processor/slime, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/circuit, -/area/station/science/xenobiology) "wll" = ( /obj/effect/turf_decal/delivery, /obj/structure/sign/departments/science/alt/directional/north, @@ -85297,21 +85176,6 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos/hfr_room) -"wob" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 4 - }, -/obj/effect/turf_decal/caution/red{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wideplating_new{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/maintenance/floor2/starboard) "won" = ( /obj/machinery/light/broken/directional/north, /obj/effect/decal/cleanable/ash, @@ -85382,13 +85246,14 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/starboard/fore) -"wpc" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/bodycontainer/morgue{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/science/genetics) +"wpt" = ( +/obj/structure/railing/corner, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "wpE" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 4 @@ -85718,6 +85583,14 @@ /obj/structure/cable, /turf/open/floor/carpet/green, /area/station/commons/dorms/apartment2) +"wtw" = ( +/obj/effect/turf_decal/siding/purple{ + dir = 9 + }, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "wtC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -85990,6 +85863,11 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/white, /area/station/medical/psychology) +"wwW" = ( +/obj/machinery/airalarm/directional/east, +/obj/machinery/camera/emp_proof/directional/east, +/turf/open/floor/iron, +/area/station/engineering/atmos) "wxb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -86296,14 +86174,6 @@ dir = 8 }, /area/station/medical/chemistry) -"wAt" = ( -/obj/machinery/duct, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "wAz" = ( /obj/machinery/vending/autodrobe, /obj/machinery/light_switch/directional/east, @@ -86375,6 +86245,13 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/service/chapel) +"wCc" = ( +/obj/structure/stairs/north, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/cytology) "wCk" = ( /obj/effect/decal/cleanable/glass, /turf/open/floor/plating/foam, @@ -86525,15 +86402,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/maintenance/floor3/port/aft) -"wEw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/structure/table/glass, -/obj/machinery/reagentgrinder{ - pixel_x = -1; - pixel_y = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "wEE" = ( /obj/effect/decal/cleanable/ash/large, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -86610,6 +86478,15 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/cargo/storage) +"wFC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/effect/turf_decal/stripes, +/obj/machinery/door/window/right/directional/south{ + name = "containment Exterior"; + req_access = list("xenobiology") + }, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "wFK" = ( /obj/structure/cable, /obj/machinery/door/firedoor, @@ -86922,6 +86799,17 @@ "wIN" = ( /turf/open/openspace, /area/station/command/heads_quarters/rd) +"wIP" = ( +/obj/effect/turf_decal/stripes{ + dir = 10 + }, +/obj/machinery/portable_atmospherics/canister/hydrogen, +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron/dark, +/area/station/science/cytology) "wIQ" = ( /obj/structure/closet/firecloset, /obj/machinery/light/directional/west, @@ -87165,14 +87053,6 @@ dir = 1 }, /area/station/engineering/lobby) -"wLb" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/structure/microscope, -/turf/open/floor/iron/white, -/area/station/science/cytology) "wLd" = ( /obj/structure/flora/bush/style_random, /turf/open/floor/grass, @@ -87228,6 +87108,10 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"wLD" = ( +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/kitchen, +/area/station/command/heads_quarters/rd) "wLK" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/engine, @@ -87246,6 +87130,15 @@ }, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"wMf" = ( +/obj/effect/turf_decal/siding/purple{ + dir = 1 + }, +/obj/machinery/computer/scan_consolenew, +/turf/open/floor/iron/showroomfloor{ + name = "lab floor" + }, +/area/station/science/genetics) "wMr" = ( /obj/machinery/door/airlock{ id_tag = "dorms_3_bolts"; @@ -87359,10 +87252,6 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/catwalk_floor/iron, /area/station/cargo/storage) -"wNF" = ( -/obj/structure/ladder, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/fore) "wNH" = ( /obj/structure/railing{ dir = 8 @@ -87766,6 +87655,11 @@ "wTj" = ( /turf/open/floor/iron/dark, /area/station/hallway/floor4/aft) +"wTp" = ( +/obj/structure/ladder, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "wTq" = ( /turf/open/openspace, /area/station/hallway/secondary/service) @@ -87795,6 +87689,13 @@ }, /turf/open/floor/iron/white, /area/station/science/circuits) +"wTO" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/science/genetics) "wTS" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -88007,12 +87908,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/aft) -"wWn" = ( -/obj/machinery/light/cold/no_nightlight/directional/east, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/trimline/purple, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "wWo" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, @@ -88028,6 +87923,17 @@ /obj/effect/spawner/random/trash/grille_or_waste, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) +"wWJ" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 5 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/white, +/area/station/science/cytology) "wXi" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, @@ -88147,11 +88053,6 @@ /obj/machinery/power/solar, /turf/open/floor/iron/solarpanel/airless, /area/station/solars/starboard/fore) -"wYL" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/starboard/fore) "wYM" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -88165,11 +88066,6 @@ /obj/structure/cable, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) -"wYU" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/grass, -/area/station/science/xenobiology) "wYW" = ( /obj/machinery/light/directional/west, /obj/effect/turf_decal/tile/red/half{ @@ -88480,13 +88376,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/iron/dark/textured, /area/station/medical/cryo) -"xcZ" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/research/abandoned) "xdc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -88648,6 +88537,18 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos) +"xfD" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/reagentgrinder{ + pixel_x = -1; + pixel_y = 8 + }, +/obj/structure/table/reinforced, +/obj/item/radio/intercom/directional/west, +/obj/item/clothing/glasses/science, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "xfE" = ( /obj/structure/cable, /obj/machinery/power/tracker, @@ -88859,6 +88760,14 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) +"xih" = ( +/obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer4{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/engine_access, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/waste) "xit" = ( /obj/structure/railing/corner{ dir = 4 @@ -88896,6 +88805,9 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_dark, /area/station/maintenance/floor2/port/aft) +"xiM" = ( +/turf/open/openspace, +/area/station/science/xenobiology) "xiO" = ( /obj/machinery/atmospherics/pipe/smart/simple/pink/visible/layer2{ dir = 4 @@ -88997,6 +88909,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) +"xjZ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer4{ + dir = 4 + }, +/turf/open/floor/engine/airless, +/area/station/engineering/supermatter/waste) "xkh" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -89176,6 +89100,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/kitchen/diner) +"xng" = ( +/obj/effect/decal/cleanable/blood/gibs/old, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/floor2/starboard/aft) "xni" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 1 @@ -89638,6 +89569,11 @@ }, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/hallway/secondary/entry) +"xtR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/textured, +/area/station/maintenance/floor2/starboard/aft) "xtX" = ( /obj/machinery/door/airlock/medical{ name = "Storage" @@ -89951,15 +89887,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) -"xxY" = ( -/obj/effect/turf_decal/stripes{ - dir = 5 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Science - Cytology Containment" - }, -/turf/open/floor/engine, -/area/station/science/cytology) "xyb" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -90065,11 +89992,6 @@ /obj/machinery/light/cold/no_nightlight/directional/west, /turf/open/floor/iron, /area/station/hallway/floor2/aft) -"xzG" = ( -/obj/machinery/camera/autoname/directional/east, -/obj/structure/flora/bush/sparsegrass/style_random, -/turf/open/floor/grass, -/area/station/science/genetics) "xzH" = ( /obj/effect/turf_decal/trimline/yellow/warning, /obj/structure/disposalpipe/segment, @@ -90249,13 +90171,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/side, /area/station/hallway/floor3/fore) -"xCB" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "xCC" = ( /turf/open/floor/iron/dark, /area/station/medical/psychology) @@ -90371,6 +90286,13 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"xDK" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "xDQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -90662,10 +90584,6 @@ /obj/machinery/duct, /turf/open/floor/pod/dark, /area/station/maintenance/floor4/port) -"xGk" = ( -/obj/structure/stairs/north, -/turf/open/floor/iron/white, -/area/station/science/cytology) "xGl" = ( /turf/open/floor/plating/foam, /area/station/maintenance/floor1/port/aft) @@ -90753,6 +90671,13 @@ "xHA" = ( /turf/closed/wall, /area/station/maintenance/disposal) +"xHK" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "xHR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -90791,6 +90716,11 @@ /obj/machinery/disposal/bin, /turf/open/floor/iron, /area/station/engineering/atmos) +"xIs" = ( +/obj/effect/spawner/random/structure/tank_holder, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/pod/light, +/area/station/maintenance/floor3/starboard/fore) "xID" = ( /obj/structure/closet/crate/freezer/blood, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -90929,6 +90859,12 @@ /obj/machinery/light/blacklight/directional/south, /turf/open/floor/eighties, /area/station/commons/fitness/recreation/entertainment) +"xKj" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/science/cytology) "xKq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -91202,13 +91138,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/dark, /area/station/security/prison) -"xOW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general, -/obj/effect/turf_decal/tile/purple/opposingcorners, -/turf/open/floor/iron/white, -/area/station/science/cytology) "xOY" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -91386,6 +91315,14 @@ /obj/structure/marker_beacon/burgundy, /turf/open/space/openspace, /area/space/nearstation) +"xRH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/turf/open/floor/iron/checker{ + dir = 1 + }, +/area/station/science/genetics) "xRJ" = ( /obj/effect/decal/cleanable/blood/old, /obj/item/screwdriver, @@ -91485,6 +91422,18 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/security/detectives_office) +"xSW" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/monkeycubes{ + pixel_x = -5 + }, +/obj/item/storage/box/monkeycubes, +/obj/item/storage/box/monkeycubes{ + pixel_x = 5 + }, +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/circuit, +/area/station/science/xenobiology) "xTa" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "aband_armour"; @@ -91544,18 +91493,6 @@ }, /turf/open/space/openspace, /area/space) -"xUF" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer4{ - dir = 4 - }, -/turf/open/floor/engine/airless, -/area/station/engineering/atmos/pumproom) "xUI" = ( /obj/structure/cable, /obj/structure/chair/sofa/bench/left, @@ -91600,6 +91537,14 @@ }, /turf/open/misc/beach/sand, /area/station/hallway/floor2/fore) +"xVn" = ( +/obj/effect/decal/cleanable/garbage, +/obj/effect/decal/cleanable/vomit/old, +/obj/effect/turf_decal/trimline/purple/warning{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/station/maintenance/floor2/starboard) "xVo" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle, /obj/structure/girder, @@ -91994,6 +91939,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"xZX" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/light/cold/no_nightlight/directional/west, +/obj/structure/rack, +/obj/item/soap/nanotrasen, +/turf/open/floor/iron, +/area/station/science/cytology) "yag" = ( /obj/effect/turf_decal/tile/green/half{ dir = 4 @@ -92010,6 +91962,16 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/wood/parquet, /area/station/medical/patients_rooms) +"yaq" = ( +/obj/effect/turf_decal/trimline/purple/line{ + dir = 10 + }, +/obj/effect/turf_decal/siding/white/corner{ + dir = 4 + }, +/obj/machinery/light/cold/no_nightlight/directional/west, +/turf/open/floor/iron/white, +/area/station/science/cytology) "yaK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -92302,6 +92264,13 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard) +"yfm" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "yfn" = ( /obj/structure/table/wood, /obj/item/pen, @@ -92396,6 +92365,16 @@ /obj/machinery/light/small/red/directional/north, /turf/open/floor/engine, /area/station/maintenance/floor1/starboard/fore) +"ygn" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/reagent_dispensers/plumbed{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "ygq" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 9 @@ -92420,6 +92399,20 @@ "ygT" = ( /turf/open/floor/wood, /area/station/service/bar/atrium) +"ygU" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/office/light{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "yhr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -92463,6 +92456,10 @@ /obj/effect/spawner/random/trash/hobo_squat, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) +"yhT" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/middle, +/turf/open/floor/plating, +/area/station/science/xenobiology) "yhX" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured_half{ @@ -92493,6 +92490,17 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/floor2/aft) +"yiA" = ( +/mob/living/basic/pig{ + desc = "The best friend of any cytologist."; + name = "Oug" + }, +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/floor/grass, +/area/station/science/cytology) "yiB" = ( /obj/machinery/status_display/ai/directional/south, /obj/structure/disposalpipe/segment{ @@ -107275,7 +107283,7 @@ eSX ylE qiy hhx -rdZ +rKc bfX tqx svs @@ -123705,7 +123713,7 @@ cwG qly pEv pnr -eur +vAS tQf qzm gtX @@ -127331,7 +127339,7 @@ xgH ljE jCU xMH -dut +trP dpC qHH xgH @@ -138347,8 +138355,8 @@ vQd bVG avp xeO -wbn -pko +lYt +wwW uED oIy oIy @@ -139121,11 +139129,11 @@ aof tZD iMe xIL -oIy -oIy -jHp -oIy -oIy +sAH +sAH +fWf +sAH +sAH mOT jSD iyT @@ -139378,11 +139386,11 @@ itP gnx nnb bZE -oIy -fMD -tkc -kOJ -oIy +sAH +nIJ +uLB +rAm +sAH xgW jSD fcp @@ -139635,11 +139643,11 @@ rkf tZD jHQ kTc -oIy -dPb -dPb -dPb -oIy +sAH +qEw +qEw +qEw +sAH xgW kfo iyT @@ -139892,11 +139900,11 @@ vmr vmr skj kFk -oIy -knN -bEf -dPb -oIy +sAH +hhb +gGt +qEw +sAH isp jSD iMV @@ -140149,11 +140157,11 @@ eIt vmr jsZ fLn -oIy -jTd -xUF -knq -oIy +sAH +hep +xjZ +uEu +sAH bQz uCe iyT @@ -140406,11 +140414,11 @@ eQe vmr wul fKH -oIy -tgM -jgW -odd -oIy +sAH +jWv +rBK +eLF +sAH oIy hsG hOR @@ -140664,7 +140672,7 @@ vmr ykP npP tZD -oKH +xih iLF xiO fKL @@ -140921,7 +140929,7 @@ vmr obH npP fJw -sRE +rsT qyN mPE cYF @@ -182062,7 +182070,7 @@ roZ tMp oFa fwK -rrR +dAN gYN ewq hVq @@ -183344,9 +183352,9 @@ hLz hLz hLz hLz -egC -eRW -fBd +pDL +heC +caP jjF hkZ jjF @@ -183610,7 +183618,7 @@ jjF iit gJp jjF -bSh +uek hLz uXA rLd @@ -183860,14 +183868,14 @@ uXA hLz vpp eUJ -ecX +cCK glY cvE jjF ilG iPr jgJ -jtQ +tnA hLz uXA hLz @@ -184124,7 +184132,7 @@ hSH ilV iTn jjF -bSh +mOK hLz uXA hLz @@ -186150,7 +186158,7 @@ xuv xuv nAU ivY -amA +bdD iXa ape aoW @@ -186404,8 +186412,8 @@ hge hge hge oiO -eVs -aeI +bMu +pKO aiN jDc anN @@ -186661,7 +186669,7 @@ wUU dJI hge gKp -ubb +qXi agl cLt rdJ @@ -187176,7 +187184,7 @@ rhC hge oiO afz -cDo +lIh mis txR dDk @@ -187186,7 +187194,7 @@ uaX puG smv cyb -ueY +bsB iOp rUD sih @@ -187424,25 +187432,25 @@ ucA ucA vnK vnK -hjo +kRG sUj sUj -iOA rkM rkM rkM -iOA -iOA -iOA -dAT -amU +rkM +rkM +rkM +rkM +fKr +fKr rWT ujc rWT mCI kXZ wbS -gnf +eGF dpL tdM bvx @@ -187681,21 +187689,21 @@ ucA ucA vnK vnK -ecV -uZg -vLj -iOA -gvW -xGk -tUn -iOA -mVP -lkQ -lkQ -lkQ -lkQ -lkQ -lkQ +bir +sUj +qEy +rkM +rBF +pxL +can +kuh +cLI +yaq +nxe +mTo +rkM +rkM +rkM mrh ivs iNO @@ -187936,23 +187944,23 @@ ucA ucA ucA ucA -erN -erN -uZg -lZQ -iOA -iOA -owf -lhq -rad -iOA vnK -lkQ -bsm -vad -qVx -apu -lkQ +vnK +sUj +sUj +xVn +rkM +wCc +ezQ +qzo +aPf +qrx +eUn +jTM +oXE +xZX +dpP +rkM mGd shk wbS @@ -188195,25 +188203,25 @@ ucA ucA vnK vnK -qKR -iOA -iOA -qpa -xOW -llO -jmf -iOA sUj -bGv -aZj -czW -qID -vTF -isl -cas +rkM +rkM +rkM +xKj +xKj +ntl +aCd +rQG +qEb +eBf +rJC +pbk +dKU +rkM +oOR kvB eao -dFf +ktM sWU tAb glA @@ -188452,21 +188460,21 @@ ucA ucA vnK vnK -uZg -dhF -lGH -hbr -mmq -tlF -kxA -iOA sUj -lkQ -fVo -cMm -ldQ -ePX -lkQ +rkM +tgF +uzH +fiA +fiA +wIP +tXB +gup +vsk +tPj +drm +aWJ +giq +rkM ueO puG eep @@ -188709,22 +188717,22 @@ ucA ucA vnK vnK -uZg -iOA -hOZ -qXx -oSD -bHh -iyF -iOA sUj -lkQ -lkQ -lkQ -lkQ -lkQ -lkQ -dpL +rkM +kwL +oFI +txu +gfg +waI +cHd +oFH +sgc +rkM +gzM +iot +vbQ +rkM +qxh lhW wbS dpL @@ -188966,25 +188974,25 @@ ucA ucA vnK vnK -uZg -iOA -rkM -rqK -hNA -wqx -rkM -iOA -crl -vnK -akl -nHd -vAa -mbr -ukm -nqo -niS -vCm -nvA +sUj +sGh +ivo +txu +uHZ +txu +wFC +lhS +eSJ +jBR +gzM +vIa +gIb +ewK +vjX +gzM +kXZ +tuX +avH maW haL nQS @@ -189221,30 +189229,30 @@ ucA ucA ucA ucA -erN -erN -uZg -iOA -vlQ -vLd -lBs -auv -rUh -iOA -vmN vnK -mng -wAt -iYq -vRI -cbN -cxC +vnK +sUj +rkM +quW +nEi +txu +jml +fdp +wWJ +ffi +eVl +gzM +feP +sTT +pGb +jGf +dhb puG -hRO +qZA avH maW -aUh -eqO +nQS +uJD eTH qun qun @@ -189480,24 +189488,24 @@ ucA ucA vnK vnK -uZg -iOA -urY -tdw -iuW -mKw -tRU -iOA sUj -vnK -dTG -xcZ -sRY -tZR -oMU -nqo -pGc -tEN +rkM +aYs +pyO +pyO +oYI +cdd +rkM +gzM +gzM +rkM +ddO +uqv +bLi +aip +gzM +swk +tYg nXJ maW rxL @@ -189737,25 +189745,25 @@ ucA ucA vnK vnK -qKR -iOA -iOA -xxY -jdC -tRU -iOA -iOA sUj -vnK -wke -iSr -txM -qqI -iyP +rkM +rkM +rqK +hNA +wqx +rkM +rkM +whw +whw +qXj +npF +hML +iCE +iCE qun qun -kzN -qun +kjo +tpV qun uUg nQS @@ -189994,26 +190002,26 @@ ucA ucA vnK vnK -uZg -gcS -iOA -iOA -oHz -iOA -iOA sUj -sUj -vnK -hae -jwY -ikt -esw +rkM +vlQ +vLd +olC +auv +rUh +rkM +vzZ +vzZ +gws +npF +lcT +cvK +eFO qun -qun -azC -aBC -uQJ -maW +qNG +qtp +rjm +ibw lRu dEb tKA @@ -190251,25 +190259,25 @@ ucA ucA vnK vnK -mAQ -uZg -uZg -uZg -uZg -uZg sUj -sUj -vnK -vnK -hnK -joy -joy -rtG +rkM +cRU +eHf +iuW +eHf +dGa +rkM +dyE +yiA +cLA +npF +lcT +aAE +wfG qun -njj -azF -hXR -dHA +nVT +iCi +wTO maW rxL doJ @@ -190508,26 +190516,26 @@ ucA ucA vnK vnK -fov -vnK -qKR -vnK -vnK -ihB -vnK -vnK -vnK -swe -lMz -pgT -awT -eXn +sUj +rkM +rXg +dtm +jdC +bID +tRU +rkM +hDb +cvK +cLA +npF +lcT +eFO +pAV qun -oBF -btD -dqN -lpA -tZh +lYU +qtp +pKA +evi oOE iie nQS @@ -190765,29 +190773,29 @@ ucA ucA vnK vnK -gjC -hJU -uZg -vnK -mrq -rJr -uzw -vnK -sLL -aEf -nmw -lJG -dys -imx +sUj +rkM +rkM +rkM +fMu +rkM +rkM +rkM +pov +gBN +uOY +npF +eKD +biJ +mwB qun -tdd -fFR -dqN -aDs +hCV +jVT +uaV maW aUh aUh -eqO +ukI dEb eHc cCc @@ -191022,28 +191030,28 @@ ucA ucA vnK vnK -trZ -tFM -mOb -vnK -fmQ -uOq -lWR -vnK -tIF -eZN -leJ -tOQ -uSr -kIV +sUj +sUj +sUj +fij +hQl +oqU +dYq +rkM +frw +iBj +pzb +una +efX +pzb +frw qun -mVz -rfn -thj -aER maW -xzG +oGF +maW +ibw nQS +hIn nQS guT eHc @@ -191279,29 +191287,29 @@ ucA ucA vnK vnK -wfS -ioD -uZg +fov vnK -nlo -fVk -nlo +qKR vnK -vnK -vnK -vnK -vnK -ibw -ibw +iDh +iDh +dYq +rkM +rkM +rkM +baN +rkM +rkM +rkM +rkM qun -jiu -btD -dRf -ahe -ibw -ibw +nOR +npu +gEv ibw +maW ibw +maW ibw ibw ubi @@ -191536,24 +191544,24 @@ ucA ucA vnK vnK -fov +gjC +hJU +uZg +fij +sjW +pog +rwc vnK -qKR +pQP +eDt +uDB vnK -nQG -qdO -qtY -vnK -dpN -wob -dpN -vnK -jOZ -nwg +iaf +sgT +xRH lti -ayD -jrh -fUD +wtw +tUq hFL maW iJP @@ -191793,32 +191801,32 @@ ucA ucA vnK vnK -ggg -pro -kpt +ehl +sQT +mOb vnK vnK -qBR +gih vnK vnK +ocX +iMX +uDB vnK -dgQ -vnK -vnK -iIj -ngy +pXR +aIY +joU qun -qun -fyp -fUD -nIL -oUN -mqv -mqv -mqv -bMb -bFZ -hgp +rUJ +lQb +pCf +bcC +bcC +bcC +sLX +djH +wcG +ybm jLQ jES qHW @@ -192052,27 +192060,27 @@ vnK vnK vnK vnK -uBW -nCd +uZg +oGo sHv kpt kRS -kRS hvf kRS kRS +kRS mQz -ngy -eWY -oJF +sjf +aIY +vvs qun -mMC -bFv -nIL -maW -lhB -kCm -fCY +wMf +nyg +rfn +rfn +rfn +rfn +hFL maW roa xYM @@ -192307,9 +192315,9 @@ ucA ucA vnK vnK -fvR -fvR -fvR +fov +pro +uZg gQA wJI vnK @@ -192319,17 +192327,17 @@ wug uKz cgc vnK -qJa -dYx -wpc +vvm +nfR +huz qun -fRc -ncS -cqT -ibw -lYU -ucD -aPq +tll +ntU +vKB +rfn +niK +rfn +oig bQY wTS xYM @@ -192564,9 +192572,9 @@ ucA ucA vnK vnK -fvR -fvR -fvR +ggg +pro +kpt cYh qOQ vnK @@ -192582,11 +192590,11 @@ qun qun qun qun -nlM -ibw -cFC -dnV -oGm +vWg +oyv +abk +iqC +tGS maW xni xYM @@ -197484,7 +197492,7 @@ jSW nrX mkE gQx -wey +gXd xWy pfd fQH @@ -202373,7 +202381,7 @@ bpA bfs cVT jXc -rwV +uim lcv lcv bHU @@ -206708,10 +206716,10 @@ dEt fsu mzC mzC -dzL -spo -iYo -uZq +sLE +xtR +mmz +hoM nzM hZJ vaG @@ -206966,8 +206974,8 @@ oIk sIX hZJ uNZ -mnq -eGg +xng +mWW pqO jXE sBp @@ -207221,11 +207229,11 @@ dEt dEt hZJ sIX -pJZ -uZq -rNm -dDP -tko +jTS +hoM +bmE +bcr +qKI luw ezI hZJ @@ -207254,7 +207262,7 @@ jXl qEH dLu hsK -uaH +jEs dXz nlN xui @@ -246025,12 +246033,12 @@ jsF jsF jsF hEu -klw -klw +rip +rip wRJ -meK -ufZ -tJd +dHn +gXH +sEU wRJ jsY wRJ @@ -246282,8 +246290,8 @@ nVq nVq mDe wsA -klw -wNF +rip +wTp wRJ eLe wRJ @@ -246539,12 +246547,12 @@ nVq wRJ nVq wsA -klw -klw +rip +rip wRJ kWo wRJ -lmP +tDp wRJ jsY wRJ @@ -247308,7 +247316,7 @@ cFQ oBy xzd wDb -dos +uXi udx siB siB @@ -247572,8 +247580,8 @@ txT ccH igy wRJ -hbm -klw +xIs +rip wsZ usX nbc @@ -247822,7 +247830,7 @@ cFQ vqz efF jkH -dGB +pkH wLK siB siB @@ -247833,7 +247841,7 @@ igy igy igy igy -klw +rip wRJ tIH lyd @@ -248090,7 +248098,7 @@ ccH wRJ wRJ igy -klw +gzU wRJ nOw lFL @@ -248344,10 +248352,10 @@ ycg uHe vDg ccH -dxB +sCH wRJ igy -klw +rip wRJ tpS kwG @@ -248601,10 +248609,10 @@ ycg uHe vVo ccH -klw +rip wRJ igy -klw +rip wRJ bzy lGJ @@ -248858,10 +248866,10 @@ rtl rtl ccH ccH -jhe +bRx wRJ igy -klw +rip wRJ bIQ jwu @@ -249110,12 +249118,12 @@ pMK xeE pbj gMv -bto +vjT gTk rtl jgK -jOL -klw +xDK +rip oYT igy igy @@ -249371,8 +249379,8 @@ rLB gTk rtl bGl -klw -nqs +oMv +txF wRJ dab igy @@ -249883,7 +249891,7 @@ cgB fFF xnL wcs -xnL +cQo qxJ wDz wDz @@ -250133,9 +250141,9 @@ ucA ucA eKC eKC -eQW +fSV gsD -vsz +gKa uIQ uco vgb @@ -250390,7 +250398,7 @@ ucA ucA eKC eKC -ntO +bXd cjp wRJ wRJ @@ -250650,9 +250658,9 @@ abx ntO kXc wRJ -usX +rms wRJ -dIL +kdA bzO vHm owB @@ -251418,15 +251426,15 @@ ucA ucA eKC eKC -nLF -cjp -wRJ -wYL -wYL -wRJ -wRJ +sLm +eKY wRJ +qxI +qxI wRJ +mcO +rrW +qxI wRJ wRJ wRJ @@ -251673,20 +251681,20 @@ ucA ucA ucA ucA -uhr -abx -ntO -qvb -wRJ -wRJ -wRJ -wRJ -vFB -azX -vFB +rtl +rtl +lUO +lgY +ccH +ccH +ccH +ccH +ccH +ccH +ccH rWT hxl -oue +kRn ccH wEQ wRJ @@ -251930,17 +251938,17 @@ ucA ucA ucA ucA -uhr -abx -vuH -qvb -hKI -msG -qel -gvW -oFw -ngQ -oFw +nAH +nAH +wdS +qTw +rQc +xSW +jqP +lbO +xfD +plz +lzp rWT rWT gpu @@ -252187,21 +252195,21 @@ ucA ucA ucA ucA -eKC -eKC -qjg -kAq -gzM -rad -isM -gvW -mbt -fBy -cQg +alu +gvj +eJd +vnG +aoG +sdi +ygU +gHu +mxJ +czZ +kwf rWT byY dzQ -uMB +bmf wIN iHm oiH @@ -252444,21 +252452,21 @@ ucA ucA ucA ucA -eKC -eKC -vAX -umf -aEE -ijU -psv -dOY -vpJ -nlZ -gFb +alu +gvj +eUx +txB +iAZ +suv +qnN +cFg +hRp +plz +rSD rWT uhF vhL -uMB +uCn wIN iHm bqI @@ -252701,17 +252709,17 @@ ucA ucA ucA ucA -uhr -abx -niT -aey -gzM -rad -guA -cYY -oWv -etJ -bRH +alu +gvj +tlK +rMC +tLb +qSv +jGl +jGl +hoo +uBE +maf rWT sNd evW @@ -252958,17 +252966,17 @@ ucA ucA ucA ucA -uhr -abx -jqz -kZT -sTC -fti -sFb -gvW -uoG -wLb -frD +nAH +nAH +fOH +oUu +xHK +wpt +cuT +cuT +vYE +qAa +kwf rWT rWT oLk @@ -253215,19 +253223,19 @@ ucA ucA ucA ucA -eKC -eKC -kfO -uEw -gvW -ugM -ota -rFt -ibz -vps +nAH +nAH +hUT +lbJ +nqi +hfC +xiM +xiM +qVO +plz +bYJ rWT -rWT -mlV +usa vQs rWT lEo @@ -253472,19 +253480,19 @@ ucA ucA ucA ucA -nAj -nAj -nPn -hEA -gvW -gzM -gzM -gvW -gvW -gvW +nAH +nAH +oJr +bTy +nqi +hSP +xiM +xiM +qVO +uBE +maf rWT -tid -cSw +lLL rzW abl nnT @@ -253729,19 +253737,19 @@ ucA ucA ucA ucA -nAj -nAj -uPv -nPH -qXh -nyc -aXr -nBg -nBg -nBg +nAH +nAH +ovJ +eCz +jlE +kdU +kNn +kNn +fli +oRq +kwf rWT -iwh -ucx +mAI tCj iHm iHm @@ -253986,20 +253994,20 @@ ucA ucA ucA ucA -nAj -nAj -xCB -lpv -eXs -lqE -mnI -hBX -nBg -nBg +nAH +nAH +rSD +bTy +cZS +eIU +twv +yfm +ygn +plz +rSD rWT -vav -vYn -aNH +tjM +wLD iHm oDe qrd @@ -254243,20 +254251,20 @@ ucA ucA ucA ucA -nAj -mvc -fbq -tJq -wlb -atn -dBI -nNQ -nNQ -nNQ +nAH +nAH +maf +hrL +nqi +eKB +nAH +hUT +hUT +hUT +iHm rWT -tJs -cyz -suh +rWT +qXE iHm kgT qrd @@ -254500,20 +254508,20 @@ ucA ucA ucA ucA -nAj -mEF -wEw -tJq -tuA -sTN -ena -nBg -nBg -oUW +nAH +nAH +ovJ +otR +nqi +pep +yhT +sdg +tlb +nDm +iHm +ejP +iHm iHm -qrd -qrd -qrd iHm lga qrd @@ -254757,16 +254765,16 @@ ucA ucA ucA ucA -nAj -nAj -twT -nop -qnN -gUD -qhn -nNQ -nNQ -nNQ +nAH +nAH +kCR +bTy +nqi +pep +yhT +piJ +tlb +piJ iHm sSB sSB @@ -255014,16 +255022,16 @@ ucA ucA ucA ucA -nAj -nBg -cEl -jVJ -fUs -rwP -lWU -nBg -hBX -nBg +nAH +nAH +maf +hrL +nqi +hjN +yhT +piJ +tlb +chT iHm sSB ccV @@ -255272,15 +255280,15 @@ ucA ucA ucA nAH -kAt -vbF -hMe -gby -hMX -iHm -iHm -iHm -iHm +nAH +ovJ +umb +nqi +fXR +yhT +oJH +bhy +frv iHm sSB ccV @@ -255529,16 +255537,16 @@ ucA ucA ucA nAH -nEC -wYU -wdl -nPn -nPn +nAH +rSD +bTy +rom +irb +iHm +iHm +iHm +iHm iHm -ejP -ejP -sSB -sSB sSB ccV qrd @@ -255786,16 +255794,16 @@ ucA ucA ucA nAH -nNQ -rdv -wdl -gme -hWh +nAH +hUT +hUT +hUT +hUT iHm sSB sSB sSB -ejP +sSB qrd qrd qrd @@ -256042,12 +256050,12 @@ ucA ucA ucA ucA -nAH -nBg -vbF -feF -vZV -nPQ +hqD +hXp +nvT +dGo +dGo +dGo iHm sSB qrd @@ -256299,12 +256307,12 @@ ucA ucA ucA ucA -nAH -nBg -qCY -wWn -qgR -inG +hqD +hXp +nvT +hEM +dGo +dGo iHm sSB qrd @@ -256558,9 +256566,9 @@ ucA ucA nAH nAH +hUT nAH -nAH -nAH +hUT nAH iHm sSB @@ -256815,9 +256823,9 @@ ucA ucA qrd qrd -iOY +ome qrd -eQw +gQa qrd sSB sSB @@ -257329,7 +257337,7 @@ ucA ucA qrd qrd -bva +qIv kgT tkB lTA @@ -257586,7 +257594,7 @@ ucA ucA qrd qrd -nlg +kgT qrd mLk qrd @@ -257615,7 +257623,7 @@ cdF ftv jiL qbz -uko +smx qxy qnw vcg @@ -257843,8 +257851,8 @@ ucA ucA qrd qrd -aWG -aVs +kgT +rov vnv qrd sSB @@ -257872,9 +257880,9 @@ orN ftv jiL eLw -ipB +lFJ qxy -hTf +oyW ofa uKR nXk @@ -258100,8 +258108,8 @@ ucA ucA qrd qrd -fns -aVs +cmu +rov vnv qrd vEr @@ -261710,7 +261718,7 @@ xWr kYD iJl cvX -fpk +tRi qrd sSB lWa @@ -312586,7 +312594,7 @@ ucA xHe xHe bRh -bRh +keX rQx uEY uxw @@ -312891,7 +312899,7 @@ vEa iZA fTa fTa -aOB +vqe fXs dek dek @@ -315674,7 +315682,7 @@ rhw kKO sRn sRn -tKQ +iAt sJm sJm sJm @@ -316715,7 +316723,7 @@ nPE qPv pJV iag -hxt +uqF iqy mKs ryE @@ -317997,7 +318005,7 @@ stk spI rLM nPE -irW +cuK ipn fBw tPG @@ -319011,7 +319019,7 @@ ucA gDy gDy won -pVN +tLf bew jCM gDy @@ -333171,7 +333179,7 @@ nFT nbP ovP mDn -rZu +qQS nus mkL nbP diff --git a/_maps/map_files/VoidRaptor/VoidRaptor.dmm b/_maps/map_files/VoidRaptor/VoidRaptor.dmm index 5bed37dd49a..112d0b420f5 100644 --- a/_maps/map_files/VoidRaptor/VoidRaptor.dmm +++ b/_maps/map_files/VoidRaptor/VoidRaptor.dmm @@ -988,7 +988,7 @@ /area/station/engineering/atmos/pumproom) "aoB" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Entertainment Center" }, /turf/open/floor/iron/large, @@ -7079,7 +7079,7 @@ }, /area/station/hallway/primary/central/aft) "cgl" = ( -/mob/living/basic/giant_spider/hunter/scrawny, +/mob/living/basic/spider/giant/hunter/scrawny, /turf/open/floor/iron/smooth, /area/station/maintenance/department/electrical) "cgt" = ( @@ -11510,7 +11510,7 @@ /turf/open/floor/iron/white/diagonal, /area/station/science/research) "dxr" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Arrivals" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -17398,7 +17398,7 @@ /area/station/engineering/atmos/storage) "fbk" = ( /obj/effect/decal/cleanable/dirt, -/mob/living/basic/giant_spider/tarantula/scrawny, +/mob/living/basic/spider/giant/tarantula/scrawny, /turf/open/floor/iron/smooth, /area/station/maintenance/department/electrical) "fbl" = ( @@ -21472,7 +21472,7 @@ /area/station/maintenance/port/greater) "gmL" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Recreation Area" }, /obj/structure/disposalpipe/segment, @@ -25674,7 +25674,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Medbay" }, /obj/structure/disposalpipe/segment, @@ -26940,7 +26940,7 @@ /area/station/cargo/miningdock) "hQx" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ dir = 4; name = "Arrivals" }, @@ -29284,7 +29284,7 @@ /area/station/maintenance/aft/upper) "ixm" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Pool" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43869,7 +43869,7 @@ /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/solars/port/aft) "myv" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Cargo Lobby" }, /obj/machinery/door/firedoor, @@ -45431,7 +45431,7 @@ /area/station/hallway/primary/aft) "mUU" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ dir = 4; name = "Gun Range" }, @@ -52462,7 +52462,7 @@ }, /area/station/engineering/main) "oTc" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ dir = 4; name = "Cargo Lobby" }, @@ -52693,7 +52693,7 @@ /turf/open/floor/iron/smooth, /area/station/maintenance/port/aft) "oVP" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Recreation Area" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -53229,7 +53229,7 @@ /area/station/commons/dorms) "pcK" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ dir = 4; name = "Entertainment Center" }, @@ -55995,7 +55995,7 @@ }, /area/station/medical/virology) "pRr" = ( -/mob/living/basic/giant_spider/hunter/scrawny, +/mob/living/basic/spider/giant/hunter/scrawny, /obj/machinery/light/small/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/status_display/ai/directional/south, @@ -56130,7 +56130,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ dir = 4; name = "Library" }, @@ -56950,7 +56950,7 @@ "qbl" = ( /obj/effect/turf_decal/siding/thinplating, /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ dir = 4; name = "Arrivals" }, @@ -62920,7 +62920,7 @@ /turf/open/floor/iron/freezer, /area/station/medical/chemistry) "rLK" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Recreation Area" }, /obj/machinery/door/firedoor, @@ -71116,7 +71116,7 @@ /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/department/electrical) "tWY" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Primary Tool Storage" }, /obj/machinery/door/firedoor, @@ -78732,7 +78732,7 @@ /area/station/hallway/primary/fore) "wbx" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ dir = 4; name = "Arrivals" }, @@ -81869,7 +81869,7 @@ /area/station/ai_monitored/command/storage/eva) "wUC" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ dir = 4; name = "Game Room" }, @@ -84438,7 +84438,7 @@ /area/station/hallway/primary/central) "xKx" = ( /obj/effect/decal/cleanable/dirt, -/mob/living/basic/giant_spider/hunter/scrawny, +/mob/living/basic/spider/giant/hunter/scrawny, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron/smooth, /area/station/maintenance/department/electrical) diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 1af86355605..70907224e40 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -6687,13 +6687,6 @@ /obj/effect/light_emitter/podbay, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/one) -"EU" = ( -/obj/machinery/door/poddoor/ert{ - id = "XCCertstore" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/centcom/central_command_areas/armory) "EV" = ( /obj/structure/table/wood, /obj/machinery/microwave{ @@ -7009,6 +7002,18 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/smooth_edge, /area/centcom/central_command_areas/evacuation/ship) +"Hh" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp, +/obj/machinery/requests_console/directional/north{ + department = "Captain's Desk"; + name = "CentCom Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/announcement, +/obj/effect/mapping_helpers/requests_console/information, +/obj/effect/mapping_helpers/requests_console/assistance, +/turf/open/floor/iron/grimy, +/area/centcom/central_command_areas/admin) "Hi" = ( /obj/effect/turf_decal/tile/green, /obj/machinery/light/directional/south, @@ -8877,6 +8882,21 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) +"Rj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/airlock/vault{ + req_access = list("cent_captain") + }, +/obj/machinery/door/poddoor/shutters/indestructible{ + id = "XCCadminstore" + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/admin/storage) "Rk" = ( /obj/structure/cable, /obj/structure/marker_beacon/burgundy, @@ -9188,6 +9208,13 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/one) +"ST" = ( +/obj/machinery/door/poddoor/ert{ + id = "XCCertstore" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/centcom/central_command_areas/armory) "SX" = ( /obj/machinery/computer/shuttle, /turf/open/floor/iron/dark/herringbone, @@ -9800,6 +9827,14 @@ /obj/machinery/status_display/evac/directional/east, /turf/open/floor/iron, /area/centcom/central_command_areas/armory) +"VO" = ( +/obj/machinery/door/poddoor/ert{ + id = "XCCertstore" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/cable, +/turf/open/floor/iron, +/area/centcom/central_command_areas/armory) "VP" = ( /obj/effect/turf_decal/tile/brown/anticorner/contrasted, /turf/open/floor/iron, @@ -10499,14 +10534,6 @@ }, /turf/open/floor/iron/white, /area/centcom/tdome/observation) -"Zp" = ( -/obj/machinery/door/poddoor/ert{ - id = "XCCertstore" - }, -/obj/effect/turf_decal/delivery, -/obj/structure/cable, -/turf/open/floor/iron, -/area/centcom/central_command_areas/armory) "Zq" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/herringbone, @@ -10520,17 +10547,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/armory) -"Zw" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp, -/obj/machinery/requests_console/directional/north{ - department = "Captain's Desk" - }, -/obj/effect/mapping_helpers/requests_console/announcement, -/obj/effect/mapping_helpers/requests_console/information, -/obj/effect/mapping_helpers/requests_console/assistance, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/admin) "Zx" = ( /obj/machinery/computer/records/security{ dir = 8 @@ -10666,21 +10682,6 @@ /obj/effect/mapping_helpers/airlock/access/all/admin/storage, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) -"ZY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/airlock/vault{ - req_access = list("cent_captain") - }, -/obj/machinery/door/poddoor/shutters/indestructible{ - id = "XCCadminstore" - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/admin/storage) (1,1,1) = {" fX @@ -48879,7 +48880,7 @@ On vo fP On -Zw +Hh XV hd To @@ -49925,9 +49926,9 @@ ne mD Ya rY -EU -Zp -EU +ST +VO +ST rY Ya Ya @@ -50685,7 +50686,7 @@ On On YU YU -ZY +Rj kR YU oe diff --git a/_maps/map_files/generic/CentCom_skyrat_z2.dmm b/_maps/map_files/generic/CentCom_skyrat_z2.dmm index 0a5f3b0e85a..4ee78940736 100644 --- a/_maps/map_files/generic/CentCom_skyrat_z2.dmm +++ b/_maps/map_files/generic/CentCom_skyrat_z2.dmm @@ -1841,7 +1841,7 @@ /turf/open/indestructible/hotelwood, /area/centcom/holding/cafedorms) "aAe" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ dir = 4 }, /turf/open/floor/mineral/titanium, @@ -4512,7 +4512,7 @@ }, /area/centcom/holding/cafe) "bwP" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Interlink Longue" }, /obj/effect/turf_decal/siding/wood, @@ -4613,11 +4613,7 @@ name = "Shinto Cabin" }, /obj/structure/fans/tiny/invisible, -/obj/effect/turf_decal/siding{ - icon = 'icons/turf/floors/carpet.dmi'; - icon_state = "carpet-1" - }, -/turf/open/floor/sepia, +/turf/open/floor/carpet, /area/centcom/holding/cafedorms) "bGH" = ( /obj/effect/turf_decal/trimline/dark_red/filled/arrow_cw{ @@ -5488,7 +5484,7 @@ /turf/open/floor/iron/dark/textured_large, /area/cruiser_dock) "dPd" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ dir = 4; name = "Interlink Locker Room" }, @@ -5575,7 +5571,7 @@ /turf/open/floor/wood, /area/centcom/interlink) "dXN" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Interlink Bar" }, /turf/open/floor/iron/cafeteria, @@ -6053,7 +6049,7 @@ /turf/open/floor/iron, /area/centcom/interlink) "fua" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ dir = 8; name = "Interlink Longue" }, @@ -6210,7 +6206,7 @@ }, /area/centcom/holding/cafe) "fOv" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Interlink Public Garden" }, /obj/effect/turf_decal/siding/white{ @@ -6548,12 +6544,7 @@ /turf/open/floor/iron/dark, /area/centcom/interlink) "gLq" = ( -/obj/effect/turf_decal/siding{ - icon = 'icons/turf/floors/carpet.dmi'; - icon_state = "carpet-2"; - pixel_y = -16 - }, -/turf/open/floor/bamboo, +/turf/open/floor/carpet, /area/centcom/holding/cafedorms) "gMw" = ( /turf/closed/wall/mineral/sandstone, @@ -7193,7 +7184,7 @@ /turf/open/misc/beach/sand, /area/centcom/holding/cafepark) "iwK" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ dir = 4; name = "Interlink Cafe" }, @@ -7866,7 +7857,7 @@ /turf/open/floor/iron/dark/textured_large, /area/cruiser_dock) "kfb" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Interlink Locker Room" }, /turf/open/floor/iron, @@ -7915,7 +7906,7 @@ }, /area/centcom/interlink) "kmV" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Interlink Access" }, /obj/machinery/door/poddoor/shutters/indestructible{ @@ -10160,7 +10151,7 @@ }, /area/centcom/holding/cafe) "pPI" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Interlink" }, /obj/effect/turf_decal/siding/dark, @@ -10279,7 +10270,7 @@ /turf/open/floor/wood, /area/centcom/holding/cafe) "qbk" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Interlink Access" }, /obj/machinery/door/poddoor/shutters/indestructible{ @@ -10611,7 +10602,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 8 }, -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ dir = 4; name = "Interlink Cafe" }, @@ -10836,7 +10827,7 @@ /turf/open/floor/iron/dark, /area/centcom/interlink) "rGI" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ dir = 4; name = "Interlink Aux Garden" }, @@ -12503,7 +12494,7 @@ /turf/closed/indestructible/rock, /area/centcom/interlink) "vLY" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ dir = 4; name = "Interlink Bar" }, @@ -12522,7 +12513,7 @@ /turf/open/misc/dirt/planet, /area/centcom/holding/cafepark) "vRf" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ dir = 4; name = "Interlink Garden" }, @@ -13187,7 +13178,7 @@ /area/centcom/holding/cafepark) "xIR" = ( /obj/effect/turf_decal/siding/wood, -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Interlink Cafe" }, /turf/open/floor/wood/parquet, @@ -13361,7 +13352,7 @@ /turf/open/misc/asteroid, /area/cruiser_dock) "xYp" = ( -/obj/machinery/door/airlock/multi_tile/glass{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Interlink Cafe" }, /obj/effect/turf_decal/siding/wood, diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 4eeb93f7285..d3fa5b0ed0d 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -3806,24 +3806,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"axh" = ( -/obj/structure/rack, -/obj/item/clothing/glasses/meson{ - pixel_y = 4 - }, -/obj/item/lighter, -/obj/item/reagent_containers/pill/patch/aiuri, -/obj/item/stock_parts/cell/high, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/item/computer_disk/engineering, -/obj/item/computer_disk/engineering, -/obj/item/computer_disk/engineering, -/obj/item/computer_disk/atmos, -/turf/open/floor/iron, -/area/station/command/heads_quarters/ce) "axp" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -9117,8 +9099,8 @@ /area/station/service/hydroponics/garden) "bZI" = ( /obj/machinery/door/window/brigdoor/left/directional/south{ - req_access = list("morgue_secure"); - name = "Secure Morgue Trays" + name = "Secure Morgue Trays"; + req_access = list("morgue_secure") }, /turf/open/floor/iron/dark, /area/station/medical/morgue) @@ -10094,10 +10076,10 @@ /area/station/command/heads_quarters/rd) "csn" = ( /obj/machinery/elevator_control_panel{ + layer = 3.1; linked_elevator_id = "tram_xeno_lift"; pixel_y = 2; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck"); - layer = 3.1 + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") }, /turf/closed/wall, /area/station/science/xenobiology) @@ -10637,8 +10619,8 @@ pixel_y = 6 }, /obj/machinery/light_switch/directional/east{ - pixel_y = -8; - pixel_x = 23 + pixel_x = 23; + pixel_y = -8 }, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) @@ -11320,8 +11302,8 @@ /obj/structure/railing/corner, /obj/machinery/light/small/directional/west, /obj/machinery/flasher/directional/west{ - pixel_y = -8; - pixel_x = -24 + pixel_x = -24; + pixel_y = -8 }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) @@ -11669,8 +11651,8 @@ dir = 1 }, /obj/machinery/door/window/elevator/left/directional/south{ - elevator_mode = 1; - elevator_linked_id = "tram_perma_lift" + elevator_linked_id = "tram_perma_lift"; + elevator_mode = 1 }, /turf/open/floor/iron, /area/station/security/brig) @@ -11889,6 +11871,16 @@ }, /turf/open/floor/iron, /area/station/science/ordnance/storage) +"cXX" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/warning{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/right) "cYi" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 8 @@ -11925,8 +11917,8 @@ /obj/effect/turf_decal/stripes/white/line, /obj/effect/turf_decal/tile/neutral/tram, /turf/open/floor/noslip/tram_plate/energized{ - outbound = 2; - inbound = 1 + inbound = 1; + outbound = 2 }, /area/station/hallway/primary/tram/center) "cYx" = ( @@ -14881,8 +14873,8 @@ pixel_y = 4 }, /obj/machinery/light_switch/directional/east{ - pixel_y = -8; - pixel_x = 24 + pixel_x = 24; + pixel_y = -8 }, /turf/open/floor/iron, /area/station/science/robotics/lab) @@ -14911,8 +14903,8 @@ dir = 1 }, /obj/machinery/light_switch/directional/north{ - pixel_y = 23; - pixel_x = -8 + pixel_x = -8; + pixel_y = 23 }, /turf/open/floor/iron, /area/station/service/hydroponics/garden) @@ -14933,7 +14925,7 @@ /turf/open/floor/iron, /area/station/construction/mining/aux_base) "edP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/ordnance) "eep" = ( @@ -15861,8 +15853,8 @@ pixel_y = 5 }, /obj/machinery/light_switch/directional/west{ - pixel_y = -9; - pixel_x = -22 + pixel_x = -22; + pixel_y = -9 }, /turf/open/floor/iron, /area/station/security/checkpoint/medical) @@ -16376,8 +16368,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/machinery/light_switch/directional/east{ - pixel_y = -8; - pixel_x = 22 + pixel_x = 22; + pixel_y = -8 }, /turf/open/floor/iron, /area/station/security/checkpoint/escape) @@ -16626,7 +16618,7 @@ /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) "eOZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply, /turf/closed/wall/r_wall, /area/station/science/ordnance/burnchamber) "ePd" = ( @@ -16637,8 +16629,8 @@ dir = 5 }, /obj/machinery/light_switch/directional/east{ - pixel_y = -8; - pixel_x = 23 + pixel_x = 23; + pixel_y = -8 }, /turf/open/floor/iron/dark, /area/station/service/hydroponics) @@ -16650,7 +16642,7 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/incinerator_input{ dir = 1 }, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "ePw" = ( /obj/structure/filingcabinet, @@ -16814,6 +16806,10 @@ "eSx" = ( /turf/closed/wall, /area/station/service/kitchen) +"eSy" = ( +/obj/effect/landmark/tram/nav/immovable_rod, +/turf/open/floor/carpet, +/area/station/hallway/secondary/entry) "eSz" = ( /turf/open/openspace, /area/station/hallway/primary/tram/center) @@ -17878,12 +17874,11 @@ "fnv" = ( /obj/structure/table/wood, /obj/machinery/firealarm/directional/south{ - pixel_y = -26; pixel_x = 3 }, /obj/machinery/light_switch/directional/south{ - pixel_y = -23; - pixel_x = -8 + pixel_x = -8; + pixel_y = -23 }, /turf/open/floor/wood, /area/station/commons/vacant_room/office) @@ -18125,9 +18120,9 @@ /turf/open/floor/plating, /area/station/engineering/supermatter) "frT" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, -/turf/closed/wall/r_wall, -/area/station/maintenance/disposal/incinerator) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/closed/wall, +/area/station/science/ordnance) "frV" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance/testlab) @@ -18524,7 +18519,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ dir = 1 }, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "fzo" = ( /obj/effect/landmark/start/hangover, @@ -18965,6 +18960,15 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) +"fIV" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/flashlight/lamp, +/turf/open/floor/iron/dark, +/area/station/escapepodbay) "fJe" = ( /obj/effect/turf_decal/siding/thinplating, /obj/structure/cable, @@ -19170,7 +19174,7 @@ /obj/machinery/door/airlock/public/glass/incinerator/atmos_exterior, /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "fMm" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ @@ -19693,8 +19697,8 @@ pixel_x = 5 }, /obj/machinery/light_switch/directional/north{ - pixel_y = 23; - pixel_x = -8 + pixel_x = -8; + pixel_y = 23 }, /turf/open/floor/wood/large, /area/station/service/barber) @@ -19843,6 +19847,11 @@ "gaH" = ( /turf/open/floor/catwalk_floor, /area/station/hallway/primary/tram/right) +"gaO" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/science/ordnance) "gaY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21471,17 +21480,10 @@ /turf/open/floor/iron, /area/station/cargo/miningdock) "gFm" = ( -/obj/effect/turf_decal/box/red/corners{ - dir = 4 - }, -/obj/effect/turf_decal/box/red/corners{ +/obj/machinery/light/small/directional/west, +/obj/machinery/plumbing/input{ dir = 8 }, -/obj/effect/turf_decal/box/red/corners{ - dir = 1 - }, -/obj/effect/turf_decal/box/red/corners, -/obj/machinery/light/small/directional/west, /turf/open/floor/engine, /area/station/science/xenobiology) "gFt" = ( @@ -21761,8 +21763,8 @@ }, /obj/structure/reagent_dispensers/fueltank, /obj/machinery/light_switch/directional/east{ - pixel_y = 8; - pixel_x = 23 + pixel_x = 23; + pixel_y = 8 }, /turf/open/floor/iron/dark, /area/station/command/teleporter) @@ -21988,8 +21990,8 @@ pixel_x = 3 }, /obj/machinery/light_switch/directional/south{ - pixel_y = -23; - pixel_x = -8 + pixel_x = -8; + pixel_y = -23 }, /turf/open/floor/iron/showroomfloor, /area/station/security/lockers) @@ -22344,6 +22346,16 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/medical/break_room) +"gVW" = ( +/obj/effect/turf_decal/stripes/white/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 8 + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/escapepodbay) "gWd" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -23175,6 +23187,13 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/station/solars/starboard/fore) +"hmb" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/escapepodbay) "hmd" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -23634,6 +23653,13 @@ dir = 1 }, /area/station/hallway/secondary/service) +"hwQ" = ( +/obj/effect/turf_decal/box/red, +/obj/machinery/plumbing/growing_vat{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "hyE" = ( /obj/structure/table/glass, /obj/item/book/manual/wiki/security_space_law{ @@ -23657,8 +23683,8 @@ dir = 9 }, /obj/machinery/light_switch/directional/west{ - pixel_y = -8; - pixel_x = -22 + pixel_x = -22; + pixel_y = -8 }, /turf/open/floor/iron, /area/station/cargo/drone_bay) @@ -23734,7 +23760,7 @@ /turf/open/floor/iron/grimy, /area/station/security/detectives_office) "hBl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/r_wall, /area/station/science/ordnance/burnchamber) "hBr" = ( @@ -23836,8 +23862,8 @@ }, /obj/structure/sign/clock/directional/north, /obj/machinery/light_switch/directional/north{ - pixel_y = 23; - pixel_x = -8 + pixel_x = -8; + pixel_y = 23 }, /turf/open/floor/wood, /area/station/service/bar/backroom) @@ -24713,6 +24739,13 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"hUa" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/tank/air{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal/incinerator) "hUf" = ( /obj/machinery/camera/emp_proof{ c_tag = "Engineering - Atmospherics Incinerator"; @@ -24725,6 +24758,7 @@ /obj/item/radio/intercom/directional/north, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "hUr" = ( @@ -25765,8 +25799,8 @@ dir = 8 }, /obj/machinery/door/window/elevator/left/directional/east{ - elevator_mode = 1; - elevator_linked_id = "tram_dorm_lift" + elevator_linked_id = "tram_dorm_lift"; + elevator_mode = 1 }, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) @@ -25862,8 +25896,8 @@ /obj/machinery/status_display/ai/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light_switch/directional/east{ - pixel_y = -8; - pixel_x = 23 + pixel_x = 23; + pixel_y = -8 }, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) @@ -26177,24 +26211,13 @@ /turf/open/floor/catwalk_floor, /area/station/maintenance/port/central) "ixu" = ( -/obj/structure/closet/crate/science{ - name = "MOD core crate" - }, -/obj/item/mod/core/standard{ - pixel_x = -4 - }, -/obj/item/mod/core/standard{ - pixel_x = -4 - }, -/obj/item/mod/core/standard{ - pixel_x = -4 - }, /obj/structure/noticeboard/directional/north, /obj/machinery/camera/directional/north{ c_tag = "Science - Robotics"; network = list("ss13","rd") }, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/closet/crate/mod, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) "ixC" = ( @@ -27062,7 +27085,6 @@ pixel_y = -23 }, /obj/machinery/firealarm/directional/south{ - pixel_y = -26; pixel_x = 3 }, /turf/open/floor/carpet, @@ -27984,8 +28006,8 @@ }, /obj/effect/spawner/random/bureaucracy/briefcase, /obj/machinery/light_switch/directional/east{ - pixel_y = -8; - pixel_x = 23 + pixel_x = 23; + pixel_y = -8 }, /turf/open/floor/wood, /area/station/service/lawoffice) @@ -29929,8 +29951,8 @@ /turf/open/floor/iron, /area/station/tcommsat/computer) "jLH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/closed/wall/r_wall, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply, +/turf/closed/wall, /area/station/science/ordnance) "jLI" = ( /obj/effect/turf_decal/trimline/dark_green/line{ @@ -30807,6 +30829,16 @@ /obj/machinery/light/dim/directional/south, /turf/open/floor/iron/dark, /area/station/service/bar) +"kbA" = ( +/obj/effect/turf_decal/stripes/white/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 4 + }, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron, +/area/station/escapepodbay) "kbF" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/turf_decal/siding/thinplating/dark{ @@ -30829,8 +30861,8 @@ pixel_y = 8 }, /obj/machinery/light_switch/directional/north{ - pixel_y = 23; - pixel_x = 8 + pixel_x = 8; + pixel_y = 23 }, /turf/open/floor/carpet, /area/station/service/chapel/monastery) @@ -30850,8 +30882,8 @@ /obj/effect/turf_decal/stripes/white/line, /obj/effect/turf_decal/tile/neutral/tram, /turf/open/floor/noslip/tram_plate/energized{ - outbound = 3; - inbound = 2 + inbound = 2; + outbound = 3 }, /area/station/hallway/primary/tram/right) "kcm" = ( @@ -31253,7 +31285,8 @@ dir = 5 }, /obj/machinery/requests_console/directional/north{ - department = "Security" + department = "Security"; + name = "Security Requests Console" }, /turf/open/floor/iron, /area/station/security/checkpoint/supply) @@ -31806,17 +31839,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"ksO" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) "ksP" = ( /obj/effect/turf_decal/siding/thinplating/corner{ dir = 1 @@ -31959,6 +31981,10 @@ name = "Secure Pen Lockdown" }, /obj/machinery/light/directional/north, +/obj/item/soap{ + pixel_y = 2 + }, +/obj/structure/table/glass, /turf/open/floor/iron/dark, /area/station/science/xenobiology) "kwe" = ( @@ -32091,8 +32117,8 @@ pixel_x = 3 }, /obj/machinery/light_switch/directional/north{ - pixel_y = 23; - pixel_x = -8 + pixel_x = -8; + pixel_y = 23 }, /turf/open/floor/iron/dark, /area/station/security/evidence) @@ -32595,7 +32621,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /obj/machinery/air_sensor/incinerator_tank, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "kHv" = ( /obj/structure/lattice/catwalk, @@ -33761,6 +33787,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/tram/nav/immovable_rod, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "lax" = ( @@ -34945,6 +34972,12 @@ /obj/structure/cable, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) +"lwt" = ( +/obj/machinery/atmospherics/components/binary/pump/on/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/science/ordnance) "lwx" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -35275,8 +35308,8 @@ /obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/machinery/light_switch/directional/east{ - pixel_y = 8; - pixel_x = 22 + pixel_x = 22; + pixel_y = 8 }, /turf/open/floor/iron/freezer, /area/station/medical/coldroom) @@ -35415,10 +35448,12 @@ /area/station/security/checkpoint/engineering) "lEI" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 10 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "lEL" = ( @@ -35739,8 +35774,8 @@ dir = 4 }, /obj/machinery/light_switch/directional/east{ - pixel_y = -8; - pixel_x = 23 + pixel_x = 23; + pixel_y = -8 }, /turf/open/floor/iron/dark, /area/station/security/courtroom) @@ -36393,8 +36428,8 @@ /turf/open/floor/engine/vacuum, /area/station/science/ordnance/burnchamber) "lUP" = ( -/obj/effect/landmark/tram/tramstation/west, /obj/effect/turf_decal/tile/neutral/tram, +/obj/effect/landmark/tram/platform/tramstation/west, /turf/open/floor/noslip/tram_plate, /area/station/hallway/primary/tram/left) "lUZ" = ( @@ -36499,8 +36534,8 @@ /obj/item/blood_filter, /obj/item/clothing/gloves/latex/nitrile, /obj/machinery/light_switch/directional/east{ - pixel_y = -9; - pixel_x = 22 + pixel_x = 22; + pixel_y = -9 }, /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/white, @@ -36665,10 +36700,10 @@ /turf/open/floor/iron, /area/station/security/checkpoint/arrivals) "lZJ" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2{ +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 }, -/obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/white, /area/station/science/ordnance) "lZW" = ( @@ -36947,8 +36982,8 @@ /obj/machinery/airalarm/directional/north, /obj/structure/disposalpipe/trunk, /obj/machinery/light_switch/directional/west{ - pixel_y = -8; - pixel_x = -23 + pixel_x = -23; + pixel_y = -8 }, /turf/open/floor/iron/dark, /area/station/service/hydroponics) @@ -37230,6 +37265,23 @@ "mjM" = ( /turf/closed/wall, /area/station/security/medical) +"mjX" = ( +/obj/structure/rack, +/obj/item/clothing/glasses/meson{ + pixel_y = 4 + }, +/obj/item/lighter, +/obj/item/reagent_containers/pill/patch/aiuri, +/obj/item/stock_parts/cell/high, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/item/computer_disk/engineering, +/obj/item/computer_disk/engineering, +/obj/item/computer_disk/engineering, +/turf/open/floor/iron, +/area/station/command/heads_quarters/ce) "mki" = ( /obj/machinery/door/airlock/command{ name = "Head of Personnel" @@ -37472,8 +37524,8 @@ network = list("ss13","rd") }, /obj/machinery/light_switch/directional/south{ - pixel_y = -24; - pixel_x = -8 + pixel_x = -8; + pixel_y = -24 }, /turf/open/floor/iron, /area/station/command/heads_quarters/rd) @@ -38061,8 +38113,8 @@ dir = 4 }, /obj/machinery/incident_display/tram/directional/north{ - name = "darwin award counter"; - desc = "A display that indicates how many dents that'll need fixed after the shift is over." + desc = "A display that indicates how many dents that'll need fixed after the shift is over."; + name = "darwin award counter" }, /turf/open/floor/iron, /area/station/maintenance/port/central) @@ -38840,8 +38892,8 @@ /turf/open/floor/iron, /area/station/security/courtroom/holding) "mQE" = ( -/obj/effect/landmark/tram/tramstation/east, /obj/effect/turf_decal/tile/neutral/tram, +/obj/effect/landmark/tram/platform/tramstation/east, /turf/open/floor/noslip/tram_plate, /area/station/hallway/primary/tram/right) "mQS" = ( @@ -39032,6 +39084,12 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/cargo/miningdock/cafeteria) +"mWp" = ( +/obj/machinery/atmospherics/components/tank/air{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/science/ordnance) "mWu" = ( /obj/machinery/door/airlock/external{ name = "Solar Maintenance" @@ -39409,7 +39467,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/tile/bar{ dir = 8 }, @@ -40398,6 +40455,9 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/purple{ + dir = 8 + }, /turf/open/floor/iron/white, /area/station/science/xenobiology) "nti" = ( @@ -41616,6 +41676,17 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"nQv" = ( +/obj/effect/turf_decal/trimline/neutral/warning, +/obj/structure/table/reinforced, +/obj/item/table_clock{ + pixel_y = 8 + }, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) "nQB" = ( /obj/effect/turf_decal/sand, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -41719,8 +41790,8 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light_switch/directional/west{ - pixel_y = 9; - pixel_x = -22 + pixel_x = -22; + pixel_y = 9 }, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) @@ -41738,17 +41809,10 @@ /turf/closed/wall/r_wall, /area/station/commons/vacant_room/commissary) "nSR" = ( -/obj/effect/turf_decal/box/red/corners{ - dir = 4 - }, -/obj/effect/turf_decal/box/red/corners{ +/obj/machinery/light/small/directional/east, +/obj/machinery/plumbing/input{ dir = 8 }, -/obj/effect/turf_decal/box/red/corners{ - dir = 1 - }, -/obj/effect/turf_decal/box/red/corners, -/obj/machinery/light/small/directional/east, /turf/open/floor/engine, /area/station/science/xenobiology) "nSV" = ( @@ -41902,8 +41966,8 @@ }, /obj/structure/cable, /obj/machinery/light_switch/directional/south{ - pixel_y = -24; - pixel_x = 10 + pixel_x = 10; + pixel_y = -24 }, /turf/open/floor/iron, /area/station/security/checkpoint/supply) @@ -42647,8 +42711,8 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/bar/opposingcorners, /obj/machinery/light_switch/directional/south{ - pixel_y = -23; - pixel_x = 8 + pixel_x = 8; + pixel_y = -23 }, /turf/open/floor/iron, /area/station/cargo/miningdock/cafeteria) @@ -43260,16 +43324,14 @@ /turf/open/floor/glass/reinforced, /area/station/science/research) "ovK" = ( -/obj/effect/turf_decal/stripes/white/line{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/light/small/directional/south{ dir = 1 }, -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/turf_decal/tile/neutral/tram, -/turf/open/floor/noslip/tram_plate/energized{ - outbound = 2; - inbound = 1 - }, -/area/station/hallway/primary/tram/left) +/turf/open/floor/plating, +/area/station/science/ordnance) "ovL" = ( /turf/open/floor/iron, /area/station/hallway/secondary/service) @@ -43420,6 +43482,7 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/south, /turf/open/floor/plating, /area/station/escapepodbay) "oyK" = ( @@ -43487,9 +43550,6 @@ /turf/open/floor/catwalk_floor, /area/station/solars/starboard/fore) "oAn" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ - dir = 4 - }, /obj/machinery/airlock_sensor/incinerator_ordmix{ pixel_x = 23; pixel_y = 1 @@ -43497,6 +43557,9 @@ /obj/machinery/atmospherics/components/binary/pump{ dir = 1 }, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ + dir = 4 + }, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) "oAG" = ( @@ -43766,8 +43829,8 @@ "oHq" = ( /obj/effect/turf_decal/tile/neutral/tram, /turf/open/floor/noslip/tram_plate/energized{ - outbound = 3; - inbound = 2 + inbound = 2; + outbound = 3 }, /area/station/hallway/primary/tram/right) "oHC" = ( @@ -43872,10 +43935,10 @@ /area/space/nearstation) "oKn" = ( /obj/machinery/elevator_control_panel{ + layer = 3.1; linked_elevator_id = "tram_xeno_lift"; pixel_y = 2; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck"); - layer = 3.1 + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") }, /turf/closed/wall/r_wall, /area/station/science/xenobiology) @@ -43935,7 +43998,6 @@ /area/station/ai_monitored/turret_protected/aisat_interior) "oMP" = ( /obj/machinery/firealarm/directional/south{ - pixel_y = -26; pixel_x = 3 }, /turf/closed/mineral/random/stationside/asteroid/porus, @@ -44523,6 +44585,9 @@ /obj/machinery/door/airlock/public/glass/incinerator/atmos_interior, /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/obj/machinery/airlock_controller/incinerator_atmos{ + pixel_x = -24 + }, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) "oZq" = ( @@ -44547,8 +44612,9 @@ /area/station/security/brig) "oZC" = ( /obj/structure/industrial_lift/tram/white, -/obj/effect/landmark/tram/tramstation/central, /obj/effect/turf_decal/tile/neutral/tram, +/obj/effect/landmark/tram/nav/tramstation/main, +/obj/effect/landmark/tram/platform/tramstation/central, /turf/open/floor/noslip/tram_plate, /area/station/hallway/primary/tram/center) "pal" = ( @@ -44804,6 +44870,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/prison/safe) +"peB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/binary/pump/on/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/plating, +/area/station/maintenance/disposal/incinerator) "peO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/showroomfloor, @@ -45664,8 +45736,8 @@ capacity = 9e+006; charge = 10000 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "ptu" = ( @@ -46891,8 +46963,8 @@ /obj/item/radio/intercom/directional/west, /obj/machinery/airalarm/directional/north, /obj/machinery/light_switch/directional/west{ - pixel_y = -8; - pixel_x = -23 + pixel_x = -23; + pixel_y = -8 }, /turf/open/floor/iron, /area/station/security/checkpoint/arrivals) @@ -47514,26 +47586,13 @@ /turf/open/space/basic, /area/station/solars/starboard/fore) "pZM" = ( -/obj/structure/rack, -/obj/item/storage/box/gloves{ - pixel_x = -4; - pixel_y = 8 - }, -/obj/item/storage/box/masks{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/wrench, -/obj/item/knife/kitchen, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, /obj/machinery/airalarm/directional/west, /obj/machinery/camera/directional/west{ c_tag = "Science - Cytology West"; network = list("ss13","rd","xeno") }, -/turf/open/floor/iron/white, +/obj/machinery/hydroponics/soil, +/turf/open/floor/grass, /area/station/science/xenobiology) "pZW" = ( /turf/closed/wall, @@ -47741,7 +47800,7 @@ /area/station/cargo/lobby) "qeg" = ( /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_ordmix{ - dir = 4 + dir = 8 }, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) @@ -48074,8 +48133,8 @@ /obj/machinery/recharger, /obj/structure/cable, /obj/machinery/light_switch/directional/east{ - pixel_y = -8; - pixel_x = 23 + pixel_x = 23; + pixel_y = -8 }, /turf/open/floor/iron/showroomfloor, /area/station/security/warden) @@ -48337,11 +48396,6 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) -"qoY" = ( -/obj/structure/lattice, -/obj/machinery/light/dim/directional/north, -/turf/open/openspace, -/area/station/asteroid) "qoZ" = ( /obj/item/paper/fluff/ids_for_dummies, /turf/open/misc/asteroid/airless, @@ -48568,17 +48622,6 @@ /obj/item/soap/syndie, /turf/open/floor/iron/showroomfloor, /area/station/commons/vacant_room) -"qtQ" = ( -/obj/effect/turf_decal/trimline/neutral/warning, -/obj/structure/table/reinforced, -/obj/item/table_clock{ - pixel_y = 8 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/item/storage/backpack/duffelbag/med/surgery, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) "qtS" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -48928,8 +48971,8 @@ dir = 2 }, /obj/machinery/light_switch/directional/west{ - pixel_y = -8; - pixel_x = -23 + pixel_x = -23; + pixel_y = -8 }, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) @@ -49289,8 +49332,8 @@ }, /obj/effect/turf_decal/tile/brown/fourcorners, /obj/machinery/light_switch/directional/west{ - pixel_y = 8; - pixel_x = -22 + pixel_x = -22; + pixel_y = 8 }, /turf/open/floor/iron, /area/station/cargo/sorting) @@ -49818,8 +49861,8 @@ dir = 8 }, /obj/machinery/door/window/elevator/left/directional/east{ - elevator_mode = 1; - elevator_linked_id = "tram_dorm_lift" + elevator_linked_id = "tram_dorm_lift"; + elevator_mode = 1 }, /turf/open/floor/iron, /area/station/maintenance/tram/left) @@ -50017,7 +50060,6 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/white, @@ -50295,6 +50337,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/directional/west, +/obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/exit) "ram" = ( @@ -50476,8 +50519,8 @@ c_tag = "Secure - EVA Storage" }, /obj/machinery/light_switch/directional/south{ - pixel_y = -23; - pixel_x = 8 + pixel_x = 8; + pixel_y = -23 }, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) @@ -50623,6 +50666,15 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/tram/right) +"rfe" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, +/obj/machinery/light/small/directional/south{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal/incinerator) "rff" = ( /obj/effect/turf_decal/trimline/dark_red/warning{ dir = 10 @@ -51494,8 +51546,8 @@ /obj/effect/turf_decal/stripes/white/line, /obj/effect/turf_decal/tile/neutral/tram, /turf/open/floor/noslip/tram_plate/energized{ - outbound = 3; - inbound = 2 + inbound = 2; + outbound = 3 }, /area/station/hallway/primary/tram/center) "ruV" = ( @@ -51671,6 +51723,13 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) +"ryK" = ( +/obj/machinery/door/airlock/research{ + name = "Burn Chamber Maintenance" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply, +/turf/open/floor/plating, +/area/station/science/ordnance) "ryS" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 @@ -51683,6 +51742,18 @@ /turf/open/floor/iron/white, /area/station/science/ordnance/office) "rzt" = ( +/obj/structure/rack, +/obj/item/storage/box/gloves{ + pixel_x = -4; + pixel_y = 8 + }, +/obj/item/storage/box/masks{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/wrench, +/obj/item/knife/kitchen, +/obj/effect/turf_decal/siding/purple, /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 }, @@ -53385,8 +53456,8 @@ dir = 2 }, /obj/machinery/light_switch/directional/east{ - pixel_y = -9; - pixel_x = 22 + pixel_x = 22; + pixel_y = -9 }, /turf/open/floor/iron/white, /area/station/medical/surgery/aft) @@ -53501,6 +53572,14 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"sjT" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/purple/corner{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "skb" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -53988,8 +54067,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light_switch/directional/east{ - pixel_y = -9; - pixel_x = 22 + pixel_x = 22; + pixel_y = -9 }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) @@ -54085,8 +54164,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light_switch/directional/west{ - pixel_y = 8; - pixel_x = -23 + pixel_x = -23; + pixel_y = 8 }, /turf/open/floor/iron/dark, /area/station/service/chapel/office) @@ -54489,16 +54568,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"sAW" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) "sBr" = ( /obj/machinery/newscaster/directional/west, /obj/structure/disposalpipe/segment{ @@ -54631,6 +54700,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/siding/purple/corner{ + dir = 1 + }, /turf/open/floor/iron/white, /area/station/science/xenobiology) "sEV" = ( @@ -54796,9 +54868,6 @@ /obj/effect/landmark/start/atmospheric_technician, /obj/effect/landmark/navigate_destination/incinerator, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) @@ -55436,8 +55505,8 @@ pixel_x = -3 }, /obj/machinery/light_switch/directional/south{ - pixel_y = -23; - pixel_x = 8 + pixel_x = 8; + pixel_y = -23 }, /turf/open/floor/iron, /area/station/construction/mining/aux_base) @@ -56479,8 +56548,8 @@ /obj/item/paper_bin, /obj/item/pen, /obj/machinery/light_switch/directional/west{ - pixel_y = -8; - pixel_x = -23 + pixel_x = -23; + pixel_y = -8 }, /turf/open/floor/iron, /area/station/security/processing) @@ -56693,10 +56762,10 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, -/obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/tile/bar{ dir = 8 }, +/obj/machinery/light/directional/west, /turf/open/floor/iron, /area/station/escapepodbay) "tpB" = ( @@ -57107,6 +57176,10 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"twv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply, +/turf/closed/wall/r_wall, +/area/station/science/ordnance) "twz" = ( /turf/open/openspace, /area/station/hallway/secondary/entry) @@ -57529,8 +57602,8 @@ "tCo" = ( /obj/effect/turf_decal/tile/neutral/tram, /turf/open/floor/noslip/tram_plate/energized{ - outbound = 2; - inbound = 1 + inbound = 1; + outbound = 2 }, /area/station/hallway/primary/tram/left) "tCw" = ( @@ -58323,8 +58396,8 @@ pixel_y = -5 }, /obj/machinery/light_switch/directional/east{ - pixel_y = 8; - pixel_x = 23 + pixel_x = 23; + pixel_y = 8 }, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) @@ -58356,6 +58429,7 @@ dir = 1 }, /obj/effect/turf_decal/sand/plating, +/obj/machinery/light/small/directional/south, /turf/open/floor/plating, /area/station/escapepodbay) "tSp" = ( @@ -59008,6 +59082,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/directional/west, +/obj/machinery/airalarm/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/exit) "udY" = ( @@ -59080,6 +59155,11 @@ /obj/machinery/light/cold/directional/north, /turf/open/floor/grass, /area/station/commons/dorms) +"ufe" = ( +/obj/structure/lattice, +/obj/machinery/light/cold/dim/directional/west, +/turf/open/openspace, +/area/station/asteroid) "ufh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59183,6 +59263,7 @@ dir = 9 }, /obj/machinery/light/directional/west, +/obj/machinery/mining_weather_monitor/directional/north, /turf/open/floor/iron, /area/station/construction/mining/aux_base) "uhw" = ( @@ -59322,7 +59403,6 @@ /turf/open/floor/iron/white, /area/station/medical/pharmacy) "ujw" = ( -/obj/machinery/airalarm/directional/east, /obj/effect/landmark/start/hangover, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/white/line{ @@ -59825,8 +59905,8 @@ dir = 1 }, /obj/machinery/light_switch/directional/west{ - pixel_y = 8; - pixel_x = -22 + pixel_x = -22; + pixel_y = 8 }, /turf/open/floor/iron, /area/station/cargo/warehouse) @@ -60530,8 +60610,8 @@ /obj/item/stack/sheet/iron/fifty, /obj/item/storage/box/lights/mixed, /obj/machinery/light_switch/directional/west{ - pixel_y = -8; - pixel_x = -23 + pixel_x = -23; + pixel_y = -8 }, /turf/open/floor/iron, /area/station/commons/storage/tools) @@ -61241,8 +61321,8 @@ }, /obj/item/radio/intercom/directional/east, /obj/machinery/camera/directional/east{ - network = list("ss13","rd","xeno"); - c_tag = "Science - Cytology East" + c_tag = "Science - Cytology East"; + network = list("ss13","rd","xeno") }, /turf/open/floor/iron/white, /area/station/science/xenobiology) @@ -61802,19 +61882,18 @@ /area/station/service/library/lounge) "uXn" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 8; - piping_layer = 2 + dir = 8 }, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/camera/directional/south{ c_tag = "Science - Mixing Lab"; network = list("ss13","rd") }, /obj/machinery/airalarm/directional/south, /obj/effect/mapping_helpers/airalarm/mixingchamber_access, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/ordnance/burnchamber) "uXv" = ( @@ -62189,11 +62268,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit) -"veJ" = ( -/obj/structure/lattice, -/obj/machinery/light/dim/directional/south, -/turf/open/openspace, -/area/station/asteroid) "veV" = ( /turf/closed/wall, /area/station/commons/toilet) @@ -62270,8 +62344,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light_switch/directional/south{ - pixel_x = -8; - pixel_y = -26 + pixel_x = -8 }, /turf/open/floor/iron/dark/corner{ dir = 8 @@ -62359,6 +62432,14 @@ /obj/effect/mapping_helpers/trapdoor_placer, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) +"vhI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/atmos{ + name = "Turbine Maintenance" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/plating, +/area/station/maintenance/disposal/incinerator) "vic" = ( /obj/machinery/lift_indicator{ linked_elevator_id = "tram_lower_center_lift"; @@ -63696,8 +63777,8 @@ /obj/item/restraints/legcuffs/beartrap, /obj/item/restraints/legcuffs/beartrap, /obj/machinery/light_switch/directional/east{ - pixel_y = 8; - pixel_x = 23 + pixel_x = 23; + pixel_y = 8 }, /turf/open/floor/iron, /area/station/service/janitor) @@ -63978,9 +64059,7 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/white, /area/station/science/ordnance) "vKd" = ( @@ -64278,6 +64357,7 @@ /obj/machinery/firealarm/directional/west, /obj/machinery/electrolyzer, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "vPB" = ( @@ -64829,6 +64909,13 @@ /obj/machinery/computer/records/medical, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) +"waV" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/escapepodbay) "wbb" = ( /turf/open/floor/iron, /area/station/commons/dorms) @@ -65099,7 +65186,8 @@ dir = 1 }, /obj/machinery/requests_console/directional/south{ - department = "Security" + department = "Security"; + name = "Security Requests Console" }, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) @@ -65409,7 +65497,6 @@ "wlM" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "wlQ" = ( @@ -65500,8 +65587,8 @@ dir = 10 }, /obj/machinery/door/window/elevator/left/directional/south{ - elevator_mode = 1; - elevator_linked_id = "tram_perma_lift" + elevator_linked_id = "tram_perma_lift"; + elevator_mode = 1 }, /turf/open/floor/iron, /area/station/security/execution/transfer) @@ -66296,8 +66383,8 @@ /obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/machinery/light_switch/directional/east{ - pixel_y = -8; - pixel_x = 22 + pixel_x = 22; + pixel_y = -8 }, /turf/open/floor/iron/freezer, /area/station/medical/coldroom) @@ -66817,7 +66904,7 @@ "wNq" = ( /obj/machinery/igniter/incinerator_atmos, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/turf/open/floor/engine, +/turf/open/floor/engine/vacuum, /area/station/maintenance/disposal/incinerator) "wNs" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -67162,10 +67249,8 @@ /turf/open/floor/glass/reinforced, /area/station/science/research) "wXi" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 10 - }, -/turf/open/floor/iron/white, +/obj/machinery/hydroponics/soil, +/turf/open/floor/grass, /area/station/science/xenobiology) "wXx" = ( /obj/effect/turf_decal/stripes/line{ @@ -67483,7 +67568,7 @@ /area/station/maintenance/tram/mid) "xei" = ( /obj/machinery/atmospherics/components/binary/pump/on, -/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ dir = 4 }, /turf/open/floor/engine, @@ -67506,8 +67591,8 @@ pixel_x = 4 }, /obj/machinery/light_switch/directional/north{ - pixel_y = 28; - pixel_x = -6 + pixel_x = -6; + pixel_y = 28 }, /turf/open/floor/iron, /area/station/security/checkpoint/science) @@ -67566,6 +67651,9 @@ "xfL" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/purple{ + dir = 8 + }, /turf/open/floor/iron/white, /area/station/science/xenobiology) "xfN" = ( @@ -68378,9 +68466,10 @@ pixel_x = 5; pixel_y = 9 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/machinery/light/directional/east, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/science/ordnance) "xwz" = ( @@ -68868,8 +68957,8 @@ }, /obj/machinery/light/cold/directional/east, /obj/machinery/light_switch/directional/east{ - pixel_y = 8; - pixel_x = 23 + pixel_x = 23; + pixel_y = 8 }, /turf/open/floor/iron, /area/station/command/bridge) @@ -68983,6 +69072,10 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) +"xKN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/closed/wall, +/area/station/maintenance/disposal/incinerator) "xKR" = ( /obj/machinery/button/door/directional/west{ id = "private_q"; @@ -69992,6 +70085,11 @@ }, /turf/open/floor/plating, /area/station/maintenance/tram/mid) +"ydd" = ( +/obj/structure/lattice, +/obj/machinery/light/cold/dim/directional/east, +/turf/open/openspace, +/area/station/asteroid) "ydh" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -83505,11 +83603,11 @@ dDk dDk mXt abA -itN +gVW dDk dDk dDk -mXt +kbA abA itN dDk @@ -83757,7 +83855,7 @@ abF abf abf abF -abF +hmb lzJ abF abf @@ -83769,13 +83867,13 @@ ndN abf abf abF -abF +hmb lzJ abF abf abf abF -abF +hmb abF qPE apC @@ -84266,7 +84364,7 @@ aaa aaa dDk abb -abg +waV pPA abg abB @@ -84798,7 +84896,7 @@ dDk adp adA adB -adF +fIV lIS adF adK @@ -85300,7 +85398,7 @@ abM abM pZW abK -abg +waV acc ack acu @@ -102812,7 +102910,7 @@ dor fSp vKv roB -axh +mjX iHK bAK jsW @@ -110536,11 +110634,11 @@ bNz bNz bNz rRy -rRy -rRy -rRy -rRy -frT +vhI +xKN +xKN +rdO +rdO xOL qWU lPO @@ -110792,11 +110890,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +rRy +peB +rfe +hUa +qWU aaa aeQ aeR @@ -111049,11 +111147,11 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +qWU +qWU +qWU +qWU +qWU aaa aaa aaa @@ -122861,11 +122959,11 @@ qME qME stU frV -wBV -wBV -jLH +frT +ryK jLH jLH +twv aaa aaa aaa @@ -123117,12 +123215,12 @@ nMB qAl nMB ryI -ign -aac -aaa -aaa -aaa -aaa +frV +ovK +lwt +gaO +mWp +wBV aaa aaa aaa @@ -123374,12 +123472,12 @@ nMB nMB nMB abh -ign -aac -aac -vXM -vXM -aaa +frV +wBV +wBV +wBV +wBV +wBV aaa aaa aaa @@ -123633,11 +123731,11 @@ dWM ign ign aac -vXM -vXM -vXM -vXM -vXM +aac +aac +aac +aac +aac vXM aaa aaa @@ -149302,7 +149400,7 @@ xIL eVh kJU xQS -ski +eSy xQS pJE aGx @@ -156241,7 +156339,7 @@ dOb aFm jva qWY -ovK +syI jEc jva bJu @@ -158295,11 +158393,11 @@ yiM aEh iPy yiM -qoY +afz afS lzu afY -veJ +afz yiM iPy tBu @@ -158551,13 +158649,13 @@ aaS afz afA afz -afz +ufe afy afP lzu afX afy -afz +ufe afz age abM @@ -163948,13 +164046,13 @@ afv afz afA afz -afz +ydd afy afP wJq afX afy -afz +ydd afz age afz @@ -164206,11 +164304,11 @@ izU vMI nEl izU -qoY +afz afV wJq aga -veJ +afz izU nEl dnp @@ -171916,11 +172014,11 @@ izU eqK nEl izU -qoY +afz afS wJq afY -veJ +afz izU nEl mhE @@ -172172,13 +172270,13 @@ afv afz afA afz -afz +ufe afy afP wJq afX afy -afz +ufe afz age aaS @@ -172447,7 +172545,7 @@ hiZ wTP sFA uKP -qtQ +nQv qfS gNN whz @@ -177569,13 +177667,13 @@ afv afz afA afz -afz +ydd afy afP lMF afX afy -afz +ydd afz age aaS @@ -177827,11 +177925,11 @@ bMb lyt ghV bMb -qoY +afz afS lMF afY -veJ +afz bMb ghV bXG @@ -179926,7 +180024,7 @@ aaa aaa qVr gFm -bfH +hwQ soq abM abM @@ -180954,7 +181052,7 @@ qVr gYw cHY aLR -xfL +sjT xfL nsK sEx @@ -182450,7 +182548,7 @@ lSM aDv bKY fgi -rEB +cXX eOw dfx brm @@ -183524,7 +183622,7 @@ aaa aaa qVr nSR -bfH +hwQ qVr aaa aaa @@ -185280,11 +185378,11 @@ jha qDn ajg qZZ -ksO +ajg hSt pgo kAO -sAW +kAO udX kAO duA diff --git a/_maps/shuttles/arrival_box.dmm b/_maps/shuttles/arrival_box.dmm index c2786e125bf..3d4a8769d4c 100644 --- a/_maps/shuttles/arrival_box.dmm +++ b/_maps/shuttles/arrival_box.dmm @@ -46,7 +46,8 @@ /area/shuttle/arrival) "l" = ( /obj/machinery/requests_console/directional/north{ - department = "Arrival shuttle" + department = "Arrival shuttle"; + name = "Arrival Shuttle Requests Console" }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/arrival) diff --git a/_maps/shuttles/arrival_kilo.dmm b/_maps/shuttles/arrival_kilo.dmm index c3592d962cb..3fd328965de 100644 --- a/_maps/shuttles/arrival_kilo.dmm +++ b/_maps/shuttles/arrival_kilo.dmm @@ -231,7 +231,8 @@ /area/shuttle/arrival) "aT" = ( /obj/machinery/requests_console/directional/east{ - department = "Arrivals shuttle" + department = "Arrivals shuttle"; + name = "Arrival Shuttle Requests Console" }, /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/mineral/titanium/white, diff --git a/_maps/shuttles/arrival_northstar.dmm b/_maps/shuttles/arrival_northstar.dmm index cf41f43c2d1..888a497bc58 100644 --- a/_maps/shuttles/arrival_northstar.dmm +++ b/_maps/shuttles/arrival_northstar.dmm @@ -16,7 +16,8 @@ /area/shuttle/arrival) "d" = ( /obj/machinery/requests_console/directional/north{ - department = "Arrivals shuttle" + department = "Arrivals shuttle"; + name = "Arrival Shuttle Requests Console" }, /obj/structure/table/reinforced/plastitaniumglass, /obj/item/storage/medkit/regular{ diff --git a/_maps/shuttles/arrival_pubby.dmm b/_maps/shuttles/arrival_pubby.dmm index fe59e4e77d1..8f2ecdab58c 100644 --- a/_maps/shuttles/arrival_pubby.dmm +++ b/_maps/shuttles/arrival_pubby.dmm @@ -113,7 +113,8 @@ /area/shuttle/arrival) "P" = ( /obj/machinery/requests_console/directional/north{ - department = "Arrivals shuttle" + department = "Arrivals shuttle"; + name = "Arrival Shuttle Requests Console" }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/arrival) diff --git a/_maps/shuttles/emergency_casino.dmm b/_maps/shuttles/emergency_casino.dmm index cd410769b38..3992fd21348 100644 --- a/_maps/shuttles/emergency_casino.dmm +++ b/_maps/shuttles/emergency_casino.dmm @@ -1,12 +1,4 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"ab" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/obj/item/kirbyplants/organic/plant21, -/obj/machinery/status_display/evac/directional/south, -/turf/open/floor/wood, -/area/shuttle/escape) "aj" = ( /obj/structure/chair/stool/bar/directional/east, /obj/effect/turf_decal/siding/wood{ @@ -28,21 +20,11 @@ }, /turf/open/floor/carpet/royalblue, /area/shuttle/escape) -"bb" = ( -/obj/machinery/stasis, -/obj/machinery/vending/wallmed/directional/east, -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "bG" = ( /obj/structure/table, /obj/item/defibrillator/loaded, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) -"bQ" = ( -/obj/machinery/light/floor, -/turf/open/floor/wood, -/area/shuttle/escape) "bR" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -61,6 +43,11 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/carpet/green, /area/shuttle/escape) +"ct" = ( +/obj/structure/table/reinforced, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/iron, +/area/shuttle/escape) "cu" = ( /obj/structure/chair/comfy/shuttle{ dir = 4 @@ -72,24 +59,6 @@ /obj/machinery/space_heater, /turf/open/floor/iron/dark, /area/shuttle/escape) -"cC" = ( -/obj/structure/table, -/obj/item/scalpel{ - pixel_y = 12 - }, -/obj/item/circular_saw, -/obj/item/retractor{ - pixel_x = 4 - }, -/obj/item/hemostat{ - pixel_x = -4 - }, -/obj/item/clothing/gloves/latex, -/obj/item/clothing/mask/surgical, -/obj/item/surgicaldrill, -/obj/item/cautery, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape) "cF" = ( /obj/structure/chair/sofa/corp/corner{ dir = 1 @@ -119,11 +88,6 @@ /obj/effect/decal/cleanable/blood/splatter, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"dq" = ( -/obj/machinery/status_display/evac/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/carpet/green, -/area/shuttle/escape) "dr" = ( /obj/structure/window/reinforced/tinted/spawner/directional/west, /turf/open/floor/carpet/green, @@ -146,25 +110,17 @@ }, /turf/open/floor/carpet/royalblue, /area/shuttle/escape) -"eA" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/siding{ - dir = 8 - }, -/turf/open/floor/carpet/royalblue, -/area/shuttle/escape) -"eE" = ( -/obj/structure/table/reinforced, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/item/storage/fancy/donut_box, -/turf/open/floor/iron, -/area/shuttle/escape) "eW" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 }, /turf/open/floor/wood, /area/shuttle/escape) +"fi" = ( +/obj/structure/bed/dogbed, +/obj/machinery/light/small/directional/east, +/turf/open/floor/mineral/titanium/purple, +/area/shuttle/escape) "fm" = ( /obj/structure/chair/comfy/shuttle{ dir = 4 @@ -274,11 +230,6 @@ }, /turf/open/floor/wood, /area/shuttle/escape) -"gT" = ( -/obj/structure/bed/dogbed, -/obj/machinery/light/small/directional/west, -/turf/open/floor/mineral/titanium/purple, -/area/shuttle/escape) "hg" = ( /obj/machinery/suit_storage_unit/standard_unit, /turf/open/floor/mineral/titanium, @@ -357,11 +308,6 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/carpet/green, /area/shuttle/escape) -"kD" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "kM" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/delivery, @@ -399,6 +345,13 @@ }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) +"lr" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/siding{ + dir = 8 + }, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) "lx" = ( /obj/structure/sign/poster/official/help_others/directional/north, /obj/machinery/light/directional/east, @@ -426,6 +379,11 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/carpet/green, /area/shuttle/escape) +"lV" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/turf_decal/delivery, +/turf/open/floor/mineral/titanium, +/area/shuttle/escape) "mc" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/shower/directional/west{ @@ -464,11 +422,13 @@ /obj/item/coin/gold, /turf/open/floor/wood, /area/shuttle/escape) -"mv" = ( -/obj/structure/chair/comfy/shuttle, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) +"mt" = ( +/obj/effect/turf_decal/siding{ + dir = 9 + }, +/obj/item/kirbyplants/organic/plant21, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) "mx" = ( /obj/machinery/computer/slot_machine, /obj/structure/window/reinforced/spawner/directional/east, @@ -479,12 +439,33 @@ /obj/effect/spawner/structure/window/reinforced/shuttle, /turf/open/floor/plating, /area/shuttle/escape) +"mD" = ( +/obj/structure/rack, +/obj/item/canvas/twentyfour_twentyfour, +/obj/item/canvas/twentyfour_twentyfour, +/obj/item/canvas/twentythree_twentythree, +/obj/item/canvas/twentythree_twentythree, +/obj/item/canvas, +/obj/item/canvas, +/obj/item/canvas, +/obj/machinery/vending/wallmed/directional/west, +/obj/machinery/light/directional/north, +/turf/open/floor/sepia, +/area/shuttle/escape) "mT" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/turf_decal/delivery, /obj/structure/sign/poster/random/directional/west, /turf/open/floor/mineral/titanium, /area/shuttle/escape) +"mZ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/item/kirbyplants/organic/plant21, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/wood, +/area/shuttle/escape) "ni" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/south, @@ -531,18 +512,6 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/carpet/green, /area/shuttle/escape) -"oI" = ( -/obj/machinery/chem_master/condimaster{ - desc = "Looks like a knock-off chem-master. Perhaps useful for separating liquids when mixing drinks precisely. Also dispenses condiments."; - name = "HoochMaster Deluxe" - }, -/obj/machinery/status_display/evac/directional/north, -/obj/item/storage/box/drinkingglasses, -/obj/item/reagent_containers/cup/glass/shaker, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/shuttle/escape) "pg" = ( /obj/structure/table, /obj/item/reagent_containers/cup/bottle/epinephrine{ @@ -594,16 +563,22 @@ }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"qi" = ( -/obj/machinery/light/floor, -/turf/open/floor/carpet/royalblue, -/area/shuttle/escape) "qj" = ( /obj/machinery/computer/station_alert{ dir = 8 }, /turf/open/floor/iron/dark, /area/shuttle/escape) +"qn" = ( +/obj/machinery/stasis, +/obj/machinery/vending/wallmed/directional/east, +/obj/machinery/light/directional/north, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) +"qr" = ( +/obj/machinery/light/floor, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) "qx" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -637,17 +612,14 @@ }, /turf/open/floor/wood, /area/shuttle/escape) -"rx" = ( -/obj/effect/turf_decal/siding{ - dir = 9 - }, -/obj/item/kirbyplants/organic/plant21, -/turf/open/floor/carpet/royalblue, -/area/shuttle/escape) "rH" = ( /obj/structure/chair/stool/directional/east, /turf/open/floor/wood, /area/shuttle/escape) +"rV" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/shuttle/escape) "sd" = ( /obj/machinery/door/airlock/security/glass{ name = "Brig" @@ -657,24 +629,34 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) +"si" = ( +/obj/structure/table, +/obj/item/scalpel{ + pixel_y = 12 + }, +/obj/item/circular_saw, +/obj/item/retractor{ + pixel_x = 4 + }, +/obj/item/hemostat{ + pixel_x = -4 + }, +/obj/item/clothing/gloves/latex, +/obj/item/clothing/mask/surgical, +/obj/item/surgicaldrill, +/obj/item/cautery, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/escape) "so" = ( /obj/structure/table, /obj/item/storage/toolbox/emergency, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"sx" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/obj/item/kirbyplants/organic/plant21, -/obj/machinery/status_display/evac/directional/south, +"sw" = ( +/obj/structure/chair/stool/directional/north, +/obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, /area/shuttle/escape) -"sD" = ( -/obj/structure/bed/dogbed, -/obj/machinery/light/small/directional/east, -/turf/open/floor/mineral/titanium/purple, -/area/shuttle/escape) "tk" = ( /obj/structure/rack, /obj/item/skub, @@ -689,13 +671,6 @@ /obj/item/toy/gun, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"vn" = ( -/obj/effect/turf_decal/siding{ - dir = 10 - }, -/obj/item/kirbyplants/organic/plant21, -/turf/open/floor/carpet/royalblue, -/area/shuttle/escape) "vv" = ( /obj/structure/table, /obj/machinery/microwave, @@ -718,6 +693,11 @@ /obj/item/surgical_drapes, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) +"vM" = ( +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/siding, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) "vP" = ( /obj/structure/rack, /obj/item/soap, @@ -726,6 +706,18 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/mineral/titanium, /area/shuttle/escape) +"vQ" = ( +/obj/machinery/chem_master/condimaster{ + desc = "Looks like a knock-off chem-master. Perhaps useful for separating liquids when mixing drinks precisely. Also dispenses condiments."; + name = "HoochMaster Deluxe" + }, +/obj/machinery/status_display/evac/directional/north, +/obj/item/storage/box/drinkingglasses, +/obj/item/reagent_containers/cup/glass/shaker, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/shuttle/escape) "vT" = ( /obj/machinery/computer/emergency_shuttle{ dir = 8 @@ -790,6 +782,18 @@ /obj/item/toy/crayon/spraycan, /turf/open/floor/sepia, /area/shuttle/escape) +"xl" = ( +/obj/effect/turf_decal/siding, +/obj/machinery/light/floor, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) +"xt" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/siding{ + dir = 1 + }, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) "xI" = ( /obj/structure/sink/directional/north, /obj/structure/extinguisher_cabinet/directional/south, @@ -809,10 +813,6 @@ /obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/mineral/titanium/purple, /area/shuttle/escape) -"yh" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "yl" = ( /obj/structure/chair/stool/directional/north, /obj/item/radio/intercom/directional/west, @@ -829,10 +829,10 @@ }, /turf/open/floor/wood, /area/shuttle/escape) -"yG" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/effect/turf_decal/delivery, -/turf/open/floor/mineral/titanium, +"yF" = ( +/obj/structure/bed/dogbed, +/obj/machinery/light/small/directional/west, +/turf/open/floor/mineral/titanium/purple, /area/shuttle/escape) "yH" = ( /obj/structure/closet/crate, @@ -867,6 +867,13 @@ /obj/item/toy/figure/clown, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) +"zG" = ( +/obj/effect/turf_decal/siding{ + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) "Ab" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood, @@ -896,6 +903,11 @@ /obj/structure/chair/stool/directional/north, /turf/open/floor/wood, /area/shuttle/escape) +"Bb" = ( +/obj/structure/reagent_dispensers/wall/peppertank/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) "Bf" = ( /obj/machinery/computer/slot_machine, /turf/open/floor/carpet/green, @@ -907,11 +919,6 @@ /obj/effect/spawner/random/entertainment/arcade, /turf/open/floor/carpet/green, /area/shuttle/escape) -"Cc" = ( -/obj/structure/reagent_dispensers/wall/peppertank/directional/east, -/obj/machinery/light/directional/east, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "Cg" = ( /obj/structure/table/reinforced, /obj/item/storage/fancy/cigarettes/cigars{ @@ -977,10 +984,6 @@ }, /turf/open/floor/carpet/royalblue, /area/shuttle/escape) -"EA" = ( -/obj/machinery/space_heater, -/turf/open/floor/carpet/green, -/area/shuttle/escape) "EF" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/delivery, @@ -1029,18 +1032,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"Gu" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/siding{ - dir = 1 - }, -/turf/open/floor/carpet/royalblue, -/area/shuttle/escape) -"Gw" = ( -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/siding, -/turf/open/floor/carpet/royalblue, -/area/shuttle/escape) "Gz" = ( /obj/machinery/vending/coffee, /obj/effect/turf_decal/box, @@ -1065,16 +1056,25 @@ /obj/structure/chair/stool/bar/directional/north, /turf/open/floor/carpet/green, /area/shuttle/escape) +"HS" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/item/kirbyplants/organic/plant21, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/wood, +/area/shuttle/escape) +"HZ" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/light/directional/west, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) "Ih" = ( /obj/machinery/power/shuttle_engine/propulsion{ dir = 8 }, /turf/open/floor/plating/airless, /area/shuttle/escape) -"In" = ( -/obj/machinery/vending/wallmed/directional/east, -/turf/open/floor/carpet/green, -/area/shuttle/escape) "JZ" = ( /obj/machinery/computer/communications{ dir = 8 @@ -1107,6 +1107,13 @@ }, /turf/open/floor/carpet/green, /area/shuttle/escape) +"Ll" = ( +/obj/effect/turf_decal/siding{ + dir = 10 + }, +/obj/item/kirbyplants/organic/plant21, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) "Lv" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -1189,10 +1196,6 @@ }, /turf/open/floor/carpet/green, /area/shuttle/escape) -"NT" = ( -/obj/structure/closet/crate/bin, -/turf/open/floor/carpet/green, -/area/shuttle/escape) "NU" = ( /obj/structure/chair/sofa/corp, /turf/open/floor/carpet/royalblue, @@ -1204,6 +1207,20 @@ "Oa" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/escape) +"Or" = ( +/obj/machinery/light/floor, +/turf/open/floor/wood, +/area/shuttle/escape) +"Ow" = ( +/obj/machinery/status_display/evac/directional/east, +/obj/machinery/light/directional/east, +/turf/open/floor/carpet/green, +/area/shuttle/escape) +"OA" = ( +/obj/structure/chair/comfy/shuttle, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) "Pb" = ( /obj/effect/turf_decal/siding/thinplating, /turf/open/floor/carpet/green, @@ -1252,6 +1269,12 @@ }, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) +"PQ" = ( +/obj/structure/table/reinforced, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/iron, +/area/shuttle/escape) "PS" = ( /obj/structure/chair/stool/directional/east, /obj/item/radio/intercom/directional/west, @@ -1263,11 +1286,6 @@ }, /turf/open/floor/carpet/royalblue, /area/shuttle/escape) -"QS" = ( -/obj/machinery/status_display/evac/directional/east, -/obj/machinery/light/directional/east, -/turf/open/floor/carpet/green, -/area/shuttle/escape) "QY" = ( /obj/structure/chair/stool/directional/north, /obj/effect/turf_decal/siding/wood, @@ -1286,6 +1304,10 @@ "RZ" = ( /turf/open/floor/wood, /area/shuttle/escape) +"Sb" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/carpet/green, +/area/shuttle/escape) "Sk" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -1324,29 +1346,15 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/mineral/titanium, /area/shuttle/escape) -"Vr" = ( -/obj/structure/rack, -/obj/item/canvas/twentyfour_twentyfour, -/obj/item/canvas/twentyfour_twentyfour, -/obj/item/canvas/twentythree_twentythree, -/obj/item/canvas/twentythree_twentythree, -/obj/item/canvas, -/obj/item/canvas, -/obj/item/canvas, -/obj/machinery/vending/wallmed/directional/west, -/obj/machinery/light/directional/north, -/turf/open/floor/sepia, -/area/shuttle/escape) "VQ" = ( /obj/machinery/computer/security{ dir = 8 }, /turf/open/floor/iron/dark, /area/shuttle/escape) -"Wm" = ( -/obj/structure/chair/stool/directional/north, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood, +"VT" = ( +/obj/machinery/vending/wallmed/directional/east, +/turf/open/floor/carpet/green, /area/shuttle/escape) "Wp" = ( /turf/open/floor/carpet/green, @@ -1355,11 +1363,6 @@ /obj/structure/chair/stool/directional/west, /turf/open/floor/carpet/green, /area/shuttle/escape) -"WT" = ( -/obj/effect/turf_decal/siding, -/obj/machinery/light/floor, -/turf/open/floor/carpet/royalblue, -/area/shuttle/escape) "WW" = ( /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/carpet/green, @@ -1381,11 +1384,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/shuttle/escape) -"Xs" = ( -/obj/structure/table/reinforced, -/obj/item/storage/fancy/donut_box, -/turf/open/floor/iron, -/area/shuttle/escape) "Xv" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -1412,10 +1410,19 @@ /obj/structure/window/reinforced/tinted/spawner/directional/east, /turf/open/floor/carpet/green, /area/shuttle/escape) +"XY" = ( +/obj/machinery/space_heater, +/turf/open/floor/carpet/green, +/area/shuttle/escape) "Yc" = ( /obj/structure/chair/stool/directional/south, /turf/open/floor/wood, /area/shuttle/escape) +"Yl" = ( +/obj/machinery/status_display/evac/directional/west, +/obj/machinery/light/directional/west, +/turf/open/floor/carpet/green, +/area/shuttle/escape) "Yp" = ( /turf/open/floor/mineral/titanium, /area/shuttle/escape) @@ -1473,13 +1480,6 @@ }, /turf/open/floor/wood, /area/shuttle/escape) -"Zr" = ( -/obj/effect/turf_decal/siding{ - dir = 1 - }, -/obj/machinery/light/floor, -/turf/open/floor/carpet/royalblue, -/area/shuttle/escape) (1,1,1) = {" Bj @@ -1557,7 +1557,7 @@ LR Pj vP mT -yG +lV tk Pj MS @@ -1614,17 +1614,17 @@ yl Wp gm iN -dq +Yl mm cb Wp yo PS -EA +XY Uu bG vL -cC +si pg Uu "} @@ -1706,7 +1706,7 @@ Wp Wp XW Uu -bb +qn el Fi lo @@ -1725,7 +1725,7 @@ UA Lz Lz Lz -ab +HS Uu Uu Uu @@ -1749,7 +1749,7 @@ RZ Ab mz zp -kD +HZ dy oc Uu @@ -1777,14 +1777,14 @@ Uu "} (15,1,1) = {" Uu -eE +PQ aS aS aS aS YS AA -bQ +Or kz kz RZ @@ -1809,9 +1809,9 @@ RZ RZ Yc nx -Wm +sw Uu -mv +OA dy dy Lv @@ -1819,7 +1819,7 @@ mz "} (17,1,1) = {" Uu -oI +vQ Xr jH Cz @@ -1851,7 +1851,7 @@ RZ RZ Yc YN -Wm +sw Uu Ru dy @@ -1861,14 +1861,14 @@ mz "} (19,1,1) = {" Uu -Xs +ct aS aS aS aS Gf AA -bQ +Or rH rH RZ @@ -1917,7 +1917,7 @@ RZ Ab mz MX -Cc +Bb dy vi Uu @@ -1935,7 +1935,7 @@ AS gI gI gI -sx +mZ Uu Uu Uu @@ -1958,7 +1958,7 @@ Wp Wp pp Uu -Vr +mD DA DA Ny @@ -2029,18 +2029,18 @@ mz "} (27,1,1) = {" Uu -NT +Sb xc WW -In +VT Wp -QS +Ow Wp Wp Wp Wp xc -EA +XY Uu LL iz @@ -2076,17 +2076,17 @@ iy fm cu Uu -rx -eA +mt +lr mn mn mn mn -vn +Ll Uu wu Ty -gT +yF mz Bj "} @@ -2097,13 +2097,13 @@ Yp Yp Yp Xg -Zr +zG aX et et et cF -WT +xl ye Ty Ty @@ -2128,7 +2128,7 @@ kO Uu fS Ty -sD +fi mz Bj "} @@ -2139,13 +2139,13 @@ Uu Uu Uu Oa -Gu +xt KG Mb -qi +qr Mb jE -Gw +vM Oa Uu Uu @@ -2159,7 +2159,7 @@ Bj Bj mz wK -yh +rV jQ Qk Qk @@ -2167,7 +2167,7 @@ Ew Qk Qk dd -yh +rV cw mz Bj diff --git a/_maps/shuttles/emergency_lance.dmm b/_maps/shuttles/emergency_lance.dmm index 78204658ba5..ff0dc795797 100644 --- a/_maps/shuttles/emergency_lance.dmm +++ b/_maps/shuttles/emergency_lance.dmm @@ -89,6 +89,17 @@ }, /turf/open/floor/iron/dark/textured, /area/shuttle/escape) +"cM" = ( +/obj/effect/turf_decal/bot_white, +/obj/structure/rack, +/obj/item/stack/medical/gauze, +/obj/item/stack/medical/bruise_pack, +/obj/item/stack/medical/ointment{ + pixel_x = 5 + }, +/obj/item/stack/medical/bone_gel, +/turf/open/floor/iron/dark/textured, +/area/shuttle/escape) "df" = ( /obj/effect/turf_decal/stripes/red/corner{ dir = 4 @@ -112,34 +123,6 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) -"du" = ( -/obj/structure/table/reinforced, -/obj/item/storage/medkit/emergency{ - pixel_x = 2; - pixel_y = 3 - }, -/obj/item/storage/medkit/emergency{ - pixel_x = -2 - }, -/obj/effect/turf_decal/tile/dark_blue, -/turf/open/floor/iron/dark/side{ - dir = 9 - }, -/area/shuttle/escape) -"dv" = ( -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "escape_cockpit_windows"; - name = "Cockpit Window Blast Doors"; - pixel_x = -7; - req_access = list("command") - }, -/obj/machinery/recharger{ - pixel_x = 5 - }, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/dark/textured, -/area/shuttle/escape) "dW" = ( /obj/machinery/door/airlock/external/ruin{ name = "Emegency Shuttle External Airlock" @@ -153,23 +136,26 @@ }, /turf/open/floor/iron/dark/textured, /area/shuttle/escape) -"dY" = ( -/obj/effect/turf_decal/bot_white, -/obj/structure/rack, -/obj/item/stack/medical/gauze, -/obj/item/stack/medical/bruise_pack, -/obj/item/stack/medical/ointment{ - pixel_x = 5 - }, -/obj/item/stack/medical/bone_gel, -/turf/open/floor/iron/dark/textured, -/area/shuttle/escape) "eD" = ( /obj/effect/turf_decal/tile/dark_blue/half/contrasted{ dir = 1 }, /turf/open/floor/iron/dark/side, /area/shuttle/escape) +"eW" = ( +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "escape_cockpit_windows"; + name = "Cockpit Window Blast Doors"; + pixel_x = -7; + req_access = list("command") + }, +/obj/machinery/recharger{ + pixel_x = 5 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/dark/textured, +/area/shuttle/escape) "fo" = ( /obj/structure/chair/comfy/shuttle, /obj/structure/window/reinforced/survival_pod/spawner/directional/west, @@ -185,15 +171,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured, /area/shuttle/escape) -"fE" = ( -/obj/machinery/light/floor, -/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw{ - dir = 8 +"fJ" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) +"ga" = ( +/obj/machinery/computer/operating{ + dir = 1 }, -/obj/effect/turf_decal/trimline/dark_blue/arrow_cw{ - dir = 4 +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 }, -/turf/open/floor/iron/dark, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark/side, /area/shuttle/escape) "gr" = ( /obj/machinery/door/airlock/grunge{ @@ -214,16 +204,6 @@ /obj/structure/window/reinforced/survival_pod/spawner/directional/north, /turf/open/floor/plating/airless, /area/shuttle/escape) -"gQ" = ( -/obj/structure/sign/warning/vacuum/external/directional/east, -/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/dark_blue/arrow_cw{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "hp" = ( /obj/item/radio/intercom/directional/east, /obj/effect/decal/cleanable/dirt, @@ -264,6 +244,16 @@ /obj/effect/turf_decal/trimline/dark_blue/arrow_ccw, /turf/open/floor/iron/dark/textured, /area/shuttle/escape) +"hM" = ( +/obj/machinery/light/floor, +/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/arrow_cw{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/shuttle/escape) "ic" = ( /obj/structure/table/reinforced, /obj/machinery/button/door{ @@ -341,16 +331,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/shuttle/escape) -"ka" = ( -/obj/machinery/computer/operating{ - dir = 1 - }, -/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ - dir = 1 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark/side, -/area/shuttle/escape) "kb" = ( /obj/item/borg/upgrade/defib, /obj/structure/closet/crate/medical{ @@ -388,6 +368,15 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) +"kx" = ( +/obj/machinery/iv_drip, +/obj/structure/bed/roller, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/shuttle/escape) "kz" = ( /obj/effect/turf_decal/stripes/red/line, /obj/effect/turf_decal/stripes/red/line{ @@ -411,16 +400,6 @@ /obj/effect/turf_decal/tile/dark_blue/fourcorners, /turf/open/floor/iron, /area/shuttle/escape) -"lK" = ( -/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/dark_blue/arrow_cw{ - dir = 4 - }, -/obj/machinery/light/floor, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "mb" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -500,6 +479,16 @@ }, /turf/open/floor/plating/airless, /area/shuttle/escape) +"nE" = ( +/obj/structure/sign/warning/vacuum/external/directional/east, +/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/arrow_cw{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/shuttle/escape) "nS" = ( /obj/structure/lattice, /turf/open/space/basic, @@ -528,6 +517,13 @@ }, /turf/open/floor/iron/white/textured_large, /area/shuttle/escape) +"oY" = ( +/obj/machinery/power/shuttle_engine/heater{ + dir = 1 + }, +/obj/structure/window/reinforced/survival_pod/spawner/directional/south, +/turf/open/floor/plating/airless, +/area/shuttle/escape) "pb" = ( /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ dir = 1 @@ -665,6 +661,17 @@ /obj/machinery/power/shuttle_engine/propulsion, /turf/open/floor/plating/airless, /area/shuttle/escape) +"uy" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 10 + }, +/area/shuttle/escape) "uF" = ( /obj/structure/sign/departments/medbay/alt/directional/south, /obj/effect/turf_decal/tile/dark_blue/half/contrasted{ @@ -772,6 +779,13 @@ /obj/machinery/light/directional/west, /turf/open/floor/plating, /area/shuttle/escape) +"xH" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south, +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/shuttle/escape/brig) "yB" = ( /obj/structure/window/reinforced/survival_pod/spawner/directional/north, /obj/effect/decal/cleanable/blood/old, @@ -829,16 +843,10 @@ }, /turf/open/floor/iron/dark/side, /area/shuttle/escape) -"AT" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/effect/turf_decal/tile/dark_blue{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 6 - }, +"Bp" = ( +/obj/structure/chair/comfy/shuttle, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark/textured, /area/shuttle/escape) "BC" = ( /obj/machinery/porta_turret/syndicate/energy/raven{ @@ -850,15 +858,6 @@ /obj/structure/chair/comfy/shuttle, /turf/open/floor/iron/dark/textured, /area/shuttle/escape) -"BP" = ( -/obj/machinery/iv_drip, -/obj/structure/bed/roller, -/obj/effect/turf_decal/tile/dark_blue/half/contrasted, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/shuttle/escape) "Cv" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/yellow/half/contrasted{ @@ -898,10 +897,6 @@ /obj/effect/turf_decal/trimline/dark_blue/arrow_ccw, /turf/open/floor/iron/dark, /area/shuttle/escape) -"Dd" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/south, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "Dg" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -920,6 +915,20 @@ icon_state = "darkfull" }, /area/shuttle/escape/brig) +"Ec" = ( +/obj/structure/table/reinforced, +/obj/item/storage/medkit/emergency{ + pixel_x = 2; + pixel_y = 3 + }, +/obj/item/storage/medkit/emergency{ + pixel_x = -2 + }, +/obj/effect/turf_decal/tile/dark_blue, +/turf/open/floor/iron/dark/side{ + dir = 9 + }, +/area/shuttle/escape) "EL" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/turretid{ @@ -953,13 +962,6 @@ dir = 5 }, /area/shuttle/escape) -"FA" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/south, -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/shuttle/escape/brig) "FX" = ( /obj/structure/table/reinforced, /obj/item/book/manual/wiki/surgery{ @@ -1030,13 +1032,6 @@ }, /turf/open/floor/iron/checker, /area/shuttle/escape) -"Hp" = ( -/obj/machinery/power/shuttle_engine/heater{ - dir = 1 - }, -/obj/structure/window/reinforced/survival_pod/spawner/directional/south, -/turf/open/floor/plating/airless, -/area/shuttle/escape) "Hq" = ( /obj/machinery/door/airlock/grunge{ name = "Central Entrance" @@ -1153,6 +1148,16 @@ dir = 9 }, /area/shuttle/escape) +"Lf" = ( +/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/arrow_cw{ + dir = 4 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark, +/area/shuttle/escape) "Lg" = ( /obj/structure/lattice/catwalk, /obj/structure/marker_beacon/indigo, @@ -1204,6 +1209,17 @@ /obj/effect/turf_decal/trimline/dark_blue/arrow_ccw, /turf/open/floor/iron/dark, /area/shuttle/escape) +"LI" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/turf/open/floor/iron/dark/side{ + dir = 6 + }, +/area/shuttle/escape) "Mc" = ( /obj/structure/chair/office{ dir = 4 @@ -1213,6 +1229,15 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) +"Mk" = ( +/obj/machinery/computer/crew, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/turf/open/floor/iron/dark/side{ + dir = 5 + }, +/area/shuttle/escape) "MA" = ( /obj/machinery/vending/wallmed/directional/west, /obj/effect/turf_decal/tile/dark_blue/half/contrasted{ @@ -1231,6 +1256,14 @@ dir = 1 }, /area/shuttle/escape) +"MK" = ( +/obj/structure/chair/comfy/shuttle, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/shuttle/escape) "MQ" = ( /obj/structure/extinguisher_cabinet/directional/north, /obj/effect/turf_decal/tile/dark_blue, @@ -1243,17 +1276,6 @@ /obj/item/storage/medkit/advanced, /turf/open/floor/iron/dark/textured, /area/shuttle/escape) -"Na" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/effect/turf_decal/tile/dark_blue{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/shuttle/escape) "Nk" = ( /obj/machinery/light/small/directional/south, /obj/effect/turf_decal/tile/dark_blue/fourcorners, @@ -1274,11 +1296,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured, /area/shuttle/escape) -"NW" = ( -/obj/structure/chair/comfy/shuttle, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, -/area/shuttle/escape) "Ol" = ( /obj/machinery/power/terminal, /obj/structure/cable, @@ -1321,11 +1338,6 @@ dir = 4 }, /area/shuttle/escape) -"OZ" = ( -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/turf/open/floor/iron/dark/textured, -/area/shuttle/escape) "Pe" = ( /obj/structure/sign/nanotrasen{ pixel_y = 32 @@ -1432,15 +1444,6 @@ /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/plating, /area/shuttle/escape) -"Ty" = ( -/obj/machinery/computer/crew, -/obj/effect/turf_decal/tile/dark_blue{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/shuttle/escape) "TE" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -1448,6 +1451,27 @@ /obj/structure/window/reinforced/survival_pod/spawner/directional/west, /turf/open/floor/iron/dark/textured, /area/shuttle/escape) +"TO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/gun/energy/e_gun/mini{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/gun/energy/e_gun/mini, +/obj/item/gun/energy/e_gun/mini{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/structure/window/reinforced/survival_pod/spawner/directional/north, +/obj/structure/window/reinforced/survival_pod/spawner/directional/south, +/obj/machinery/door/window/survival_pod{ + dir = 4; + name = "Emergency Weapons"; + req_access = list("command") + }, +/obj/structure/rack, +/turf/open/floor/iron/dark/textured, +/area/shuttle/escape) "TQ" = ( /obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ dir = 1 @@ -1552,6 +1576,11 @@ /obj/machinery/recharge_station, /turf/open/floor/iron/dark/textured, /area/shuttle/escape) +"Xz" = ( +/obj/structure/bed/roller, +/obj/machinery/iv_drip, +/turf/open/floor/iron/dark/textured, +/area/shuttle/escape) "XA" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, @@ -1588,27 +1617,6 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) -"YN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/gun/energy/e_gun/mini{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/gun/energy/e_gun/mini, -/obj/item/gun/energy/e_gun/mini{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/structure/window/reinforced/survival_pod/spawner/directional/north, -/obj/structure/window/reinforced/survival_pod/spawner/directional/south, -/obj/machinery/door/window/survival_pod{ - dir = 4; - name = "Emergency Weapons"; - req_access = list("command") - }, -/obj/structure/rack, -/turf/open/floor/iron/dark/textured, -/area/shuttle/escape) "ZE" = ( /obj/machinery/door/airlock/grunge{ name = "Bridge Hall" @@ -1619,14 +1627,6 @@ /obj/effect/turf_decal/tile/dark_blue/fourcorners, /turf/open/floor/iron, /area/shuttle/escape) -"ZI" = ( -/obj/structure/chair/comfy/shuttle, -/obj/effect/turf_decal/tile/dark_blue/half/contrasted, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/shuttle/escape) "ZZ" = ( /mob/living/simple_animal/bot/medbot{ name = "\improper emergency medibot"; @@ -1729,7 +1729,7 @@ vf MZ Lj Gw -YN +TO vf WQ nS @@ -1776,7 +1776,7 @@ uX uX uX ne -Hp +oY fz pb If @@ -1828,7 +1828,7 @@ uX uX uX ne -Hp +oY cC oe Yt @@ -1880,7 +1880,7 @@ uX uX uX ne -Hp +oY QL kt LA @@ -1890,7 +1890,7 @@ QP WQ ol WQ -du +Ec Lk GA GA @@ -1936,7 +1936,7 @@ WQ WQ dn WQ -dv +eW ai UG WQ @@ -1947,7 +1947,7 @@ WI WI WI vy -Na +uy WQ uX uX @@ -1973,7 +1973,7 @@ WQ CR WQ WQ -NW +Bp JN Hu WQ @@ -1999,7 +1999,7 @@ TQ WI WI WI -ka +ga WQ pK Kz @@ -2046,7 +2046,7 @@ gF WQ XA WQ -ZI +MK eD EX WI @@ -2063,10 +2063,10 @@ qH bV WQ WQ -dY +cM kN So -OZ +Xz Px WQ GA @@ -2112,13 +2112,13 @@ cz (10,1,1) = {" jo jY -fE -gQ +hM +nE jM jY -lK +Lf Yq -lK +Lf Yq Hq cw @@ -2168,7 +2168,7 @@ bV WQ WQ mx -OZ +Xz zc hp Px @@ -2254,7 +2254,7 @@ nb WQ qH WQ -BP +kx WI WI jG @@ -2311,7 +2311,7 @@ WI WI WI ao -ka +ga WQ pK pK @@ -2353,7 +2353,7 @@ WQ HV WQ iz -Dd +fJ kz yB Ao @@ -2363,7 +2363,7 @@ WI WI WI TQ -AT +LI WQ uX uX @@ -2400,17 +2400,17 @@ uX uX uX ne -Hp +oY vm rr WQ Oy -FA +xH Dx YM JS WQ -Ty +Mk Qv OY OY @@ -2452,7 +2452,7 @@ uX uX uX ne -Hp +oY zh WO WQ @@ -2504,7 +2504,7 @@ uX uX uX ne -Hp +oY Gr Qu sp diff --git a/_maps/shuttles/emergency_monastery.dmm b/_maps/shuttles/emergency_monastery.dmm index b15a3fbe2d9..6c1aa5922d3 100644 --- a/_maps/shuttles/emergency_monastery.dmm +++ b/_maps/shuttles/emergency_monastery.dmm @@ -2390,6 +2390,21 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/space/basic, /area/shuttle/escape) +"IN" = ( +/obj/item/radio/intercom/directional/north, +/obj/machinery/requests_console/directional/west{ + department = "Chapel"; + name = "Monastery Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/structure/closet, +/obj/item/storage/backpack/cultpack, +/obj/item/clothing/head/chaplain/nun_hood, +/obj/item/clothing/suit/chaplainsuit/nun, +/obj/item/clothing/suit/chaplainsuit/holidaypriest, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/shuttle/escape) "IR" = ( /obj/structure/flora/bush/flowers_yw/style_random, /obj/structure/flora/bush/flowers_pp/style_random, @@ -2797,20 +2812,6 @@ /obj/machinery/newscaster/directional/east, /turf/open/floor/iron/dark, /area/shuttle/escape) -"NV" = ( -/obj/item/radio/intercom/directional/north, -/obj/machinery/requests_console/directional/west{ - department = "Chapel" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/structure/closet, -/obj/item/storage/backpack/cultpack, -/obj/item/clothing/head/chaplain/nun_hood, -/obj/item/clothing/suit/chaplainsuit/nun, -/obj/item/clothing/suit/chaplainsuit/holidaypriest, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "NX" = ( /obj/structure/chair{ dir = 8 @@ -3966,7 +3967,7 @@ JG JG nr nr -NV +IN PY rA nr diff --git a/_maps/shuttles/emergency_narnar.dmm b/_maps/shuttles/emergency_narnar.dmm index f05479065bc..835a6054a87 100644 --- a/_maps/shuttles/emergency_narnar.dmm +++ b/_maps/shuttles/emergency_narnar.dmm @@ -178,14 +178,14 @@ /turf/open/floor/cult, /area/shuttle/escape) "J" = ( -/mob/living/simple_animal/hostile/eyeball{ +/mob/living/basic/eyeball{ faction = list("cult"); name = "left eyeball" }, /turf/open/floor/cult, /area/shuttle/escape) "K" = ( -/mob/living/simple_animal/hostile/eyeball{ +/mob/living/basic/eyeball{ faction = list("cult"); name = "right eyeball" }, diff --git a/_maps/shuttles/emergency_shadow.dmm b/_maps/shuttles/emergency_shadow.dmm index 066c65bb97c..704ec17a369 100644 --- a/_maps/shuttles/emergency_shadow.dmm +++ b/_maps/shuttles/emergency_shadow.dmm @@ -36,13 +36,6 @@ /obj/machinery/status_display/evac/directional/east, /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape) -"bc" = ( -/obj/effect/turf_decal/trimline/red/corner{ - dir = 8 - }, -/obj/structure/sign/departments/security/directional/west, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/escape) "bA" = ( /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /turf/open/floor/iron/dark/smooth_large, @@ -54,6 +47,18 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape) +"bH" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/item/reagent_containers/cup/glass/trophy/gold_cup{ + pixel_x = 16; + pixel_y = 2 + }, +/obj/item/clothing/accessory/medal/gold, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark/smooth_large, +/area/shuttle/escape) "bT" = ( /obj/effect/mob_spawn/corpse/human/clown, /turf/open/floor/engine/plasma, @@ -107,6 +112,21 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape) +"eJ" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/delivery, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/escape/engine) +"fb" = ( +/obj/machinery/atmospherics/pipe/smart/simple/violet/hidden{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/red/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark/small, +/area/shuttle/escape/engine) "fh" = ( /obj/structure/table, /turf/open/floor/iron/dark/smooth_large, @@ -132,41 +152,10 @@ }, /turf/open/floor/plating/airless, /area/shuttle/escape/engine) -"fL" = ( -/obj/effect/turf_decal/trimline/yellow/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 4 - }, -/obj/item/kirbyplants/organic/plant21, -/obj/structure/sign/warning/hot_temp/directional/west, -/obj/item/reagent_containers/pill/maintenance, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/escape) -"gh" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/glass/drinkingglass{ - pixel_x = -6; - pixel_y = 14 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass{ - pixel_x = -6; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass{ - pixel_x = 7; - pixel_y = 14 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/dark_blue/opposingcorners, -/obj/machinery/light/small/directional/north, +"gF" = ( +/obj/machinery/light/floor, /turf/open/floor/iron/dark/smooth_large, -/area/shuttle/escape) +/area/shuttle/escape/brig) "gG" = ( /obj/structure/table, /obj/machinery/coffeemaker, @@ -180,13 +169,16 @@ /obj/effect/turf_decal/trimline/neutral/line, /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape) -"hv" = ( -/obj/machinery/atmospherics/pipe/smart/simple/violet/hidden{ - dir = 10 - }, -/obj/effect/turf_decal/stripes/red/corner, -/turf/open/floor/iron/dark/small, +"hz" = ( +/obj/structure/tank_dispenser/oxygen, +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/dark/textured_large, /area/shuttle/escape/engine) +"ig" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/escape) "ix" = ( /obj/effect/turf_decal/siding/dark{ dir = 6 @@ -247,23 +239,34 @@ /obj/machinery/status_display/evac/directional/west, /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape) -"kY" = ( -/obj/effect/turf_decal/trimline/yellow/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 4 - }, -/obj/item/kirbyplants/organic/plant21, -/obj/structure/sign/warning/hot_temp/directional/west, -/obj/item/clothing/mask/cigarette/rollie/cannabis, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/escape) "ll" = ( /obj/machinery/computer/security, /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape) +"lw" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/glass/drinkingglass{ + pixel_x = -6; + pixel_y = 14 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass{ + pixel_x = -6; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass{ + pixel_x = 7; + pixel_y = 14 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/smooth_large, +/area/shuttle/escape) "lD" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -332,14 +335,16 @@ }, /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape) -"oZ" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/machinery/door/window/brigdoor/right, -/obj/effect/turf_decal/siding/dark{ - dir = 1 +"pi" = ( +/obj/effect/turf_decal/trimline/dark_blue/corner{ + dir = 4 }, -/turf/open/floor/eighties, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 8 + }, +/obj/item/kirbyplants/organic/plant21, +/obj/item/clothing/accessory/clown_enjoyer_pin, +/turf/open/floor/iron/dark/textured_large, /area/shuttle/escape) "qk" = ( /obj/machinery/shower/directional/south, @@ -357,21 +362,16 @@ }, /turf/open/floor/eighties, /area/shuttle/escape) -"qz" = ( -/obj/machinery/atmospherics/pipe/smart/simple/violet/hidden{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/red/corner{ +"qr" = ( +/obj/effect/turf_decal/siding/dark{ dir = 4 }, -/turf/open/floor/iron/dark/small, -/area/shuttle/escape/engine) -"qR" = ( -/obj/machinery/light/directional/west, -/obj/structure/sign/poster/official/there_is_no_gas_giant/directional/west, -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/iron/dark/small, -/area/shuttle/escape/engine) +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/etherealball{ + TurnedOn = 1 + }, +/turf/open/floor/eighties, +/area/shuttle/escape) "rg" = ( /obj/effect/turf_decal/siding/dark{ dir = 9 @@ -392,12 +392,6 @@ "sd" = ( /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape/brig) -"st" = ( -/obj/structure/tank_dispenser/oxygen, -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/escape/engine) "sE" = ( /obj/machinery/computer/records/security, /obj/effect/turf_decal/tile/dark_blue/opposingcorners, @@ -422,30 +416,12 @@ }, /turf/open/floor/catwalk_floor, /area/shuttle/escape/engine) -"vr" = ( -/obj/structure/table, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/item/storage/backpack/duffelbag/med/surgery, -/obj/item/clothing/suit/apron/surgical, -/obj/item/clothing/mask/surgical, -/obj/item/clothing/gloves/latex/nitrile{ - pixel_y = 4 - }, -/obj/effect/turf_decal/tile/blue/opposingcorners, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "vv" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/item/reagent_containers/cup/glass/trophy/gold_cup{ - pixel_x = 16; - pixel_y = 2 - }, -/obj/item/clothing/accessory/medal/gold, -/obj/structure/table/reinforced/plastitaniumglass, -/obj/effect/turf_decal/tile/dark_blue/opposingcorners, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark/smooth_large, -/area/shuttle/escape) +/obj/machinery/light/directional/west, +/obj/structure/sign/poster/official/there_is_no_gas_giant/directional/west, +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/iron/dark/small, +/area/shuttle/escape/engine) "vw" = ( /obj/machinery/atmospherics/pipe/smart/manifold/violet/hidden{ dir = 4 @@ -465,16 +441,6 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) -"vA" = ( -/obj/effect/turf_decal/siding/dark{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/etherealball{ - TurnedOn = 1 - }, -/turf/open/floor/eighties, -/area/shuttle/escape) "vU" = ( /turf/closed/wall/mineral/plastitanium, /area/shuttle/escape) @@ -493,7 +459,19 @@ }, /turf/open/floor/iron/dark/small, /area/shuttle/escape/engine) -"xi" = ( +"xy" = ( +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 4 + }, +/obj/item/kirbyplants/organic/plant21, +/obj/structure/sign/warning/hot_temp/directional/west, +/obj/item/clothing/mask/cigarette/rollie/cannabis, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/escape) +"yg" = ( /obj/effect/turf_decal/trimline/red/corner{ dir = 1 }, @@ -530,6 +508,15 @@ }, /turf/open/floor/plating/airless, /area/shuttle/escape/engine) +"zF" = ( +/obj/effect/turf_decal/trimline/dark_blue/corner, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 8 + }, +/obj/item/kirbyplants/organic/plant21, +/obj/item/clothing/head/cone, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/escape) "zI" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -568,10 +555,6 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) -"Bq" = ( -/obj/machinery/light/floor, -/turf/open/floor/iron/dark/smooth_large, -/area/shuttle/escape/brig) "Bu" = ( /obj/machinery/door/firedoor/border_only, /obj/effect/turf_decal/stripes/red/line, @@ -734,11 +717,6 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape) -"Gc" = ( -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/siding/dark, -/turf/open/floor/eighties, -/area/shuttle/escape) "Gx" = ( /obj/structure/extinguisher_cabinet/directional/south, /obj/effect/turf_decal/tile/blue/opposingcorners, @@ -775,6 +753,12 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape) +"GR" = ( +/obj/machinery/recharge_station, +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/escape/engine) "Hh" = ( /obj/machinery/airalarm/directional/north, /obj/structure/rack, @@ -798,21 +782,6 @@ }, /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape) -"Im" = ( -/obj/effect/turf_decal/trimline/dark_blue/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 8 - }, -/obj/item/kirbyplants/organic/plant21, -/obj/item/clothing/accessory/clown_enjoyer_pin, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/escape) -"Ir" = ( -/obj/machinery/light/floor, -/turf/open/floor/iron/dark/smooth_large, -/area/shuttle/escape) "IG" = ( /obj/structure/chair/comfy/shuttle, /obj/structure/extinguisher_cabinet/directional/north, @@ -900,6 +869,13 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape) +"MT" = ( +/obj/machinery/atmospherics/pipe/smart/simple/violet/hidden{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/red/corner, +/turf/open/floor/iron/dark/small, +/area/shuttle/escape/engine) "Ns" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -916,12 +892,18 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape/brig) -"NR" = ( -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/delivery, -/obj/machinery/light/directional/east, +"Oe" = ( +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 4 + }, +/obj/item/kirbyplants/organic/plant21, +/obj/structure/sign/warning/hot_temp/directional/west, +/obj/item/reagent_containers/pill/maintenance, /turf/open/floor/iron/dark/textured_large, -/area/shuttle/escape/engine) +/area/shuttle/escape) "Oi" = ( /turf/open/floor/engine/plasma, /area/shuttle/escape/engine) @@ -929,10 +911,6 @@ /obj/effect/turf_decal/tile/yellow/opposingcorners, /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape/engine) -"OO" = ( -/obj/machinery/light/floor, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/escape) "OU" = ( /obj/structure/sign/warning/fire/directional/west, /obj/machinery/space_heater, @@ -953,33 +931,11 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape) -"Po" = ( -/obj/effect/turf_decal/trimline/blue/corner, -/obj/structure/sign/departments/medbay/alt/directional/east, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/escape) -"Pv" = ( -/obj/structure/table, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/item/lazarus_injector, -/obj/item/healthanalyzer, -/obj/effect/turf_decal/tile/blue/opposingcorners, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "PM" = ( /obj/structure/chair/comfy/shuttle, /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape) -"PN" = ( -/obj/effect/turf_decal/trimline/dark_blue/corner, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 8 - }, -/obj/item/kirbyplants/organic/plant21, -/obj/item/clothing/head/cone, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/escape) "PV" = ( /obj/machinery/space_heater, /obj/effect/turf_decal/tile/yellow/opposingcorners, @@ -1023,6 +979,13 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape) +"RL" = ( +/obj/effect/turf_decal/trimline/red/corner{ + dir = 8 + }, +/obj/structure/sign/departments/security/directional/west, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/escape) "RS" = ( /obj/effect/turf_decal/siding/dark, /turf/open/floor/eighties, @@ -1034,11 +997,40 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape) +"Sb" = ( +/obj/structure/table, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/item/clothing/suit/apron/surgical, +/obj/item/clothing/mask/surgical, +/obj/item/clothing/gloves/latex/nitrile{ + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/shuttle/escape) +"So" = ( +/obj/structure/table, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/item/lazarus_injector, +/obj/item/healthanalyzer, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/iron/dark, +/area/shuttle/escape) "Tl" = ( /obj/machinery/vending/boozeomat, /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /turf/open/floor/iron/dark/smooth_large, /area/shuttle/escape) +"TW" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/machinery/door/window/brigdoor/right, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/floor/eighties, +/area/shuttle/escape) "Uk" = ( /obj/effect/turf_decal/trimline/neutral/line, /obj/machinery/newscaster/directional/north, @@ -1071,13 +1063,6 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/dark, /area/shuttle/escape) -"VA" = ( -/obj/effect/turf_decal/trimline/blue/corner{ - dir = 4 - }, -/obj/structure/sign/departments/medbay/alt/directional/east, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/escape) "VD" = ( /obj/machinery/computer/communications{ dir = 8 @@ -1097,12 +1082,6 @@ }, /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape) -"Wt" = ( -/obj/machinery/recharge_station, -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/escape/engine) "Wy" = ( /obj/machinery/door/airlock/engineering{ name = "Engine Room" @@ -1110,6 +1089,10 @@ /obj/machinery/door/firedoor/heavy, /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape/engine) +"WQ" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/smooth_large, +/area/shuttle/escape) "WW" = ( /obj/effect/turf_decal/trimline/blue/corner{ dir = 1 @@ -1120,12 +1103,29 @@ "XA" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/shuttle/escape) +"XG" = ( +/obj/effect/turf_decal/trimline/blue/corner, +/obj/structure/sign/departments/medbay/alt/directional/east, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/escape) "XW" = ( /obj/effect/turf_decal/trimline/red/line{ dir = 8 }, /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape) +"Yc" = ( +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/siding/dark, +/turf/open/floor/eighties, +/area/shuttle/escape) +"YL" = ( +/obj/effect/turf_decal/trimline/blue/corner{ + dir = 4 + }, +/obj/structure/sign/departments/medbay/alt/directional/east, +/turf/open/floor/iron/dark/textured_large, +/area/shuttle/escape) "YP" = ( /obj/effect/turf_decal/trimline/blue/line{ dir = 8 @@ -1207,7 +1207,7 @@ cH uW uW jB -qR +vv ow uW uW @@ -1219,13 +1219,13 @@ Cw Cw cH rj -hv +MT vw vw LA vw vw -qz +fb rj cH Cw @@ -1292,7 +1292,7 @@ Qd "} (9,1,1) = {" cH -st +hz OL Bu cX @@ -1302,12 +1302,12 @@ cX cX wF OL -Wt +GR cH "} (10,1,1) = {" Qd -NR +eJ OL wz EM @@ -1317,7 +1317,7 @@ EM EM nQ OL -NR +eJ Qd "} (11,1,1) = {" @@ -1337,7 +1337,7 @@ cH "} (12,1,1) = {" US -kY +xy Dq cV ZM @@ -1347,7 +1347,7 @@ ZM ZM cV QM -fL +Oe US "} (13,1,1) = {" @@ -1432,7 +1432,7 @@ Wc vU IG sd -Bq +gF sd GC vU @@ -1474,13 +1474,13 @@ vU US FW Wc -bc +RL XW XW XW XW XW -xi +yg AS Dz US @@ -1490,11 +1490,11 @@ vU gG Wc VR -OO +ig VR RV VR -OO +ig VR AS jl @@ -1504,13 +1504,13 @@ US US cF Wc -Po +XG yQ yQ yQ yQ yQ -VA +YL AS cv US @@ -1552,7 +1552,7 @@ Wc vU qk dw -Ir +WQ dw FT vU @@ -1565,11 +1565,11 @@ PX AA Rk vU -vr +Sb dw oK dw -Pv +So vU Uk MP @@ -1637,7 +1637,7 @@ US "} (32,1,1) = {" US -PN +zF ao mj mj @@ -1647,7 +1647,7 @@ Kk mj mj HB -Im +pi US "} (33,1,1) = {" @@ -1668,7 +1668,7 @@ vU (34,1,1) = {" Cw vU -gh +lw rg Fz qo @@ -1676,7 +1676,7 @@ BB GB Fz Zq -vv +bH vU Cw "} @@ -1699,13 +1699,13 @@ Cw Cw vU XA -oZ +TW Wa Wa Wa Wa Wa -Gc +Yc XA vU Cw @@ -1717,7 +1717,7 @@ US af Ch jS -vA +qr BR Ch ix diff --git a/_maps/shuttles/emergency_tranquility.dmm b/_maps/shuttles/emergency_tranquility.dmm index e4f1fc1a906..ce1262d35c6 100644 --- a/_maps/shuttles/emergency_tranquility.dmm +++ b/_maps/shuttles/emergency_tranquility.dmm @@ -32,19 +32,6 @@ }, /turf/open/water/jungle, /area/shuttle/escape) -"aK" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/catwalk_floor, -/area/shuttle/escape) -"ba" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/obj/item/kirbyplants/organic/plant22{ - pixel_x = -8 - }, -/turf/open/floor/wood, -/area/shuttle/escape) "bq" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -61,6 +48,18 @@ }, /turf/open/water/jungle, /area/shuttle/escape) +"bC" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/candle_box{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/item/lighter, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/turf/open/floor/iron/dark/herringbone, +/area/shuttle/escape) "bS" = ( /obj/structure/railing{ color = "#A47449"; @@ -97,17 +96,6 @@ }, /turf/open/floor/sepia, /area/shuttle/escape) -"cx" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/obj/machinery/vending/coffee, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/wood, -/area/shuttle/escape) "cD" = ( /obj/structure/table/reinforced, /obj/machinery/chem_dispenser/drinks/beer/fullupgrade{ @@ -138,6 +126,16 @@ /obj/structure/bookcase/random, /turf/open/floor/wood, /area/shuttle/escape) +"dB" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/structure/hedge{ + icon_state = "hedge-8" + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/shuttle/escape) "dI" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 8 @@ -195,17 +193,6 @@ }, /turf/open/floor/carpet/royalblue, /area/shuttle/escape) -"eI" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/railing{ - color = "#A47449"; - dir = 2; - layer = 3.1 - }, -/obj/machinery/microwave, -/obj/structure/table/wood, -/turf/open/floor/stone, -/area/shuttle/escape) "eN" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 6 @@ -233,6 +220,13 @@ }, /turf/open/floor/stone, /area/shuttle/escape) +"fs" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/machinery/light/floor, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) "fv" = ( /obj/machinery/door/airlock/engineering{ name = "Engine Room" @@ -408,41 +402,14 @@ }, /turf/open/floor/stone, /area/shuttle/escape) -"ii" = ( -/obj/structure/closet/cardboard, -/obj/structure/sign/poster/official/cohiba_robusto_ad/directional/north, -/obj/item/clothing/suit/hooded/wintercoat/custom, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/sandal{ - pixel_y = -11; - pixel_x = 4 +"ie" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 }, -/obj/item/clothing/shoes/sandal{ - pixel_y = -11; - pixel_x = 4 +/obj/item/kirbyplants/organic/plant22{ + pixel_x = -8 }, -/obj/item/clothing/shoes/sandal{ - pixel_y = -11; - pixel_x = 4 - }, -/obj/item/clothing/shoes/sandal{ - pixel_y = -11; - pixel_x = 4 - }, -/obj/item/clothing/shoes/sandal{ - pixel_y = -11; - pixel_x = 4 - }, -/obj/item/clothing/shoes/sandal{ - pixel_y = -11; - pixel_x = 4 - }, -/turf/open/floor/plating, +/turf/open/floor/wood, /area/shuttle/escape) "ij" = ( /obj/structure/railing/corner{ @@ -464,16 +431,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plating, /area/shuttle/escape) -"iv" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/wood, -/area/shuttle/escape) "iz" = ( /obj/structure/chair{ dir = 1 @@ -513,6 +470,14 @@ }, /turf/open/floor/grass, /area/shuttle/escape) +"jp" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/stasis, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/shuttle/escape) "ju" = ( /obj/structure/table/reinforced, /obj/item/newspaper{ @@ -555,6 +520,9 @@ /obj/structure/flora/bush/style_4, /turf/open/floor/grass, /area/shuttle/escape) +"jN" = ( +/turf/open/floor/carpet/green, +/area/shuttle/escape) "kh" = ( /obj/structure/railing/corner{ dir = 2; @@ -578,26 +546,10 @@ }, /turf/open/floor/grass, /area/shuttle/escape) -"km" = ( -/obj/machinery/status_display/evac/directional/west, -/obj/machinery/keycard_auth/directional/south, -/obj/machinery/light/floor, -/turf/open/floor/carpet/royalblue, -/area/shuttle/escape) "kn" = ( /obj/structure/flora/bush/fullgrass/style_random, /turf/open/floor/grass, /area/shuttle/escape) -"kD" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/wood, -/area/shuttle/escape) "kE" = ( /obj/machinery/door/airlock/medical/glass{ name = "Escape Shuttle Infirmary" @@ -705,11 +657,11 @@ }, /turf/open/floor/wood, /area/shuttle/escape) -"ni" = ( +"nj" = ( /obj/effect/turf_decal/siding/wood{ - dir = 6 + dir = 9 }, -/obj/item/kirbyplants/organic/plant3, +/obj/item/kirbyplants/organic/plant21, /turf/open/floor/wood, /area/shuttle/escape) "nq" = ( @@ -763,6 +715,10 @@ /obj/structure/flora/bush/flowers_pp, /turf/open/floor/grass, /area/shuttle/escape) +"nQ" = ( +/mob/living/simple_animal/bot/hygienebot, +/turf/open/floor/wood, +/area/shuttle/escape) "nV" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -838,6 +794,16 @@ }, /turf/open/floor/carpet/royalblue, /area/shuttle/escape) +"oQ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/structure/sign/nanotrasen{ + pixel_y = -32 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/wood, +/area/shuttle/escape) "oV" = ( /obj/effect/turf_decal/siding/wood/end{ dir = 8 @@ -871,6 +837,23 @@ /obj/structure/flora/bush/flowers_br/style_2, /turf/open/floor/grass, /area/shuttle/escape) +"ps" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood, +/obj/item/toy/cards/deck{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/toy/cards/deck/kotahi{ + pixel_x = 5; + pixel_y = 2 + }, +/obj/item/toy/figure/dsquad{ + pixel_x = -9; + pixel_y = 1 + }, +/turf/open/floor/carpet/red, +/area/shuttle/escape) "pK" = ( /obj/structure/reagent_dispensers/foamtank, /obj/effect/turf_decal/delivery, @@ -930,6 +913,13 @@ "qU" = ( /turf/open/floor/carpet/red, /area/shuttle/escape) +"rb" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/item/kirbyplants/organic/plant3, +/turf/open/floor/wood, +/area/shuttle/escape) "rd" = ( /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -938,11 +928,6 @@ /obj/structure/sign/poster/official/high_class_martini/directional/north, /turf/open/floor/wood, /area/shuttle/escape) -"rh" = ( -/obj/structure/closet/radiation, -/obj/effect/turf_decal/bot, -/turf/open/floor/plating, -/area/shuttle/escape) "rK" = ( /obj/machinery/vending/wallmed/directional/south, /turf/open/floor/iron/chapel, @@ -1126,9 +1111,6 @@ dir = 1 }, /area/shuttle/escape) -"vE" = ( -/turf/open/floor/carpet/green, -/area/shuttle/escape) "vI" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 @@ -1153,6 +1135,16 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) +"wl" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/structure/sign/nanotrasen{ + pixel_y = -32 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/wood, +/area/shuttle/escape) "wm" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/structure/table/optable, @@ -1189,6 +1181,11 @@ }, /turf/open/floor/wood/large, /area/shuttle/escape) +"xF" = ( +/obj/machinery/computer/crew, +/obj/structure/sign/flag/nanotrasen/directional/north, +/turf/open/floor/iron/dark/small, +/area/shuttle/escape) "xK" = ( /obj/structure/chair/pew/left{ dir = 8 @@ -1219,6 +1216,25 @@ }, /turf/open/floor/wood, /area/shuttle/escape) +"ya" = ( +/obj/structure/railing/corner{ + dir = 8; + color = "#A47449"; + layer = 3.1 + }, +/obj/structure/flora/bush/large/style_2{ + pixel_x = -6; + pixel_y = -16 + }, +/obj/structure/flora/rock/pile/jungle{ + pixel_x = -3; + pixel_y = -6 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/grass, +/area/shuttle/escape) "yj" = ( /obj/machinery/recharge_station, /obj/effect/turf_decal/bot/left, @@ -1233,14 +1249,6 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/dark/small, /area/shuttle/escape) -"yp" = ( -/obj/effect/turf_decal/tile/blue/opposingcorners, -/obj/machinery/stasis, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/shuttle/escape) "yu" = ( /obj/structure/fluff/beach_umbrella{ pixel_x = -15; @@ -1338,6 +1346,23 @@ /obj/effect/turf_decal/siding/wood/end, /turf/open/floor/glass, /area/shuttle/escape) +"zw" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_x = -7; + pixel_y = 4 + }, +/obj/machinery/recharger{ + pixel_x = 7; + pixel_y = 4 + }, +/obj/item/storage/box/handcuffs{ + pixel_y = 2 + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark/textured_half, +/area/shuttle/escape) "zB" = ( /obj/machinery/vending/games, /obj/effect/turf_decal/siding/wood{ @@ -1364,6 +1389,20 @@ /obj/machinery/vending/wallmed/directional/south, /turf/open/floor/wood, /area/shuttle/escape) +"Ac" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/item/kirbyplants/organic/plant22, +/turf/open/floor/carpet/red, +/area/shuttle/escape) +"Al" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/line, +/turf/open/floor/iron/dark/small, +/area/shuttle/escape) "At" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -1412,6 +1451,42 @@ }, /turf/open/floor/wood/tile, /area/shuttle/escape) +"Bm" = ( +/obj/structure/closet/cardboard, +/obj/structure/sign/poster/official/cohiba_robusto_ad/directional/north, +/obj/item/clothing/suit/hooded/wintercoat/custom, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/shoes/sandal{ + pixel_y = -11; + pixel_x = 4 + }, +/obj/item/clothing/shoes/sandal{ + pixel_y = -11; + pixel_x = 4 + }, +/obj/item/clothing/shoes/sandal{ + pixel_y = -11; + pixel_x = 4 + }, +/obj/item/clothing/shoes/sandal{ + pixel_y = -11; + pixel_x = 4 + }, +/obj/item/clothing/shoes/sandal{ + pixel_y = -11; + pixel_x = 4 + }, +/obj/item/clothing/shoes/sandal{ + pixel_y = -11; + pixel_x = 4 + }, +/turf/open/floor/plating, +/area/shuttle/escape) "Bn" = ( /obj/structure/railing/corner, /obj/effect/turf_decal/siding/wood/corner, @@ -1448,23 +1523,6 @@ }, /turf/open/water/jungle, /area/shuttle/escape) -"Cv" = ( -/obj/structure/table, -/obj/machinery/recharger{ - pixel_x = -7; - pixel_y = 4 - }, -/obj/machinery/recharger{ - pixel_x = 7; - pixel_y = 4 - }, -/obj/item/storage/box/handcuffs{ - pixel_y = 2 - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark/textured_half, -/area/shuttle/escape) "CR" = ( /turf/open/floor/wood, /area/shuttle/escape) @@ -1484,11 +1542,6 @@ /obj/structure/chair/comfy/shuttle, /turf/open/floor/carpet/royalblue, /area/shuttle/escape) -"Dn" = ( -/obj/effect/spawner/structure/window/reinforced/shuttle, -/obj/machinery/light/directional/south, -/turf/open/floor/plating, -/area/shuttle/escape) "DC" = ( /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -1504,10 +1557,6 @@ }, /turf/open/floor/iron/dark/herringbone, /area/shuttle/escape) -"DR" = ( -/obj/structure/closet/secure_closet/bar/all_access, -/turf/open/floor/stone, -/area/shuttle/escape) "Ec" = ( /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -1571,6 +1620,32 @@ }, /turf/open/floor/sepia, /area/shuttle/escape) +"Fd" = ( +/obj/item/paper_bin{ + pixel_x = -4 + }, +/obj/item/pen/fourcolor{ + pixel_x = -4 + }, +/obj/item/stamp{ + pixel_x = 8; + pixel_y = 5 + }, +/obj/item/stamp/denied{ + pixel_x = 8 + }, +/obj/item/stamp/head/qm{ + pixel_y = -5; + pixel_x = 8 + }, +/obj/structure/table/reinforced{ + color = "#c1b6a5" + }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/shuttle/escape) "Fg" = ( /obj/structure/railing/corner{ dir = 4; @@ -1595,15 +1670,6 @@ /obj/structure/chair/sofa/right/brown, /turf/open/floor/wood, /area/shuttle/escape) -"FO" = ( -/obj/structure/railing{ - layer = 3.1 - }, -/obj/effect/turf_decal/siding/dark, -/obj/effect/turf_decal/trimline/blue/line, -/obj/machinery/light/floor, -/turf/open/floor/iron/dark/small, -/area/shuttle/escape) "FS" = ( /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -1773,23 +1839,6 @@ }, /turf/open/floor/wood, /area/shuttle/escape) -"Ij" = ( -/obj/structure/table/wood, -/obj/effect/turf_decal/siding/wood, -/obj/item/toy/cards/deck{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/toy/cards/deck/kotahi{ - pixel_x = 5; - pixel_y = 2 - }, -/obj/item/toy/figure/dsquad{ - pixel_x = -9; - pixel_y = 1 - }, -/turf/open/floor/carpet/red, -/area/shuttle/escape) "IG" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet/red, @@ -1825,18 +1874,6 @@ }, /turf/open/floor/grass, /area/shuttle/escape) -"IW" = ( -/obj/structure/table/wood, -/obj/item/storage/fancy/candle_box{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/lighter, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 8 - }, -/turf/open/floor/iron/dark/herringbone, -/area/shuttle/escape) "IY" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -1846,10 +1883,6 @@ "IZ" = ( /turf/open/floor/catwalk_floor, /area/shuttle/escape) -"Jk" = ( -/mob/living/simple_animal/bot/hygienebot, -/turf/open/floor/wood, -/area/shuttle/escape) "Jo" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /turf/open/floor/iron/dark, @@ -1883,6 +1916,11 @@ }, /turf/open/floor/carpet/red, /area/shuttle/escape) +"JR" = ( +/obj/structure/closet/radiation, +/obj/effect/turf_decal/bot, +/turf/open/floor/plating, +/area/shuttle/escape) "JS" = ( /turf/open/floor/iron/stairs/left, /area/shuttle/escape) @@ -1905,6 +1943,15 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/water, /area/shuttle/escape) +"Kk" = ( +/obj/structure/railing{ + layer = 3.1 + }, +/obj/effect/turf_decal/siding/dark, +/obj/effect/turf_decal/trimline/blue/line, +/obj/machinery/light/floor, +/turf/open/floor/iron/dark/small, +/area/shuttle/escape) "Km" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/chair/comfy/black{ @@ -2033,31 +2080,16 @@ }, /turf/open/floor/iron/dark/small, /area/shuttle/escape) -"Mm" = ( -/obj/structure/railing/corner{ - dir = 8; - color = "#A47449"; - layer = 3.1 +"Mk" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/computer/operating{ + dir = 4 }, -/obj/structure/flora/bush/large/style_2{ - pixel_x = -6; - pixel_y = -16 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/obj/structure/flora/rock/pile/jungle{ - pixel_x = -3; - pixel_y = -6 - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/turf/open/floor/grass, -/area/shuttle/escape) -"MF" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/obj/item/kirbyplants/organic/plant21, -/turf/open/floor/wood, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, /area/shuttle/escape) "MO" = ( /obj/effect/turf_decal/siding/wood, @@ -2119,6 +2151,12 @@ dir = 8 }, /area/shuttle/escape) +"NZ" = ( +/obj/machinery/status_display/evac/directional/west, +/obj/machinery/keycard_auth/directional/south, +/obj/machinery/light/floor, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) "Oh" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 1 @@ -2166,6 +2204,11 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/dark/small, /area/shuttle/escape) +"OC" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/item/kirbyplants/organic/plant10, +/turf/open/floor/iron/dark, +/area/shuttle/escape) "OG" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood/large, @@ -2215,24 +2258,6 @@ /obj/machinery/status_display/evac/directional/west, /turf/open/floor/iron/dark/small, /area/shuttle/escape) -"Pv" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/machinery/light/floor, -/turf/open/floor/carpet/royalblue, -/area/shuttle/escape) -"PO" = ( -/obj/effect/turf_decal/tile/blue/opposingcorners, -/obj/machinery/computer/operating{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/shuttle/escape) "Qq" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 8 @@ -2277,12 +2302,9 @@ }, /turf/open/floor/plating, /area/shuttle/escape) -"Rd" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/line, -/turf/open/floor/iron/dark/small, +"Rh" = ( +/obj/structure/closet/secure_closet/bar/all_access, +/turf/open/floor/stone, /area/shuttle/escape) "Rm" = ( /obj/structure/table/reinforced, @@ -2300,32 +2322,6 @@ }, /turf/open/floor/iron/dark/herringbone, /area/shuttle/escape) -"Rt" = ( -/obj/item/paper_bin{ - pixel_x = -4 - }, -/obj/item/pen/fourcolor{ - pixel_x = -4 - }, -/obj/item/stamp{ - pixel_x = 8; - pixel_y = 5 - }, -/obj/item/stamp/denied{ - pixel_x = 8 - }, -/obj/item/stamp/head/qm{ - pixel_y = -5; - pixel_x = 8 - }, -/obj/structure/table/reinforced{ - color = "#c1b6a5" - }, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "RD" = ( /obj/machinery/computer/emergency_shuttle{ dir = 8 @@ -2436,11 +2432,6 @@ /obj/effect/turf_decal/siding/thinplating_new/dark, /turf/open/floor/iron/dark, /area/shuttle/escape) -"SM" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/item/kirbyplants/organic/plant10, -/turf/open/floor/iron/dark, -/area/shuttle/escape) "SR" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 8 @@ -2452,18 +2443,6 @@ /obj/effect/decal/cleanable/wrapping, /turf/open/floor/iron/dark/herringbone, /area/shuttle/escape) -"Tb" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/item/kirbyplants/organic/plant22, -/turf/open/floor/carpet/red, -/area/shuttle/escape) -"Th" = ( -/obj/machinery/computer/crew, -/obj/structure/sign/flag/nanotrasen/directional/north, -/turf/open/floor/iron/dark/small, -/area/shuttle/escape) "Tq" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -2507,6 +2486,17 @@ }, /turf/open/floor/glass, /area/shuttle/escape) +"Uk" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/machinery/vending/coffee, +/obj/structure/sign/nanotrasen{ + pixel_y = 32 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/wood, +/area/shuttle/escape) "UF" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/closet/emcloset/anchored, @@ -2526,12 +2516,6 @@ }, /turf/open/floor/grass, /area/shuttle/escape) -"UM" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/carpet/royalblue, -/area/shuttle/escape) "UP" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/closet/emcloset/anchored, @@ -2552,6 +2536,17 @@ }, /turf/open/floor/grass, /area/shuttle/escape) +"Vd" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/railing{ + color = "#A47449"; + dir = 2; + layer = 3.1 + }, +/obj/machinery/microwave, +/obj/structure/table/wood, +/turf/open/floor/stone, +/area/shuttle/escape) "VR" = ( /obj/structure/railing{ dir = 4 @@ -2592,6 +2587,12 @@ "Wo" = ( /turf/closed/wall/mineral/titanium, /area/shuttle/escape) +"Wp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/carpet/royalblue, +/area/shuttle/escape) "Wx" = ( /obj/structure/railing/corner{ dir = 1; @@ -2608,16 +2609,6 @@ /obj/effect/turf_decal/box, /turf/open/floor/iron/dark/textured_large, /area/shuttle/escape) -"WT" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/obj/structure/hedge{ - icon_state = "hedge-8" - }, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood/large, -/area/shuttle/escape) "Xa" = ( /obj/effect/turf_decal/siding/wood/corner, /obj/effect/turf_decal/siding/wood/corner{ @@ -2660,6 +2651,11 @@ "XX" = ( /turf/open/floor/iron/dark/small, /area/shuttle/escape) +"XZ" = ( +/obj/effect/spawner/structure/window/reinforced/shuttle, +/obj/machinery/light/directional/south, +/turf/open/floor/plating, +/area/shuttle/escape) "Yc" = ( /obj/structure/sign/departments/medbay/alt/directional, /turf/closed/wall/mineral/titanium/nodiagonal, @@ -2701,6 +2697,10 @@ }, /turf/open/floor/wood/tile, /area/shuttle/escape) +"Zx" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/catwalk_floor, +/area/shuttle/escape) "ZJ" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/stone, @@ -2876,9 +2876,9 @@ fL ux fC ZJ -eI +Vd yj -aK +Zx ux eW hx @@ -2926,13 +2926,13 @@ ux cD CV hT -DR +Rh ux IZ ux Km gg -Tb +Ac zB ux Wo @@ -2984,7 +2984,7 @@ QR JG qU RM -Ij +ps ux ux QV @@ -3001,10 +3001,10 @@ Pg Pg Pg Pg -MF +nj pP AQ -WT +dB Tw XW nq @@ -3046,7 +3046,7 @@ ux zf OK ux -Jk +nQ Qq sY sY @@ -3072,7 +3072,7 @@ oB oB Bs qw -ni +rb UU ow os @@ -3096,7 +3096,7 @@ ux UP NC ux -cx +Uk vT iM aj @@ -3108,9 +3108,9 @@ MO nv vT Wx -Mm +ya jl -kD +oQ ux oy NC @@ -3136,7 +3136,7 @@ ag ag nA bS -Dn +XZ oe oe Sz @@ -3205,12 +3205,12 @@ Fj wM OG MO -ba +ie HS Fg kh Ci -iv +wl ux UF pe @@ -3246,7 +3246,7 @@ ux zf Ty ux -Jk +nQ si mc mc @@ -3294,7 +3294,7 @@ fe (24,1,1) = {" Wo ux -rh +JR ux yQ Kt @@ -3312,7 +3312,7 @@ Hu NV SA ux -ii +Bm ux Wo "} @@ -3348,7 +3348,7 @@ fL fL ux nG -vE +jN AT wp er @@ -3358,7 +3358,7 @@ Sl gz xK qn -IW +bC KI ux fL @@ -3398,7 +3398,7 @@ fL fL fL ux -Cv +zw GM GM Sz @@ -3408,7 +3408,7 @@ TV Sz Gh wm -PO +Mk ux fL fL @@ -3483,7 +3483,7 @@ Sz ux dd VZ -yp +jp ux fL fL @@ -3504,7 +3504,7 @@ ux ux Ay GK -SM +OC ux ux ux @@ -3526,13 +3526,13 @@ fL ux Pq yo -Rd +Al EW GK Jo -UM +Wp KK -km +NZ ux fL fL @@ -3549,7 +3549,7 @@ fL fL fL ux -Th +xF XX ll VR @@ -3576,7 +3576,7 @@ fL Sz LG XX -FO +Kk OM GK Jo @@ -3605,7 +3605,7 @@ Hq SH Az eN -Pv +fs eH Gg ux @@ -3631,7 +3631,7 @@ wi BC eu vy -Rt +Fd ux Wo fL diff --git a/_maps/shuttles/hunter_russian.dmm b/_maps/shuttles/hunter_russian.dmm index 9788549705a..248235bd772 100644 --- a/_maps/shuttles/hunter_russian.dmm +++ b/_maps/shuttles/hunter_russian.dmm @@ -173,10 +173,10 @@ /obj/structure/closet/crate/secure/weapon{ name = "surplus crate" }, -/obj/item/ammo_box/a762, -/obj/item/ammo_box/a762, -/obj/item/ammo_box/a762, -/obj/item/ammo_box/a762, +/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/strilka310, /turf/open/floor/pod/dark, /area/shuttle/hunter/russian) "qF" = ( @@ -613,7 +613,7 @@ /obj/effect/decal/cleanable/dirt, /obj/item/gun/ballistic/automatic/pistol, /obj/item/ammo_box/magazine/m9mm, -/obj/item/ammo_box/a762, +/obj/item/ammo_box/strilka310, /obj/item/crowbar, /turf/open/floor/pod/dark, /area/shuttle/hunter/russian) diff --git a/_maps/shuttles/infiltrator_advanced.dmm b/_maps/shuttles/infiltrator_advanced.dmm index 83c0a18b5dc..83e13c63f35 100644 --- a/_maps/shuttles/infiltrator_advanced.dmm +++ b/_maps/shuttles/infiltrator_advanced.dmm @@ -600,6 +600,7 @@ dir = 6 }, /obj/structure/cable, +/mob/living/simple_animal/bot/medbot/nukie, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/medical) "bA" = ( diff --git a/_maps/shuttles/infiltrator_basic.dmm b/_maps/shuttles/infiltrator_basic.dmm index 71e7885a4ea..68b28c95777 100644 --- a/_maps/shuttles/infiltrator_basic.dmm +++ b/_maps/shuttles/infiltrator_basic.dmm @@ -676,6 +676,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, +/mob/living/simple_animal/bot/medbot/nukie, /turf/open/floor/iron/corner{ dir = 1 }, diff --git a/_maps/shuttles/pirate_Interdyne.dmm b/_maps/shuttles/pirate_Interdyne.dmm index 18df846d104..c3f7e186acb 100644 --- a/_maps/shuttles/pirate_Interdyne.dmm +++ b/_maps/shuttles/pirate_Interdyne.dmm @@ -491,6 +491,10 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, +/mob/living/simple_animal/bot/medbot/nukie{ + name = "Dr. Pax"; + desc = "A twitchy medibot. It can't seem to hold still. Slightly concerning." + }, /turf/open/floor/iron/dark, /area/shuttle/pirate) "fY" = ( diff --git a/_maps/shuttles/pirate_grey.dmm b/_maps/shuttles/pirate_grey.dmm index e46a2e08e6e..c81c004f6e6 100644 --- a/_maps/shuttles/pirate_grey.dmm +++ b/_maps/shuttles/pirate_grey.dmm @@ -21,12 +21,6 @@ /obj/item/reagent_containers/cup/glass/coffee, /turf/open/floor/plating, /area/shuttle/pirate) -"az" = ( -/obj/effect/spawner/random/entertainment/arcade{ - dir = 1 - }, -/turf/open/floor/plating, -/area/shuttle/pirate) "aA" = ( /obj/effect/spawner/random/trash/moisture_trap, /turf/open/floor/plating, @@ -138,16 +132,6 @@ /obj/structure/sign/poster/random/directional/east, /turf/open/floor/plating, /area/shuttle/pirate) -"ex" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating, -/area/shuttle/pirate) "eU" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -271,21 +255,18 @@ /obj/item/knife/butcher, /turf/open/floor/plating, /area/shuttle/pirate) +"ko" = ( +/obj/effect/spawner/random/entertainment/arcade{ + dir = 1 + }, +/turf/open/floor/plating, +/area/shuttle/pirate) "kw" = ( /obj/structure/closet, /obj/effect/spawner/random/maintenance/two, /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/plating, /area/shuttle/pirate) -"kL" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/machinery/power/port_gen/pacman/pre_loaded, -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/shuttle/pirate) "lk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/broken_floor, @@ -437,6 +418,15 @@ }, /turf/open/floor/plating, /area/shuttle/pirate) +"qm" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/machinery/power/port_gen/pacman/pre_loaded, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/shuttle/pirate) "qn" = ( /obj/effect/mapping_helpers/broken_floor, /obj/item/flashlight/flashdark, @@ -1451,6 +1441,16 @@ }, /turf/open/floor/iron, /area/shuttle/pirate) +"XX" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/spawner/random/structure/steam_vent, +/turf/open/floor/plating, +/area/shuttle/pirate) "Yf" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -1613,7 +1613,7 @@ Wy Lp KZ yv -az +ko zB "} (7,1,1) = {" @@ -1670,7 +1670,7 @@ aA IY Kq xT -kL +qm Ti "} (10,1,1) = {" @@ -1732,7 +1732,7 @@ HD "} (13,1,1) = {" HD -ex +XX vJ ZU SB diff --git a/_maps/shuttles/pirate_silverscale.dmm b/_maps/shuttles/pirate_silverscale.dmm index 98b41415fa2..efe506d8f87 100644 --- a/_maps/shuttles/pirate_silverscale.dmm +++ b/_maps/shuttles/pirate_silverscale.dmm @@ -57,10 +57,10 @@ /turf/open/floor/pod/dark, /area/shuttle/pirate) "dT" = ( -/obj/item/ammo_box/a762{ +/obj/item/ammo_box/strilka310{ pixel_y = 2 }, -/obj/item/ammo_box/a762, +/obj/item/ammo_box/strilka310, /obj/item/grenade/c4{ pixel_x = -13 }, @@ -789,8 +789,8 @@ dir = 8; layer = 2.9 }, -/obj/item/ammo_box/a762, -/obj/item/ammo_box/a762{ +/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/strilka310{ pixel_y = 3 }, /obj/effect/turf_decal/bot, diff --git a/_maps/shuttles/ruin_cyborg_mothership.dmm b/_maps/shuttles/ruin_cyborg_mothership.dmm index 0d577a348cf..30fae567714 100644 --- a/_maps/shuttles/ruin_cyborg_mothership.dmm +++ b/_maps/shuttles/ruin_cyborg_mothership.dmm @@ -1,4 +1,13 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"am" = ( +/obj/structure/lattice/catwalk, +/obj/structure/spacevine, +/obj/machinery/shieldgen{ + anchored = 1; + req_access = null + }, +/turf/template_noop, +/area/shuttle/ruin/cyborg_mothership) "aB" = ( /obj/machinery/conveyor{ dir = 8; @@ -49,10 +58,6 @@ }, /turf/template_noop, /area/shuttle/ruin/cyborg_mothership) -"dO" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/circuit/airless, -/area/shuttle/ruin/cyborg_mothership) "ey" = ( /obj/structure/table, /obj/item/toy/talking/ai{ @@ -72,6 +77,13 @@ }, /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) +"eQ" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/showroomfloor, +/area/shuttle/ruin/cyborg_mothership) "fB" = ( /obj/structure/sign/warning/vacuum/external/directional/west, /obj/structure/closet/emcloset/anchored, @@ -118,24 +130,17 @@ }, /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) -"ir" = ( -/obj/structure/table/optable, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/shuttle/ruin/cyborg_mothership) "iv" = ( /obj/structure/lattice, /obj/structure/spacevine, /turf/template_noop, /area/shuttle/ruin/cyborg_mothership) -"iN" = ( -/obj/structure/table, -/obj/effect/turf_decal/bot, -/obj/item/clothing/gloves/latex, -/obj/item/clothing/mask/surgical, -/obj/item/razor, -/obj/structure/mirror/directional/west, -/turf/open/floor/iron/dark, +"iD" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/obj/machinery/light/floor/broken, +/turf/open/floor/iron/showroomfloor, /area/shuttle/ruin/cyborg_mothership) "iO" = ( /obj/machinery/rnd/production/protolathe/offstation, @@ -145,6 +150,13 @@ }, /turf/open/floor/circuit/airless, /area/shuttle/ruin/cyborg_mothership) +"jl" = ( +/obj/item/stack/rods, +/obj/machinery/button/door/directional/east{ + id = "mothership_right" + }, +/turf/open/floor/circuit/airless, +/area/shuttle/ruin/cyborg_mothership) "jx" = ( /obj/effect/mapping_helpers/burnt_floor, /obj/effect/turf_decal/stripes/asteroid/line{ @@ -202,13 +214,6 @@ /obj/structure/plasticflaps, /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) -"ms" = ( -/obj/item/stack/rods, -/obj/machinery/button/door/directional/east{ - id = "mothership_right" - }, -/turf/open/floor/circuit/airless, -/area/shuttle/ruin/cyborg_mothership) "mC" = ( /obj/machinery/mineral/ore_redemption/offstation{ input_dir = 4 @@ -281,6 +286,17 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) +"oU" = ( +/mob/living/basic/hivebot/range, +/turf/open/floor/circuit/airless, +/area/shuttle/ruin/cyborg_mothership) +"pe" = ( +/obj/machinery/button/door/directional/west{ + id = "mothership_left" + }, +/obj/structure/cable, +/turf/open/floor/circuit/airless, +/area/shuttle/ruin/cyborg_mothership) "po" = ( /obj/machinery/door/airlock/hatch, /obj/structure/cable, @@ -306,6 +322,18 @@ /obj/structure/cable, /turf/open/floor/plating, /area/shuttle/ruin/cyborg_mothership) +"pR" = ( +/obj/machinery/camera/directional/south, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south{ + environ = 0; + equipment = 0; + lighting = 0 + }, +/obj/effect/mapping_helpers/apc/unlocked, +/obj/machinery/light/cold/no_nightlight/directional/south, +/turf/open/floor/circuit/airless, +/area/shuttle/ruin/cyborg_mothership) "pY" = ( /obj/machinery/recharge_station, /obj/structure/sign/warning/vacuum/external/directional/east, @@ -327,18 +355,6 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) -"qz" = ( -/obj/machinery/camera/directional/south, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south{ - environ = 0; - equipment = 0; - lighting = 0 - }, -/obj/effect/mapping_helpers/apc/unlocked, -/obj/machinery/light/cold/no_nightlight/directional/south, -/turf/open/floor/circuit/airless, -/area/shuttle/ruin/cyborg_mothership) "qV" = ( /obj/structure/spacevine, /obj/machinery/conveyor{ @@ -393,15 +409,6 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) -"uF" = ( -/mob/living/basic/hivebot, -/obj/structure/spacevine, -/obj/machinery/conveyor{ - id = "mothership_main" - }, -/obj/structure/cable, -/turf/open/floor/plating/airless, -/area/shuttle/ruin/cyborg_mothership) "uK" = ( /obj/machinery/power/smes, /obj/structure/cable, @@ -447,6 +454,26 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) +"xs" = ( +/mob/living/basic/hivebot, +/obj/structure/spacevine, +/obj/machinery/conveyor{ + id = "mothership_main" + }, +/obj/structure/cable, +/turf/open/floor/plating/airless, +/area/shuttle/ruin/cyborg_mothership) +"xz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/window/reinforced/spawner/directional/north{ + layer = 2.9 + }, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/obj/machinery/power/port_gen/pacman, +/turf/open/floor/plating/airless, +/area/shuttle/ruin/cyborg_mothership) "yd" = ( /obj/effect/mapping_helpers/burnt_floor, /obj/effect/turf_decal/stripes/asteroid/line{ @@ -461,13 +488,6 @@ }, /turf/open/floor/circuit/airless, /area/shuttle/ruin/cyborg_mothership) -"yw" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/obj/machinery/light/floor/broken, -/turf/open/floor/iron/showroomfloor, -/area/shuttle/ruin/cyborg_mothership) "yA" = ( /obj/structure/spacevine, /obj/machinery/conveyor{ @@ -480,6 +500,15 @@ /obj/machinery/status_display/ai, /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/ruin/cyborg_mothership) +"yI" = ( +/obj/structure/table, +/obj/effect/turf_decal/bot, +/obj/item/clothing/gloves/latex, +/obj/item/clothing/mask/surgical, +/obj/item/razor, +/obj/structure/mirror/directional/west, +/turf/open/floor/iron/dark, +/area/shuttle/ruin/cyborg_mothership) "yQ" = ( /obj/item/organ/internal/brain, /obj/structure/cable, @@ -490,11 +519,6 @@ /obj/structure/spacevine, /turf/template_noop, /area/shuttle/ruin/cyborg_mothership) -"zy" = ( -/obj/structure/lattice, -/mob/living/basic/hivebot/mechanic, -/turf/template_noop, -/area/shuttle/ruin/cyborg_mothership) "zF" = ( /obj/machinery/conveyor/inverted{ dir = 6; @@ -522,6 +546,12 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) +"Ba" = ( +/mob/living/basic/hivebot, +/obj/item/circuitboard/aicore, +/obj/structure/cable, +/turf/open/floor/circuit/green/airless, +/area/shuttle/ruin/cyborg_mothership) "BD" = ( /obj/structure/cable, /obj/machinery/power/solar, @@ -542,11 +572,6 @@ }, /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) -"Dm" = ( -/obj/structure/lattice, -/mob/living/basic/hivebot/range, -/turf/template_noop, -/area/shuttle/ruin/cyborg_mothership) "Dv" = ( /obj/structure/cable, /obj/structure/table_frame, @@ -585,10 +610,6 @@ /obj/machinery/camera/directional/south, /turf/open/floor/iron/showroomfloor, /area/shuttle/ruin/cyborg_mothership) -"FJ" = ( -/mob/living/basic/hivebot/range, -/turf/open/floor/circuit/airless, -/area/shuttle/ruin/cyborg_mothership) "Ge" = ( /obj/structure/spacevine, /obj/machinery/conveyor{ @@ -598,15 +619,6 @@ /obj/structure/cable, /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) -"GF" = ( -/obj/structure/lattice/catwalk, -/obj/structure/spacevine, -/obj/machinery/shieldgen{ - anchored = 1; - req_access = null - }, -/turf/template_noop, -/area/shuttle/ruin/cyborg_mothership) "Hg" = ( /obj/machinery/conveyor{ id = "Recycler" @@ -625,6 +637,11 @@ /obj/item/wrench, /turf/open/floor/plating, /area/shuttle/ruin/cyborg_mothership) +"HQ" = ( +/obj/structure/lattice, +/mob/living/basic/hivebot/range, +/turf/template_noop, +/area/shuttle/ruin/cyborg_mothership) "IS" = ( /obj/structure/lattice, /obj/machinery/camera/directional/west, @@ -669,6 +686,11 @@ }, /turf/open/floor/circuit/airless, /area/shuttle/ruin/cyborg_mothership) +"LT" = ( +/obj/structure/table/optable, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/shuttle/ruin/cyborg_mothership) "MB" = ( /obj/machinery/computer/shuttle/cyborg_mothership{ dir = 1 @@ -699,12 +721,10 @@ /obj/structure/plasticflaps, /turf/open/floor/iron/showroomfloor, /area/shuttle/ruin/cyborg_mothership) -"Nz" = ( -/obj/machinery/button/door/directional/west{ - id = "mothership_left" - }, -/obj/structure/cable, -/turf/open/floor/circuit/airless, +"On" = ( +/obj/structure/lattice, +/mob/living/basic/hivebot/mechanic, +/turf/template_noop, /area/shuttle/ruin/cyborg_mothership) "Oq" = ( /obj/structure/table, @@ -726,6 +746,14 @@ }, /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) +"OA" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/shieldgen{ + anchored = 1; + req_access = null + }, +/turf/template_noop, +/area/shuttle/ruin/cyborg_mothership) "OY" = ( /obj/machinery/power/shuttle_engine/heater, /obj/structure/window/reinforced/spawner/directional/north{ @@ -751,6 +779,10 @@ /obj/machinery/camera/directional/east, /turf/template_noop, /area/shuttle/ruin/cyborg_mothership) +"QO" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/circuit/airless, +/area/shuttle/ruin/cyborg_mothership) "Rv" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/ore_box, @@ -782,13 +814,6 @@ }, /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) -"Sd" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/obj/machinery/light/floor, -/turf/open/floor/iron/showroomfloor, -/area/shuttle/ruin/cyborg_mothership) "SV" = ( /obj/machinery/power/shuttle_engine/heater, /obj/structure/window/reinforced/spawner/directional/north{ @@ -802,17 +827,6 @@ /obj/item/stack/sheet/mineral/titanium, /turf/template_noop, /area/shuttle/ruin/cyborg_mothership) -"TH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 4 - }, -/obj/machinery/power/port_gen/pacman, -/turf/open/floor/plating/airless, -/area/shuttle/ruin/cyborg_mothership) "TZ" = ( /obj/item/radio/intercom/directional/south, /obj/structure/ai_core, @@ -884,12 +898,6 @@ /obj/structure/cable, /turf/template_noop, /area/shuttle/ruin/cyborg_mothership) -"Yb" = ( -/mob/living/basic/hivebot, -/obj/item/circuitboard/aicore, -/obj/structure/cable, -/turf/open/floor/circuit/green/airless, -/area/shuttle/ruin/cyborg_mothership) "Yl" = ( /obj/machinery/conveyor/inverted{ dir = 5; @@ -922,14 +930,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/shuttle/ruin/cyborg_mothership) -"ZO" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/shieldgen{ - anchored = 1; - req_access = null - }, -/turf/template_noop, -/area/shuttle/ruin/cyborg_mothership) (1,1,1) = {" hR @@ -991,7 +991,7 @@ hR hR hR hR -TH +xz RD wA jx @@ -1011,7 +1011,7 @@ hR hR hR hR -GF +am oe oe oe @@ -1050,7 +1050,7 @@ of oe BD oe -ZO +OA hR hR hR @@ -1115,7 +1115,7 @@ oR eO hR so -zy +On so kz mp @@ -1161,13 +1161,13 @@ kz zZ zZ mN -iN +yI Oq zZ kz kz zZ -Nz +pe ww UL Uq @@ -1186,13 +1186,13 @@ yF fB zZ Ey -Sd +eQ Fe yF HM yF yg -Yb +Ba vy Dv Ln @@ -1221,7 +1221,7 @@ ks TZ zZ uK -qz +pR zZ VU tr @@ -1236,7 +1236,7 @@ yF pY zZ Ey -yw +iD bE yF hB @@ -1245,7 +1245,7 @@ dA Ng MB ey -FJ +oU Uq yF so @@ -1261,16 +1261,16 @@ kz zZ zZ mN -ir +LT hs zZ kz Em no -ms +jl pz Uq -dO +QO zZ kz hR @@ -1338,7 +1338,7 @@ hR hR oe qV -Dm +HQ so so hR @@ -1400,7 +1400,7 @@ MZ BD oe oe -GF +am hR hR hR @@ -1411,14 +1411,14 @@ hR hR hR hR -ZO +OA oe oe oe RV tW tW -uF +xs Jj tW Sc diff --git a/_maps/shuttles/skyrat/pirate_nri_raider.dmm b/_maps/shuttles/skyrat/pirate_nri_raider.dmm index c52cdd03b58..3008861bb1d 100644 --- a/_maps/shuttles/skyrat/pirate_nri_raider.dmm +++ b/_maps/shuttles/skyrat/pirate_nri_raider.dmm @@ -424,29 +424,13 @@ /area/shuttle/pirate/nri) "qE" = ( /obj/structure/table/reinforced, -/obj/item/storage/box/nri_rations{ - pixel_x = -3 +/obj/item/storage/box/colonial_rations{ + pixel_y = 12 }, -/obj/item/storage/box/nri_rations{ - pixel_x = 7; - pixel_y = -5 - }, -/obj/item/storage/box/nri_rations{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/storage/box/nri_rations{ - pixel_x = 7; - pixel_y = -2 - }, -/obj/item/storage/box/nri_rations{ - pixel_x = -3; +/obj/item/storage/box/colonial_rations{ pixel_y = 6 }, -/obj/item/storage/box/nri_rations{ - pixel_x = 7; - pixel_y = 1 - }, +/obj/item/storage/box/colonial_rations, /turf/open/floor/pod/light, /area/shuttle/pirate/nri) "qJ" = ( @@ -1345,7 +1329,7 @@ /turf/open/floor/pod, /area/shuttle/pirate/nri) "Wa" = ( -/obj/machinery/vending/imported/mothic, +/obj/machinery/biogenerator/food_replicator, /turf/open/floor/pod/light, /area/shuttle/pirate/nri) "Wr" = ( @@ -1390,10 +1374,26 @@ /turf/open/floor/engine/hull/reinforced, /area/shuttle/pirate/nri) "Yd" = ( -/obj/structure/table/reinforced, -/obj/item/coffee_cartridge, -/obj/item/coffee_cartridge, -/obj/machinery/coffeemaker, +/obj/structure/closet/crate/freezer, +/obj/item/food/meat/slab/meatproduct, +/obj/item/food/meat/slab/meatproduct, +/obj/item/food/meat/slab/meatproduct, +/obj/item/food/meat/slab/meatproduct, +/obj/item/food/meat/slab/meatproduct, +/obj/item/food/meat/slab/meatproduct, +/obj/item/food/meat/slab/meatproduct, +/obj/item/food/meat/slab/meatproduct, +/obj/item/food/meat/slab/meatproduct, +/obj/item/food/meat/slab/meatproduct, +/obj/item/food/meat/slab/meatproduct, +/obj/item/food/meat/slab/meatproduct, +/obj/item/food/meat/slab/meatproduct, +/obj/item/food/meat/slab/meatproduct, +/obj/item/food/meat/slab/meatproduct, +/obj/item/food/meat/slab/meatproduct, +/obj/item/food/meat/slab/meatproduct, +/obj/item/food/meat/slab/meatproduct, +/obj/item/food/meat/slab/meatproduct, /turf/open/floor/pod, /area/shuttle/pirate/nri) "Yy" = ( diff --git a/_maps/shuttles/skyrat/slaver_syndie.dmm b/_maps/shuttles/skyrat/slaver_syndie.dmm index 2addf5c6e87..6cd82b4a88c 100644 --- a/_maps/shuttles/skyrat/slaver_syndie.dmm +++ b/_maps/shuttles/skyrat/slaver_syndie.dmm @@ -571,7 +571,7 @@ /obj/item/holosign_creator/atmos, /obj/item/stack/cable_coil, /obj/item/analyzer, -/obj/item/storage/bag/material, +/obj/item/storage/pouch/material, /obj/item/construction/rcd/loaded/upgraded, /obj/item/stack/sheet/plasteel/fifty, /obj/item/stack/sheet/glass/fifty, diff --git a/_maps/shuttles/whiteship_birdshot.dmm b/_maps/shuttles/whiteship_birdshot.dmm index cdc9011daa7..65c3fbc5502 100644 --- a/_maps/shuttles/whiteship_birdshot.dmm +++ b/_maps/shuttles/whiteship_birdshot.dmm @@ -812,9 +812,6 @@ /turf/open/floor/iron/small, /area/shuttle/abandoned/cargo) "Bs" = ( -/obj/machinery/computer/shuttle/white_ship/bridge{ - dir = 8 - }, /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/broken/directional/south, /obj/machinery/button/door/directional/south{ @@ -827,6 +824,7 @@ name = "Bridge Blast Door Control"; pixel_x = 6 }, +/obj/structure/table/greyscale, /turf/open/floor/iron/dark/small, /area/shuttle/abandoned/bridge) "Bt" = ( @@ -948,10 +946,10 @@ /turf/open/floor/catwalk_floor, /area/shuttle/abandoned/crew) "FK" = ( -/obj/machinery/computer/shuttle/white_ship/pod/recall{ +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/shuttle/white_ship/bridge{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/small, /area/shuttle/abandoned/bridge) "FL" = ( @@ -1393,14 +1391,11 @@ /turf/open/floor/iron/smooth_large, /area/shuttle/abandoned/cargo) "Uu" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, +/obj/structure/chair/comfy/shuttle, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/small, /area/shuttle/abandoned/bridge) "UK" = ( -/obj/structure/table/greyscale, /obj/effect/decal/cleanable/dirt, /obj/machinery/turretid{ icon_state = "control_kill"; diff --git a/_maps/shuttles/whiteship_delta.dmm b/_maps/shuttles/whiteship_delta.dmm index c70ba5f117f..c64f0236fa9 100644 --- a/_maps/shuttles/whiteship_delta.dmm +++ b/_maps/shuttles/whiteship_delta.dmm @@ -455,7 +455,7 @@ dir = 8 }, /obj/effect/decal/cleanable/blood/old, -/mob/living/basic/giant_spider/hunter/scrawny, +/mob/living/basic/spider/giant/hunter/scrawny, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/shuttle/abandoned/bar) @@ -944,7 +944,7 @@ dir = 8 }, /obj/structure/cable, -/mob/living/basic/giant_spider/tarantula/scrawny, +/mob/living/basic/spider/giant/tarantula/scrawny, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) "cg" = ( @@ -1504,7 +1504,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/mob/living/basic/giant_spider/nurse/scrawny, +/mob/living/basic/spider/giant/nurse/scrawny, /turf/open/floor/iron, /area/shuttle/abandoned/cargo) "dx" = ( @@ -1576,7 +1576,7 @@ "dG" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/mob/living/basic/giant_spider/hunter/scrawny, +/mob/living/basic/spider/giant/hunter/scrawny, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) "dH" = ( diff --git a/_maps/shuttles/whiteship_meta.dmm b/_maps/shuttles/whiteship_meta.dmm index 65900f2dafb..4d907da6697 100644 --- a/_maps/shuttles/whiteship_meta.dmm +++ b/_maps/shuttles/whiteship_meta.dmm @@ -664,6 +664,10 @@ pixel_x = 14 }, /obj/structure/cable, +/obj/item/megaphone{ + pixel_x = -2; + pixel_y = -4 + }, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) "cf" = ( @@ -686,12 +690,12 @@ /area/shuttle/abandoned/bridge) "cg" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/shuttle/white_ship/pod/recall{ - dir = 8 - }, /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ dir = 1 }, +/obj/machinery/computer/shuttle/white_ship/bridge{ + dir = 8 + }, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) "ch" = ( @@ -768,13 +772,16 @@ /turf/open/floor/iron, /area/shuttle/abandoned/bar) "cv" = ( -/obj/machinery/computer/shuttle/white_ship/bridge{ - dir = 8 - }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 8 }, +/obj/structure/table, +/obj/item/folder/blue{ + pixel_x = 6; + pixel_y = 9 + }, +/obj/machinery/recharger, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) "cx" = ( @@ -828,28 +835,19 @@ /obj/structure/table, /obj/machinery/light/small/built/directional/west, /obj/effect/decal/cleanable/dirt, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, /obj/item/radio/off{ pixel_x = 6; pixel_y = 7 }, -/obj/item/megaphone{ - pixel_x = -2; - pixel_y = -4 - }, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) "cE" = ( -/obj/structure/table, /obj/machinery/firealarm/directional/south, /obj/effect/decal/cleanable/dirt, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/item/storage/toolbox/emergency{ - pixel_x = -12 - }, -/obj/item/wrench{ - pixel_x = -12 - }, +/obj/item/wrench, +/obj/item/storage/toolbox/emergency, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) "cF" = ( @@ -1652,15 +1650,9 @@ /turf/open/floor/iron/dark, /area/shuttle/abandoned/cargo) "wE" = ( -/obj/structure/table, /obj/machinery/airalarm/directional/north, /obj/effect/mapping_helpers/airalarm/all_access, /obj/effect/decal/cleanable/dirt, -/obj/item/folder/blue{ - pixel_x = 6; - pixel_y = 9 - }, -/obj/machinery/recharger, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) "xK" = ( diff --git a/_maps/shuttles/whiteship_pubby.dmm b/_maps/shuttles/whiteship_pubby.dmm index 9b806f969e3..50dd7802f2f 100644 --- a/_maps/shuttles/whiteship_pubby.dmm +++ b/_maps/shuttles/whiteship_pubby.dmm @@ -802,15 +802,6 @@ /obj/effect/mapping_helpers/airalarm/all_access, /turf/open/floor/plating, /area/shuttle/abandoned) -"Ho" = ( -/obj/effect/turf_decal/bot_white, -/obj/machinery/modular_computer/preset/research{ - dir = 1 - }, -/obj/effect/turf_decal/siding/purple/end, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/diagonal, -/area/shuttle/abandoned) "Il" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/decal/cleanable/dirt, @@ -884,6 +875,15 @@ }, /turf/closed/wall/mineral/titanium, /area/shuttle/abandoned) +"Ky" = ( +/obj/effect/turf_decal/bot_white, +/obj/machinery/modular_computer/preset/research{ + dir = 1 + }, +/obj/effect/turf_decal/siding/purple/end, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white/diagonal, +/area/shuttle/abandoned) "Lf" = ( /obj/machinery/computer/shuttle/white_ship/bridge, /obj/effect/decal/cleanable/dirt, @@ -1444,7 +1444,7 @@ re Zp MM pk -Ho +Ky Sc Rr vJ diff --git a/_maps/skyrat/lazy_templates/reebe.dmm b/_maps/skyrat/lazy_templates/reebe.dmm index 2a14276560a..d918d65d743 100644 --- a/_maps/skyrat/lazy_templates/reebe.dmm +++ b/_maps/skyrat/lazy_templates/reebe.dmm @@ -217,15 +217,15 @@ "vA" = ( /obj/structure/table/bronze, /obj/item/gun/ballistic/rifle/lionhunter/clockwork, -/obj/item/ammo_box/a762/lionhunter/clock{ +/obj/item/ammo_box/strilka310/lionhunter/clock{ pixel_x = 12; pixel_y = 9 }, -/obj/item/ammo_box/a762/lionhunter/clock{ +/obj/item/ammo_box/strilka310/lionhunter/clock{ pixel_x = -12; pixel_y = 9 }, -/obj/item/ammo_box/a762/lionhunter/clock{ +/obj/item/ammo_box/strilka310/lionhunter/clock{ pixel_y = 9 }, /turf/open/floor/bronze/flat, diff --git a/_maps/templates/battlecruiser_starfury.dmm b/_maps/templates/battlecruiser_starfury.dmm index 979b5f2b058..d3f72900fd4 100644 --- a/_maps/templates/battlecruiser_starfury.dmm +++ b/_maps/templates/battlecruiser_starfury.dmm @@ -1028,7 +1028,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/glass_large, +/obj/machinery/door/airlock/multi_tile/public/glass, /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/pod/light, /area/shuttle/sbc_starfury) @@ -1590,14 +1590,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor/heavy, /obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/machinery/door/airlock/glass_large, +/obj/machinery/door/airlock/multi_tile/public/glass, /turf/open/floor/pod/light, /area/shuttle/sbc_starfury) "fF" = ( /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /obj/machinery/door/firedoor/heavy, /obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/machinery/door/airlock/glass_large, +/obj/machinery/door/airlock/multi_tile/public/glass, /turf/open/floor/pod/light, /area/shuttle/sbc_starfury) "fG" = ( @@ -4457,7 +4457,7 @@ "AJ" = ( /obj/machinery/door/firedoor/heavy, /obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/machinery/door/airlock/glass_large, +/obj/machinery/door/airlock/multi_tile/public/glass, /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/pod/light, /area/shuttle/sbc_starfury) diff --git a/_maps/templates/lazy_templates/nukie_base.dmm b/_maps/templates/lazy_templates/nukie_base.dmm index c2ace1e7441..9815d45806b 100644 --- a/_maps/templates/lazy_templates/nukie_base.dmm +++ b/_maps/templates/lazy_templates/nukie_base.dmm @@ -647,7 +647,7 @@ dir = 1 }, /obj/effect/turf_decal/siding/wideplating, -/obj/machinery/door/airlock/glass_large{ +/obj/machinery/door/airlock/multi_tile/public/glass{ name = "Disembarkents" }, /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm index fc3308a0bde..92c4126129c 100644 --- a/code/__DEFINES/access.dm +++ b/code/__DEFINES/access.dm @@ -292,6 +292,7 @@ ACCESS_ENGINE_EQUIP, \ ACCESS_ENGINEERING, \ ACCESS_EXTERNAL_AIRLOCKS, \ + ACCESS_GATEWAY, \ ACCESS_GENETICS, \ ACCESS_HYDROPONICS, \ ACCESS_JANITOR, \ @@ -340,7 +341,6 @@ ACCESS_CHANGE_IDS, \ ACCESS_COMMAND, \ ACCESS_EVA, \ - ACCESS_GATEWAY, \ ACCESS_KEYCARD_AUTH, \ ACCESS_MINISAT, \ ACCESS_RC_ANNOUNCE, \ @@ -395,7 +395,9 @@ ACCESS_AWAY_GENERIC4, \ ACCESS_AWAY_MAINTENANCE, \ ACCESS_AWAY_MEDICAL, \ + ACCESS_AWAY_SCIENCE, \ ACCESS_AWAY_SEC, \ + ACCESS_AWAY_SUPPLY, \ ) /// Weird internal Cult access that prevents non-cult from using their doors. Do not use direct, access via SSid_access.get_flag_access_list(ACCESS_FLAG_SPECIAL) diff --git a/code/__DEFINES/achievements.dm b/code/__DEFINES/achievements.dm index 091383196a2..45390b5ff3c 100644 --- a/code/__DEFINES/achievements.dm +++ b/code/__DEFINES/achievements.dm @@ -54,6 +54,7 @@ #define MEDAL_EARTHQUAKE_VICTIM "Earthquake Victim" #define MEDAL_DEBT_EXTINGUISHED "Debt Extinguished" #define MEDAL_ARCHMAGE "Archmage" +#define MEDAL_THEORETICAL_LIMITS "All Within Theoretical Limits" //Skill medal hub IDs #define MEDAL_LEGENDARY_MINER "Legendary Miner" diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index 8bd2ff76311..00ffee31d26 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -76,6 +76,8 @@ #define ADMIN_SHOW_PAPER(atom) "(SHOW)" /// Displays "(PLAY)" in the chat, when clicked it tries to play internet sounds from the request. #define ADMIN_PLAY_INTERNET(text, credit) "(PLAY)" +/// Displays "(SEE Z-LEVEL LAYOUT)" in the chat, when clicked it shows the z-level layouts for the current world state. +#define ADMIN_SEE_ZLEVEL_LAYOUT "(SEE Z-LEVEL LAYOUT)" /atom/proc/Admin_Coordinates_Readable(area_name, admin_jump_ref) var/turf/T = Safe_COORD_Location() diff --git a/code/__DEFINES/ai/ai.dm b/code/__DEFINES/ai/ai.dm index 3cf1d721891..1a6829946a1 100644 --- a/code/__DEFINES/ai/ai.dm +++ b/code/__DEFINES/ai/ai.dm @@ -22,10 +22,8 @@ #define AI_BEHAVIOR_MOVE_AND_PERFORM (1<<2) ///Does finishing this task not null the current movement target? #define AI_BEHAVIOR_KEEP_MOVE_TARGET_ON_FINISH (1<<3) -///Does finishing this task make the AI stop moving towards the target? -#define AI_BEHAVIOR_KEEP_MOVING_TOWARDS_TARGET_ON_FINISH (1<<4) ///Does this behavior NOT block planning? -#define AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION (1<<5) +#define AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION (1<<4) ///AI flags /// Don't move if being pulled diff --git a/code/__DEFINES/ai/ai_blackboard.dm b/code/__DEFINES/ai/ai_blackboard.dm index ee7807f146d..289f7586222 100644 --- a/code/__DEFINES/ai/ai_blackboard.dm +++ b/code/__DEFINES/ai/ai_blackboard.dm @@ -34,6 +34,9 @@ ///Blackboard key for a whitelist typecache of "things we can target while trying to move" #define BB_OBSTACLE_TARGETTING_WHITELIST "BB_targetting_whitelist" +/// Blackboard key storing how long your targetting datum has held a particular target +#define BB_BASIC_MOB_HAS_TARGET_TIME "BB_basic_mob_has_target_time" + ///Targetting keys for something to run away from, if you need to store this separately from current target #define BB_BASIC_MOB_FLEE_TARGET "BB_basic_flee_target" #define BB_BASIC_MOB_FLEE_TARGET_HIDING_LOCATION "BB_basic_flee_target_hiding_location" diff --git a/code/__DEFINES/ai/monsters.dm b/code/__DEFINES/ai/monsters.dm index 128573c8b01..4915ff9cbc8 100644 --- a/code/__DEFINES/ai/monsters.dm +++ b/code/__DEFINES/ai/monsters.dm @@ -59,8 +59,63 @@ /// We increment this counter every time we try to move while dragging an arm and if we go too long we'll give up trying to get out of line of sight and just eat the fingers #define BB_LOBSTROSITY_FINGER_LUST "BB_lobstrosity_finger_lust" -///hivebot keys +/// Key containing overwatch ability information +#define BB_WATCHER_OVERWATCH "BB_watcher_overwatch" +/// Key containing gazae ability information +#define BB_WATCHER_GAZE "BB_watcher_gaze" + +// eyeball keys +///the death glare ability +#define BB_GLARE_ABILITY "BB_glare_ability" +///the blind target we must protect +#define BB_BLIND_TARGET "BB_blind_target" +///value to store the minimum eye damage to prevent us from attacking a human +#define BB_EYE_DAMAGE_THRESHOLD "BB_eye_damage_threshold" + +// hivebot keys ///the machine we must go to repair #define BB_MACHINE_TARGET "BB_machine_target" ///the hivebot partner we will go communicate with #define BB_HIVE_PARTNER "BB_hive_partner" + +// Ice Whelps +///whelp's straight line fire ability +#define BB_WHELP_STRAIGHTLINE_FIRE "BB_whelp_straightline_fire" +///whelp's secondary enraged ability +#define BB_WHELP_WIDESPREAD_FIRE "BB_whelp_widespread_fire" +///how enraged the whelp is +#define BB_WHELP_ENRAGED "BB_whelp_enraged" +///the target rock we will attempt to create a sculpture out of +#define BB_TARGET_ROCK "BB_target_rock" +///the cannibal target we shall consume +#define BB_TARGET_CANNIBAL "BB_target_cannibal" +///the tree we will burn down +#define BB_TARGET_TREE "BB_target_tree" + +// Regal Rats +/// The rat's ability to corrupt an area. +#define BB_DOMAIN_ABILITY "BB_domain_ability" +/// The rat's ability to raise a horde of soldiers. +#define BB_RAISE_HORDE_ABILITY "BB_raise_horde_ability" + +// mega arachnid keys +/// ability to throw restrain projectiles +#define BB_ARACHNID_RESTRAIN "BB_arachnid_restrain" +/// the found surveillance item we must destroy +#define BB_SURVEILLANCE_TARGET "BB_surveillance_target" +/// our acid slip ability +#define BB_ARACHNID_SLIP "BB_arachnid_slip" + +// goldgrub keys +/// key that tells if a storm is coming +#define BB_STORM_APPROACHING "BB_storm_approaching" +/// key that tells the wall we will mine +#define BB_TARGET_MINERAL_WALL "BB_target_mineral_wall" +/// key that holds our spit ability +#define BB_SPIT_ABILITY "BB_spit_ability" +/// key that holds our dig ability +#define BB_BURROW_ABILITY "BB_burrow_ability" +/// key that holds the ore we will eat +#define BB_ORE_TARGET "BB_ore_target" +/// which ore types we will not eat +#define BB_ORE_IGNORE_TYPES "BB_ore_ignore_types" diff --git a/code/__DEFINES/aquarium.dm b/code/__DEFINES/aquarium.dm index 263f86db3e6..6e0a39f5040 100644 --- a/code/__DEFINES/aquarium.dm +++ b/code/__DEFINES/aquarium.dm @@ -32,6 +32,7 @@ #define FISH_RARITY_RARE 400 #define FISH_RARITY_VERY_RARE 200 #define FISH_RARITY_GOOD_LUCK_FINDING_THIS 1 +#define FISH_RARITY_NOPE 0 #define AQUARIUM_FLUID_FRESHWATER "Freshwater" #define AQUARIUM_FLUID_SALTWATER "Saltwater" diff --git a/code/__DEFINES/basic_mobs.dm b/code/__DEFINES/basic_mobs.dm index 06a5c4443f9..5a4aebaee23 100644 --- a/code/__DEFINES/basic_mobs.dm +++ b/code/__DEFINES/basic_mobs.dm @@ -16,3 +16,6 @@ /// Temporary trait applied when an attack forecast animation has completed #define TRAIT_BASIC_ATTACK_FORECAST "trait_basic_attack_forecast" #define INTERACTION_BASIC_ATTACK_FORCEAST "interaction_basic_attack_forecast" + +/// Above this speed we stop gliding because it looks silly +#define END_GLIDE_SPEED 10 diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index 06752686102..25bd59bc8b5 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -326,6 +326,29 @@ #define COLOR_CARP_DARK_BLUE "#3a384d" #define COLOR_CARP_DARK_GREEN "#358102" +#define COLOR_SLIME_ADAMANTINE "#135f49" +#define COLOR_SLIME_BLACK "#3b3b3b" +#define COLOR_SLIME_BLUE "#19ffff" +#define COLOR_SLIME_BLUESPACE "#ebebeb" +#define COLOR_SLIME_CERULEAN "#5783aa" +#define COLOR_SLIME_DARK_BLUE "#2e9dff" +#define COLOR_SLIME_DARK_PURPLE "#9948f7" +#define COLOR_SLIME_GOLD "#c38b07" +#define COLOR_SLIME_GREEN "#07f024" +#define COLOR_SLIME_GREY "#c2c2c2" +#define COLOR_SLIME_LIGHT_PINK "#ffe1fa" +#define COLOR_SLIME_METAL "#676767" +#define COLOR_SLIME_OIL "#242424" +#define COLOR_SLIME_ORANGE "#ffb445" +#define COLOR_SLIME_PINK "#fe5bbd" +#define COLOR_SLIME_PURPLE "#d138ff" +#define COLOR_SLIME_PYRITE "#ffc427" +#define COLOR_SLIME_RAINBOW COLOR_SLIME_GREY // only for consistency +#define COLOR_SLIME_RED "#fb4848" +#define COLOR_SLIME_SEPIA "#9b8a7a" +#define COLOR_SLIME_SILVER "#dadada" +#define COLOR_SLIME_YELLOW "#fff419" + #define COLOR_GNOME_RED_ONE "#f10b0b" #define COLOR_GNOME_RED_TWO "#bc5347" #define COLOR_GNOME_RED_THREE "#b40f1a" diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm index c31775afb24..4e37baadffb 100644 --- a/code/__DEFINES/construction.dm +++ b/code/__DEFINES/construction.dm @@ -98,6 +98,7 @@ #define CAT_LIZARD "Lizard Food" #define CAT_MEAT "Meats" #define CAT_SEAFOOD "Seafood" +#define CAT_MARTIAN "Martian Food" #define CAT_MISCFOOD "Misc. Food" #define CAT_MEXICAN "Mexican Food" #define CAT_MOTH "Mothic Food" @@ -120,6 +121,7 @@ GLOBAL_LIST_INIT(crafting_category_food, list( CAT_LIZARD, CAT_MEAT, CAT_SEAFOOD, + CAT_MARTIAN, CAT_MISCFOOD, CAT_MEXICAN, CAT_MOTH, @@ -195,6 +197,8 @@ GLOBAL_LIST_INIT(crafting_category, list( #define RCD_UPGRADE_SIMPLE_CIRCUITS (1<<1) #define RCD_UPGRADE_SILO_LINK (1<<2) #define RCD_UPGRADE_FURNISHING (1<<3) +#define RCD_UPGRADE_ANTI_INTERRUPT (1<<4) +#define RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN (1<<5) #define RPD_UPGRADE_UNWRENCH (1<<0) @@ -212,6 +216,9 @@ GLOBAL_LIST_INIT(crafting_category, list( /// How much less resources the RCD uses when reconstructing #define RCD_MEMORY_COST_BUFF 8 +/// If set to TRUE in rcd_vals, will bypass the cooldown on slowing down frequent use +#define RCD_RESULT_BYPASS_FREQUENT_USE_COOLDOWN "bypass_frequent_use_cooldown" + // Defines for the construction component #define FORWARD 1 #define BACKWARD -1 diff --git a/code/__DEFINES/cooldowns.dm b/code/__DEFINES/cooldowns.dm index 8aa3b5e38d9..f486e6a943b 100644 --- a/code/__DEFINES/cooldowns.dm +++ b/code/__DEFINES/cooldowns.dm @@ -37,6 +37,7 @@ #define COOLDOWN_MECHA_SMOKE "mecha_smoke" #define COOLDOWN_MECHA_SKYFALL "mecha_skyfall" #define COOLDOWN_MECHA_MISSILE_STRIKE "mecha_missile_strike" +#define COOLDOWN_MECHA_CABIN_SEAL "mecha_cabin_seal" //car cooldowns #define COOLDOWN_CAR_HONK "car_honk" diff --git a/code/__DEFINES/dcs/signals/signals_action.dm b/code/__DEFINES/dcs/signals/signals_action.dm index f928975813c..27206e483c5 100644 --- a/code/__DEFINES/dcs/signals/signals_action.dm +++ b/code/__DEFINES/dcs/signals/signals_action.dm @@ -42,3 +42,6 @@ ///From /datum/action/vehicle/sealed/mecha/mech_toggle_safeties/proc/update_action_icon(): () #define COMSIG_MECH_SAFETIES_TOGGLE "mech_safeties_toggle" + +/// From /datum/action/cooldown/mob_cooldown/assume_form/proc/assume_appearances(), sent to the action owner: (atom/movable/target) +#define COMSIG_ACTION_DISGUISED_APPEARANCE "mob_ability_disguise_appearance" diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm index d0a7004b561..d47833f84c0 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm @@ -62,3 +62,5 @@ #define ATTACKER_STAMINA_ATTACK (1<<0) ///the attacker is shoving the source #define ATTACKER_SHOVING (1<<1) + /// The attack is a damaging-type attack + #define ATTACKER_DAMAGING_ATTACK (1<<2) diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm index 242385fa3e3..dc0293fb274 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm @@ -67,8 +67,6 @@ #define COMSIG_ATOM_ABSTRACT_EXITED "atom_abstract_exited" ///from base of atom/Bumped(): (/atom/movable) #define COMSIG_ATOM_BUMPED "atom_bumped" -///from base of atom/handle_atom_del(): (atom/deleted) -#define COMSIG_ATOM_CONTENTS_DEL "atom_contents_del" ///from base of atom/has_gravity(): (turf/location, list/forced_gravities) #define COMSIG_ATOM_HAS_GRAVITY "atom_has_gravity" ///from internal loop in atom/movable/proc/CanReach(): (list/next) diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm index 2f8ebc83665..2312c42baa4 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm @@ -8,7 +8,7 @@ #define COMSIG_CLICK "atom_click" ///from base of atom/ShiftClick(): (/mob) #define COMSIG_CLICK_SHIFT "shift_click" - #define COMPONENT_ALLOW_EXAMINATE (1<<0) //Allows the user to examinate regardless of client.eye. + #define COMPONENT_ALLOW_EXAMINATE (1<<0) //! Allows the user to examinate regardless of client.eye. ///from base of atom/CtrlClickOn(): (/mob) #define COMSIG_CLICK_CTRL "ctrl_click" ///from base of atom/AltClick(): (/mob) diff --git a/code/__DEFINES/dcs/signals/signals_camera.dm b/code/__DEFINES/dcs/signals/signals_camera.dm new file mode 100644 index 00000000000..6ec142f54fa --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_camera.dm @@ -0,0 +1,2 @@ +///Signal sent when a /datum/trackable found a target: (datum/trackable/source, mob/living/target) +#define COMSIG_TRACKABLE_TRACKING_TARGET "comsig_trackable_tracking_target" diff --git a/code/__DEFINES/dcs/signals/signals_fish.dm b/code/__DEFINES/dcs/signals/signals_fish.dm index 7da86f90acc..281c73adb52 100644 --- a/code/__DEFINES/dcs/signals/signals_fish.dm +++ b/code/__DEFINES/dcs/signals/signals_fish.dm @@ -29,6 +29,3 @@ /// Sent when the challenge is to be interrupted: (reason) #define COMSIG_FISHING_SOURCE_INTERRUPT_CHALLENGE "fishing_spot_interrupt_challenge" - -/// Sent to the reward after it's been generated by fishing: (fishing_spot) -#define COMSIG_ATOM_FISHING_REWARD "atom_fishing_reward" diff --git a/code/__DEFINES/dcs/signals/signals_global.dm b/code/__DEFINES/dcs/signals/signals_global.dm index 4be04166d47..9b6960e2730 100644 --- a/code/__DEFINES/dcs/signals/signals_global.dm +++ b/code/__DEFINES/dcs/signals/signals_global.dm @@ -74,6 +74,9 @@ /// global signal sent when a nuclear device is disarmed (/obj/machinery/nuclearbomb/nuke/disarmed_nuke) #define COMSIG_GLOB_NUKE_DEVICE_DISARMED "!nuclear_device_disarmed" +/// global signal sent when a nuclear device is detonating (/obj/machinery/nuclearbomb/nuke/exploding_nuke) +#define COMSIG_GLOB_NUKE_DEVICE_DETONATING "!nuclear_device_detonating" + /// Global signal sent when a light mechanism is completed (try_id) #define COMSIG_GLOB_LIGHT_MECHANISM_COMPLETED "!light_mechanism_completed" diff --git a/code/__DEFINES/dcs/signals/signals_material_container.dm b/code/__DEFINES/dcs/signals/signals_material_container.dm index 3f9ab395175..f33567a2739 100644 --- a/code/__DEFINES/dcs/signals/signals_material_container.dm +++ b/code/__DEFINES/dcs/signals/signals_material_container.dm @@ -5,7 +5,7 @@ /// Called from datum/component/material_container/proc/user_insert() : (held_item, user) #define COMSIG_MATCONTAINER_PRE_USER_INSERT "matcontainer_pre_user_insert" #define MATCONTAINER_BLOCK_INSERT (1<<1) -/// Called from datum/component/material_container/proc/insert_item() : (target, last_inserted_id, material_amount, container) +/// Called from datum/component/material_container/proc/insert_item() : (target, last_inserted_id, mats_consumed, material_amount, context) #define COMSIG_MATCONTAINER_ITEM_CONSUMED "matcontainer_item_consumed" -/// Called from datum/component/material_container/proc/retrieve_sheets() : (sheets) -#define COMSIG_MATCONTAINER_SHEETS_RETRIVED "matcontainer_sheets_retrived" +/// Called from datum/component/material_container/proc/retrieve_sheets() : (sheets, context) +#define COMSIG_MATCONTAINER_SHEETS_RETRIEVED "matcontainer_sheets_retrieved" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_basic.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_basic.dm index 738f033656a..18c6c651435 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_basic.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_basic.dm @@ -2,3 +2,6 @@ #define COMSIG_BASICMOB_LOOK_DEAD "basicmob_look_dead" /// Sent from /mob/living/basic/proc/look_alive() : () #define COMSIG_BASICMOB_LOOK_ALIVE "basicmob_look_alive" + +///from the ranged_attacks component for basic mobs: (mob/living/basic/firer, atom/target, modifiers) +#define COMSIG_BASICMOB_POST_ATTACK_RANGED "basicmob_post_attack_ranged" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm index 2e305427f88..dd5b38113d3 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm @@ -108,6 +108,10 @@ #define COMSIG_CARBON_BLOCK_EAT (1 << 0) ///Called when a carbon vomits : (distance, force) #define COMSIG_CARBON_VOMITED "carbon_vomited" +///Called from apply_overlay(cache_index, overlay) +#define COMSIG_CARBON_APPLY_OVERLAY "carbon_apply_overlay" +///Called from remove_overlay(cache_index, overlay) +#define COMSIG_CARBON_REMOVE_OVERLAY "carbon_remove_overlay" // /mob/living/carbon/human signals diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm index 2c80f3f1985..bb7d2de4989 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -182,6 +182,12 @@ #define WAIVE_AUTOMUTE_CHECK (1<<0) ///From base of /turf/closed/mineral/proc/gets_drilled(): (turf/closed/mineral/rock, give_exp) #define COMSIG_MOB_MINED "mob_mined" +///Sent by pilot of mech in base of /obj/vehicle/sealed/mecha/relaymove(): (/obj/vehicle/sealed/mecha/mech) +#define COMSIG_MOB_DROVE_MECH "mob_drove_mech" +///Sent by pilot of mech in /obj/vehicle/sealed/mecha/on_mouseclick when using mech equipment : (/obj/vehicle/sealed/mecha/mech) +#define COMSIG_MOB_USED_MECH_EQUIPMENT "mob_used_mech_equipment" +///Sent by pilot of mech in /obj/vehicle/sealed/mecha/on_mouseclick when triggering mech punch : (/obj/vehicle/sealed/mecha/mech) +#define COMSIG_MOB_USED_MECH_MELEE "mob_used_mech_melee" ///from living/flash_act(), when a mob is successfully flashed. #define COMSIG_MOB_FLASHED "mob_flashed" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_simple.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_simple.dm index 9901ba66588..65d96ea8c4c 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_simple.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_simple.dm @@ -10,8 +10,9 @@ #define COMPONENT_HOSTILE_NO_ATTACK (1<<0) //cancel the attack, only works before attack happens ///after attackingtarget has happened, source is the attacker and target is the attacked, extra argument for if the attackingtarget was successful #define COMSIG_HOSTILE_POST_ATTACKINGTARGET "hostile_post_attackingtarget" -///from base of mob/living/simple_animal/hostile/regalrat: (mob/living/simple_animal/hostile/regalrat/king) +///from base of mob/living/basic/regal_rat: (mob/living/basic/regal_rat/king) #define COMSIG_RAT_INTERACT "rat_interaction" + #define COMPONENT_RAT_INTERACTED (1<<0) //! If this is returned, cancel any further interactions. ///FROM mob/living/simple_animal/hostile/ooze/eat_atom(): (atom/target, edible_flags) #define COMSIG_OOZE_EAT_ATOM "ooze_eat_atom" #define COMPONENT_ATOM_EATEN (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index eff3b3b7f0c..cc17e337791 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -379,8 +379,10 @@ ///sent to targets during the process_hit proc of projectiles #define COMSIG_FIRE_CASING "fire_casing" -///sent to the projectile after an item is spawned by the projectile_drop element: (new_casing) +///sent to the projectile after an item is spawned by the projectile_drop element: (new_item) #define COMSIG_PROJECTILE_ON_SPAWN_DROP "projectile_on_spawn_drop" +///sent to the projectile when spawning the item (shrapnel) that may be embedded: (new_item) +#define COMSIG_PROJECTILE_ON_SPAWN_EMBEDDED "projectile_on_spawn_embedded" // /obj/vehicle/sealed/car/vim signals @@ -460,3 +462,15 @@ /// from /obj/plunger_act when an object is being plungered #define COMSIG_PLUNGER_ACT "plunger_act" + +/// from /obj/structure/cursed_slot_machine/handle_status_effect() when someone pulls the handle on the slot machine +#define COMSIG_CURSED_SLOT_MACHINE_USE "cursed_slot_machine_use" + #define SLOT_MACHINE_USE_CANCEL (1<<0) //! we've used up the number of times we may use this slot machine. womp womp. + #define SLOT_MACHINE_USE_POSTPONE (1<<1) //! we haven't used up all our attempts to gamble away our life but we should chill for a few seconds + +/// from /obj/structure/cursed_slot_machine/determine_victor() when someone loses. +#define COMSIG_CURSED_SLOT_MACHINE_LOST "cursed_slot_machine_lost" + +/// from /obj/structure/cursed_slot_machine/determine_victor() when someone finally wins. +#define COMSIG_GLOB_CURSED_SLOT_MACHINE_WON "cursed_slot_machine_won" + diff --git a/code/__DEFINES/fishing.dm b/code/__DEFINES/fishing.dm index 0fd2b13749e..2481f0ae3e7 100644 --- a/code/__DEFINES/fishing.dm +++ b/code/__DEFINES/fishing.dm @@ -8,6 +8,8 @@ #define FAV_BAIT_DIFFICULTY_MOD -5 /// Difficulty modifier when bait is fish's disliked #define DISLIKED_BAIT_DIFFICULTY_MOD 15 +/// Difficulty modifier when our fisherman has the trait TRAIT_SETTLER +#define SETTLER_DIFFICULTY_MOD -5 #define FISH_TRAIT_MINOR_DIFFICULTY_BOOST 5 @@ -49,12 +51,6 @@ /// Much like FISHING_HOOK_ENSNARE but for the reel. #define FISHING_LINE_BOUNCY (1 << 2) -#define FISHING_SPOT_PRESET_BEACH "beach" -#define FISHING_SPOT_PRESET_LAVALAND_LAVA "lavaland lava" -#define FISHING_SPOT_PRESET_ICEMOON_PLASMA "icemoon plasma" -#define FISHING_SPOT_PRESET_CHASM "chasm" -#define FISHING_SPOT_PRESET_TOILET "toilet" - #define FISHING_MINIGAME_RULE_HEAVY_FISH "heavy" #define FISHING_MINIGAME_RULE_LUBED_FISH "lubed" #define FISHING_MINIGAME_RULE_WEIGHTED_BAIT "weighted" diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index bb49452d250..f509b740d26 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -155,6 +155,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define PASSDOORS (1<<10) #define PASSVEHICLE (1<<11) #define PASSITEM (1<<12) +/// Do not intercept click attempts during Adjacent() checks. See [turf/proc/ClickCross]. **ONLY MEANINGFUL ON pass_flags_self!** +#define LETPASSCLICKS (1<<13) //Movement Types #define GROUND (1<<0) diff --git a/code/__DEFINES/food.dm b/code/__DEFINES/food.dm index 0ca53bb2274..7c6a10644ad 100644 --- a/code/__DEFINES/food.dm +++ b/code/__DEFINES/food.dm @@ -186,6 +186,7 @@ DEFINE_BITFIELD(food_flags, list( #define ICE_CREAM_KORTA_VANILLA "korta vanilla" #define ICE_CREAM_MOB "mob" #define ICE_CREAM_CUSTOM "custom" +#define ICE_CREAM_KORTA_CUSTOM "korta custom" #define ICE_CREAM_BLAND "bland" #define DEFAULT_MAX_ICE_CREAM_SCOOPS 3 diff --git a/code/__DEFINES/industrial_lift.dm b/code/__DEFINES/industrial_lift.dm index a5b8a9f756b..5ab2406229d 100644 --- a/code/__DEFINES/industrial_lift.dm +++ b/code/__DEFINES/industrial_lift.dm @@ -12,6 +12,9 @@ ///debug lift_id #define DEBUG_LIFT_ID "debug" +///used for navigation aids that aren't actual platforms +#define TRAM_NAV_BEACONS "tram_nav" +#define IMMOVABLE_ROD_DESTINATIONS "immovable_rod" //specific_lift_id's ///the specific_lift_id of the main station tram landmark for tramstation that spawns roundstart. diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index f7b703b5e1f..c76276c019d 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -206,6 +206,7 @@ GLOBAL_LIST_INIT(detective_vest_allowed, list( /obj/item/storage/belt/holster/detective, /obj/item/storage/belt/holster/nukie, /obj/item/storage/belt/holster/energy, + /obj/item/gun/ballistic/shotgun/automatic/combat/compact, /obj/item/gun/microfusion, //SKYRAT EDIT ADDITION )) @@ -224,6 +225,7 @@ GLOBAL_LIST_INIT(security_vest_allowed, list( /obj/item/storage/belt/holster/detective, /obj/item/storage/belt/holster/nukie, /obj/item/storage/belt/holster/energy, + /obj/item/gun/ballistic/shotgun/automatic/combat/compact, /obj/item/gun/microfusion, //SKYRAT EDIT ADDITION )) @@ -238,6 +240,7 @@ GLOBAL_LIST_INIT(security_wintercoat_allowed, list( /obj/item/storage/belt/holster/detective, /obj/item/storage/belt/holster/nukie, /obj/item/storage/belt/holster/energy, + /obj/item/gun/ballistic/shotgun/automatic/combat/compact, /obj/item/gun/microfusion, //SKYRAT EDIT ADDITION )) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 9b62b3004ae..84c475779cd 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -159,7 +159,7 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( #define ishostile(A) (istype(A, /mob/living/simple_animal/hostile)) -#define isregalrat(A) (istype(A, /mob/living/simple_animal/hostile/regalrat)) +#define isregalrat(A) (istype(A, /mob/living/basic/regal_rat)) #define isguardian(A) (istype(A, /mob/living/simple_animal/hostile/guardian)) @@ -169,7 +169,7 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( #define isclown(A) (istype(A, /mob/living/simple_animal/hostile/retaliate/clown)) -#define isspider(A) (istype(A, /mob/living/basic/giant_spider)) +#define isspider(A) (istype(A, /mob/living/basic/spider/giant)) //Misc mobs @@ -212,6 +212,8 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( #define ismachinery(A) (istype(A, /obj/machinery)) +#define istramwall(A) (istype(A, /obj/structure/window/reinforced/tram/front)) + #define isvendor(A) (istype(A, /obj/machinery/vending)) #define isvehicle(A) (istype(A, /obj/vehicle)) @@ -238,6 +240,8 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( #define isgun(A) (istype(A, /obj/item/gun)) +#define isammobox(A) (istype(A, /obj/item/ammo_box)) + #define isinstrument(A) (istype(A, /obj/item/instrument) || istype(A, /obj/structure/musician)) #define is_reagent_container(O) (istype(O, /obj/item/reagent_containers)) diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index a7afaff4df8..ca09aeb402c 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -150,9 +150,6 @@ Always compile, always use that verb, and always make sure that it works for wha // must correspond to _basemap.dm for things to work correctly #define DEFAULT_MAP_TRAITS list(\ DECLARE_LEVEL("CentCom", ZTRAITS_CENTCOM),\ - /* SKYRAT EDIT ADDITION BEGIN - MODULAR_MAPS */\ - DECLARE_LEVEL("Offstation_skyrat", ZTRAITS_CENTCOM),\ - /* SKYRAT EDIT ADDITION END - MODULAR_MAPS */\ ) // Camera lock flags diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index cbcea4e5374..c40f3c4f59c 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -228,7 +228,7 @@ #define EXP_DISTRIBUTION(desired_mean) ( -(1/(1/desired_mean)) * log(rand(1, 1000) * 0.001) ) #define LORENTZ_DISTRIBUTION(x, s) ( s*tan(TODEGREES(PI*(rand()-0.5))) + x ) -#define LORENTZ_CUMULATIVE_DISTRIBUTION(x, y, s) ( (1/PI)*TORADIANS(arctan((x-y)/s)) + 1/2 ) +#define LORENTZ_CUMULATIVE_DISTRIBUTION(x, y, s) ( (1/PI)*TORADIANS(arctan((x-(y))/s)) + 1/2 ) #define RULE_OF_THREE(a, b, x) ((a*x)/b) diff --git a/code/__DEFINES/mecha.dm b/code/__DEFINES/mecha.dm index 7b1e8e02527..db65b0b6ee8 100644 --- a/code/__DEFINES/mecha.dm +++ b/code/__DEFINES/mecha.dm @@ -1,11 +1,11 @@ #define MECHA_INT_FIRE (1<<0) #define MECHA_INT_TEMP_CONTROL (1<<1) #define MECHA_INT_SHORT_CIRCUIT (1<<2) -#define MECHA_INT_TANK_BREACH (1<<3) +#define MECHA_CABIN_AIR_BREACH (1<<3) #define MECHA_INT_CONTROL_LOST (1<<4) -#define ADDING_ACCESS_POSSIBLE (1<<0) -#define ADDING_MAINT_ACCESS_POSSIBLE (1<<1) +#define PANEL_OPEN (1<<0) +#define ID_LOCK_ON (1<<1) #define CANSTRAFE (1<<2) #define LIGHTS_ON (1<<3) #define SILICON_PILOT (1<<4) @@ -34,11 +34,6 @@ #define MECHA_POWER "mecha_power" #define MECHA_ARMOR "mecha_armor" -#define MECHA_LOCKED 0 -#define MECHA_SECURE_BOLTS 1 -#define MECHA_LOOSE_BOLTS 2 -#define MECHA_OPEN_HATCH 3 - // Some mechs must (at least for now) use snowflake handling of their UI elements, these defines are for that // when changing MUST update the same-named tsx file constants #define MECHA_SNOWFLAKE_ID_SLEEPER "sleeper_snowflake" @@ -47,6 +42,10 @@ #define MECHA_SNOWFLAKE_ID_EXTINGUISHER "extinguisher_snowflake" #define MECHA_SNOWFLAKE_ID_EJECTOR "ejector_snowflake" #define MECHA_SNOWFLAKE_ID_OREBOX_MANAGER "orebox_manager_snowflake" +#define MECHA_SNOWFLAKE_ID_RADIO "radio_snowflake" +#define MECHA_SNOWFLAKE_ID_AIR_TANK "air_tank_snowflake" +#define MECHA_SNOWFLAKE_ID_WEAPON_BALLISTIC "ballistic_weapon_snowflake" +#define MECHA_SNOWFLAKE_ID_GENERATOR "generator_snowflake" #define MECHA_AMMO_INCENDIARY "Incendiary bullet" #define MECHA_AMMO_BUCKSHOT "Buckshot shell" @@ -55,3 +54,6 @@ #define MECHA_AMMO_MISSILE_PEP "PEP missile" #define MECHA_AMMO_FLASHBANG "Flashbang" #define MECHA_AMMO_CLUSTERBANG "Clusterbang" +#define MECHA_AMMO_PUNCHING_GLOVE "Punching glove" +#define MECHA_AMMO_BANANA_PEEL "Banana peel" +#define MECHA_AMMO_MOUSETRAP "Mousetrap" diff --git a/code/__DEFINES/melee.dm b/code/__DEFINES/melee.dm index b1b6e5cc359..6cc9f47fa18 100644 --- a/code/__DEFINES/melee.dm +++ b/code/__DEFINES/melee.dm @@ -11,4 +11,4 @@ #define MARTIALART_WRESTLING "wrestling" /// The number of hits required to crit a target -#define HITS_TO_CRIT(damage) round(100 / damage, 0.1) +#define HITS_TO_CRIT(damage) round(HUMAN_MAXHEALTH / damage, 0.1) // SKYRAT EDIT - changes the magic health number of 100 to HUMAN_MAXHEALTH. diff --git a/code/__DEFINES/mobfactions.dm b/code/__DEFINES/mobfactions.dm index 82146abc970..a7dcbee90e8 100644 --- a/code/__DEFINES/mobfactions.dm +++ b/code/__DEFINES/mobfactions.dm @@ -43,6 +43,8 @@ #define FACTION_MIMIC "mimic" /// Beasts found on the various mining environments #define FACTION_MINING "mining" +/// Watchers don't like any creatures other than each other +#define FACTION_WATCHER "watcher" /// Monkeys and gorillas #define FACTION_MONKEY "monkey" /// Mushrooms and mushroompeople diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index a4e567ce6a8..4f13e711fc3 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -6,7 +6,7 @@ #define PLAYER_NOT_READY 0 #define PLAYER_READY_TO_PLAY 1 -//movement intent defines for the m_intent var +//movement intent defines for the move_intent var #define MOVE_INTENT_WALK "walk" #define MOVE_INTENT_RUN "run" @@ -42,6 +42,7 @@ #define VENTCRAWLER_ALWAYS 2 //Mob bio-types flags +///The mob is organic, can can heal from medical sutures. #define MOB_ORGANIC (1 << 0) #define MOB_MINERAL (1 << 1) #define MOB_ROBOTIC (1 << 2) @@ -53,6 +54,7 @@ #define MOB_REPTILE (1 << 8) #define MOB_SPIRIT (1 << 9) #define MOB_PLANT (1 << 10) +#define MOB_SLIME (1 << 11) //Lung respiration type flags #define RESPIRATION_OXYGEN (1 << 0) @@ -496,20 +498,23 @@ #define HUMAN_CARRY_SLOWDOWN 0.35 //Flags that control what things can spawn species (whitelist) -//Badmin magic mirror -#define MIRROR_BADMIN (1<<0) +// These flags unlock the Lepton Violet shuttle, hardcoded in wabbajack() //Standard magic mirror (wizard) #define MIRROR_MAGIC (1<<1) //Pride ruin mirror #define MIRROR_PRIDE (1<<2) //Race swap wizard event #define RACE_SWAP (1<<3) -//ERT spawn template (avoid races that don't function without correct gear) -#define ERT_SPAWN (1<<4) -//xenobio black crossbreed -#define SLIME_EXTRACT (1<<5) //Wabbacjack staff projectiles -#define WABBAJACK (1<<6) +#define WABBAJACK (1<<4) + +// These flags do NOT unlock the Lepton Violet shuttle, hardcoded in wabbajack() - use for things like xenobio, admins, etc. +//Badmin magic mirror +#define MIRROR_BADMIN (1<<5) +//ERT spawn template (avoid races that don't function without correct gear) +#define ERT_SPAWN (1<<6) +//xenobio black crossbreed +#define SLIME_EXTRACT (1<<7) // Randomization keys for calling wabbajack with. // Note the contents of these keys are important, as they're displayed to the player diff --git a/code/__DEFINES/mod.dm b/code/__DEFINES/mod.dm index e98230a8f3b..e0b7d6ff4a3 100644 --- a/code/__DEFINES/mod.dm +++ b/code/__DEFINES/mod.dm @@ -43,5 +43,13 @@ #define MOD_ICON_OVERRIDE "mod_icon_override" #define MOD_WORN_ICON_OVERRIDE "mod_worn_icon_override" +//Defines for MODlink frequencies +#define MODLINK_FREQ_NANOTRASEN "NT" +#define MODLINK_FREQ_SYNDICATE "SYND" +#define MODLINK_FREQ_CHARLIE "CHRL" +#define MODLINK_FREQ_CENTCOM "CC" + /// Global list of all /datum/mod_theme GLOBAL_LIST_INIT(mod_themes, setup_mod_themes()) +/// Global list of all ids associated to a /datum/mod_link instance +GLOBAL_LIST_EMPTY(mod_link_ids) diff --git a/code/__DEFINES/pipe_construction.dm b/code/__DEFINES/pipe_construction.dm index 852870accf8..540cadabc47 100644 --- a/code/__DEFINES/pipe_construction.dm +++ b/code/__DEFINES/pipe_construction.dm @@ -6,6 +6,7 @@ #define PIPE_UNARY 4 //4 directions: N, S, E, W #define PIPE_ONEDIR 5 //1 direction: N/S/E/W #define PIPE_UNARY_FLIPPABLE 6 //8 directions: N/S/E/W/N-flipped/S-flipped/E-flipped/W-flipped +#define PIPE_ONEDIR_FLIPPABLE 7 //2 direction: N/S/E/W, N-flipped/S-flipped/E-flipped/W-flipped //Disposal pipe relative connection directions #define DISP_DIR_BASE 0 diff --git a/code/__DEFINES/projectiles.dm b/code/__DEFINES/projectiles.dm index e76b1cae4f6..eec9472c2bf 100644 --- a/code/__DEFINES/projectiles.dm +++ b/code/__DEFINES/projectiles.dm @@ -35,7 +35,7 @@ /// The caliber used by the the M-90gl Carbine, and NT-ARG 'Boarder'. #define CALIBER_A223 "a223" /// The caliber used by bolt action rifles. -#define CALIBER_A762 "a762" +#define CALIBER_STRILKA310 ".310_strilka" /// The caliber used by shotguns. #define CALIBER_SHOTGUN "shotgun" /// The caliber used by grenade launchers. diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm index f4967eb9ce3..686c42e07d0 100644 --- a/code/__DEFINES/radio.dm +++ b/code/__DEFINES/radio.dm @@ -86,6 +86,7 @@ #define FREQ_ELECTROPACK 1449 #define FREQ_MAGNETS 1449 #define FREQ_LOCATOR_IMPLANT 1451 +#define FREQ_RADIO_NAV_BEACON 1455 #define FREQ_SIGNALER 1457 // the default for new signalers #define FREQ_COMMON 1459 // Common comms frequency, dark green diff --git a/code/__DEFINES/research/slimes.dm b/code/__DEFINES/research/slimes.dm new file mode 100644 index 00000000000..64a85afc217 --- /dev/null +++ b/code/__DEFINES/research/slimes.dm @@ -0,0 +1,27 @@ +// Just slimin' here. +// Warning: These defines are used for slime cores and their icon states, so if you +// touch these names, remember to update icons/mob/simple/slimes.dmi and the respective +// slime core paths too! + +#define SLIME_TYPE_ADAMANTINE "adamantine" +#define SLIME_TYPE_BLACK "black" +#define SLIME_TYPE_BLUE "blue" +#define SLIME_TYPE_BLUESPACE "bluespace" +#define SLIME_TYPE_CERULEAN "cerulean" +#define SLIME_TYPE_DARK_BLUE "dark blue" +#define SLIME_TYPE_DARK_PURPLE "dark purple" +#define SLIME_TYPE_GOLD "gold" +#define SLIME_TYPE_GREEN "green" +#define SLIME_TYPE_GREY "grey" +#define SLIME_TYPE_LIGHT_PINK "light pink" +#define SLIME_TYPE_METAL "metal" +#define SLIME_TYPE_OIL "oil" +#define SLIME_TYPE_ORANGE "orange" +#define SLIME_TYPE_PINK "pink" +#define SLIME_TYPE_PURPLE "purple" +#define SLIME_TYPE_PYRITE "pyrite" +#define SLIME_TYPE_RAINBOW "rainbow" +#define SLIME_TYPE_RED "red" +#define SLIME_TYPE_SEPIA "sepia" +#define SLIME_TYPE_SILVER "silver" +#define SLIME_TYPE_YELLOW "yellow" diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 292408f9743..32a5e3b8fda 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -69,6 +69,8 @@ #define ROLE_PYROCLASTIC_SLIME "Pyroclastic Anomaly Slime" #define ROLE_ANOMALY_GHOST "Ectoplasmic Anomaly Ghost" #define ROLE_MIND_TRANSFER "Mind Transfer Potion" +#define ROLE_LAZARUS_GOOD "Friendly Revived Mob" +#define ROLE_LAZARUS_BAD "Slaved Revived Mob" #define ROLE_POSIBRAIN "Posibrain" #define ROLE_DRONE "Drone" #define ROLE_EMAGGED_BOT "Malfunctioning Bot" diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm index c67d9e1a832..3649bc4a6b0 100644 --- a/code/__DEFINES/shuttles.dm +++ b/code/__DEFINES/shuttles.dm @@ -89,11 +89,19 @@ #define SHUTTLE_DEFAULT_SHUTTLE_AREA_TYPE /area/shuttle #define SHUTTLE_DEFAULT_UNDERLYING_AREA /area/space -//Shuttle unlocks +/// Shuttle unlocks +// Needs Alien Technology researched. #define SHUTTLE_UNLOCK_ALIENTECH "abductor" +// Needs bubblegum to die. #define SHUTTLE_UNLOCK_BUBBLEGUM "bubblegum" +// Needs one to set the holodeck to Medieval Sim. #define SHUTTLE_UNLOCK_MEDISIM "holodeck" +// Needs a rune to be cleared by a null rod. #define SHUTTLE_UNLOCK_NARNAR "narnar" +// Needs someone to be polymorphed - Pride Mirror, Magic Mirror, Race Swap, Polymorph Staff/Wand. Badmin Mirror doesn't count, neither does xenobio. +#define SHUTTLE_UNLOCK_WABBAJACK "wabbajack" +// Needs cargo budget to be almost empty to be purchasable. +#define SHUTTLE_UNLOCK_SCRAPHEAP "scrapheap" //Shuttle Events diff --git a/code/__DEFINES/span.dm b/code/__DEFINES/span.dm index 2e237ce94ae..22cf26e19a5 100644 --- a/code/__DEFINES/span.dm +++ b/code/__DEFINES/span.dm @@ -43,6 +43,7 @@ #define span_drone(str) ("" + str + "") #define span_engradio(str) ("" + str + "") #define span_extremelybig(str) ("" + str + "") +#define span_game_say(str) ("" + str + "") #define span_ghostalert(str) ("" + str + "") #define span_green(str) ("" + str + "") #define span_greenannounce(str) ("" + str + "") @@ -69,6 +70,7 @@ #define span_medradio(str) ("" + str + "") #define span_memo(str) ("" + str + "") #define span_memoedit(str) ("" + str + "") +#define span_message(str) ("" + str + "") #define span_mind_control(str) ("" + str + "") #define span_minorannounce(str) ("" + str + "") #define span_monkey(str) ("" + str + "") diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 2c13b7eb07d..b08bc32d8b7 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -134,6 +134,7 @@ #define INIT_ORDER_BLACKBOX 94 #define INIT_ORDER_SERVER_MAINT 93 #define INIT_ORDER_INPUT 85 +#define INIT_ORDER_PLAYER_RANKS 84 // SKYRAT EDIT - Player Ranks Subsystem #define INIT_ORDER_SOUNDS 83 #define INIT_ORDER_INSTRUMENTS 82 #define INIT_ORDER_GREYSCALE 81 @@ -292,8 +293,8 @@ #define SSAIR_REBUILD_QUEUE 2 // Explosion Subsystem subtasks -#define SSEXPLOSIONS_MOVABLES 1 -#define SSEXPLOSIONS_TURFS 2 +#define SSEXPLOSIONS_TURFS 1 +#define SSEXPLOSIONS_MOVABLES 2 #define SSEXPLOSIONS_THROWS 3 // Wardrobe subsystem tasks diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm index 22c3827022f..6187a67825a 100644 --- a/code/__DEFINES/tgs.dm +++ b/code/__DEFINES/tgs.dm @@ -1,6 +1,6 @@ // tgstation-server DMAPI -#define TGS_DMAPI_VERSION "6.5.2" +#define TGS_DMAPI_VERSION "6.5.3" // All functions and datums outside this document are subject to change with any version and should not be relied on. @@ -154,7 +154,7 @@ #define TGS_TOPIC var/tgs_topic_return = TgsTopic(args[1]); if(tgs_topic_return) return tgs_topic_return /** - * Call this as late as possible in [world/proc/Reboot]. + * Call this as late as possible in [world/proc/Reboot] (BEFORE ..()). */ /world/proc/TgsReboot() return diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 38afa0e9c0b..5a09eb0c122 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -115,7 +115,9 @@ #define HAS_TRAIT_NOT_FROM(target, trait, source) (HAS_TRAIT(target, trait) && (length(target._status_traits[trait] - source) > 0)) /// Returns a list of trait sources for this trait. Only useful for wacko cases and internal futzing /// You should not be using this -#define GET_TRAIT_SOURCES(target, trait) target._status_traits?[trait] || list() +#define GET_TRAIT_SOURCES(target, trait) (target._status_traits?[trait] || list()) +/// Returns the amount of sources for a trait. useful if you don't want to have a "thing counter" stuck around all the time +#define COUNT_TRAIT_SOURCES(target, trait) length(GET_TRAIT_SOURCES(target, trait)) /// A simple helper for checking traits in a mob's mind #define HAS_MIND_TRAIT(target, trait) (HAS_TRAIT(target, trait) || (target.mind ? HAS_TRAIT(target.mind, trait) : FALSE)) @@ -280,6 +282,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_TOXIMMUNE "toxin_immune" /// Mob is immune to oxygen damage, does not need to breathe #define TRAIT_NOBREATH "no_breath" +/// Mob is currently disguised as something else (like a morph being another mob or an object). Holds a reference to the thing that applied the trait. +#define TRAIT_DISGUISED "disguised" /// Use when you want a mob to be able to metabolize plasma temporarily (e.g. plasma fixation disease symptom) #define TRAIT_PLASMA_LOVER_METABOLISM "plasma_lover_metabolism" #define TRAIT_EASYDISMEMBER "easy_dismember" @@ -305,6 +309,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_RECENTLY_BLOCKED_MAGIC "recently_blocked_magic" /// The user can do things like use magic staffs without penalty #define TRAIT_MAGICALLY_GIFTED "magically_gifted" +/// This object innately spawns with fantasy variables already applied (the magical component is given to it on initialize), and thus we never want to give it the component again. +#define TRAIT_INNATELY_FANTASTICAL_ITEM "innately_fantastical_item" #define TRAIT_DEPRESSION "depression" #define TRAIT_BLOOD_DEFICIENCY "blood_deficiency" #define TRAIT_JOLLY "jolly" @@ -567,6 +573,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Mobs with this trait do care about a few grisly things, such as digging up graves. They also really do not like bringing people back to life or tending wounds, but love autopsies and amputations. #define TRAIT_MORBID "morbid" +/// Whether or not the user is in a MODlink call, prevents making more calls +#define TRAIT_IN_CALL "in_call" + // METABOLISMS // Various jobs on the station have historically had better reactions // to various drinks and foodstuffs. Security liking donuts is a classic @@ -610,7 +619,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_WINE_TASTER "wine_taster" #define TRAIT_BONSAI "bonsai" #define TRAIT_LIGHTBULB_REMOVER "lightbulb_remover" -#define TRAIT_KNOW_CYBORG_WIRES "know_cyborg_wires" +#define TRAIT_KNOW_ROBO_WIRES "know_robo_wires" #define TRAIT_KNOW_ENGI_WIRES "know_engi_wires" #define TRAIT_ENTRAILS_READER "entrails_reader" #define TRAIT_SABRAGE_PRO "sabrage_pro" @@ -638,6 +647,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Cannot be grabbed by goliath tentacles #define TRAIT_TENTACLE_IMMUNE "tentacle_immune" +/// Currently under the effect of overwatch +#define TRAIT_OVERWATCHED "watcher_overwatched" +/// Cannot be targetted by watcher overwatch +#define TRAIT_OVERWATCH_IMMUNE "overwatch_immune" //non-mob traits /// Used for limb-based paralysis, where replacing the limb will fix it. @@ -750,6 +763,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_CUSTOM_TAP_SOUND "no_tap_sound" /// Makes the feedback message when someone else is putting this item on you more noticeable #define TRAIT_DANGEROUS_OBJECT "dangerous_object" +/// determines whether or not objects are haunted and teleport/attack randomly +#define TRAIT_HAUNTED "haunted" //quirk traits #define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance" @@ -783,6 +798,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_SMOKER "smoker" #define TRAIT_POSTERBOY "poster_boy" #define TRAIT_THROWINGARM "throwing_arm" +#define TRAIT_SETTLER "settler" ///if the atom has a sticker attached to it #define TRAIT_STICKERED "stickered" @@ -999,6 +1015,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai */ #define TRAIT_UNIQUE_IMMERSE "unique_immerse" + // unique trait sources, still defines #define EMP_TRAIT "emp_trait" #define STATUE_MUTE "statue" @@ -1013,6 +1030,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define HYPNOCHAIR_TRAIT "hypnochair" #define FLASHLIGHT_EYES "flashlight_eyes" #define IMPURE_OCULINE "impure_oculine" +#define HAUNTIUM_REAGENT_TRAIT "hauntium_reagent_trait" #define TRAIT_SANTA "santa" #define SCRYING_ORB "scrying-orb" #define ABDUCTOR_ANTAGONIST "abductor-antagonist" @@ -1080,6 +1098,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define PAI_FOLDED "pai-folded" /// Trait applied to brain mobs when they lack external aid for locomotion, such as being inside a mech. #define BRAIN_UNAIDED "brain-unaided" +/// Trait applied to a mob when it gets a required "operational datum" (components/elements). Sends out the source as the type of the element. +#define TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM "element-required" /// Trait applied by MODsuits. #define MOD_TRAIT "mod" /// Trait applied by element @@ -1112,6 +1132,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define HALLUCINATION_TRAIT "hallucination_trait" /// Trait given by simple/basic mob death #define BASIC_MOB_DEATH_TRAIT "basic_mob_death" +/// Trait given by your current speed +#define SPEED_TRAIT "speed_trait" /// Trait given to mobs that have been autopsied #define AUTOPSY_TRAIT "autopsy_trait" @@ -1266,3 +1288,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// This means the "caster" of the spell is changed to the mob's loc /// Note this doesn't mean all spells are guaranteed to work or the mob is guaranteed to cast #define TRAIT_CASTABLE_LOC "castable_loc" + +///Trait given by /datum/element/relay_attacker +#define TRAIT_RELAYING_ATTACKER "relaying_attacker" diff --git a/code/__DEFINES/tram.dm b/code/__DEFINES/tram.dm index 8b7ff3a0bac..a88086b36a5 100644 --- a/code/__DEFINES/tram.dm +++ b/code/__DEFINES/tram.dm @@ -26,3 +26,7 @@ #define BIRDSHOT_MAINTENANCE_LEFT 1 #define BRIDSHOT_MAINTENANCE_RIGHT 2 + +/// Tram navigation directions +#define OUTBOUND 1 +#define INBOUND -1 diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index 32e18e5d146..07239ca07c5 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -98,6 +98,7 @@ #define VV_HK_EDIT_FILTERS "edit_filters" #define VV_HK_EDIT_PARTICLES "edit_particles" #define VV_HK_EDIT_COLOR_MATRIX "edit_color_matrix" +#define VV_HK_TEST_MATRIXES "test_matrixes" #define VV_HK_ADD_AI "add_ai" #define VV_HK_ARMOR_MOD "mod_obj_armor" diff --git a/code/__DEFINES/wires.dm b/code/__DEFINES/wires.dm index c064dcce602..d4f0cb748e1 100644 --- a/code/__DEFINES/wires.dm +++ b/code/__DEFINES/wires.dm @@ -16,6 +16,7 @@ #define WIRE_BACKUP1 "Auxiliary Power 1" #define WIRE_BACKUP2 "Auxiliary Power 2" #define WIRE_BEACON "Beacon" +#define WIRE_BOLTLIGHT "Bolt Lights" #define WIRE_BOLTS "Bolts" #define WIRE_BOOM "Boom Wire 1" #define WIRE_BOOM2 "Boom Wire 2" @@ -30,7 +31,7 @@ #define WIRE_IDSCAN "ID Scan" #define WIRE_INTERFACE "Interface" #define WIRE_LAWSYNC "AI Law Synchronization" -#define WIRE_LIGHT "Bolt Lights" +#define WIRE_LIGHT "Lights" #define WIRE_LIMIT "Limiter" #define WIRE_LOADCHECK "Load Check" #define WIRE_LOCKDOWN "Lockdown" @@ -59,6 +60,7 @@ #define WIRE_ZAP "High Voltage Circuit" #define WIRE_ZAP1 "High Voltage Circuit 1" #define WIRE_ZAP2 "High Voltage Circuit 2" +#define WIRE_OVERCLOCK "Overclock" // Wire states for the AI #define AI_WIRE_NORMAL 0 diff --git a/code/__DEFINES/wounds.dm b/code/__DEFINES/wounds.dm index 322f9a643c2..0a020b2b5a8 100644 --- a/code/__DEFINES/wounds.dm +++ b/code/__DEFINES/wounds.dm @@ -141,7 +141,7 @@ GLOBAL_LIST_INIT(global_all_wound_types, list( /// If this wound marks the limb as being allowed to have gauze applied #define ACCEPTS_GAUZE (1<<4) //SKYRAT EDIT ADDITION BEGIN - MEDICAL -/// If this wound marks the limb as being allowed to have splints applied +/// If this wound marks the limb as being allowed to have gauze applied as a splint #define ACCEPTS_SPLINT (1<<5) //SKYRAT EDIT ADDITION END diff --git a/code/__DEFINES/~skyrat_defines/manufacturer_strings.dm b/code/__DEFINES/~skyrat_defines/manufacturer_strings.dm index feb5be06bcf..fd90be189d0 100644 --- a/code/__DEFINES/~skyrat_defines/manufacturer_strings.dm +++ b/code/__DEFINES/~skyrat_defines/manufacturer_strings.dm @@ -15,6 +15,8 @@ #define COMPANY_IZHEVSK "It has [span_brown("Izhevsk Coalition")] cut into it." #define COMPANY_TKACH "It has [span_robot("Tkach Design Bureau")] stamped onto it." +#define COMPANY_SAKHNO "It has [span_green("Sakhno Concern")] stamped onto it." +#define COMPANY_XHIHAO "It has [span_purple("Xhihao Light Arms")] etched into it." #define COMPANY_ABDUCTOR "It has [span_abductor("✌︎︎♌︎︎♎︎︎◆︎︎♍︎︎⧫︎︎❄︎♏︎♍︎♒︎")] engraved into it." diff --git a/code/__DEFINES/~skyrat_defines/mobs.dm b/code/__DEFINES/~skyrat_defines/mobs.dm index 5110341c9ac..dc32d8e3b66 100644 --- a/code/__DEFINES/~skyrat_defines/mobs.dm +++ b/code/__DEFINES/~skyrat_defines/mobs.dm @@ -4,6 +4,8 @@ #define HUMAN_HEALTH_MODIFIER 1.35 +#define HUMAN_MAXHEALTH MAX_LIVING_HEALTH * HUMAN_HEALTH_MODIFIER + /// Used for Nanite Slurry vomit. The mob will vomit a nanite puddle. #define VOMIT_NANITE 3 diff --git a/code/__DEFINES/~skyrat_defines/obj_flags.dm b/code/__DEFINES/~skyrat_defines/obj_flags.dm index 6b393200223..a284b21fdc9 100644 --- a/code/__DEFINES/~skyrat_defines/obj_flags.dm +++ b/code/__DEFINES/~skyrat_defines/obj_flags.dm @@ -1,6 +1,3 @@ -///Makes the organ not pop out when dismembered -#define ORGAN_NO_DISMEMBERMENT (1<<7) - #define GENITAL_SKIP_VISIBILITY 0 #define GENITAL_NEVER_SHOW 1 #define GENITAL_HIDDEN_BY_CLOTHES 2 diff --git a/code/__DEFINES/~skyrat_defines/projectiles.dm b/code/__DEFINES/~skyrat_defines/projectiles.dm index ac0085001cc..dd08d26514e 100644 --- a/code/__DEFINES/~skyrat_defines/projectiles.dm +++ b/code/__DEFINES/~skyrat_defines/projectiles.dm @@ -22,10 +22,8 @@ /// The caliber used by the Ripper gen2 #define CALIBER_B577 ".577 Snider" -/// The caliber used by the Oldarms 'Mk.11.4 rifle' -#define CALIBER_223 ".223 Stinger" +/// The caliber used by the Oldarms 'Mk.11.4 rifle', designed to be worse .223. +#define CALIBER_223S ".223 Stinger" /// Caliber used by the giant anti materiel rifle in guncargo #define CALIBER_60STRELA ".60 Strela" - -#define CALIBER_A277 "a277" diff --git a/code/__HELPERS/areas.dm b/code/__HELPERS/areas.dm index 4349dac91c5..383e8a425fc 100644 --- a/code/__HELPERS/areas.dm +++ b/code/__HELPERS/areas.dm @@ -10,7 +10,7 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(/area/station/en // The dirs are connected turfs in the same space // break_if_found is a typecache of turf/area types to return false if found // Please keep this proc type agnostic. If you need to restrict it do it elsewhere or add an arg. -/proc/detect_room(turf/origin, list/break_if_found, max_size=INFINITY) +/proc/detect_room(turf/origin, list/break_if_found = list(), max_size=INFINITY) if(origin.blocks_air) return list(origin) diff --git a/code/__HELPERS/atoms.dm b/code/__HELPERS/atoms.dm index 402e3d975fd..9845593c084 100644 --- a/code/__HELPERS/atoms.dm +++ b/code/__HELPERS/atoms.dm @@ -323,3 +323,15 @@ rough example of the "cone" made by the 3 dirs checked if(!storage_datum) return . += storage_datum.real_location?.resolve() + +/// Returns an x and y value require to reverse the transformations made to center an oversized icon +/atom/proc/get_oversized_icon_offsets() + if (pixel_x == 0 && pixel_y == 0) + return list("x" = 0, "y" = 0) + var/list/icon_dimensions = get_icon_dimensions(icon) + var/icon_width = icon_dimensions["width"] + var/icon_height = icon_dimensions["height"] + return list( + "x" = icon_width > world.icon_size && pixel_x != 0 ? (icon_width - world.icon_size) * 0.5 : 0, + "y" = icon_height > world.icon_size && pixel_y != 0 ? (icon_height - world.icon_size) * 0.5 : 0, + ) diff --git a/code/__HELPERS/byond_status.dm b/code/__HELPERS/byond_status.dm new file mode 100644 index 00000000000..1985080418c --- /dev/null +++ b/code/__HELPERS/byond_status.dm @@ -0,0 +1,7 @@ +/// Returns the debug status, including sleeping procs. +/// If this blame is older than a month, please revert the PR that added it. +/proc/byond_status() + if (world.system_type == UNIX) + return LIBCALL("libbyond_sleeping_procs.so", "get_status")() + else + return "byond_status is not supported on [world.system_type]" diff --git a/code/__HELPERS/cameras.dm b/code/__HELPERS/cameras.dm new file mode 100644 index 00000000000..9d74f3fe71b --- /dev/null +++ b/code/__HELPERS/cameras.dm @@ -0,0 +1,35 @@ +/** + * get_camera_list + * + * Builds a list of all available cameras that can be seen to networks_available + * Args: + * networks_available - List of networks that we use to see which cameras are visible to it. + */ +/proc/get_camera_list(list/networks_available) + var/list/all_camera_list = list() + for(var/obj/machinery/camera/camera as anything in GLOB.cameranet.cameras) + all_camera_list.Add(camera) + + camera_sort(all_camera_list) + + var/list/usable_camera_list = list() + + for(var/obj/machinery/camera/camera as anything in all_camera_list) + var/list/tempnetwork = camera.network & networks_available + if(length(tempnetwork)) + usable_camera_list["[camera.c_tag][camera.can_use() ? null : " (Deactivated)"]"] = camera + + return usable_camera_list + +///Sorts the list of cameras by their c_tag to display to players. +/proc/camera_sort(list/camera_list) + var/obj/machinery/camera/camera_comparing_a + var/obj/machinery/camera/camera_comparing_b + + for(var/i = length(camera_list), i > 0, i--) + for(var/j = 1 to i - 1) + camera_comparing_a = camera_list[j] + camera_comparing_b = camera_list[j + 1] + if(sorttext(camera_comparing_a.c_tag, camera_comparing_b.c_tag) < 0) + camera_list.Swap(j, j + 1) + return camera_list diff --git a/code/__HELPERS/construction.dm b/code/__HELPERS/construction.dm index 384aee42737..9d21362a87a 100644 --- a/code/__HELPERS/construction.dm +++ b/code/__HELPERS/construction.dm @@ -5,6 +5,7 @@ return defaults + list( "cost" = defaults["cost"] / RCD_MEMORY_COST_BUFF, "delay" = defaults["delay"] / RCD_MEMORY_SPEED_BUFF, + RCD_RESULT_BYPASS_FREQUENT_USE_COOLDOWN = TRUE, ) else return defaults diff --git a/code/__HELPERS/dynamic_human_icon_gen.dm b/code/__HELPERS/dynamic_human_icon_gen.dm index 0348524b455..f23af0e45a5 100644 --- a/code/__HELPERS/dynamic_human_icon_gen.dm +++ b/code/__HELPERS/dynamic_human_icon_gen.dm @@ -54,4 +54,5 @@ GLOBAL_LIST_EMPTY(dynamic_human_appearances) /proc/set_dynamic_human_appearance(list/arguments) var/atom/target = arguments[1] //1st argument is the target var/dynamic_appearance = get_dynamic_human_appearance(arglist(arguments.Copy(2))) //the rest of the arguments starting from 2 matter to the proc - target.appearance = dynamic_appearance + target.icon = null + target.copy_overlays(dynamic_appearance, cut_old = TRUE) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 707c7769265..659c2c0144e 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -116,6 +116,7 @@ /obj/item/stack/sheet/sinew = GLOB.sinew_recipes, /obj/item/stack/sheet/animalhide/carp = GLOB.carp_recipes, /obj/item/stack/sheet/mineral/sandstone = GLOB.sandstone_recipes, + /obj/item/stack/sheet/mineral/clay = GLOB.clay_recipes, /obj/item/stack/sheet/mineral/sandbags = GLOB.sandbag_recipes, /obj/item/stack/sheet/mineral/diamond = GLOB.diamond_recipes, /obj/item/stack/sheet/mineral/uranium = GLOB.uranium_recipes, diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 4a8aa5e33c7..9ca77550be0 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -1433,3 +1433,38 @@ GLOBAL_LIST_EMPTY(transformation_animation_objects) if(scream) stack_trace("Icon Lookup for state: [state] in file [file] failed.") return FALSE + +/** + * Returns the size of the sprite in tiles. + * Takes the icon size and divides it by the world icon size (default 32). + * This gives the size of the sprite in tiles. + * + * @return size of the sprite in tiles + */ +/proc/get_size_in_tiles(obj/target) + var/icon/size_check = icon(target.icon, target.icon_state) + var/size = size_check.Width() / world.icon_size + + return size + +/** + * Updates the bounds of a rotated object + * This ensures that the bounds are always correct, + * even if the object is rotated after init. + */ +/obj/proc/set_bounds() + var/size = get_size_in_tiles(src) + + if(dir in list(NORTH, SOUTH)) + bound_width = size * world.icon_size + bound_height = world.icon_size + else + bound_width = world.icon_size + bound_height = size * world.icon_size + +/// Returns a list containing the width and height of an icon file +/proc/get_icon_dimensions(icon_path) + if (isnull(GLOB.icon_dimensions[icon_path])) + var/icon/my_icon = icon(icon_path) + GLOB.icon_dimensions[icon_path] = list("width" = my_icon.Width(), "height" = my_icon.Height()) + return GLOB.icon_dimensions[icon_path] diff --git a/code/__HELPERS/matrices.dm b/code/__HELPERS/matrices.dm index a79e0866211..075a5e5ae0e 100644 --- a/code/__HELPERS/matrices.dm +++ b/code/__HELPERS/matrices.dm @@ -185,15 +185,24 @@ round(cos_inv_third+sqrt3_sin, 0.001), round(cos_inv_third-sqrt3_sin, 0.001), ro output[offset+x] = round(A[offset+1]*B[x] + A[offset+2]*B[x+4] + A[offset+3]*B[x+8] + A[offset+4]*B[x+12]+(y == 5?B[x+16]:0), 0.001) return output -///Converts RGB shorthands into RGBA matrices complete of constants rows (ergo a 20 keys list in byond). -/proc/color_to_full_rgba_matrix(color) +/** + * Converts RGB shorthands into RGBA matrices complete of constants rows (ergo a 20 keys list in byond). + * if return_identity_on_fail is true, stack_trace is called instead of CRASH, and an identity is returned. + */ +/proc/color_to_full_rgba_matrix(color, return_identity_on_fail = TRUE) + if(!color) + return color_matrix_identity() if(istext(color)) var/list/L = ReadRGB(color) if(!L) - CRASH("Invalid/unsupported color format argument in color_to_full_rgba_matrix()") + var/message = "Invalid/unsupported color ([color]) argument in color_to_full_rgba_matrix()" + if(return_identity_on_fail) + stack_trace(message) + return color_matrix_identity() + CRASH(message) return list(L[1]/255,0,0,0, 0,L[2]/255,0,0, 0,0,L[3]/255,0, 0,0,0,L.len>3?L[4]/255:1, 0,0,0,0) - else if(!islist(color)) //invalid format - return color_matrix_identity() + if(!islist(color)) //invalid format + CRASH("Invalid/unsupported color ([color]) argument in color_to_full_rgba_matrix()") var/list/L = color switch(L.len) if(3 to 5) // row-by-row hexadecimals @@ -219,7 +228,11 @@ round(cos_inv_third+sqrt3_sin, 0.001), round(cos_inv_third-sqrt3_sin, 0.001), ro for(var/b in 1 to 20-L.len) . += 0 else - CRASH("Invalid/unsupported color format argument in color_to_full_rgba_matrix()") + var/message = "Invalid/unsupported color (list of length [L.len]) argument in color_to_full_rgba_matrix()" + if(return_identity_on_fail) + stack_trace(message) + return color_matrix_identity() + CRASH(message) #undef LUMA_R #undef LUMA_G diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 64cfbf29840..6bb147721fd 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -317,9 +317,21 @@ GLOBAL_LIST_EMPTY(species_list) progbar.end_progress() if(interaction_key) + var/reduced_interaction_count = (LAZYACCESS(user.do_afters, interaction_key) || 0) - 1 + if(reduced_interaction_count > 0) // Not done yet! + LAZYSET(user.do_afters, interaction_key, reduced_interaction_count) + return + // all out, let's clear er out fully LAZYREMOVE(user.do_afters, interaction_key) SEND_SIGNAL(user, COMSIG_DO_AFTER_ENDED) +/// Returns the total amount of do_afters this mob is taking part in +/mob/proc/do_after_count() + var/count = 0 + for(var/key in do_afters) + count += do_afters[key] + return count + /proc/is_species(A, species_datum) . = FALSE if(ishuman(A)) diff --git a/code/__HELPERS/path.dm b/code/__HELPERS/path.dm index 09c1e882f4e..fb6d9c27b2b 100644 --- a/code/__HELPERS/path.dm +++ b/code/__HELPERS/path.dm @@ -147,6 +147,11 @@ SSpathfinder.currentrun -= src if(on_finish) on_finish.Invoke(null) + on_finish = null + avoid = null + id = null + caller = null + open = null /** * "starts" off the pathfinding, by storing the values this datum will need to work later on diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 9e14c1c1212..681f525bd5e 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -4,6 +4,8 @@ #define PERSONAL_LAST_ROUND "personal last round" #define SERVER_LAST_ROUND "server last round" +GLOBAL_LIST_INIT(achievements_unlocked, list()) + /datum/controller/subsystem/ticker/proc/gather_roundend_feedback() gather_antag_data() record_nuke_disk_location() @@ -322,6 +324,8 @@ parts += goal_report() //Economy & Money parts += market_report() + //Player Achievements + parts += cheevo_report() list_clear_nulls(parts) @@ -809,3 +813,25 @@ return qdel(query_update_everything_ranks) qdel(query_check_everything_ranks) + +/datum/controller/subsystem/ticker/proc/cheevo_report() + var/list/parts = list() + if(length(GLOB.achievements_unlocked)) + parts += "Achievement Get!
" + parts += "Total Achievements Earned: [length(GLOB.achievements_unlocked)]!
" + parts += "" + return "
" + +///A datum containing the info necessary for an achievement readout, reported and added to the global list in /datum/award/achievement/on_unlock(mob/user) +/datum/achievement_report + ///The winner of this achievement. + var/winner + ///The achievement that was won. + var/cheevo + ///The ckey of our winner + var/winner_key + ///The name of the area we earned this cheevo in + var/award_location diff --git a/code/__HELPERS/stoplag.dm b/code/__HELPERS/stoplag.dm index e838ddd97c9..48839bdac9a 100644 --- a/code/__HELPERS/stoplag.dm +++ b/code/__HELPERS/stoplag.dm @@ -10,6 +10,12 @@ return 1 if (!initial_delay) initial_delay = world.tick_lag +// Unit tests are not the normal environemnt. The mc can get absolutely thigh crushed, and sleeping procs running for ages is much more common +// We don't want spurious hard deletes off this, so let's only sleep for the requested period of time here yeah? +#ifdef UNIT_TESTS + sleep(initial_delay) + return CEILING(DS2TICKS(initial_delay), 1) +#else . = 0 var/i = DS2TICKS(initial_delay) do @@ -17,5 +23,6 @@ sleep(i * world.tick_lag * DELTA_CALC) i *= 2 while (TICK_USAGE > min(TICK_LIMIT_TO_RUN, Master.current_ticklimit)) +#endif #undef DELTA_CALC diff --git a/code/__HELPERS/turfs.dm b/code/__HELPERS/turfs.dm index 73f96d09c26..069bf55576f 100644 --- a/code/__HELPERS/turfs.dm +++ b/code/__HELPERS/turfs.dm @@ -216,7 +216,7 @@ Turf and target are separate in case you want to teleport some distance from a t var/list/offsets = get_visual_offset(checked_atom) return pixel_offset_turf(atom_turf, offsets) - + /** * Returns how visually "off" the atom is from its source turf as a list of x, y (in pixel steps) * it takes into account: @@ -232,9 +232,9 @@ Turf and target are separate in case you want to teleport some distance from a t var/pixel_y_offset = checked_atom.pixel_y + atom_matrix.get_y_shift() //Irregular objects - var/icon/checked_atom_icon = icon(checked_atom.icon, checked_atom.icon_state) - var/checked_atom_icon_height = checked_atom_icon.Height() - var/checked_atom_icon_width = checked_atom_icon.Width() + var/list/icon_dimensions = get_icon_dimensions(checked_atom.icon) + var/checked_atom_icon_height = icon_dimensions["width"] + var/checked_atom_icon_width = icon_dimensions["height"] if(checked_atom_icon_height != world.icon_size || checked_atom_icon_width != world.icon_size) pixel_x_offset += ((checked_atom_icon_width / world.icon_size) - 1) * (world.icon_size * 0.5) pixel_y_offset += ((checked_atom_icon_height / world.icon_size) - 1) * (world.icon_size * 0.5) diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 3a7fa2857f1..80d9d3e9b09 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -232,14 +232,13 @@ DEFINE_BITFIELD(mat_container_flags, list( DEFINE_BITFIELD(internal_damage, list( "MECHA_INT_FIRE" = MECHA_INT_FIRE, "MECHA_INT_TEMP_CONTROL" = MECHA_INT_TEMP_CONTROL, - "MECHA_INT_TANK_BREACH" = MECHA_INT_TANK_BREACH, + "MECHA_CABIN_AIR_BREACH" = MECHA_CABIN_AIR_BREACH, "MECHA_INT_CONTROL_LOST" = MECHA_INT_CONTROL_LOST, "MECHA_INT_SHORT_CIRCUIT" = MECHA_INT_SHORT_CIRCUIT, )) DEFINE_BITFIELD(mecha_flags, list( - "ADDING_ACCESS_POSSIBLE" = ADDING_ACCESS_POSSIBLE, - "ADDING_MAINT_ACCESS_POSSIBLE" = ADDING_MAINT_ACCESS_POSSIBLE, + "ID_LOCK_ON" = ID_LOCK_ON, "CANSTRAFE" = CANSTRAFE, "LIGHTS_ON" = LIGHTS_ON, "SILICON_PILOT" = SILICON_PILOT, @@ -258,7 +257,8 @@ DEFINE_BITFIELD(mob_biotypes, list( "MOB_ROBOTIC" = MOB_ROBOTIC, "MOB_SPIRIT" = MOB_SPIRIT, "MOB_UNDEAD" = MOB_UNDEAD, - "MOB_PLANT" = MOB_PLANT + "MOB_PLANT" = MOB_PLANT, + "MOB_SLIME" = MOB_SLIME, )) DEFINE_BITFIELD(mob_respiration_type, list( @@ -286,18 +286,18 @@ DEFINE_BITFIELD(movement_type, list( )) DEFINE_BITFIELD(obj_flags, list( - "BLOCK_Z_IN_DOWN" = BLOCK_Z_IN_DOWN, - "BLOCK_Z_IN_UP" = BLOCK_Z_IN_UP, - "BLOCK_Z_OUT_DOWN" = BLOCK_Z_OUT_DOWN, - "BLOCK_Z_OUT_UP" = BLOCK_Z_OUT_UP, + "IN_USE" = IN_USE, + "EMAGGED" = EMAGGED, "CAN_BE_HIT" = CAN_BE_HIT, "DANGEROUS_POSSESSION" = DANGEROUS_POSSESSION, - "EMAGGED" = EMAGGED, - "IN_USE" = IN_USE, + "UNIQUE_RENAME" = UNIQUE_RENAME, + "BLOCK_Z_OUT_DOWN" = BLOCK_Z_OUT_DOWN, + "BLOCK_Z_OUT_UP" = BLOCK_Z_OUT_UP, + "BLOCK_Z_IN_DOWN" = BLOCK_Z_IN_DOWN, + "BLOCK_Z_IN_UP" = BLOCK_Z_IN_UP, "BLOCKS_CONSTRUCTION" = BLOCKS_CONSTRUCTION, "BLOCKS_CONSTRUCTION_DIR" = BLOCKS_CONSTRUCTION_DIR, "IGNORE_DENSITY" = IGNORE_DENSITY, - "UNIQUE_RENAME" = UNIQUE_RENAME, )) DEFINE_BITFIELD(pass_flags, list( diff --git a/code/_globalvars/lists/achievements.dm b/code/_globalvars/lists/achievements.dm index 91521694ef7..2963dfb4139 100755 --- a/code/_globalvars/lists/achievements.dm +++ b/code/_globalvars/lists/achievements.dm @@ -1 +1,3 @@ GLOBAL_LIST_EMPTY(commendations) +///A list of the current achievement categories supported by the UI and checked by the achievement unit test +GLOBAL_LIST_INIT(achievement_categories, list("Bosses", "Jobs", "Skills", "Misc", "Mafia", "Scores")) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index bdf217da9b6..7f3341eb26b 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -147,17 +147,21 @@ GLOBAL_LIST_INIT(security_depts_prefs, sort_list(list( #define DBACKPACK "Department Backpack" #define DDUFFELBAG "Department Duffel Bag" #define DSATCHEL "Department Satchel" +#define DMESSENGER "Department Messenger Bag" #define GBACKPACK "Grey Backpack" #define GDUFFELBAG "Grey Duffel Bag" #define GSATCHEL "Grey Satchel" +#define GMESSENGER "Grey Messenger Bag" #define LSATCHEL "Leather Satchel" GLOBAL_LIST_INIT(backpacklist, list( DBACKPACK, DDUFFELBAG, DSATCHEL, + DMESSENGER, GBACKPACK, GDUFFELBAG, GSATCHEL, + GMESSENGER, LSATCHEL, )) diff --git a/code/_globalvars/lists/icons.dm b/code/_globalvars/lists/icons.dm new file mode 100644 index 00000000000..ff60e6bc8d9 --- /dev/null +++ b/code/_globalvars/lists/icons.dm @@ -0,0 +1,2 @@ +/// Cache of the width and height of icon files, to avoid repeating the same expensive operation +GLOBAL_LIST_EMPTY(icon_dimensions) diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm index 3d125902e54..309b31ceb37 100644 --- a/code/_globalvars/phobias.dm +++ b/code/_globalvars/phobias.dm @@ -13,6 +13,7 @@ GLOBAL_LIST_INIT(phobia_types, sort_list(list( "falling", "greytide", "guns", + "heresy", "insects", "lizards", "robots", @@ -37,6 +38,7 @@ GLOBAL_LIST_INIT(phobia_regexes, list( "falling" = construct_phobia_regex("falling"), "greytide" = construct_phobia_regex("greytide"), "guns" = construct_phobia_regex("guns"), + "heresy" = construct_phobia_regex("heresy"), "insects" = construct_phobia_regex("insects"), "lizards" = construct_phobia_regex("lizards"), "ocky icky" = construct_phobia_regex("ocky icky"), @@ -68,6 +70,10 @@ GLOBAL_LIST_INIT(phobia_mobs, list( /mob/living/basic/pet/penguin, )), "doctors" = typecacheof(list(/mob/living/simple_animal/bot/medbot)), + "heresy" = typecacheof(list( + /mob/living/basic/heretic_summon, + /mob/living/simple_animal/hostile/heretic_summon, + )), "insects" = typecacheof(list( /mob/living/basic/cockroach, /mob/living/basic/bee, @@ -80,7 +86,7 @@ GLOBAL_LIST_INIT(phobia_mobs, list( /mob/living/simple_animal/drone, )), "security" = typecacheof(list(/mob/living/simple_animal/bot/secbot)), - "spiders" = typecacheof(list(/mob/living/basic/giant_spider)), + "spiders" = typecacheof(list(/mob/living/basic/spider/giant)), "skeletons" = typecacheof(list(/mob/living/simple_animal/hostile/skeleton)), "snakes" = typecacheof(list(/mob/living/simple_animal/hostile/retaliate/snake)), "the supernatural" = typecacheof(list( @@ -89,6 +95,7 @@ GLOBAL_LIST_INIT(phobia_mobs, list( /mob/living/basic/demon, /mob/living/basic/faithless, /mob/living/basic/ghost, + /mob/living/basic/heretic_summon, /mob/living/simple_animal/bot/mulebot/paranormal, /mob/living/simple_animal/hostile/construct, /mob/living/simple_animal/hostile/dark_wizard, @@ -356,6 +363,31 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/machinery/porta_turret, /obj/machinery/power/emitter, )), + "heresy" = typecacheof(list( + /obj/effect/floating_blade, + /obj/effect/forcefield/cosmic_field, + /obj/effect/heretic_rune, + /obj/effect/heretic_influence, + /obj/effect/visible_heretic_influence, + /obj/item/ammo_box/strilka310/lionhunter, + /obj/item/ammo_casing/strilka310/lionhunter, + /obj/item/clothing/mask/madness_mask, + /obj/item/clothing/neck/eldritch_amulet, + /obj/item/clothing/neck/fake_heretic_amulet, + /obj/item/clothing/neck/heretic_focus, + /obj/item/clothing/suit/hooded/cultrobes/eldritch, + /obj/item/codex_cicatrix, + /obj/item/coin/eldritch, + /obj/item/gun/ballistic/rifle/lionhunter, + /obj/item/melee/rune_carver, + /obj/item/melee/sickly_blade, + /obj/item/melee/touch_attack/mansus_fist, + /obj/item/reagent_containers/cup/beaker/eldritch, + /obj/item/toy/eldritch_book, + /obj/item/toy/reality_pierce, + /obj/projectile/curse_hand, + /obj/structure/destructible/eldritch_crucible, + )), "insects" = typecacheof(list( /obj/item/clothing/mask/animal/small/bee, /obj/item/clothing/suit/hooded/bee_costume, diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index f0ff4f7a9e9..d35c97ef68a 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -145,7 +145,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_WINE_TASTER" = TRAIT_WINE_TASTER, "TRAIT_BONSAI" = TRAIT_BONSAI, "TRAIT_LIGHTBULB_REMOVER" = TRAIT_LIGHTBULB_REMOVER, - "TRAIT_KNOW_CYBORG_WIRES" = TRAIT_KNOW_CYBORG_WIRES, + "TRAIT_KNOW_ROBO_WIRES" = TRAIT_KNOW_ROBO_WIRES, "TRAIT_KNOW_ENGI_WIRES" = TRAIT_KNOW_ENGI_WIRES, "TRAIT_ALCOHOL_TOLERANCE" = TRAIT_ALCOHOL_TOLERANCE, "TRAIT_AGEUSIA" = TRAIT_AGEUSIA, @@ -158,6 +158,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_VORACIOUS" = TRAIT_VORACIOUS, "TRAIT_SELF_AWARE" = TRAIT_SELF_AWARE, "TRAIT_FREERUNNING" = TRAIT_FREERUNNING, + "TRAIT_SETTLER" = TRAIT_SETTLER, "TRAIT_SKITTISH" = TRAIT_SKITTISH, "TRAIT_PROSOPAGNOSIA" = TRAIT_PROSOPAGNOSIA, "TRAIT_TAGGER" = TRAIT_TAGGER, @@ -211,6 +212,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_EXPANDED_FOV" = TRAIT_EXPANDED_FOV, "TRAIT_GOOD_HEARING" = TRAIT_GOOD_HEARING, "TRAIT_XRAY_HEARING" = TRAIT_XRAY_HEARING, + "TRAIT_TENTACLE_IMMUNE" = TRAIT_TENTACLE_IMMUNE, + "TRAIT_OVERWATCH_IMMUNE" = TRAIT_OVERWATCH_IMMUNE, ), /obj/item/bodypart = list( "TRAIT_PARALYSIS" = TRAIT_PARALYSIS, @@ -239,6 +242,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_UNCATCHABLE" = TRAIT_UNCATCHABLE, "TRAIT_DANGEROUS_OBJECT" = TRAIT_DANGEROUS_OBJECT, "TRAIT_GERM_SENSITIVE" = TRAIT_GERM_SENSITIVE, + "TRAIT_HAUNTED" = TRAIT_HAUNTED, ), /atom = list( "TRAIT_KEEP_TOGETHER" = TRAIT_KEEP_TOGETHER, diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm index e33ba9cb540..ab5b3f4aad9 100644 --- a/code/_onclick/adjacent.dm +++ b/code/_onclick/adjacent.dm @@ -87,19 +87,23 @@ /* This checks if you there is uninterrupted airspace between that turf and this one. - This is defined as any dense ON_BORDER_1 object, or any dense object without LETPASSTHROW. +This is defined as any dense ON_BORDER_1 object, or any dense object without LETPASSTHROW or LETPASSCLICKS. The border_only flag allows you to not objects (for source and destination squares) */ /turf/proc/ClickCross(target_dir, border_only, atom/target, atom/movable/mover) for(var/obj/O in src) if((mover && O.CanPass(mover, target_dir)) || (!mover && !O.density)) continue - if(O == target || O == mover || (O.pass_flags_self & LETPASSTHROW)) //check if there's a dense object present on the turf - continue // LETPASSTHROW is used for anything you can click through (or the firedoor special case, see above) + + //If there's a dense object on the turf, only allow the click to pass if you can throw items over it or it has a special flag. + if(O == target || O == mover || (O.pass_flags_self & (LETPASSTHROW|LETPASSCLICKS))) + continue if( O.flags_1&ON_BORDER_1) // windows are on border, check them first if( O.dir & target_dir || O.dir & (O.dir-1) ) // full tile windows are just diagonals mechanically return FALSE //O.dir&(O.dir-1) is false for any cardinal direction, but true for diagonal ones + else if( !border_only ) // dense, not on border, cannot pass over return FALSE + return TRUE diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index f41683cbad7..95697862b3c 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -11,7 +11,7 @@ return if(ismob(A)) - ai_actual_track(A) + ai_tracking_tool.set_tracked_mob(src, A.name) else A.move_camera_by_click() diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 1b0f70badb4..e4d3e2f449e 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -339,9 +339,10 @@ /atom/proc/ShiftClick(mob/user) var/flags = SEND_SIGNAL(user, COMSIG_CLICK_SHIFT, src) + if(flags & COMSIG_MOB_CANCEL_CLICKON) + return if(user.client && (user.client.eye == user || user.client.eye == user.loc || flags & COMPONENT_ALLOW_EXAMINATE)) user.examinate(src) - return /** * Ctrl click diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index dfc380bb690..92340c59bc9 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -109,7 +109,7 @@ CtrlShiftClick(user) /obj/machinery/door/airlock/BorgCtrlShiftClick(mob/living/silicon/robot/user) // Sets/Unsets Emergency Access Override Forwards to AI code. - if(get_dist(src, user) <= user.interaction_range) + if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled)) AICtrlShiftClick(user) else ..() @@ -118,7 +118,7 @@ ShiftClick(user) /obj/machinery/door/airlock/BorgShiftClick(mob/living/silicon/robot/user) // Opens and closes doors! Forwards to AI code. - if(get_dist(src, user) <= user.interaction_range) + if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled)) AIShiftClick(user) else ..() @@ -128,44 +128,44 @@ CtrlClick(user) /obj/machinery/door/airlock/BorgCtrlClick(mob/living/silicon/robot/user) // Bolts doors. Forwards to AI code. - if(get_dist(src, user) <= user.interaction_range) + if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled)) AICtrlClick(user) else ..() /obj/machinery/power/apc/BorgCtrlClick(mob/living/silicon/robot/user) // turns off/on APCs. Forwards to AI code. - if(get_dist(src, user) <= user.interaction_range) + if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled)) AICtrlClick(user) else ..() /obj/machinery/power/apc/BorgCtrlShiftClick(mob/living/silicon/robot/user) - if(get_dist(src, user) <= user.interaction_range) + if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled)) AICtrlShiftClick(user) else ..() /obj/machinery/power/apc/BorgShiftClick(mob/living/silicon/robot/user) - if(get_dist(src, user) <= user.interaction_range) + if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled)) AIShiftClick(user) else ..() /obj/machinery/power/apc/BorgAltClick(mob/living/silicon/robot/user) - if(get_dist(src, user) <= user.interaction_range) + if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled)) AIAltClick(user) else ..() /obj/machinery/power/apc/attack_robot_secondary(mob/living/silicon/user, list/modifiers) - if(get_dist(src, user) <= user.interaction_range) + if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled)) return attack_ai_secondary(user, modifiers) else ..() /obj/machinery/turretid/BorgCtrlClick(mob/living/silicon/robot/user) //turret control on/off. Forwards to AI code. - if(get_dist(src, user) <= user.interaction_range) + if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled)) AICtrlClick(user) else ..() @@ -175,13 +175,13 @@ return /obj/machinery/door/airlock/BorgAltClick(mob/living/silicon/robot/user) // Eletrifies doors. Forwards to AI code. - if(get_dist(src, user) <= user.interaction_range) + if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled)) AIAltClick(user) else ..() /obj/machinery/turretid/BorgAltClick(mob/living/silicon/robot/user) //turret lethal on/off. Forwards to AI code. - if(get_dist(src, user) <= user.interaction_range) + if(get_dist(src, user) <= user.interaction_range && !(user.control_disabled)) AIAltClick(user) else ..() diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm index 3cd50a700e7..5f687d19642 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -30,13 +30,11 @@ icon_state = "track" /atom/movable/screen/ai/camera_track/Click() - if(..()) + . = ..() + if(.) return var/mob/living/silicon/ai/AI = usr - var/target_name = tgui_input_list(AI, "Select a target", "Tracking", AI.trackable_mobs()) - if(isnull(target_name)) - return - AI.ai_camera_track(target_name) + AI.ai_camera_track() /atom/movable/screen/ai/camera_light name = "Toggle Camera Light" diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index 60e3e4f7503..3c1b1029a3e 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -87,6 +87,12 @@ pull_icon.update_appearance() pull_icon.screen_loc = ui_above_movement static_inventory += pull_icon + + rest_icon = new /atom/movable/screen/rest(null, src) + rest_icon.icon = ui_style + rest_icon.screen_loc = ui_above_intent + rest_icon.update_appearance() + static_inventory += rest_icon //begin indicators diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm index 7d3b50da0c7..d9ebb3611b6 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -22,6 +22,12 @@ pull_icon.screen_loc = ui_above_movement hotkeybuttons += pull_icon + rest_icon = new /atom/movable/screen/rest(null, src) + rest_icon.icon = ui_style + rest_icon.screen_loc = ui_above_intent + rest_icon.update_appearance() + static_inventory += rest_icon + using = new/atom/movable/screen/language_menu(null, src) using.screen_loc = ui_alien_language_menu static_inventory += using diff --git a/code/_onclick/hud/generic_dextrous.dm b/code/_onclick/hud/generic_dextrous.dm index 29b78669d48..bf09fa33717 100644 --- a/code/_onclick/hud/generic_dextrous.dm +++ b/code/_onclick/hud/generic_dextrous.dm @@ -62,10 +62,3 @@ for(var/obj/item/I in D.held_items) I.screen_loc = null D.client.screen -= I - - -//Dextrous simple mobs can use hands! -/mob/living/simple_animal/create_mob_hud() - if(dextrous) - hud_type = dextrous_hud_type - return ..() diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index f762df16966..11f186e9877 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -78,7 +78,7 @@ using = new /atom/movable/screen/mov_intent(null, src) using.icon = ui_style - using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking") + using.icon_state = (owner.move_intent == MOVE_INTENT_RUN ? "running" : "walking") using.screen_loc = ui_movi static_inventory += using diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index 3ecb3bddd53..f54b81ca669 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -339,7 +339,7 @@ GLOBAL_LIST_EMPTY(radial_menus) /datum/radial_menu/Destroy() Reset() hide() - QDEL_NULL(custom_check_callback) + custom_check_callback = null . = ..() /* diff --git a/code/_onclick/hud/radial_persistent.dm b/code/_onclick/hud/radial_persistent.dm index 58dfa0e07ef..5fe81d005bd 100644 --- a/code/_onclick/hud/radial_persistent.dm +++ b/code/_onclick/hud/radial_persistent.dm @@ -49,7 +49,7 @@ set_choices(newchoices,tooltips, set_page = target_page) /datum/radial_menu/persistent/Destroy() - QDEL_NULL(select_proc_callback) + select_proc_callback = null GLOB.radial_menus -= uniqueid Reset() hide() diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 6f4fefe3fd4..a87014a49d3 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -326,15 +326,18 @@ toggle(usr) /atom/movable/screen/mov_intent/update_icon_state() - switch(hud?.mymob?.m_intent) + if(!hud || !hud.mymob || !isliving(hud.mymob)) + return + var/mob/living/living_hud_owner = hud.mymob + switch(living_hud_owner.move_intent) if(MOVE_INTENT_WALK) icon_state = "walking" if(MOVE_INTENT_RUN) icon_state = "running" return ..() -/atom/movable/screen/mov_intent/proc/toggle(mob/user) - if(isobserver(user)) +/atom/movable/screen/mov_intent/proc/toggle(mob/living/user) + if(!istype(user)) return user.toggle_move_intent(user) diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 5c9207a4f80..30eb87618a3 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -699,3 +699,11 @@ /datum/config_entry/flag/config_errors_runtime default = FALSE + +/datum/config_entry/number/upload_limit + default = 524288 + min_val = 0 + +/datum/config_entry/number/upload_limit_admin + default = 5242880 + min_val = 0 diff --git a/code/controllers/subsystem/achievements.dm b/code/controllers/subsystem/achievements.dm index 58fcb3efb73..e477848d739 100644 --- a/code/controllers/subsystem/achievements.dm +++ b/code/controllers/subsystem/achievements.dm @@ -6,6 +6,8 @@ SUBSYSTEM_DEF(achievements) ///List of achievements var/list/datum/award/achievement/achievements = list() + ///The achievement with the highest amount of players that have unlocked it. + var/datum/award/achievement/most_unlocked_achievement ///List of scores var/list/datum/award/score/scores = list() ///List of all awards @@ -16,18 +18,47 @@ SUBSYSTEM_DEF(achievements) return SS_INIT_NO_NEED achievements_enabled = TRUE - for(var/T in subtypesof(/datum/award/achievement)) - var/instance = new T - achievements[T] = instance - awards[T] = instance + var/list/achievements_by_db_id = list() + for(var/datum/award/achievement/achievement as anything in subtypesof(/datum/award/achievement)) + if(!initial(achievement.database_id)) // abstract type + continue + var/datum/award/achievement/instance = new achievement + achievements[achievement] = instance + awards[achievement] = instance + achievements_by_db_id[instance.database_id] = instance - for(var/T in subtypesof(/datum/award/score)) - var/instance = new T - scores[T] = instance - awards[T] = instance + for(var/datum/award/score/score as anything in subtypesof(/datum/award/score)) + if(!initial(score.database_id)) // abstract type + continue + var/instance = new score + scores[score] = instance + awards[score] = instance update_metadata() + /** + * Count how many (unlocked) achievements are in the achievements database + * then store that amount in the times_achieved variable for each achievement. + * + * Thanks to Jordie for the query. + */ + var/datum/db_query/query = SSdbcore.NewQuery( + "SELECT a.achievement_key, COUNT(a.achievement_key) AS count FROM achievements a \ + JOIN achievement_metadata m ON a.achievement_key = m.achievement_key AND m.achievement_type = 'achievement' \ + GROUP BY a.achievement_key ORDER BY count DESC" + ) + if(query.Execute(async = TRUE)) + while(query.NextRow()) + var/id = query.item[1] + var/datum/award/achievement/instance = id ? achievements_by_db_id[id] : null + if(isnull(instance)) // removed achievement + continue + instance.times_achieved = query.item[2] + // the results are ordered in descending orders, so the first in the list should be the most unlocked one. + if(!most_unlocked_achievement) + most_unlocked_achievement = instance + qdel(query) + for(var/i in GLOB.clients) var/client/C = i if(!C.player_details.achievements.initialized) @@ -65,8 +96,6 @@ SUBSYSTEM_DEF(achievements) var/list/to_update = list() for(var/T in awards) var/datum/award/A = awards[T] - if(!A.database_id) - continue if(!current_metadata[A.database_id] || current_metadata[A.database_id] < A.achievement_version) to_update += list(A.get_metadata_row()) diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index 933542746be..953cbd3bd4c 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -111,63 +111,6 @@ SUBSYSTEM_DEF(atoms) testing("Initialized [count] atoms") -/// Init this specific atom -/datum/controller/subsystem/atoms/proc/InitAtom(atom/A, from_template = FALSE, list/arguments) - var/the_type = A.type - - if(QDELING(A)) - // Check init_start_time to not worry about atoms created before the atoms SS that are cleaned up before this - if (A.gc_destroyed > init_start_time) - BadInitializeCalls[the_type] |= BAD_INIT_QDEL_BEFORE - return TRUE - - // This is handled and battle tested by dreamchecker. Limit to UNIT_TESTS just in case that ever fails. - #ifdef UNIT_TESTS - var/start_tick = world.time - #endif - - var/result = A.Initialize(arglist(arguments)) - - #ifdef UNIT_TESTS - if(start_tick != world.time) - BadInitializeCalls[the_type] |= BAD_INIT_SLEPT - #endif - - var/qdeleted = FALSE - - switch(result) - if (INITIALIZE_HINT_NORMAL) - // pass - if(INITIALIZE_HINT_LATELOAD) - if(arguments[1]) //mapload - late_loaders += A - else - A.LateInitialize() - if(INITIALIZE_HINT_QDEL) - qdel(A) - qdeleted = TRUE - else - BadInitializeCalls[the_type] |= BAD_INIT_NO_HINT - - if(!A) //possible harddel - qdeleted = TRUE - else if(!(A.flags_1 & INITIALIZED_1)) - BadInitializeCalls[the_type] |= BAD_INIT_DIDNT_INIT - else - SEND_SIGNAL(A, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE) - SEND_GLOBAL_SIGNAL(COMSIG_GLOB_ATOM_AFTER_POST_INIT, A) - var/atom/location = A.loc - if(location) - /// Sends a signal that the new atom `src`, has been created at `loc` - SEND_SIGNAL(location, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, A, arguments[1]) - var/area/atom_area = get_area(location) - if(atom_area) - SEND_SIGNAL(atom_area, COMSIG_AREA_INITIALIZED_IN, A) - if(created_atoms && from_template && ispath(the_type, /atom/movable))//we only want to populate the list with movables - created_atoms += A.get_all_contents() - - return qdeleted || QDELING(A) - /datum/controller/subsystem/atoms/proc/map_loader_begin(source) set_tracked_initalized(INITIALIZATION_INSSATOMS, source) diff --git a/code/controllers/subsystem/circuit_component.dm b/code/controllers/subsystem/circuit_component.dm index ceea6b7e44e..3ef1be5a3aa 100644 --- a/code/controllers/subsystem/circuit_component.dm +++ b/code/controllers/subsystem/circuit_component.dm @@ -28,8 +28,6 @@ SUBSYSTEM_DEF(circuit_component) to_call.user = null to_call.InvokeAsync() - qdel(to_call) - if(MC_TICK_CHECK) return @@ -76,7 +74,6 @@ SUBSYSTEM_DEF(circuit_component) instant_run_currentrun.Cut(1,2) to_call.user = null to_call.InvokeAsync(received_inputs) - qdel(to_call) if(length(instant_run_stack)) instant_run_callbacks_to_run = pop(instant_run_stack) diff --git a/code/controllers/subsystem/dcs.dm b/code/controllers/subsystem/dcs.dm index 014157da5a5..e130b6dc0ff 100644 --- a/code/controllers/subsystem/dcs.dm +++ b/code/controllers/subsystem/dcs.dm @@ -40,7 +40,7 @@ PROCESSING_SUBSYSTEM_DEF(dcs) CRASH("Attempted to instantiate [eletype] as a /datum/element") if(initial(eletype.element_flags) & ELEMENT_BESPOKE) - element_id = GetIdFromArguments(arguments) + element_id = length(arguments) == 1 ? "[arguments[1]]" : GetIdFromArguments(arguments) . = elements_by_type[element_id] if(. || !init_element) @@ -55,8 +55,8 @@ PROCESSING_SUBSYSTEM_DEF(dcs) **/ /datum/controller/subsystem/processing/dcs/proc/GetIdFromArguments(list/arguments) var/datum/element/eletype = arguments[1] - var/list/fullid = list("[eletype]") - var/list/named_arguments = list() + var/list/fullid = list(eletype) + var/list/named_arguments for(var/i in initial(eletype.argument_hash_start_idx) to length(arguments)) var/key = arguments[i] @@ -69,17 +69,21 @@ PROCESSING_SUBSYSTEM_DEF(dcs) if(PERFORM_ALL_TESTS(dcs_check_list_arguments) && islist(value)) add_to_arguments_that_are_lists(value, eletype) value = REF(value) + + if (!named_arguments) + named_arguments = list() + named_arguments[key] = value continue if (isnum(key)) - fullid += "[key]" + fullid += key else if(PERFORM_ALL_TESTS(dcs_check_list_arguments) && islist(key)) add_to_arguments_that_are_lists(key, eletype) fullid += REF(key) - if(length(named_arguments)) + if(named_arguments) named_arguments = sortTim(named_arguments, GLOBAL_PROC_REF(cmp_text_asc)) fullid += named_arguments diff --git a/code/controllers/subsystem/explosions.dm b/code/controllers/subsystem/explosions.dm index 9530e580fad..2021964609a 100644 --- a/code/controllers/subsystem/explosions.dm +++ b/code/controllers/subsystem/explosions.dm @@ -25,7 +25,11 @@ SUBSYSTEM_DEF(explosions) var/list/highturf = list() var/list/flameturf = list() + /// List of turfs to throw the contents of var/list/throwturf = list() + /// List of turfs to throw the contents of... AFTER the next explosion processes + /// This avoids order of operations errors and shit + var/list/held_throwturf = list() var/list/low_mov_atom = list() var/list/med_mov_atom = list() @@ -34,7 +38,7 @@ SUBSYSTEM_DEF(explosions) // Track how many explosions have happened. var/explosion_index = 0 - var/currentpart = SSAIR_PIPENETS + var/currentpart = SSEXPLOSIONS_TURFS /datum/controller/subsystem/explosions/stat_entry(msg) @@ -63,12 +67,13 @@ SUBSYSTEM_DEF(explosions) msg += "HO:[high_mov_atom.len]|" msg += "TO:[throwturf.len]" + msg += "HTO:[held_throwturf.len]" msg += "} " return ..() /datum/controller/subsystem/explosions/proc/is_exploding() - return (lowturf.len || medturf.len || highturf.len || flameturf.len || throwturf.len || low_mov_atom.len || med_mov_atom.len || high_mov_atom.len) + return (lowturf.len || medturf.len || highturf.len || flameturf.len || throwturf.len || held_throwturf.len || low_mov_atom.len || med_mov_atom.len || high_mov_atom.len) /datum/controller/subsystem/explosions/proc/wipe_turf(turf/T) lowturf -= T @@ -76,6 +81,7 @@ SUBSYSTEM_DEF(explosions) highturf -= T flameturf -= T throwturf -= T + held_throwturf -= T /client/proc/check_bomb_impacts() set name = "Check Bomb Impact" @@ -383,6 +389,7 @@ SUBSYSTEM_DEF(explosions) // we assert that turfs will be processed closed to farthest, so we can build this as we go along // This is gonna be an array, index'd by turfs var/list/cached_exp_block = list() + var/list/held_throwturf = src.held_throwturf //lists are guaranteed to contain at least 1 turf at this point //we presuppose that we'll be iterating away from the epicenter @@ -447,11 +454,11 @@ SUBSYSTEM_DEF(explosions) var/list/throwingturf = explode.explosion_throw_details if (throwingturf[1] < max_range - dist) throwingturf[1] = max_range - dist - throwingturf[2] = get_dir(epicenter, explode) + throwingturf[2] = epicenter throwingturf[3] = max_range else - explode.explosion_throw_details = list(max_range - dist, get_dir(epicenter, explode), max_range) - throwturf += explode + explode.explosion_throw_details = list(max_range - dist, epicenter, max_range) + held_throwturf += explode var/took = (REALTIMEOFDAY - started_at) / 10 @@ -690,6 +697,9 @@ SUBSYSTEM_DEF(explosions) EX_ACT(movable_thing, EXPLODE_LIGHT) cost_low_mov_atom = MC_AVERAGE(cost_low_mov_atom, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + /// Throwing only becomes acceptable after the explosions process, so we don't miss stuff that explosions GENERATE + throwturf = held_throwturf + held_throwturf = list() if (currentpart == SSEXPLOSIONS_THROWS) currentpart = SSEXPLOSIONS_TURFS @@ -705,14 +715,15 @@ SUBSYSTEM_DEF(explosions) if (length(details) != 3) continue var/throw_range = details[1] - var/throw_dir = details[2] + var/turf/center = details[2] var/max_range = details[3] for(var/atom/movable/A in explode) if(QDELETED(A)) continue if(!A.anchored && A.move_resist != INFINITY) - var/atom_throw_range = rand(throw_range, max_range) - var/turf/throw_at = get_ranged_target_turf(A, throw_dir, atom_throw_range) + // We want to have our distance matter, but we do want to bias to a lot of throw, for the vibe + var/atom_throw_range = rand(throw_range, max_range) + max_range * 0.3 + var/turf/throw_at = get_ranged_target_turf_direct(A, center, atom_throw_range, 180) // Throw 180 degrees away from the explosion source A.throw_at(throw_at, atom_throw_range, EXPLOSION_THROW_SPEED, quickstart = FALSE) cost_throwturf = MC_AVERAGE(cost_throwturf, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index f985868679c..88112f93226 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -232,6 +232,9 @@ SUBSYSTEM_DEF(garbage) message = "[message] (ref count of [refcount(D)])" #endif log_world(message) + var/detail = D.dump_harddel_info() + if(detail) + LAZYADD(I.extra_details, detail) #ifdef TESTING for(var/c in GLOB.admins) //Using testing() here would fill the logs with ADMIN_VV garbage diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 1c4023c71db..9b85f6e464c 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -940,7 +940,7 @@ SUBSYSTEM_DEF(job) return JOB_UNAVAILABLE_AGE //SKYRAT EDIT ADDITION BEGIN - CUSTOMIZATION - if(possible_job.veteran_only && !is_veteran_player(player.client)) + if(possible_job.veteran_only && !SSplayer_ranks.is_veteran(player.client)) JobDebug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_NOT_VETERAN)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") return JOB_NOT_VETERAN diff --git a/code/controllers/subsystem/lua.dm b/code/controllers/subsystem/lua.dm index d8fb642c1c9..641416b7243 100644 --- a/code/controllers/subsystem/lua.dm +++ b/code/controllers/subsystem/lua.dm @@ -18,7 +18,8 @@ SUBSYSTEM_DEF(lua) var/list/current_run = list() /// Protects return values from getting GCed before getting converted to lua values - var/gc_guard + /// Gets cleared every tick. + var/list/gc_guard = list() /datum/controller/subsystem/lua/Initialize() if(!CONFIG_GET(flag/auxtools_enabled)) @@ -99,6 +100,7 @@ SUBSYSTEM_DEF(lua) sleeps.Cut() resumes.Cut() + gc_guard.Cut() var/list/current_sleeps = current_run["sleeps"] var/list/affected_states = list() while(length(current_sleeps)) diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 298febf5385..a65ba66ed6c 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -144,6 +144,9 @@ SUBSYSTEM_DEF(mapping) if(CONFIG_GET(flag/roundstart_away)) createRandomZlevel(prob(CONFIG_GET(number/config_gateway_chance))) + else if (SSmapping.config.load_all_away_missions) // we're likely in a local testing environment, so punch it. + load_all_away_missions() + loading_ruins = TRUE setup_ruins() loading_ruins = FALSE @@ -944,3 +947,77 @@ GLOBAL_LIST_EMPTY(the_station_areas) /// Returns true if the map we're playing on is on a planet /datum/controller/subsystem/mapping/proc/is_planetary() return config.planetary + +/// For debug purposes, will add every single away mission present in a given directory. +/// You can optionally pass in a string directory to load from instead of the default. +/datum/controller/subsystem/mapping/proc/load_all_away_missions(map_directory) + if(!map_directory) + map_directory = "_maps/RandomZLevels/" + var/start_time = null // in case we're doing this at runtime, useful to know how much time we're spending loading all these away missions + var/confirmation_alert_result = null + var/new_wait = 0 // default to always zeroing out the wait time for away missions to be unlocked due to the unit-testery nature of this map + + if(IsAdminAdvancedProcCall()) + if(!check_rights(R_DEBUG)) + return + var/confirmation_string = "This will load every single away mission in the [map_directory] directory. This might cause a bit of lag that can only be cleared on a world restart. Are you sure you want to do this?" + confirmation_alert_result = tgui_alert(usr, confirmation_string, "DEBUG ONLY!!!", list("Yes", "Cancel")) + if(confirmation_alert_result != "Yes") + return + + var/current_wait_time = CONFIG_GET(number/gateway_delay) + switch(tgui_alert(usr, "Do you want to zero out the cooldown for access to these maps? Currently [DisplayTimeText(current_wait_time)]", "OH FUCK!!!", list("Yes", "No", "Cancel"))) + if("No") + new_wait = current_wait_time + if("Cancel") + return + + else + start_time = REALTIMEOFDAY + var/beginning_message = "Loading all away missions..." + to_chat(world, span_boldannounce(beginning_message)) + log_world(beginning_message) + log_mapping(beginning_message) + + var/list/all_away_missions = generate_map_list_from_directory(map_directory) + var/number_of_away_missions = length(all_away_missions) + for(var/entry in all_away_missions) + load_new_z_level(entry, entry, secret = FALSE) // entry in both fields so we know if something failed to load since it'll log the full file name of what was loaded. + + for(var/datum/gateway_destination/away_datum in GLOB.gateway_destinations) + away_datum.wait = new_wait + log_mapping("Now loading [away_datum.name]...") + + validate_z_level_loading(all_away_missions) + + if(!isnull(start_time)) + var/tracked_time = (REALTIMEOFDAY - start_time) / 10 + var/finished_message = "Loaded [number_of_away_missions] away missions in [tracked_time] second[tracked_time == 1 ? "" : "s"]!" + to_chat(world, span_boldannounce(finished_message)) + log_world(finished_message) + log_mapping(finished_message) + + if(isnull(confirmation_alert_result)) + log_mapping("All away missions have been loaded. List of away missions paired to corresponding Z-Levels are as follows:") + log_mapping(gather_z_level_information()) + return + + message_admins("[key_name_admin(usr)] has loaded every single away mission in the [map_directory] directory. [ADMIN_SEE_ZLEVEL_LAYOUT]") + log_game("[key_name(usr)] has loaded every single away mission in the [map_directory] directory.") + +/// Lightweight proc that just checks to make sure that all of the expected z-levels were loaded. Split out for clarity from load_all_away_missions() +/// Argument "checkable_levels" is just a list of the names (typically the filepaths) of the z-levels we were expected to load, which should correspond to the name on the space level datum. +/datum/controller/subsystem/mapping/proc/validate_z_level_loading(list/checkable_levels) + for(var/z in 1 to max(world.maxz, length(z_list))) + var/datum/space_level/level = z_list[z] + if(isnull(level)) + continue + + var/level_name = level.name + if(level_name in checkable_levels) + checkable_levels -= level_name + continue + + var/number_of_remaining_levels = length(checkable_levels) + if(number_of_remaining_levels > 0) + CRASH("The following [number_of_remaining_levels] away mission(s) were not loaded: [checkable_levels.Join("\n")]") diff --git a/code/controllers/subsystem/minor_mapping.dm b/code/controllers/subsystem/minor_mapping.dm index 7bdc3353637..8516ed98ea9 100644 --- a/code/controllers/subsystem/minor_mapping.dm +++ b/code/controllers/subsystem/minor_mapping.dm @@ -26,13 +26,13 @@ SUBSYSTEM_DEF(minor_mapping) to_spawn-- if(HAS_TRAIT(SSstation, STATION_TRAIT_SPIDER_INFESTATION) && prob(PROB_SPIDER_REPLACEMENT)) - new /mob/living/basic/giant_spider/maintenance(proposed_turf) + new /mob/living/basic/spider/maintenance(proposed_turf) return if (prob(PROB_MOUSE_SPAWN)) new /mob/living/basic/mouse(proposed_turf) else - new /mob/living/simple_animal/hostile/regalrat/controlled(proposed_turf) + new /mob/living/basic/regal_rat/controlled(proposed_turf) /// Returns true if a mouse won't die if spawned on this turf /datum/controller/subsystem/minor_mapping/proc/valid_mouse_turf(turf/open/proposed_turf) @@ -67,7 +67,9 @@ SUBSYSTEM_DEF(minor_mapping) for(var/turf/open/floor/plating/T in all_turfs) if(T.is_blocked_turf()) continue - if(locate(/obj/structure/cable) in T) + //dont include multiz cables in the list because repairing them sucks + var/cable = locate(/obj/structure/cable) in T + if(cable && !istype(cable, /obj/structure/cable/multilayer/multiz)) exposed_wires += T return shuffle(exposed_wires) diff --git a/code/controllers/subsystem/movement/movement_types.dm b/code/controllers/subsystem/movement/movement_types.dm index 2c8c411e236..7067b3abbfc 100644 --- a/code/controllers/subsystem/movement/movement_types.dm +++ b/code/controllers/subsystem/movement/movement_types.dm @@ -405,6 +405,7 @@ /datum/move_loop/has_target/jps/Destroy() id = null //Kill me avoid = null + on_finish_callback = null return ..() /datum/move_loop/has_target/jps/proc/handle_no_id() diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index e9c1260c6f7..278b5c804c4 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -1,6 +1,48 @@ #define EXP_ASSIGN_WAYFINDER 1200 #define RANDOM_QUIRK_BONUS 3 #define MINIMUM_RANDOM_QUIRKS 3 + +// Shifted to glob so they are generated at world start instead of risking players doing preference stuff before the subsystem inits +GLOBAL_LIST_INIT_TYPED(quirk_blacklist, /list/datum/quirk, list( + list(/datum/quirk/item_quirk/blindness, /datum/quirk/item_quirk/nearsighted), + list(/datum/quirk/jolly, /datum/quirk/depression, /datum/quirk/apathetic, /datum/quirk/hypersensitive), + list(/datum/quirk/no_taste, /datum/quirk/vegetarian, /datum/quirk/deviant_tastes, /datum/quirk/gamer), + list(/datum/quirk/pineapple_liker, /datum/quirk/pineapple_hater, /datum/quirk/gamer), + list(/datum/quirk/alcohol_tolerance, /datum/quirk/light_drinker), + list(/datum/quirk/item_quirk/clown_enjoyer, /datum/quirk/item_quirk/mime_fan, /datum/quirk/item_quirk/pride_pin), + list(/datum/quirk/bad_touch, /datum/quirk/friendly), + list(/datum/quirk/extrovert, /datum/quirk/introvert), + list(/datum/quirk/prosthetic_limb, /datum/quirk/quadruple_amputee, /datum/quirk/body_purist), + list(/datum/quirk/prosthetic_organ, /datum/quirk/tin_man, /datum/quirk/body_purist), + list(/datum/quirk/quadruple_amputee, /datum/quirk/paraplegic, /datum/quirk/hemiplegic), + list(/datum/quirk/quadruple_amputee, /datum/quirk/frail), + list(/datum/quirk/social_anxiety, /datum/quirk/mute), + list(/datum/quirk/mute, /datum/quirk/softspoken), + list(/datum/quirk/poor_aim, /datum/quirk/bighands), + list(/datum/quirk/bilingual, /datum/quirk/foreigner), + list(/datum/quirk/spacer_born, /datum/quirk/paraplegic, /datum/quirk/item_quirk/settler), + list(/datum/quirk/photophobia, /datum/quirk/nyctophobia), + list(/datum/quirk/item_quirk/settler, /datum/quirk/freerunning), + //SKYRAT EDIT ADDITION BEGIN + list(/datum/quirk/equipping/nerve_staple, /datum/quirk/nonviolent), + list(/datum/quirk/equipping/nerve_staple, /datum/quirk/item_quirk/nearsighted), + list(/datum/quirk/no_guns, /datum/quirk/bighands, /datum/quirk/poor_aim), + list(/datum/quirk/no_guns, /datum/quirk/nonviolent), + list(/datum/quirk/spacer_born, /datum/quirk/oversized), + //SKYRAT EDIT ADDITION END +)) + +GLOBAL_LIST_INIT(quirk_string_blacklist, generate_quirk_string_blacklist()) + +/proc/generate_quirk_string_blacklist() + var/list/string_blacklist = list() + for(var/blacklist in GLOB.quirk_blacklist) + var/list/string_list = list() + for(var/datum/quirk/typepath as anything in blacklist) + string_list += initial(typepath.name) + string_blacklist += list(string_list) + return string_blacklist + //Used to process and handle roundstart quirks // - Quirk strings are used for faster checking in code // - Quirk datums are stored and hold different effects, as well as being a vector for applying trait string @@ -15,43 +57,12 @@ PROCESSING_SUBSYSTEM_DEF(quirks) var/list/quirk_points = list() //Assoc. list of quirk names and their "point cost"; positive numbers are good traits, and negative ones are bad ///An assoc list of quirks that can be obtained as a hardcore character, and their hardcore value. var/list/hardcore_quirks = list() - - /// A list of quirks that can not be used with each other. Format: list(quirk1,quirk2),list(quirk3,quirk4) - var/static/list/quirk_blacklist = list( - list("Blind", "Nearsighted"), - list("Jolly", "Depression", "Apathetic", "Hypersensitive"), - list("Ageusia", "Vegetarian", "Deviant Tastes", "Gamer"), - list("Ananas Affinity", "Ananas Aversion", "Gamer"), - list("Alcohol Tolerance", "Light Drinker"), - list("Clown Enjoyer", "Mime Fan", "Pride Pin"), - list("Bad Touch", "Friendly"), - list("Extrovert", "Introvert"), - list("Prosthetic Limb", "Quadruple Amputee", "Body Purist"), - list("Prosthetic Organ", "Tin Man", "Body Purist"), - list("Quadruple Amputee", "Paraplegic", "Hemiplegic"), - list("Quadruple Amputee", "Frail"), - list("Social Anxiety", "Mute"), - list("Mute", "Soft-Spoken"), - list("Stormtrooper Aim", "Big Hands"), - list("Bilingual", "Foreigner"), - list("Spacer", "Paraplegic"), - list("Photophobia", "Nyctophobia"), - //SKYRAT EDIT ADDITION BEGIN - list("Nerve Stapled", "Pacifist"), - list("Nerve Stapled", "Nearsighted"), - list("No Guns", "Big Hands", "Stormtrooper Aim"), - list("No Guns", "Pacifist"), - list("Spacer", "Oversized"), - //SKYRAT EDIT ADDITION END - ) - //BUBBER EDIT ADDITION START - Species quirks /// A list of quirks that can only be used by a certain species. Format: list(quirk, species define) var/static/list/quirk_species_whitelist = list( list("Hydrophilic", "[SPECIES_SLIMESTART]") ) //BUBBER EDIT ADDITION END - /datum/controller/subsystem/processing/quirks/Initialize() get_quirks() return SS_INIT_SUCCESS @@ -119,7 +130,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) //Create a random list of stuff to start with while(bonus_quirks > added_quirk_count) var/quirk = pick(possible_quirks) //quirk is a string - if(quirk in quirk_blacklist) //prevent blacklisted + if(quirk in GLOB.quirk_blacklist) //prevent blacklisted possible_quirks -= quirk continue if(quirk_points[quirk] > 0) @@ -134,7 +145,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) if(!length(possible_quirks))//Lets not get stuck break var/quirk = pick(quirks) - if(quirk in quirk_blacklist) //prevent blacklisted + if(quirk in GLOB.quirk_blacklist) //prevent blacklisted possible_quirks -= quirk continue if(!quirk_points[quirk] < 0)//negative only @@ -149,7 +160,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) if(!length(possible_quirks))//Lets not get stuck break var/quirk = pick(quirks) - if(quirk in quirk_blacklist) //prevent blacklisted + if(quirk in GLOB.quirk_blacklist) //prevent blacklisted possible_quirks -= quirk continue if(!quirk_points[quirk] > 0) //positive only @@ -194,7 +205,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) var/blacklisted = FALSE - for (var/list/blacklist as anything in quirk_blacklist) + for (var/list/blacklist as anything in GLOB.quirk_blacklist) if (!(quirk in blacklist)) continue diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm index 4bb21be2c0a..60c8ecbf84c 100644 --- a/code/controllers/subsystem/throwing.dm +++ b/code/controllers/subsystem/throwing.dm @@ -55,7 +55,7 @@ SUBSYSTEM_DEF(throwing) var/init_dir ///The maximum number of turfs that the thrownthing will travel to reach it's target. var/maxrange - ///The speed of the projectile thrownthing being thrown. + ///Turfs to travel per tick var/speed ///If a mob is the one who has thrown the object, then it's moved here. This can be null and must be null checked before trying to use it. var/mob/thrower @@ -115,8 +115,7 @@ SUBSYSTEM_DEF(throwing) thrownthing = null thrower = null initial_target = null - if(callback) - QDEL_NULL(callback) //It stores a reference to the thrownthing, its source. Let's clean that. + callback = null return ..() ///Defines the datum behavior on the thrownthing's qdeletion event. diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index b9260e51312..c86ffa72d9a 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -73,7 +73,6 @@ SUBSYSTEM_DEF(ticker) var/discord_alerted = FALSE //SKYRAT EDIT - DISCORD PING SPAM PREVENTION /datum/controller/subsystem/ticker/Initialize() - load_mentors() // SKYRAT EDIT ADDITION - MENTORS STOPPED LOADING AUTOMATICALLY DUE TO RECENT TG CHANGES var/list/byond_sound_formats = list( "mid" = TRUE, "midi" = TRUE, diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index 9bd56294c69..7be217ffe71 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -579,8 +579,8 @@ SUBSYSTEM_DEF(timer) * * timer_subsystem the subsystem to insert this timer into */ /proc/_addtimer(datum/callback/callback, wait = 0, flags = 0, datum/controller/subsystem/timer/timer_subsystem, file, line) - if (!callback) - CRASH("addtimer called without a callback") + ASSERT(istype(callback), "addtimer called [callback ? "with an invalid callback ([callback])" : "without a callback"]") + ASSERT(isnum(wait), "addtimer called with a non-numeric wait ([wait])") if (wait < 0) stack_trace("addtimer called with a negative wait. Converting to [world.tick_lag]") diff --git a/code/controllers/subsystem/tts.dm b/code/controllers/subsystem/tts.dm index aa6b0d0e953..26f65b81256 100644 --- a/code/controllers/subsystem/tts.dm +++ b/code/controllers/subsystem/tts.dm @@ -417,3 +417,5 @@ SUBSYSTEM_DEF(tts) return request.is_complete() else return request.is_complete() && request_blips.is_complete() + +#undef SHIFT_DATA_ARRAY diff --git a/code/datums/achievements/_achievement_data.dm b/code/datums/achievements/_achievement_data.dm index 781863835d4..aa47d8e9fc8 100644 --- a/code/datums/achievements/_achievement_data.dm +++ b/code/datums/achievements/_achievement_data.dm @@ -49,9 +49,7 @@ var/datum/award/award = SSachievements.awards[award_type] if(!award || !award.name) //Skip abstract achievements types continue - if(!data[award_type]) - data[award_type] = award.parse_value(kv[award.database_id], data) - original_cached_data[award_type] = data[award_type] + award.on_achievement_data_init(src, kv[award.database_id]) ///Updates local cache with db data for the given achievement type if it wasn't loaded yet. /datum/achievement_data/proc/get_data(achievement_type) @@ -77,22 +75,12 @@ A.on_unlock(user) //Only on default achievement, as scores keep going up. else if(istype(A, /datum/award/score)) data[achievement_type] += value + update_static_data(user) ///Getter for the status/score of an achievement /datum/achievement_data/proc/get_achievement_status(achievement_type) return data[achievement_type] -///Resets an achievement to default values. -/datum/achievement_data/proc/reset(achievement_type) - if(!SSachievements.achievements_enabled) - return - var/datum/award/A = SSachievements.awards[achievement_type] - get_data(achievement_type) - if(istype(A, /datum/award/achievement)) - data[achievement_type] = FALSE - else if(istype(A, /datum/award/score)) - data[achievement_type] = 0 - /datum/achievement_data/ui_assets(mob/user) return list( get_asset_datum(/datum/asset/spritesheet/simple/achievements), @@ -107,34 +95,30 @@ ui = new(user, src, "Achievements") ui.open() -/datum/achievement_data/ui_data(mob/user) - var/ret_data = list() // screw standards (qustinnus you must rename src.data ok) - ret_data["categories"] = list("Bosses", "Jobs", "Misc", "Mafia", "Scores") - ret_data["achievements"] = list() - ret_data["user_key"] = user.ckey +/datum/achievement_data/ui_static_data(mob/user) + . = ..() + .["categories"] = GLOB.achievement_categories + .["achievements"] = list() + .["highscore"] = list() + .["user_key"] = user.ckey var/datum/asset/spritesheet/simple/assets = get_asset_datum(/datum/asset/spritesheet/simple/achievements) - //This should be split into static data later for(var/achievement_type in SSachievements.awards) - if(!SSachievements.awards[achievement_type].name) //No name? we a subtype. + var/datum/award/award = SSachievements.awards[achievement_type] + if(!award.name) //No name? we a subtype. continue if(isnull(data[achievement_type])) //We're still loading continue - var/list/this = list( - "name" = SSachievements.awards[achievement_type].name, - "desc" = SSachievements.awards[achievement_type].desc, - "category" = SSachievements.awards[achievement_type].category, - "icon_class" = assets.icon_class_name(SSachievements.awards[achievement_type].icon), + var/list/award_data = list( + "name" = award.name, + "desc" = award.desc, + "category" = award.category, + "icon_class" = assets.icon_class_name(award.icon), "value" = data[achievement_type], - "score" = ispath(achievement_type,/datum/award/score) ) - ret_data["achievements"] += list(this) + award_data += award.get_ui_data() + .["achievements"] += list(award_data) - return ret_data - -/datum/achievement_data/ui_static_data(mob/user) - . = ..() - .["highscore"] = list() for(var/score in SSachievements.scores) var/datum/award/score/S = SSachievements.scores[score] if(!S.name || !S.track_high_scores || !S.high_scores.len) diff --git a/code/datums/achievements/_awards.dm b/code/datums/achievements/_awards.dm index a2cb179e4d3..b7500d54d45 100644 --- a/code/datums/achievements/_awards.dm +++ b/code/datums/achievements/_awards.dm @@ -27,6 +27,9 @@ var/raw_value = get_raw_value(key) return parse_value(raw_value) +/datum/award/proc/on_achievement_data_init(datum/achievement_data/holder, database_value) + holder.original_cached_data[type] = holder.data[type] = parse_value(database_value) + ///This saves the changed data to the hub. /datum/award/proc/get_changed_rows(key, value) if(!database_id || !key || !name) @@ -62,29 +65,67 @@ return result //Should return sanitized value for achievement cache -/datum/award/proc/parse_value(raw_value, list/data) +/datum/award/proc/parse_value(raw_value) return default_value ///Can be overriden for achievement specific events /datum/award/proc/on_unlock(mob/user) return +///returns additional ui data for the Check Achievements menu +/datum/award/proc/get_ui_data() + return list( + "score" = FALSE, + "achieve_info" = null, + "achieve_tooltip" = null, + ) + ///Achievements are one-off awards for usually doing cool things. /datum/award/achievement desc = "Achievement for epic people" icon = "" // This should warn contributors that do not declare an icon when contributing new achievements. + ///How many players have earned this achievement + var/times_achieved = 0 /datum/award/achievement/get_metadata_row() . = ..() .["achievement_type"] = "achievement" -/datum/award/achievement/parse_value(raw_value, list/data) +/datum/award/achievement/get_ui_data() + . = ..() + .["achieve_info"] = "Unlocked by [times_achieved] players so far" + if(!SSachievements.most_unlocked_achievement) + .["achieve_tooltip"] = "No achievement has been unlocked yet. Be the first today!" + return + if(SSachievements.most_unlocked_achievement == src) + .["achieve_tooltip"] = "This is the most unlocked achievement" + return + var/percent = FLOOR(times_achieved / SSachievements.most_unlocked_achievement.times_achieved * 100, 0.01) + .["achieve_tooltip"] = "[(times_achieved && !percent) ? "Less than 0.01" : percent]% compared to the achievement unlocked by the most players: \"[SSachievements.most_unlocked_achievement.name])\"" + +/datum/award/achievement/parse_value(raw_value) return raw_value > 0 /datum/award/achievement/on_unlock(mob/user) . = ..() to_chat(user, span_greenannounce("Achievement unlocked: [name]!")) user.client.give_award(/datum/award/score/achievements_score, user, 1) + times_achieved++ + if(SSachievements.most_unlocked_achievement?.times_achieved < times_achieved) + SSachievements.most_unlocked_achievement = src + + var/datum/achievement_report/new_report = new /datum/achievement_report() + + new_report.winner = "[(user.real_name == user.name) ? user.real_name : "[user.real_name], as [user.name]"]" + new_report.cheevo = name + if(user.ckey) + new_report.winner_key = user.ckey + else + stack_trace("[name] achievement earned by [user], who did not have a ckey.") + + new_report.award_location = "[get_area_name(user)]" + + GLOB.achievements_unlocked += new_report ///Scores are for leaderboarded things, such as killcount of a specific boss /datum/award/score @@ -104,6 +145,10 @@ . = ..() .["achievement_type"] = "score" +/datum/award/score/get_ui_data() + . = ..() + .["score"] = TRUE + /datum/award/score/proc/LoadHighScores() var/datum/db_query/Q = SSdbcore.NewQuery( "SELECT ckey,value FROM [format_table_name("achievements")] WHERE achievement_key = :achievement_key ORDER BY value DESC LIMIT 50", @@ -119,7 +164,7 @@ high_scores[key] = score qdel(Q) -/datum/award/score/parse_value(raw_value, list/data) +/datum/award/score/parse_value(raw_value) return isnum(raw_value) ? raw_value : 0 ///Defining this here 'cause it's the first score a player should see in the Scores category. @@ -135,11 +180,13 @@ * So, let's start counting how many achievements have been unlocked so far and return its value instead, * which is why this award should always be loaded last. */ -/datum/award/score/achievements_score/parse_value(raw_value, list/data) - if(isnum(raw_value)) - return raw_value - . = 0 - for(var/award_type in data) - if(ispath(award_type, /datum/award/achievement) && data[award_type]) - .++ - return . +/datum/award/score/achievements_score/on_achievement_data_init(datum/achievement_data/holder, database_value) + if(isnum(database_value)) + return ..() + //We need to keep the value differents so that it's properly saved at the end of the round. + holder.original_cached_data[type] = 0 + var/value = 0 + for(var/award_type in holder.data) + if(ispath(award_type, /datum/award/achievement) && holder.data[award_type]) + value++ + holder.data[type] = value diff --git a/code/datums/achievements/misc_achievements.dm b/code/datums/achievements/misc_achievements.dm index 354d9a8dc36..1dd047ac244 100644 --- a/code/datums/achievements/misc_achievements.dm +++ b/code/datums/achievements/misc_achievements.dm @@ -241,3 +241,9 @@ desc = "I've paid my dues, shift after shift... I've done my sentence but commited no griff..." database_id = MEDAL_DEBT_EXTINGUISHED icon = "outdebted" + +/datum/award/achievement/misc/theoretical_limits + name = "All Within Theoretical Limits" + desc = "I never thought I'd see a resonance cascade, let alone prevent one..." + database_id = MEDAL_THEORETICAL_LIMITS + icon = "theoreticallimits" diff --git a/code/datums/actions/cooldown_action.dm b/code/datums/actions/cooldown_action.dm index 29bf2ff48ca..a7e0603461a 100644 --- a/code/datums/actions/cooldown_action.dm +++ b/code/datums/actions/cooldown_action.dm @@ -20,7 +20,7 @@ /// Significant figures to round cooldown to var/cooldown_rounding = 0.1 /// Shares cooldowns with other abiliies, bitflag - var/shared_cooldown + var/shared_cooldown = NONE /// List of prerequisite actions that are used in this sequenced ability, you cannot put other sequenced abilities in this var/list/sequence_actions /// List of prerequisite actions that have been initialized @@ -154,7 +154,7 @@ /datum/action/cooldown/proc/StartCooldown(override_cooldown_time, override_melee_cooldown_time) // "Shared cooldowns" covers actions which are not the same type, // but have the same cooldown group and are on the same mob - if(shared_cooldown) + if(shared_cooldown != NONE) StartCooldownOthers(override_cooldown_time) StartCooldownSelf(override_cooldown_time) @@ -238,7 +238,7 @@ /// For signal calling /datum/action/cooldown/proc/PreActivate(atom/target) - if(SEND_SIGNAL(owner, COMSIG_MOB_ABILITY_STARTED, src) & COMPONENT_BLOCK_ABILITY_START) + if(SEND_SIGNAL(owner, COMSIG_MOB_ABILITY_STARTED, src, target) & COMPONENT_BLOCK_ABILITY_START) return // Note, that PreActivate handles no cooldowns at all by default. // Be sure to call StartCooldown() in Activate() where necessary. diff --git a/code/datums/actions/items/toggles.dm b/code/datums/actions/items/toggles.dm index be145702d35..f0fcfb9783e 100644 --- a/code/datums/actions/items/toggles.dm +++ b/code/datums/actions/items/toggles.dm @@ -103,3 +103,7 @@ /datum/action/item_action/flip name = "Flip" + +/datum/action/item_action/call_link + name = "Call MODlink" + diff --git a/code/datums/actions/mobs/assume_form.dm b/code/datums/actions/mobs/assume_form.dm new file mode 100644 index 00000000000..b10a91c5d65 --- /dev/null +++ b/code/datums/actions/mobs/assume_form.dm @@ -0,0 +1,87 @@ +/// Allows a mob to assume the form of another item or mob. +/// Warning, this will likely shit the bricks if you add this action to anything more sophisticated than a basic mob- this isn't built for anything carbon-wise. +/datum/action/cooldown/mob_cooldown/assume_form + name = "Assume Form" + desc = "Choose something that you wish to blend into the environment as. Click on yourself to reset your appearance." + button_icon_state = "sniper_zoom" + background_icon_state = "bg_alien" + overlay_icon_state = "bg_alien_border" + ranged_mousepointer = 'icons/effects/mouse_pointers/supplypod_target.dmi' + check_flags = AB_CHECK_CONSCIOUS + cooldown_time = 1.5 SECONDS + + /// Stuff that we can not disguise as. + var/static/list/blacklist_typecache = typecacheof(list( + /atom/movable/screen, + /obj/effect, + /obj/energy_ball, + /obj/narsie, + /obj/singularity, + )) + +/datum/action/cooldown/mob_cooldown/assume_form/Grant(mob/grant_to) + . = ..() + RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(reset_appearances)) + +/datum/action/cooldown/mob_cooldown/assume_form/Remove(mob/remove_from) + reset_appearances() + UnregisterSignal(owner, COMSIG_LIVING_DEATH) + return ..() + +/datum/action/cooldown/mob_cooldown/assume_form/Activate(atom/target_atom) + StartCooldown(360 SECONDS, 360 SECONDS) + determine_intent(target_atom) + StartCooldown() + return TRUE + +/// Rapid proc to test if we can assume the form of a given atom. Returns TRUE if we can, FALSE if we can't. Done like this so we can be nice and explicit. +/datum/action/cooldown/mob_cooldown/assume_form/proc/can_assume_form(atom/target_atom) + if(is_type_in_typecache(target_atom, blacklist_typecache) || (!isobj(target_atom) && !ismob(target_atom))) + return FALSE + + return TRUE + +/// Determines what our user meant by their action. If they clicked on themselves, we reset our appearance. Otherwise, we assume the appearance of the clicked-on item. +/datum/action/cooldown/mob_cooldown/assume_form/proc/determine_intent(atom/target_atom) + if(!can_assume_form(target_atom)) + return + + if(target_atom == owner) + reset_appearances() + return + + assume_appearances(target_atom) + +/// Assumes the appearance of a desired movable and applies it to our mob. Target is the movable in question. +/datum/action/cooldown/mob_cooldown/assume_form/proc/assume_appearances(atom/movable/target_atom) + owner.appearance = target_atom.appearance + owner.copy_overlays(target_atom) + owner.alpha = max(target_atom.alpha, 150) //fucking chameleons + owner.transform = initial(target_atom.transform) + owner.pixel_x = target_atom.base_pixel_x + owner.pixel_y = target_atom.base_pixel_y + + // important: do this at the very end because we might have SIGNAL_ADDTRAIT for this on the mob that's dependent on the above logic + SEND_SIGNAL(owner, COMSIG_ACTION_DISGUISED_APPEARANCE, target_atom) + ADD_TRAIT(owner, TRAIT_DISGUISED, REF(src)) + +/// Resets the appearances of the mob to the default. +/datum/action/cooldown/mob_cooldown/assume_form/proc/reset_appearances() + SIGNAL_HANDLER + + if(!HAS_TRAIT(owner, TRAIT_DISGUISED)) + return // in case we're being invoked on death and we aren't disguised (or we just click on ourselves randomly), no need to do this additional work. + + owner.animate_movement = SLIDE_STEPS + owner.maptext = null + owner.alpha = initial(owner.alpha) + owner.color = initial(owner.color) + owner.desc = initial(owner.desc) + + owner.name = initial(owner.name) + owner.icon = initial(owner.icon) + owner.icon_state = initial(owner.icon_state) + owner.cut_overlays() + + // important: do this very end because we might have SIGNAL_REMOVETRAIT for this on the mob that's dependent on the above logic + REMOVE_TRAIT(owner, TRAIT_DISGUISED, REF(src)) diff --git a/code/datums/actions/mobs/fire_breath.dm b/code/datums/actions/mobs/fire_breath.dm index 1cc830e6de1..254a6081425 100644 --- a/code/datums/actions/mobs/fire_breath.dm +++ b/code/datums/actions/mobs/fire_breath.dm @@ -24,7 +24,8 @@ /datum/action/cooldown/mob_cooldown/fire_breath/proc/fire_line(atom/target, offset) SLEEP_CHECK_DEATH(0, owner) var/list/turfs = line_target(offset, fire_range, target) - dragon_fire_line(owner, turfs, ice_breath) + // This proc sleeps + INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(dragon_fire_line), owner, /* burn_turfs = */ turfs, /* frozen = */ ice_breath) /datum/action/cooldown/mob_cooldown/fire_breath/proc/line_target(offset, range, atom/target) if(!target) diff --git a/code/datums/actions/mobs/open_mob_commands.dm b/code/datums/actions/mobs/open_mob_commands.dm index 49a130a8730..008e7c4dc1b 100644 --- a/code/datums/actions/mobs/open_mob_commands.dm +++ b/code/datums/actions/mobs/open_mob_commands.dm @@ -8,7 +8,7 @@ /// Weakref for storing our stargazer var/datum/weakref/our_mob -/datum/action/cooldown/open_mob_commands/Grant(mob/granted_to, mob/living/basic/star_gazer/our_mob_input) +/datum/action/cooldown/open_mob_commands/Grant(mob/granted_to, mob/living/basic/heretic_summon/star_gazer/our_mob_input) . = ..() our_mob = WEAKREF(our_mob_input) @@ -18,7 +18,7 @@ /// Opens the pet command options menu for a mob. /datum/action/cooldown/open_mob_commands/proc/open_menu() - var/mob/living/basic/star_gazer/our_mob_resolved = our_mob?.resolve() + var/mob/living/basic/heretic_summon/star_gazer/our_mob_resolved = our_mob?.resolve() if(our_mob_resolved) var/datum/component/obeys_commands/command_component = our_mob_resolved.GetComponent(/datum/component/obeys_commands) if(command_component) diff --git a/code/datums/actions/mobs/small_sprite.dm b/code/datums/actions/mobs/small_sprite.dm deleted file mode 100644 index b53b46fe43a..00000000000 --- a/code/datums/actions/mobs/small_sprite.dm +++ /dev/null @@ -1,57 +0,0 @@ -//Small sprites -/datum/action/small_sprite - name = "Toggle Giant Sprite" - desc = "Others will always see you as giant." - button_icon = 'icons/mob/actions/actions_xeno.dmi' - button_icon_state = "smallqueen" - background_icon_state = "bg_alien" - overlay_icon_state = "bg_alien_border" - var/small = FALSE - var/small_icon - var/small_icon_state - -/datum/action/small_sprite/queen - small_icon = 'icons/mob/nonhuman-player/alien.dmi' - small_icon_state = "alienq" - -/datum/action/small_sprite/megafauna - button_icon = 'icons/mob/actions/actions_xeno.dmi' - small_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' - -/datum/action/small_sprite/megafauna/drake - small_icon_state = "ash_whelp" - -/datum/action/small_sprite/megafauna/colossus - small_icon_state = "Basilisk" - -/datum/action/small_sprite/megafauna/bubblegum - small_icon_state = "goliath2" - -/datum/action/small_sprite/megafauna/legion - small_icon_state = "mega_legion" - -/datum/action/small_sprite/mega_arachnid - small_icon = 'icons/mob/simple/jungle/arachnid.dmi' - small_icon_state = "arachnid_mini" - background_icon_state = "bg_demon" - overlay_icon_state = "bg_demon_border" - - -/datum/action/small_sprite/space_dragon - small_icon = 'icons/mob/simple/carp.dmi' - small_icon_state = "carp" - button_icon = 'icons/mob/simple/carp.dmi' - button_icon_state = "carp" - -/datum/action/small_sprite/Trigger(trigger_flags) - ..() - if(!small) - var/image/I = image(icon = small_icon, icon_state = small_icon_state, loc = owner) - I.override = TRUE - I.pixel_x -= owner.pixel_x - I.pixel_y -= owner.pixel_y - owner.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic, "smallsprite", I, AA_TARGET_SEE_APPEARANCE | AA_MATCH_TARGET_OVERLAYS) - small = TRUE - else - owner.remove_alt_appearance("smallsprite") - small = FALSE diff --git a/code/datums/actions/mobs/sneak.dm b/code/datums/actions/mobs/sneak.dm index 13ae5a784b8..3fed4f4d500 100644 --- a/code/datums/actions/mobs/sneak.dm +++ b/code/datums/actions/mobs/sneak.dm @@ -1,32 +1,37 @@ -/datum/action/cooldown/sneak +/datum/action/cooldown/mob_cooldown/sneak name = "Sneak" - desc = "Sneak into the enviorment." + desc = "Blend into the environment." button_icon = 'icons/mob/actions/actions_animal.dmi' button_icon_state = "sniper_zoom" background_icon_state = "bg_alien" overlay_icon_state = "bg_alien_border" check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED | AB_CHECK_INCAPACITATED + cooldown_time = 0.5 SECONDS + melee_cooldown_time = 0 SECONDS + click_to_activate = FALSE /// The alpha we go to when sneaking. var/sneak_alpha = 75 + /// How long it takes to become transparent + var/animation_time = 0.5 SECONDS -/datum/action/cooldown/sneak/Remove(mob/living/remove_from) +/datum/action/cooldown/mob_cooldown/sneak/Remove(mob/living/remove_from) if(HAS_TRAIT(remove_from, TRAIT_SNEAK)) remove_from.alpha = initial(remove_from.alpha) REMOVE_TRAIT(remove_from, TRAIT_SNEAK, name) return ..() -/datum/action/cooldown/sneak/Activate(atom/target) +/datum/action/cooldown/mob_cooldown/sneak/Activate(atom/target) if(HAS_TRAIT(owner, TRAIT_SNEAK)) // It's safest to go to the initial alpha of the mob. // Otherwise we get permanent invisbility exploits. - owner.alpha = initial(owner.alpha) - to_chat(owner, span_noticealien("You reveal yourself!")) + animate(owner, alpha = initial(owner.alpha), time = animation_time) + owner.balloon_alert(owner, "you reveal yourself") REMOVE_TRAIT(owner, TRAIT_SNEAK, name) else - owner.alpha = sneak_alpha - to_chat(owner, span_noticealien("You blend into the enviorment...")) + animate(owner, alpha = sneak_alpha, time = animation_time) + owner.balloon_alert(owner, "you blend into the environment") ADD_TRAIT(owner, TRAIT_SNEAK, name) return TRUE diff --git a/code/datums/ai/_ai_behavior.dm b/code/datums/ai/_ai_behavior.dm index 9089bb5cf6b..98ab8f2fc7e 100644 --- a/code/datums/ai/_ai_behavior.dm +++ b/code/datums/ai/_ai_behavior.dm @@ -21,11 +21,12 @@ /datum/ai_behavior/proc/finish_action(datum/ai_controller/controller, succeeded, ...) LAZYREMOVE(controller.current_behaviors, src) controller.behavior_args -= type - if(behavior_flags & AI_BEHAVIOR_REQUIRE_MOVEMENT) //If this was a movement task, reset our movement target if necessary - if(!(behavior_flags & AI_BEHAVIOR_KEEP_MOVE_TARGET_ON_FINISH)) - clear_movement_target(controller) - if(!(behavior_flags & AI_BEHAVIOR_KEEP_MOVING_TOWARDS_TARGET_ON_FINISH)) - controller.ai_movement.stop_moving_towards(controller) + if(!(behavior_flags & AI_BEHAVIOR_REQUIRE_MOVEMENT)) //If this was a movement task, reset our movement target if necessary + return + if(behavior_flags & AI_BEHAVIOR_KEEP_MOVE_TARGET_ON_FINISH) + return + clear_movement_target(controller) + controller.ai_movement.stop_moving_towards(controller) /// Helper proc to ensure consistency in setting the source of the movement target /datum/ai_behavior/proc/set_movement_target(datum/ai_controller/controller, atom/target, datum/ai_movement/new_movement) diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm index fc75c4b1f81..c396771a033 100644 --- a/code/datums/ai/_ai_controller.dm +++ b/code/datums/ai/_ai_controller.dm @@ -64,7 +64,8 @@ multiple modular subtrees with behaviors if(idle_behavior) idle_behavior = new idle_behavior() - PossessPawn(new_pawn) + if(!isnull(new_pawn)) // unit tests need the ai_controller to exist in isolation due to list schenanigans i hate it here + PossessPawn(new_pawn) /datum/ai_controller/Destroy(force, ...) set_ai_status(AI_STATUS_OFF) @@ -148,6 +149,9 @@ multiple modular subtrees with behaviors ///Proc for deinitializing the pawn to the old controller /datum/ai_controller/proc/UnpossessPawn(destroy) + if(isnull(pawn)) + return // instantiated without an applicable pawn, fine + UnregisterSignal(pawn, list(COMSIG_MOB_LOGIN, COMSIG_MOB_LOGOUT, COMSIG_MOB_STATCHANGE)) if(ai_movement.moving_controllers[src]) ai_movement.stop_moving_towards(src) @@ -155,7 +159,6 @@ multiple modular subtrees with behaviors pawn = null if(destroy) qdel(src) - return ///Returns TRUE if the ai controller can actually run at the moment. /datum/ai_controller/proc/able_to_run() @@ -542,6 +545,8 @@ multiple modular subtrees with behaviors * * key - A blackboard key */ /datum/ai_controller/proc/clear_blackboard_key(key) + if(isnull(blackboard[key])) + return CLEAR_AI_DATUM_TARGET(blackboard[key], key) blackboard[key] = null if(isnull(pawn)) diff --git a/code/datums/ai/_ai_planning_subtree.dm b/code/datums/ai/_ai_planning_subtree.dm index 6560e91c00f..b3f0ae9fb53 100644 --- a/code/datums/ai/_ai_planning_subtree.dm +++ b/code/datums/ai/_ai_planning_subtree.dm @@ -1,6 +1,9 @@ ///A subtree is attached to a controller and is occasionally called by /ai_controller/SelectBehaviors(), this mainly exists to act as a way to subtype and modify SelectBehaviors() without needing to subtype the ai controller itself /datum/ai_planning_subtree - + /// A list of typepaths of "operational datums" (elements/components) we absolutely NEED to run. Checked in unit tests, as well as be a nice reminder to developers that such a thing might be needed. + /// Note that in the Attach/Inititalize/New (or any future equivalent for these procs), you will need to add the trait TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM to the mob in question + /// in order for unit tests to succeed. This will break obviously enough if you don't do this and declare the required datum here however. + var/list/operational_datums = null ///Determines what behaviors should the controller try processing; if this returns SUBTREE_RETURN_FINISH_PLANNING then the controller won't go through the other subtrees should multiple exist in controller.planning_subtrees /datum/ai_planning_subtree/proc/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm index fca9e7bd732..486f9a0fdb2 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm @@ -33,17 +33,33 @@ /datum/ai_behavior/run_away_from_target/proc/plot_path_away_from(datum/ai_controller/controller, atom/target) var/turf/target_destination = get_turf(controller.pawn) - for (var/i in 1 to run_distance) - var/turf/test_destination = get_ranged_target_turf_direct(controller.pawn, target, range = i, offset = 180) - var/list/airlocks = SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/airlock) - if (test_destination.is_blocked_turf(exclude_mobs = TRUE, source_atom = controller.pawn, ignore_atoms = airlocks)) + var/static/list/offset_angles = list(45, 90, 135, 180, 225, 270) + for(var/angle in offset_angles) + var/turf/test_turf = get_furthest_turf(controller.pawn, angle, target) + if(isnull(test_turf)) + continue + var/distance_from_target = get_dist(target, test_turf) + if(distance_from_target <= get_dist(target, target_destination)) + continue + target_destination = test_turf + if(distance_from_target == run_distance) //we already got the max running distance break - target_destination = test_destination + if (target_destination == get_turf(controller.pawn)) return FALSE set_movement_target(controller, target_destination) return TRUE +/datum/ai_behavior/run_away_from_target/proc/get_furthest_turf(atom/source, angle, atom/target) + var/turf/return_turf + var/list/airlocks = SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/airlock) + for(var/i in 1 to run_distance) + var/turf/test_destination = get_ranged_target_turf_direct(source, target, range = i, offset = angle) + if(test_destination.is_blocked_turf(exclude_mobs = !source.density, source_atom = source, ignore_atoms = airlocks)) + break + return_turf = test_destination + return return_turf + /datum/ai_behavior/run_away_from_target/finish_action(datum/ai_controller/controller, succeeded, target_key, hiding_location_key) . = ..() if (clear_failed_targets) diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/targeted_mob_ability.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/targeted_mob_ability.dm index f3f18f94355..c0bd9d1323b 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/targeted_mob_ability.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/targeted_mob_ability.dm @@ -5,7 +5,7 @@ /datum/ai_behavior/targeted_mob_ability /datum/ai_behavior/targeted_mob_ability/perform(seconds_per_tick, datum/ai_controller/controller, ability_key, target_key) - var/datum/action/cooldown/ability = controller.blackboard[ability_key] + var/datum/action/cooldown/ability = get_ability_to_use(controller, ability_key) var/mob/living/target = controller.blackboard[target_key] if(QDELETED(ability) || QDELETED(target)) finish_action(controller, FALSE, ability_key, target_key) @@ -26,6 +26,9 @@ if(living_target.stat >= UNCONSCIOUS) controller.clear_blackboard_key(target_key) +/datum/ai_behavior/targeted_mob_ability/proc/get_ability_to_use(datum/ai_controller/controller, ability_key) + return controller.blackboard[ability_key] + /** * # Try Mob Ability and plan execute * Attempts to use a mob's cooldown ability on a target and then move the target into a special target blackboard datum diff --git a/code/datums/ai/basic_mobs/basic_subtrees/maintain_distance.dm b/code/datums/ai/basic_mobs/basic_subtrees/maintain_distance.dm new file mode 100644 index 00000000000..b80a28836a0 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/maintain_distance.dm @@ -0,0 +1,82 @@ +/// Step away if too close, or towards if too far +/datum/ai_planning_subtree/maintain_distance + /// Blackboard key holding atom we want to stay away from + var/target_key = BB_BASIC_MOB_CURRENT_TARGET + /// How close will we allow our target to get? + var/minimum_distance = 3 + /// How far away will we allow our target to get? + var/maximum_distance = 6 + /// How far do we look for our target? + var/view_distance = 10 + +/datum/ai_planning_subtree/maintain_distance/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + . = ..() + var/atom/target = controller.blackboard[target_key] + if (!isliving(target) || !can_see(controller.pawn, target, view_distance)) + return // Don't run away from cucumbers, they're not snakes + var/range = get_dist(controller.pawn, target) + if (range < minimum_distance) + controller.queue_behavior(/datum/ai_behavior/step_away, target_key) + return + if (range > maximum_distance) + controller.queue_behavior(/datum/ai_behavior/pursue_to_range, target_key, maximum_distance) + return + +/// Take one step away +/datum/ai_behavior/step_away + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + required_distance = 0 + action_cooldown = 0.2 SECONDS + +/datum/ai_behavior/step_away/setup(datum/ai_controller/controller, target_key) + . = ..() + var/atom/current_target = controller.blackboard[target_key] + if (QDELETED(current_target)) + return FALSE + + var/mob/living/our_pawn = controller.pawn + our_pawn.face_atom(current_target) + + var/turf/next_step = get_step_away(controller.pawn, current_target) + if (!isnull(next_step) && !next_step.is_blocked_turf(exclude_mobs = TRUE)) + set_movement_target(controller, target = next_step, new_movement = /datum/ai_movement/basic_avoidance/backstep) + return TRUE + + var/list/all_dirs = GLOB.alldirs.Copy() + all_dirs -= get_dir(controller.pawn, next_step) + all_dirs -= get_dir(controller.pawn, current_target) + shuffle_inplace(all_dirs) + + for (var/dir in all_dirs) + next_step = get_step(controller.pawn, dir) + if (!isnull(next_step) && !next_step.is_blocked_turf(exclude_mobs = TRUE)) + set_movement_target(controller, target = next_step, new_movement = /datum/ai_movement/basic_avoidance/backstep) + return TRUE + return FALSE + +/datum/ai_behavior/step_away/perform(seconds_per_tick, datum/ai_controller/controller) + . = ..() + finish_action(controller, succeeded = TRUE) + +/datum/ai_behavior/step_away/finish_action(datum/ai_controller/controller, succeeded) + . = ..() + controller.change_ai_movement_type(initial(controller.ai_movement)) + +/// Pursue a target until we are within a provided range +/datum/ai_behavior/pursue_to_range + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION | AI_BEHAVIOR_MOVE_AND_PERFORM + +/datum/ai_behavior/pursue_to_range/setup(datum/ai_controller/controller, target_key, range) + . = ..() + var/atom/current_target = controller.blackboard[target_key] + if (QDELETED(current_target)) + return FALSE + if (get_dist(controller.pawn, current_target) <= range) + return FALSE + set_movement_target(controller, current_target) + +/datum/ai_behavior/pursue_to_range/perform(seconds_per_tick, datum/ai_controller/controller, target_key, range) + var/atom/current_target = controller.blackboard[target_key] + if (!QDELETED(current_target) && get_dist(controller.pawn, current_target) > range) + return + finish_action(controller, succeeded = TRUE) diff --git a/code/datums/ai/basic_mobs/basic_subtrees/ranged_skirmish.dm b/code/datums/ai/basic_mobs/basic_subtrees/ranged_skirmish.dm new file mode 100644 index 00000000000..07fb6f8b0dc --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/ranged_skirmish.dm @@ -0,0 +1,53 @@ +/// Fire a ranged attack without interrupting movement. +/datum/ai_planning_subtree/ranged_skirmish + operational_datums = list(/datum/component/ranged_attacks) + /// Blackboard key holding target atom + var/target_key = BB_BASIC_MOB_CURRENT_TARGET + /// What AI behaviour do we actually run? + var/datum/ai_behavior/ranged_skirmish/attack_behavior = /datum/ai_behavior/ranged_skirmish + +/datum/ai_planning_subtree/ranged_skirmish/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + . = ..() + var/atom/target = controller.blackboard[target_key] + if(QDELETED(target)) + return + controller.queue_behavior(attack_behavior, target_key, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) + +/// How often will we try to perform our ranged attack? +/datum/ai_behavior/ranged_skirmish + action_cooldown = 1 SECONDS + /// If target is further away than this we don't fire + var/max_range = 9 + /// If target is closer than this we don't fire + var/min_range = 2 + +/datum/ai_behavior/ranged_skirmish/setup(datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) + . = ..() + var/atom/target = controller.blackboard[hiding_location_key] || controller.blackboard[target_key] + return !QDELETED(target) + +/datum/ai_behavior/ranged_skirmish/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) + . = ..() + var/atom/target = controller.blackboard[target_key] + if (QDELETED(target)) + finish_action(controller, succeeded = FALSE) + return + + var/datum/targetting_datum/targetting_datum = controller.blackboard[targetting_datum_key] + if(!targetting_datum.can_attack(controller.pawn, target)) + finish_action(controller, succeeded = FALSE) + return + + var/hiding_target = targetting_datum.find_hidden_mobs(controller.pawn, target) + controller.set_blackboard_key(hiding_location_key, hiding_target) + + target = hiding_target || target + + var/distance = get_dist(controller.pawn, target) + if (distance > max_range || distance < min_range) + finish_action(controller, succeeded = FALSE) + return + + var/mob/living/basic/gunman = controller.pawn + gunman.RangedAttack(target) + finish_action(controller, succeeded = TRUE) diff --git a/code/datums/ai/basic_mobs/basic_subtrees/simple_attack_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/simple_attack_target.dm index 5db0486a43a..90379fcac0a 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/simple_attack_target.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/simple_attack_target.dm @@ -12,8 +12,8 @@ /datum/ai_planning_subtree/basic_melee_attack_subtree/average_speed melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/average_speed -//If you give this to something without the element you are a dumbass. /datum/ai_planning_subtree/basic_ranged_attack_subtree + operational_datums = list(/datum/component/ranged_attacks) var/datum/ai_behavior/basic_ranged_attack/ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack /datum/ai_planning_subtree/basic_ranged_attack_subtree/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) diff --git a/code/datums/ai/basic_mobs/basic_subtrees/target_retaliate.dm b/code/datums/ai/basic_mobs/basic_subtrees/target_retaliate.dm index ccb740c9980..2d553fe4b2f 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/target_retaliate.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/target_retaliate.dm @@ -1,5 +1,6 @@ /// Sets the BB target to a mob which you can see and who has recently attacked you /datum/ai_planning_subtree/target_retaliate + operational_datums = list(/datum/element/ai_retaliate, /datum/component/ai_retaliate_advanced) /// Blackboard key which tells us how to select valid targets var/targetting_datum_key = BB_TARGETTING_DATUM /// Blackboard key in which to store selected target diff --git a/code/datums/ai/hunting_behavior/hunting_lights.dm b/code/datums/ai/hunting_behavior/hunting_lights.dm index f26743b7dfa..6b82e87f269 100644 --- a/code/datums/ai/hunting_behavior/hunting_lights.dm +++ b/code/datums/ai/hunting_behavior/hunting_lights.dm @@ -1,23 +1,18 @@ /datum/ai_planning_subtree/find_and_hunt_target/look_for_light_fixtures target_key = BB_LOW_PRIORITY_HUNTING_TARGET finding_behavior = /datum/ai_behavior/find_hunt_target/light_fixtures - hunting_behavior = /datum/ai_behavior/hunt_target/light_fixtures + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/light_fixtures hunt_targets = list(/obj/machinery/light) hunt_range = 7 -/datum/ai_behavior/hunt_target/light_fixtures +/datum/ai_behavior/hunt_target/unarmed_attack_target/light_fixtures hunt_cooldown = 10 SECONDS always_reset_target = TRUE -/datum/ai_behavior/hunt_target/light_fixtures/target_caught(mob/living/hunter, obj/machinery/light/hunted) - hunter.UnarmedAttack(hunted, TRUE) - /datum/ai_behavior/find_hunt_target/light_fixtures /datum/ai_behavior/find_hunt_target/light_fixtures/valid_dinner(mob/living/source, obj/machinery/light/dinner, radius) - if(istype(dinner, /obj/machinery/light)) - var/obj/machinery/light/light_target = dinner - if(light_target.status == LIGHT_BROKEN) //light is already broken - return FALSE + if(dinner.status == LIGHT_BROKEN) //light is already broken + return FALSE return can_see(source, dinner, radius) diff --git a/code/datums/ai/monkey/monkey_behaviors.dm b/code/datums/ai/monkey/monkey_behaviors.dm index 8b766224488..13ae6817005 100644 --- a/code/datums/ai/monkey/monkey_behaviors.dm +++ b/code/datums/ai/monkey/monkey_behaviors.dm @@ -316,7 +316,7 @@ if(!enemies[possible_enemy]) //We don't hate this creature! But we might still attack it! if(!controller.blackboard[BB_MONKEY_AGGRESSIVE]) //We are not aggressive either, so we won't attack! continue - if(HAS_AI_CONTROLLER_TYPE(possible_enemy, /datum/ai_controller/monkey) && !controller.blackboard[BB_MONKEY_TARGET_MONKEYS]) //Do not target poor monkes + if(faction_check(possible_enemy.faction, list(FACTION_MONKEY, FACTION_JUNGLE), exact_match = FALSE) && !controller.blackboard[BB_MONKEY_TARGET_MONKEYS]) // do not target your team. includes monkys gorillas etc. continue // Weighted list, so the closer they are the more likely they are to be chosen as the enemy valids[possible_enemy] = CEILING(100 / (get_dist(controller.pawn, possible_enemy) || 1), 1) diff --git a/code/datums/ai/monkey/monkey_controller.dm b/code/datums/ai/monkey/monkey_controller.dm index e60e8764ca7..951147007f9 100644 --- a/code/datums/ai/monkey/monkey_controller.dm +++ b/code/datums/ai/monkey/monkey_controller.dm @@ -53,7 +53,9 @@ have ways of interacting with a specific mob and control it. . = ..() if(. & AI_CONTROLLER_INCOMPATIBLE) return + pawn = new_pawn set_blackboard_key(BB_MONKEY_AGGRESSIVE, TRUE) //Angry cunt + set_trip_mode(mode = FALSE) /datum/ai_controller/monkey/TryPossessPawn(atom/new_pawn) if(!isliving(new_pawn)) diff --git a/code/datums/ai/movement/ai_movement_basic_avoidance.dm b/code/datums/ai/movement/ai_movement_basic_avoidance.dm index 8a610a5aabc..371fb9dbc4b 100644 --- a/code/datums/ai/movement/ai_movement_basic_avoidance.dm +++ b/code/datums/ai/movement/ai_movement_basic_avoidance.dm @@ -1,13 +1,15 @@ ///Uses Byond's basic obstacle avoidance movement /datum/ai_movement/basic_avoidance max_pathing_attempts = 10 + /// Movement flags to pass to the loop + var/move_flags = NONE /datum/ai_movement/basic_avoidance/start_moving_towards(datum/ai_controller/controller, atom/current_movement_target, min_distance) . = ..() var/atom/movable/moving = controller.pawn var/min_dist = controller.blackboard[BB_CURRENT_MIN_MOVE_DISTANCE] var/delay = controller.movement_delay - var/datum/move_loop/loop = SSmove_manager.move_to(moving, current_movement_target, min_dist, delay, subsystem = SSai_movement, extra_info = controller) + var/datum/move_loop/loop = SSmove_manager.move_to(moving, current_movement_target, min_dist, delay, flags = move_flags, subsystem = SSai_movement, extra_info = controller) RegisterSignal(loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(pre_move)) RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(post_move)) @@ -18,3 +20,7 @@ if(is_type_in_typecache(target_turf, GLOB.dangerous_turfs)) . = FALSE return . + +/// Move immediately and don't update our facing +/datum/ai_movement/basic_avoidance/backstep + move_flags = MOVEMENT_LOOP_START_FAST | MOVEMENT_LOOP_NO_DIR_UPDATE diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index 03badb20ea5..fc230632bdd 100644 --- a/code/datums/brain_damage/imaginary_friend.dm +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -194,7 +194,7 @@ return ..() /mob/camera/imaginary_friend/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range) - if (client?.prefs.read_preference(/datum/preference/toggle/enable_runechat) && (client.prefs.read_preference(/datum/preference/toggle/enable_runechat_non_mobs) || ismob(speaker))) + if (safe_read_pref(client, /datum/preference/toggle/enable_runechat) && (safe_read_pref(client, /datum/preference/toggle/enable_runechat_non_mobs) || ismob(speaker))) create_chat_message(speaker, message_language, raw_message, spans) to_chat(src, compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mods)) @@ -252,7 +252,7 @@ // Speech bubble, but only for those who have runechat off var/list/speech_bubble_recipients = list() for(var/mob/user as anything in (group + src)) // Add ourselves back in - if(user.client && (!user.client.prefs.read_preference(/datum/preference/toggle/enable_runechat) || (SSlag_switch.measures[DISABLE_RUNECHAT] && !HAS_TRAIT(src, TRAIT_BYPASS_MEASURES)))) + if((safe_read_pref(user.client, /datum/preference/toggle/enable_runechat) || (SSlag_switch.measures[DISABLE_RUNECHAT] && !HAS_TRAIT(src, TRAIT_BYPASS_MEASURES)))) speech_bubble_recipients.Add(user.client) var/image/bubble = image('icons/mob/effects/talk.dmi', src, "[bubble_type][say_test(message)]", FLY_LAYER) @@ -269,9 +269,9 @@ for(var/mob/dead_player in GLOB.dead_mob_list) if(dead_player.z != z || get_dist(src, dead_player) > 7) if(eavesdrop_range) - if(!(dead_player.client?.prefs.chat_toggles & CHAT_GHOSTWHISPER)) + if(!(get_chat_toggles(dead_player.client) & CHAT_GHOSTWHISPER)) continue - else if(!(dead_player.client?.prefs.chat_toggles & CHAT_GHOSTEARS)) + else if(!(get_chat_toggles(dead_player.client) & CHAT_GHOSTEARS)) continue var/link = FOLLOW_LINK(dead_player, owner) to_chat(dead_player, "[link] [dead_rendered]") @@ -311,12 +311,12 @@ for(var/mob/ghost as anything in GLOB.dead_mob_list) if(!ghost.client || isnewplayer(ghost)) continue - if(ghost.client.prefs.chat_toggles & CHAT_GHOSTSIGHT && !(ghost in viewers(user_turf, null))) + if(get_chat_toggles(ghost.client) & CHAT_GHOSTSIGHT && !(ghost in viewers(user_turf, null))) ghost.show_message("[FOLLOW_LINK(ghost, user)] [dchatmsg]") for(var/mob/person in friend.owner.imaginary_group) to_chat(person, message) - if(person.client?.prefs.read_preference(/datum/preference/toggle/enable_runechat)) + if(safe_read_pref(person.client, /datum/preference/toggle/enable_runechat)) person.create_chat_message(friend, raw_message = msg, runechat_flags = EMOTE_MESSAGE) return TRUE diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm index db1172b4c75..5275ff97150 100644 --- a/code/datums/brain_damage/mild.dm +++ b/code/datums/brain_damage/mild.dm @@ -133,7 +133,7 @@ /datum/brain_trauma/mild/muscle_weakness/on_life(seconds_per_tick, times_fired) var/fall_chance = 1 - if(owner.m_intent == MOVE_INTENT_RUN) + if(owner.move_intent == MOVE_INTENT_RUN) fall_chance += 2 if(SPT_PROB(0.5 * fall_chance, seconds_per_tick) && owner.body_position == STANDING_UP) to_chat(owner, span_warning("Your leg gives out!")) diff --git a/code/datums/brain_damage/phobia.dm b/code/datums/brain_damage/phobia.dm index 50bc4c2b22a..3360ed36052 100644 --- a/code/datums/brain_damage/phobia.dm +++ b/code/datums/brain_damage/phobia.dm @@ -187,6 +187,10 @@ phobia_type = "guns" random_gain = FALSE +/datum/brain_trauma/mild/phobia/heresy + phobia_type = "heresy" + random_gain = FALSE + /datum/brain_trauma/mild/phobia/insects phobia_type = "insects" random_gain = FALSE diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index bc59f0b7d70..90248df1cfb 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -143,7 +143,7 @@ var/sleep_chance = 1 var/drowsy = !!owner.has_status_effect(/datum/status_effect/drowsiness) - if(owner.m_intent == MOVE_INTENT_RUN) + if(owner.move_intent == MOVE_INTENT_RUN) sleep_chance += 2 if(drowsy) sleep_chance += 3 diff --git a/code/datums/callback.dm b/code/datums/callback.dm index a51639d0b9b..026762d58f7 100644 --- a/code/datums/callback.dm +++ b/code/datums/callback.dm @@ -68,6 +68,21 @@ if(usr) user = WEAKREF(usr) +/** + * Qdel a callback datum + * This is not allowed and will stack trace. callback datums are structs, if they are referenced they exist + * + * Arguments + * * force set to true to force the deletion to be allowed. + * * ... an optional list of extra arguments to pass to the proc + */ +/datum/callback/Destroy(force=FALSE, ...) + SHOULD_CALL_PARENT(FALSE) + if (force) + return ..() + stack_trace("Callbacks can not be qdeleted. If they are referenced, they must exist. ([object == GLOBAL_PROC ? GLOBAL_PROC : object.type] [delegate])") + return QDEL_HINT_LETMELIVE + /** * Invoke this callback * diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index edeb52bda04..6ee4eaddd3f 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -193,7 +193,7 @@ /datum/chatmessage/proc/finish_image_generation(mheight, atom/target, mob/owner, complete_text, lifespan) var/rough_time = REALTIMEOFDAY approx_lines = max(1, mheight / CHAT_MESSAGE_APPROX_LHEIGHT) - + var/starting_height = target.maptext_height // Translate any existing messages upwards, apply exponential decay factors to timers message_loc = isturf(target) ? target : get_atom_on_turf(target) if (owned_by.seen_messages) @@ -208,7 +208,12 @@ // When choosing to update the remaining time we have to be careful not to update the // scheduled time once the EOL has been executed. if (time_spent >= time_before_fade) - animate(m.message, pixel_y = m.message.pixel_y + mheight, time = CHAT_MESSAGE_SPAWN_TIME, flags = ANIMATION_PARALLEL) + if(m.message.pixel_y < starting_height) + var/max_height = m.message.pixel_y + m.approx_lines * CHAT_MESSAGE_APPROX_LHEIGHT - starting_height + if(max_height > 0) + animate(m.message, pixel_y = m.message.pixel_y + max_height, time = CHAT_MESSAGE_SPAWN_TIME, flags = ANIMATION_PARALLEL) + else if(mheight + starting_height >= m.message.pixel_y) + animate(m.message, pixel_y = m.message.pixel_y + mheight, time = CHAT_MESSAGE_SPAWN_TIME, flags = ANIMATION_PARALLEL) continue var/remaining_time = time_before_fade * (CHAT_MESSAGE_EXP_DECAY ** idx++) * (CHAT_MESSAGE_HEIGHT_DECAY ** combined_height) @@ -225,7 +230,12 @@ animate(alpha = 0, time = CHAT_MESSAGE_EOL_FADE) // We run this after the alpha animate, because we don't want to interrup it, but also don't want to block it by running first // Sooo instead we do this. bit messy but it fuckin works - animate(m.message, pixel_y = m.message.pixel_y + mheight, time = CHAT_MESSAGE_SPAWN_TIME, flags = ANIMATION_PARALLEL) + if(m.message.pixel_y < starting_height) + var/max_height = m.message.pixel_y + m.approx_lines * CHAT_MESSAGE_APPROX_LHEIGHT - starting_height + if(max_height > 0) + animate(m.message, pixel_y = m.message.pixel_y + max_height, time = CHAT_MESSAGE_SPAWN_TIME, flags = ANIMATION_PARALLEL) + else if(mheight + starting_height >= m.message.pixel_y) + animate(m.message, pixel_y = m.message.pixel_y + mheight, time = CHAT_MESSAGE_SPAWN_TIME, flags = ANIMATION_PARALLEL) // Reset z index if relevant if (current_z_idx >= CHAT_LAYER_MAX_Z) @@ -236,7 +246,7 @@ SET_PLANE_EXPLICIT(message, RUNECHAT_PLANE, message_loc) message.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA | KEEP_APART message.alpha = 0 - message.pixel_y = target.maptext_height + message.pixel_y = starting_height message.pixel_x = -target.base_pixel_x message.maptext_width = CHAT_MESSAGE_WIDTH message.maptext_height = mheight * 1.25 // We add extra because some characters are superscript, like actions diff --git a/code/datums/cinematics/_cinematic.dm b/code/datums/cinematics/_cinematic.dm index 68b288e1227..36b15998bf1 100644 --- a/code/datums/cinematics/_cinematic.dm +++ b/code/datums/cinematics/_cinematic.dm @@ -52,7 +52,7 @@ /datum/cinematic/Destroy() QDEL_NULL(screen) - QDEL_NULL(special_callback) + special_callback = null watching.Cut() locked.Cut() return ..() diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index c8bc176b5a9..e461aa2ee36 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -237,12 +237,12 @@ */ /datum/component/proc/_GetInverseTypeList(our_type = type) //we can do this one simple trick + . = list(our_type) var/current_type = parent_type - . = list(our_type, current_type) //and since most components are root level + 1, this won't even have to run while (current_type != /datum/component) + . += current_type current_type = type2parent(current_type) - . += current_type // The type arg is casted so initial works, you shouldn't be passing a real instance into this /** @@ -481,15 +481,16 @@ var/list/dc = _datum_components if(!dc) return - var/comps = dc[/datum/component] - if(islist(comps)) - for(var/datum/component/I in comps) - if(I.can_transfer) - target.TakeComponent(I) - else - var/datum/component/C = comps - if(C.can_transfer) - target.TakeComponent(comps) + for(var/component_key in dc) + var/component_or_list = dc[component_key] + if(islist(component_or_list)) + for(var/datum/component/I in component_or_list) + if(I.can_transfer) + target.TakeComponent(I) + else + var/datum/component/C = component_or_list + if(C.can_transfer) + target.TakeComponent(C) /** * Return the object that is the host of any UI's that this component has diff --git a/code/datums/components/acid.dm b/code/datums/components/acid.dm index 102bae88414..9758cd0c1b6 100644 --- a/code/datums/components/acid.dm +++ b/code/datums/components/acid.dm @@ -79,7 +79,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e if(particle_effect) QDEL_NULL(particle_effect) if(process_effect) - QDEL_NULL(process_effect) + process_effect = null return ..() /datum/component/acid/RegisterWithParent() @@ -257,7 +257,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e var/mob/living/crosser = arrived if(crosser.movement_type & FLYING) return - if(crosser.m_intent == MOVE_INTENT_WALK) + if(crosser.move_intent == MOVE_INTENT_WALK) return if(prob(60)) return diff --git a/code/datums/components/action_item_overlay.dm b/code/datums/components/action_item_overlay.dm index 221fc38775c..e7e567cde36 100644 --- a/code/datums/components/action_item_overlay.dm +++ b/code/datums/components/action_item_overlay.dm @@ -26,7 +26,7 @@ /datum/component/action_item_overlay/Destroy(force, silent) item_ref = null - QDEL_NULL(item_callback) + item_callback = null item_appearance = null return ..() diff --git a/code/datums/components/ai_has_target_timer.dm b/code/datums/components/ai_has_target_timer.dm new file mode 100644 index 00000000000..bcd748ce638 --- /dev/null +++ b/code/datums/components/ai_has_target_timer.dm @@ -0,0 +1,79 @@ +/// Increments a blackboard key while the attached mob is engaged with a particular target, does nothing else on its own +/datum/component/ai_target_timer + /// Blackboard key to store data inside + var/increment_key + /// Blackboard key to watch to indicate whether we are 'in combat' + var/target_key + /// Amount of time we have spent focused on one target + var/time_on_target = 0 + /// The last target we had + var/atom/last_target + /// Timer used to see if you + var/reset_clock_timer + +/datum/component/ai_target_timer/Initialize(increment_key = BB_BASIC_MOB_HAS_TARGET_TIME, target_key = BB_BASIC_MOB_CURRENT_TARGET) + . = ..() + if (!isliving(parent)) + return COMPONENT_INCOMPATIBLE + var/mob/living/mob_parent = parent + if (isnull(mob_parent.ai_controller)) + return COMPONENT_INCOMPATIBLE + src.increment_key = increment_key + src.target_key = target_key + +/datum/component/ai_target_timer/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_AI_BLACKBOARD_KEY_SET(target_key), PROC_REF(changed_target)) + RegisterSignal(parent, COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_key), PROC_REF(lost_target)) + ADD_TRAIT(parent, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, type) + +/datum/component/ai_target_timer/UnregisterFromParent() + finalise_losing_target() + UnregisterSignal(parent, list(COMSIG_AI_BLACKBOARD_KEY_SET(target_key), COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_key))) + REMOVE_TRAIT(parent, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, type) + return ..() + +/datum/component/ai_target_timer/Destroy(force, silent) + finalise_losing_target() + return ..() + +/// When we get a new target, reset the timer and start processing +/datum/component/ai_target_timer/proc/changed_target(mob/living/source) + SIGNAL_HANDLER + var/mob/living/living_parent = parent + var/atom/new_target = living_parent.ai_controller.blackboard[target_key] + deltimer(reset_clock_timer) + if (new_target == last_target) + return + time_on_target = 0 + store_current_time() + START_PROCESSING(SSdcs, src) + if (!isnull(last_target)) + UnregisterSignal(last_target, COMSIG_QDELETING) + RegisterSignal(new_target, COMSIG_QDELETING, PROC_REF(finalise_losing_target)) + last_target = new_target + +/// When we lose our target, start a short timer in case we reacquire it very quickly +/datum/component/ai_target_timer/proc/lost_target() + SIGNAL_HANDLER + reset_clock_timer = addtimer(CALLBACK(src, PROC_REF(finalise_losing_target)), 3 SECONDS, TIMER_STOPPABLE | TIMER_DELETE_ME) + +/// Called if we have had no target for long enough +/datum/component/ai_target_timer/proc/finalise_losing_target() + deltimer(reset_clock_timer) + STOP_PROCESSING(SSdcs, src) + if (!isnull(last_target)) + UnregisterSignal(last_target, COMSIG_QDELETING) + last_target = null + time_on_target = 0 + if (!QDELETED(parent)) + store_current_time() + +/// Store the current time on our timer in our blackboard key +/datum/component/ai_target_timer/proc/store_current_time() + var/mob/living/living_parent = parent + living_parent.ai_controller.set_blackboard_key(increment_key, time_on_target) + +/datum/component/ai_target_timer/process(seconds_per_tick) + time_on_target += seconds_per_tick SECONDS + store_current_time() diff --git a/code/datums/components/ai_listen_to_weather.dm b/code/datums/components/ai_listen_to_weather.dm new file mode 100644 index 00000000000..a7bb95ee8c1 --- /dev/null +++ b/code/datums/components/ai_listen_to_weather.dm @@ -0,0 +1,36 @@ +/** + * given to a mob to set a key on or off when a storm is coming or ending + */ +/datum/component/ai_listen_to_weather + ///what weather type are we listening to + var/weather_type + ///what blackboard key are we setting + var/weather_key + +/datum/component/ai_listen_to_weather/Initialize(weather_type = /datum/weather/ash_storm, weather_key = BB_STORM_APPROACHING) + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + src.weather_type = weather_type + src.weather_key = weather_key + +/datum/component/ai_listen_to_weather/RegisterWithParent() + RegisterSignal(SSdcs, COMSIG_WEATHER_START(weather_type), PROC_REF(storm_start)) + RegisterSignal(SSdcs, COMSIG_WEATHER_END(weather_type), PROC_REF(storm_end)) + +/datum/component/ai_listen_to_weather/UnregisterFromParent() + UnregisterSignal(SSdcs, list(COMSIG_WEATHER_START(weather_type), COMSIG_WEATHER_END(weather_type))) + +/datum/component/ai_listen_to_weather/proc/storm_start() + SIGNAL_HANDLER + + var/mob/living/basic/source = parent + if(!source.ai_controller) + return + source.ai_controller.CancelActions() + source.ai_controller.set_blackboard_key(weather_key, TRUE) + +/datum/component/ai_listen_to_weather/proc/storm_end() + SIGNAL_HANDLER + + var/mob/living/basic/source = parent + source.ai_controller?.set_blackboard_key(weather_key, FALSE) diff --git a/code/datums/components/ai_retaliate_advanced.dm b/code/datums/components/ai_retaliate_advanced.dm index 87e7442832d..ca477a0db27 100644 --- a/code/datums/components/ai_retaliate_advanced.dm +++ b/code/datums/components/ai_retaliate_advanced.dm @@ -1,6 +1,7 @@ /** * Attached to a mob with an AI controller, passes things which have damaged it to a blackboard. * The AI controller is responsible for doing anything with that information. + * Differs from the element as it passes new entries through a callback. */ /datum/component/ai_retaliate_advanced /// Callback to a mob for custom behaviour @@ -13,6 +14,12 @@ src.post_retaliate_callback = post_retaliate_callback parent.AddElement(/datum/element/relay_attackers) + ADD_TRAIT(parent, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, type) + +/datum/component/ai_retaliate_advanced/Destroy(force, silent) + post_retaliate_callback = null + return ..() + /datum/component/ai_retaliate_advanced/RegisterWithParent() RegisterSignal(parent, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked)) diff --git a/code/datums/components/anti_magic.dm b/code/datums/components/anti_magic.dm index e5e78fecf78..d3d53237777 100644 --- a/code/datums/components/anti_magic.dm +++ b/code/datums/components/anti_magic.dm @@ -56,8 +56,8 @@ src.expiration = expiration /datum/component/anti_magic/Destroy(force, silent) - QDEL_NULL(drain_antimagic) - QDEL_NULL(expiration) + drain_antimagic = null + expiration = null return ..() /datum/component/anti_magic/proc/register_antimagic_signals(datum/on_what) diff --git a/code/datums/components/appearance_on_aggro.dm b/code/datums/components/appearance_on_aggro.dm new file mode 100644 index 00000000000..85690a579ae --- /dev/null +++ b/code/datums/components/appearance_on_aggro.dm @@ -0,0 +1,49 @@ + +/** + * component gave to basic creatures to allow them to change appearance when find a target + */ +/datum/component/appearance_on_aggro + var/target_key = BB_BASIC_MOB_CURRENT_TARGET + /// path of the overlay to apply + var/mutable_appearance/overlay_path + /// visibility of our icon when aggroed + var/alpha_on_aggro + /// visibility of our icon when deaggroed + var/alpha_on_deaggro + +/datum/component/appearance_on_aggro/Initialize(overlay_icon, overlay_state, alpha_on_aggro, alpha_on_deaggro) + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + if(overlay_icon && overlay_state) + src.overlay_path = mutable_appearance(overlay_icon, overlay_state) + if(!alpha_on_aggro || !alpha_on_deaggro) + return + src.alpha_on_aggro = alpha_on_aggro + src.alpha_on_deaggro = alpha_on_deaggro + +/datum/component/appearance_on_aggro/RegisterWithParent() + RegisterSignal(parent, COMSIG_AI_BLACKBOARD_KEY_SET(target_key), PROC_REF(change_appearance)) + RegisterSignal(parent, COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_key), PROC_REF(revert_appearance)) + +/datum/component/appearance_on_aggro/UnregisterFromParent() + . = ..() + UnregisterSignal(parent, list(COMSIG_AI_BLACKBOARD_KEY_SET(target_key), COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_key))) + +/datum/component/appearance_on_aggro/proc/change_appearance(mob/living/source) + SIGNAL_HANDLER + + var/atom/target = source.ai_controller.blackboard[target_key] + if(isnull(target)) + return + if(overlay_path) + source.add_overlay(overlay_path) + if(alpha_on_aggro) + animate(source, alpha = alpha_on_aggro, time = 2 SECONDS) + +/datum/component/appearance_on_aggro/proc/revert_appearance(mob/living/source) + SIGNAL_HANDLER + + if(overlay_path) + source.cut_overlay(overlay_path) + if(alpha_on_deaggro) + animate(source, alpha = alpha_on_deaggro, time = 2 SECONDS) diff --git a/code/datums/components/basic_mob_attack_telegraph.dm b/code/datums/components/basic_mob_attack_telegraph.dm index 48359609bbb..6467fbd7bbc 100644 --- a/code/datums/components/basic_mob_attack_telegraph.dm +++ b/code/datums/components/basic_mob_attack_telegraph.dm @@ -14,7 +14,7 @@ /datum/component/basic_mob_attack_telegraph/Initialize( telegraph_icon = 'icons/mob/telegraphing/telegraph.dmi', telegraph_state = ATTACK_EFFECT_BITE, - telegraph_duration = 0.3 SECONDS, + telegraph_duration = 0.4 SECONDS, datum/callback/on_began_forecast, ) . = ..() @@ -25,6 +25,13 @@ src.telegraph_duration = telegraph_duration src.on_began_forecast = on_began_forecast +/datum/component/basic_mob_attack_telegraph/Destroy(force, silent) + if(current_target) + forget_target(current_target) + target_overlay = null + on_began_forecast = null + return ..() + /datum/component/basic_mob_attack_telegraph/RegisterWithParent() . = ..() RegisterSignal(parent, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(on_attack)) @@ -40,7 +47,7 @@ /// When we attempt to attack, check if it is allowed /datum/component/basic_mob_attack_telegraph/proc/on_attack(mob/living/basic/source, atom/target) SIGNAL_HANDLER - if (!isliving(target)) + if (!(isliving(target) || ismecha(target))) // Curse you CLARKE return if (HAS_TRAIT_FROM(source, TRAIT_BASIC_ATTACK_FORECAST, REF(src))) REMOVE_TRAIT(source, TRAIT_BASIC_ATTACK_FORECAST, REF(src)) @@ -51,7 +58,7 @@ return COMPONENT_HOSTILE_NO_ATTACK /// Perform an attack after a delay -/datum/component/basic_mob_attack_telegraph/proc/delayed_attack(mob/living/basic/source, mob/living/target) +/datum/component/basic_mob_attack_telegraph/proc/delayed_attack(mob/living/basic/source, atom/target) current_target = target target.add_overlay(target_overlay) RegisterSignal(target, COMSIG_QDELETING, PROC_REF(forget_target)) @@ -69,7 +76,7 @@ source.melee_attack(target) /// The guy we're trying to attack moved, is he still in range? -/datum/component/basic_mob_attack_telegraph/proc/target_moved(mob/living/target) +/datum/component/basic_mob_attack_telegraph/proc/target_moved(atom/target) SIGNAL_HANDLER if (in_range(parent, target)) return diff --git a/code/datums/components/basic_ranged_ready_overlay.dm b/code/datums/components/basic_ranged_ready_overlay.dm new file mode 100644 index 00000000000..434a64dd6ff --- /dev/null +++ b/code/datums/components/basic_ranged_ready_overlay.dm @@ -0,0 +1,56 @@ +/** + * Fade in an overlay x seconds after a basic mob makes a ranged attack + * Indicates that it will be ready to fire again + */ +/datum/component/basic_ranged_ready_overlay + /// Icon state for the overlay to display + var/overlay_state + /// Time after which to redisplay the overlay + var/display_after + /// Timer tracking when we can next fire + var/waiting_timer + +/datum/component/basic_ranged_ready_overlay/Initialize(overlay_state = "", display_after = 2.5 SECONDS) + . = ..() + if (!isbasicmob(parent)) + return COMPONENT_INCOMPATIBLE + if (!overlay_state) + CRASH("Attempted to assign basic ranged ready overlay with a null or empty overlay state") + src.overlay_state = overlay_state + src.display_after = display_after + restore_overlay(parent) + +/datum/component/basic_ranged_ready_overlay/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_BASICMOB_POST_ATTACK_RANGED, PROC_REF(on_ranged_attack)) + RegisterSignal(parent, COMSIG_MOB_STATCHANGE, PROC_REF(on_stat_changed)) + +/datum/component/basic_ranged_ready_overlay/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_BASICMOB_POST_ATTACK_RANGED, COMSIG_LIVING_REVIVE)) + return ..() + +/datum/component/basic_ranged_ready_overlay/Destroy(force, silent) + deltimer(waiting_timer) + return ..() + +/// When we shoot, get rid of our overlay and queue its return +/datum/component/basic_ranged_ready_overlay/proc/on_ranged_attack(mob/living/basic/firer, atom/target, modifiers) + SIGNAL_HANDLER + firer.cut_overlay(overlay_state) + waiting_timer = addtimer(CALLBACK(src, PROC_REF(restore_overlay), firer), display_after, TIMER_UNIQUE | TIMER_STOPPABLE | TIMER_DELETE_ME) + +/// Don't show overlay on a dead man +/datum/component/basic_ranged_ready_overlay/proc/on_stat_changed(mob/living/basic/gunman) + SIGNAL_HANDLER + if (gunman.stat == DEAD) + gunman.cut_overlay(overlay_state) + return + if (timeleft(waiting_timer) <= 0) + restore_overlay(parent) + +/// Try putting our overlay back +/datum/component/basic_ranged_ready_overlay/proc/restore_overlay(mob/living/basic/gunman) + if (QDELETED(gunman) || gunman.stat == DEAD) + return + gunman.cut_overlay(overlay_state) + gunman.add_overlay(overlay_state) diff --git a/code/datums/components/bullet_intercepting.dm b/code/datums/components/bullet_intercepting.dm index 151f748e8aa..d8de0680665 100644 --- a/code/datums/components/bullet_intercepting.dm +++ b/code/datums/components/bullet_intercepting.dm @@ -26,7 +26,8 @@ RegisterSignal(parent, COMSIG_ITEM_PRE_UNEQUIP, PROC_REF(on_unequipped)) /datum/component/bullet_intercepting/Destroy(force, silent) - QDEL_NULL(on_intercepted) + wearer = null + on_intercepted = null return ..() /// Called when item changes slots, check if we're in a valid location to take bullets diff --git a/code/datums/components/butchering.dm b/code/datums/components/butchering.dm index 8ed9cbcc116..6aa4555f3aa 100644 --- a/code/datums/components/butchering.dm +++ b/code/datums/components/butchering.dm @@ -34,6 +34,10 @@ if(isitem(parent)) RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(onItemAttack)) +/datum/component/butchering/Destroy(force, silent) + butcher_callback = null + return ..() + /datum/component/butchering/proc/onItemAttack(obj/item/source, mob/living/M, mob/living/user) SIGNAL_HANDLER diff --git a/code/datums/components/caltrop.dm b/code/datums/components/caltrop.dm index 28bcf0a6923..45a9d1976c5 100644 --- a/code/datums/components/caltrop.dm +++ b/code/datums/components/caltrop.dm @@ -75,7 +75,7 @@ if(HAS_TRAIT(H, TRAIT_PIERCEIMMUNE)) return - if((flags & CALTROP_IGNORE_WALKERS) && H.m_intent == MOVE_INTENT_WALK) + if((flags & CALTROP_IGNORE_WALKERS) && H.move_intent == MOVE_INTENT_WALK) return if(H.movement_type & (FLOATING|FLYING)) //check if they are able to pass over us diff --git a/code/datums/components/chasm.dm b/code/datums/components/chasm.dm index 30c63ebd021..9b59420b715 100644 --- a/code/datums/components/chasm.dm +++ b/code/datums/components/chasm.dm @@ -44,7 +44,7 @@ //otherwise don't do anything because turfs and areas are initialized before movables. if(!mapload) addtimer(CALLBACK(src, PROC_REF(drop_stuff)), 0) - parent.AddElement(/datum/element/lazy_fishing_spot, FISHING_SPOT_PRESET_CHASM) + parent.AddElement(/datum/element/lazy_fishing_spot, /datum/fish_source/chasm) /datum/component/chasm/UnregisterFromParent() storage = null diff --git a/code/datums/components/cleaner.dm b/code/datums/components/cleaner.dm index 3afdc8bf102..f63616863a1 100644 --- a/code/datums/components/cleaner.dm +++ b/code/datums/components/cleaner.dm @@ -30,10 +30,8 @@ src.on_cleaned_callback = on_cleaned_callback /datum/component/cleaner/Destroy(force, silent) - if(pre_clean_callback) - QDEL_NULL(pre_clean_callback) - if(on_cleaned_callback) - QDEL_NULL(on_cleaned_callback) + pre_clean_callback = null + on_cleaned_callback = null return ..() /datum/component/cleaner/RegisterWithParent() @@ -100,6 +98,11 @@ RegisterSignal(target, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(cleaning_target_moved)) var/mutable_appearance/low_bubble = mutable_appearance('icons/effects/effects.dmi', "bubbles", FLOOR_CLEAN_LAYER, target, GAME_PLANE) var/mutable_appearance/high_bubble = mutable_appearance('icons/effects/effects.dmi', "bubbles", FLOOR_CLEAN_LAYER, target, ABOVE_GAME_PLANE) + var/list/icon_offsets = target.get_oversized_icon_offsets() + low_bubble.pixel_x = icon_offsets["x"] + low_bubble.pixel_y = icon_offsets["y"] + high_bubble.pixel_x = icon_offsets["x"] + high_bubble.pixel_y = icon_offsets["y"] if(target.plane > low_bubble.plane) //check if the higher overlay is necessary target.add_overlay(high_bubble) else if(target.plane == low_bubble.plane) diff --git a/code/datums/components/combo_attacks.dm b/code/datums/components/combo_attacks.dm index 1524451b67a..33989e26682 100644 --- a/code/datums/components/combo_attacks.dm +++ b/code/datums/components/combo_attacks.dm @@ -32,6 +32,10 @@ src.leniency_time = leniency_time src.can_attack_callback = can_attack_callback +/datum/component/combo_attacks/Destroy(force, silent) + can_attack_callback = null + return ..() + /datum/component/combo_attacks/RegisterWithParent() RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) RegisterSignal(parent, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(on_examine_more)) diff --git a/code/datums/components/crafting/_recipes.dm b/code/datums/components/crafting/_recipes.dm index f517d7eb1d1..246f04df0f5 100644 --- a/code/datums/components/crafting/_recipes.dm +++ b/code/datums/components/crafting/_recipes.dm @@ -43,6 +43,10 @@ var/delete_contents = TRUE /datum/crafting_recipe/New() + if(!name && result) + var/atom/atom_result = result + name = initial(atom_result.name) + if(!(result in reqs)) blacklist += result // These should be excluded from all crafting recipies diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index 5df3899244b..056d81f9236 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -462,7 +462,7 @@ else if(!istype(result, /obj/effect/spawner)) result.forceMove(user.drop_location()) - to_chat(user, span_notice("[crafting_recipe.name] constructed.")) + to_chat(user, span_notice("Constructed [crafting_recipe.name].")) user.investigate_log("crafted [crafting_recipe]", INVESTIGATE_CRAFTING) crafting_recipe.on_craft_completion(user, result) else @@ -514,7 +514,7 @@ data["category"] = recipe.category // Name, Description - data["name"] = recipe.name || initial(atom.name) + data["name"] = recipe.name if(ispath(recipe.result, /datum/reagent)) var/datum/reagent/reagent = recipe.result diff --git a/code/datums/components/crafting/guncrafting.dm b/code/datums/components/crafting/guncrafting.dm index 0a42b2edd84..f239288b031 100644 --- a/code/datums/components/crafting/guncrafting.dm +++ b/code/datums/components/crafting/guncrafting.dm @@ -16,6 +16,12 @@ icon = 'icons/obj/weapons/improvised.dmi' icon_state = "riflestock" +/obj/item/weaponcrafting/giant_wrench + name = "Big Slappy parts kit" + desc = "Illegal parts to make a giant like wrench commonly known as a Big Slappy." + icon = 'icons/obj/weapons/improvised.dmi' + icon_state = "weaponkit_gw" + ///These gun kits are printed from the security protolathe to then be used in making new weapons // GUN PART KIT // diff --git a/code/datums/components/crafting/melee_weapon.dm b/code/datums/components/crafting/melee_weapon.dm index 0d50bf077e6..23873a5d7af 100644 --- a/code/datums/components/crafting/melee_weapon.dm +++ b/code/datums/components/crafting/melee_weapon.dm @@ -142,3 +142,17 @@ ) time = 10 SECONDS category = CAT_WEAPON_MELEE + +/datum/crafting_recipe/giant_wrench + name = "Big Slappy" + result = /obj/item/shovel/giant_wrench + tool_behaviors = list(TOOL_CROWBAR, TOOL_SCREWDRIVER, TOOL_WELDER) + reqs = list( + /obj/item/wrench = 4, + /obj/item/weaponcrafting/giant_wrench = 1, + /obj/item/stack/sheet/plasteel = 5, + /obj/item/stack/rods = 10, + /obj/item/pickaxe/drill = 1, + ) + time = 10 SECONDS + category = CAT_WEAPON_MELEE diff --git a/code/datums/components/crafting/robot.dm b/code/datums/components/crafting/robot.dm index ba5221f0d24..12202cf17f8 100644 --- a/code/datums/components/crafting/robot.dm +++ b/code/datums/components/crafting/robot.dm @@ -76,6 +76,7 @@ bot.medkit_type = medkit bot.healthanalyzer = bot.contents[4] + ///if you add a new one don't forget to update /obj/item/storage/medkit/attackby() if (istype(medkit, /obj/item/storage/medkit/fire)) bot.skin = "ointment" else if (istype(medkit, /obj/item/storage/medkit/toxin)) @@ -86,6 +87,8 @@ bot.skin = "brute" else if (istype(medkit, /obj/item/storage/medkit/advanced)) bot.skin = "advanced" + else if (istype(src, /obj/item/storage/medkit/tactical)) + bot.skin = "bezerk" bot.damagetype_healer = initial(medkit.damagetype_healed) ? initial(medkit.damagetype_healed) : BRUTE bot.update_appearance() diff --git a/code/datums/components/crafting/weapon_ammo.dm b/code/datums/components/crafting/weapon_ammo.dm index 912c3358ee7..fd6993220ec 100644 --- a/code/datums/components/crafting/weapon_ammo.dm +++ b/code/datums/components/crafting/weapon_ammo.dm @@ -36,13 +36,12 @@ category = CAT_WEAPON_AMMO /datum/crafting_recipe/frag12 - name = "FRAG-12 Shell" + name = "FRAG-12 Slug Shell" result = /obj/item/ammo_casing/shotgun/frag12 reqs = list( /obj/item/ammo_casing/shotgun/techshell = 1, /datum/reagent/glycerol = 5, - /datum/reagent/toxin/acid = 5, - /datum/reagent/toxin/acid/fluacid = 5, + /datum/reagent/toxin/acid/fluacid = 10, ) tool_behaviors = list(TOOL_SCREWDRIVER) time = 0.5 SECONDS diff --git a/code/datums/components/deadchat_control.dm b/code/datums/components/deadchat_control.dm index 0a31cae6b88..48096e47670 100644 --- a/code/datums/components/deadchat_control.dm +++ b/code/datums/components/deadchat_control.dm @@ -51,6 +51,7 @@ ckey_to_cooldown = null if(generated_point_of_interest) SSpoints_of_interest.remove_point_of_interest(parent) + on_removal = null return ..() /datum/component/deadchat_control/proc/deadchat_react(mob/source, message) diff --git a/code/datums/components/deployable.dm b/code/datums/components/deployable.dm index 7a5e798b337..e2c6b84703e 100644 --- a/code/datums/components/deployable.dm +++ b/code/datums/components/deployable.dm @@ -10,15 +10,18 @@ /datum/component/deployable /// The time it takes to deploy the object - var/deploy_time = 5 SECONDS + var/deploy_time /// The object that gets spawned if deployed successfully var/obj/thing_to_be_deployed + /// If the item used to deploy gets deleted on use or not + var/delete_on_use + /// If the component adds a little bit into the parent's description + var/add_description_hint + /// Used in getting the name of the deployed object var/deployed_name - /// If the item used to deploy gets deleted on use or not - var/delete_on_use = TRUE -/datum/component/deployable/Initialize(deploy_time, thing_to_be_deployed, delete_on_use) +/datum/component/deployable/Initialize(deploy_time = 5 SECONDS, thing_to_be_deployed, delete_on_use = TRUE, add_description_hint = TRUE) . = ..() if(!isitem(parent)) return COMPONENT_INCOMPATIBLE @@ -26,8 +29,10 @@ src.deploy_time = deploy_time src.thing_to_be_deployed = thing_to_be_deployed src.delete_on_use = delete_on_use + src.add_description_hint = add_description_hint - RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(examine)) + if(add_description_hint) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(examine)) RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(on_attack_hand)) var/obj/item/typecast = thing_to_be_deployed diff --git a/code/datums/components/effect_remover.dm b/code/datums/components/effect_remover.dm index 8a117961fd2..7f1f437eddf 100644 --- a/code/datums/components/effect_remover.dm +++ b/code/datums/components/effect_remover.dm @@ -42,7 +42,7 @@ src.time_to_remove = time_to_remove /datum/component/effect_remover/Destroy(force, silent) - QDEL_NULL(on_clear_callback) + on_clear_callback = null return ..() /datum/component/effect_remover/RegisterWithParent() diff --git a/code/datums/components/egg_layer.dm b/code/datums/components/egg_layer.dm index 7aceb7bd55d..a1e137de6d3 100644 --- a/code/datums/components/egg_layer.dm +++ b/code/datums/components/egg_layer.dm @@ -50,6 +50,7 @@ /datum/component/egg_layer/Destroy(force, silent) . = ..() STOP_PROCESSING(SSobj, src) + egg_laid_callback = null /datum/component/egg_layer/proc/feed_food(datum/source, obj/item/food, mob/living/attacker, params) SIGNAL_HANDLER diff --git a/code/datums/components/embedded.dm b/code/datums/components/embedded.dm index e49befeff06..8abb32e0e53 100644 --- a/code/datums/components/embedded.dm +++ b/code/datums/components/embedded.dm @@ -165,7 +165,7 @@ var/mob/living/carbon/victim = parent var/chance = jostle_chance - if(victim.m_intent == MOVE_INTENT_WALK || victim.body_position == LYING_DOWN) + if(victim.move_intent == MOVE_INTENT_WALK || victim.body_position == LYING_DOWN) chance *= 0.5 if(harmful && prob(chance)) diff --git a/code/datums/components/fantasy/_fantasy.dm b/code/datums/components/fantasy/_fantasy.dm index 31f969e6193..98796d52bc1 100644 --- a/code/datums/components/fantasy/_fantasy.dm +++ b/code/datums/components/fantasy/_fantasy.dm @@ -14,7 +14,7 @@ ///affixes expects an initialized list /datum/component/fantasy/Initialize(quality, list/affixes = list(), canFail=FALSE, announce=FALSE) - if(!isitem(parent)) + if(!isitem(parent) || HAS_TRAIT(parent, TRAIT_INNATELY_FANTASTICAL_ITEM)) return COMPONENT_INCOMPATIBLE src.quality = quality diff --git a/code/datums/components/fishing_spot.dm b/code/datums/components/fishing_spot.dm index 0c8b5caabce..3f230b8754d 100644 --- a/code/datums/components/fishing_spot.dm +++ b/code/datums/components/fishing_spot.dm @@ -11,16 +11,10 @@ //Use passed in instance fish_source = configuration else - /// Check if it's a preset key - var/datum/fish_source/preset_configuration = GLOB.preset_fish_sources[configuration] - if(!preset_configuration) - stack_trace("Invalid fishing spot configuration \"[configuration]\" passed down to fishing spot component.") - return COMPONENT_INCOMPATIBLE - fish_source = preset_configuration + return COMPONENT_INCOMPATIBLE RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(handle_attackby)) RegisterSignal(parent, COMSIG_FISHING_ROD_CAST, PROC_REF(handle_cast)) - /datum/component/fishing_spot/proc/handle_cast(datum/source, obj/item/fishing_rod/rod, mob/user) SIGNAL_HANDLER if(try_start_fishing(rod,user)) @@ -52,5 +46,5 @@ /// Roll what we caught based on modified table var/result = fish_source.roll_reward(rod, user) var/datum/fishing_challenge/challenge = new(src, result, rod, user) - fish_source.pre_challenge_started(rod, user) + fish_source.pre_challenge_started(rod, user, challenge) challenge.start(user) diff --git a/code/datums/components/food/edible.dm b/code/datums/components/food/edible.dm index e8c9a37c99f..9a2ad6973f8 100644 --- a/code/datums/components/food/edible.dm +++ b/code/datums/components/food/edible.dm @@ -187,9 +187,9 @@ Behavior that's still missing from this component that original food items had t setup_initial_reagents(initial_reagents) /datum/component/edible/Destroy(force, silent) - QDEL_NULL(after_eat) - QDEL_NULL(on_consume) - QDEL_NULL(check_liked) + after_eat = null + on_consume = null + check_liked = null return ..() /// Sets up the initial reagents of the food. diff --git a/code/datums/components/food/germ_sensitive.dm b/code/datums/components/food/germ_sensitive.dm index 7b362fb8182..22ba793c1ce 100644 --- a/code/datums/components/food/germ_sensitive.dm +++ b/code/datums/components/food/germ_sensitive.dm @@ -21,7 +21,7 @@ GLOBAL_LIST_INIT(floor_diseases, list( if(!isobj(parent)) return COMPONENT_INCOMPATIBLE - ADD_TRAIT(parent, TRAIT_GERM_SENSITIVE, src) + ADD_TRAIT(parent, TRAIT_GERM_SENSITIVE, REF(src)) RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(examine)) RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(handle_movement)) @@ -44,7 +44,7 @@ GLOBAL_LIST_INIT(floor_diseases, list( handle_movement() /datum/component/germ_sensitive/UnregisterFromParent() - REMOVE_TRAIT(parent, TRAIT_GERM_SENSITIVE, src) + REMOVE_TRAIT(parent, TRAIT_GERM_SENSITIVE, REF(src)) UnregisterSignal(parent, list( COMSIG_ATOM_EXAMINE, COMSIG_MOVABLE_MOVED, diff --git a/code/datums/components/food/golem_food.dm b/code/datums/components/food/golem_food.dm index e6b6fbbf4c3..79ac0a3e604 100644 --- a/code/datums/components/food/golem_food.dm +++ b/code/datums/components/food/golem_food.dm @@ -31,7 +31,8 @@ /datum/component/golem_food/Destroy(force, silent) QDEL_NULL(golem_snack) - QDEL_NULL(extra_validation) + snack_type = null + extra_validation = null return ..() /// Attempt to feed this item to golem diff --git a/code/datums/components/food/ice_cream_holder.dm b/code/datums/components/food/ice_cream_holder.dm index 0cb15ece936..9e25c7cb4b4 100644 --- a/code/datums/components/food/ice_cream_holder.dm +++ b/code/datums/components/food/ice_cream_holder.dm @@ -342,6 +342,7 @@ GLOBAL_LIST_INIT_TYPED(ice_cream_flavours, /datum/ice_cream_flavour, init_ice_cr ingredients_text = "optional flavorings" /datum/ice_cream_flavour/custom/korta + name = ICE_CREAM_KORTA_CUSTOM desc = "filled with artisanal lizard-friendly icecream. Made with real $CUSTOM_NAME. Ain't that something." ingredients = list(/datum/reagent/consumable/korta_milk, /datum/reagent/consumable/ice) ingredients_text = "optional flavorings" diff --git a/code/datums/components/gags_recolorable.dm b/code/datums/components/gags_recolorable.dm index f864ee5bd0c..96dceaf95d8 100644 --- a/code/datums/components/gags_recolorable.dm +++ b/code/datums/components/gags_recolorable.dm @@ -62,12 +62,3 @@ playsound(atom_parent.loc, 'sound/effects/spray.ogg', 5, TRUE, 5) atom_parent.set_greyscale(menu.split_colors) - - // If the item is a piece of clothing and is being worn, make sure it updates on the player - if(!isclothing(atom_parent)) - return - if(!ishuman(atom_parent.loc)) - return - var/obj/item/clothing/clothing_parent = atom_parent - var/mob/living/carbon/human/wearer = atom_parent.loc - wearer.update_clothing(clothing_parent.slot_flags) diff --git a/code/datums/components/ghost_direct_control.dm b/code/datums/components/ghost_direct_control.dm index 6ff22b4266a..c4d08380db1 100644 --- a/code/datums/components/ghost_direct_control.dm +++ b/code/datums/components/ghost_direct_control.dm @@ -48,8 +48,8 @@ return ..() /datum/component/ghost_direct_control/Destroy(force, silent) - QDEL_NULL(extra_control_checks) - QDEL_NULL(after_assumed_control) + extra_control_checks = null + after_assumed_control = null var/mob/mob_parent = parent var/list/spawners = GLOB.joinable_mobs[format_text("[initial(mob_parent.name)]")] diff --git a/code/datums/components/growth_and_differentiation.dm b/code/datums/components/growth_and_differentiation.dm index 3132ac46255..0920344ce58 100644 --- a/code/datums/components/growth_and_differentiation.dm +++ b/code/datums/components/growth_and_differentiation.dm @@ -66,6 +66,8 @@ /datum/component/growth_and_differentiation/Destroy(force, silent) STOP_PROCESSING(SSdcs, src) deltimer(timer_id) + optional_checks = null + optional_grow_behavior = null return ..() /// Wrapper for qdel() so we can pass it in RegisterSignals(). I hate it here too. diff --git a/code/datums/components/healing_touch.dm b/code/datums/components/healing_touch.dm index 723c6cf2d80..4b953fc6289 100644 --- a/code/datums/components/healing_touch.dm +++ b/code/datums/components/healing_touch.dm @@ -71,7 +71,7 @@ return ..() /datum/component/healing_touch/Destroy(force, silent) - QDEL_NULL(extra_checks) + extra_checks = null return ..() /// Validate our target, and interrupt the attack chain to start healing it if it is allowed diff --git a/code/datums/components/health_scaling_effects.dm b/code/datums/components/health_scaling_effects.dm index ecfb9ceb1e5..140a60ea962 100644 --- a/code/datums/components/health_scaling_effects.dm +++ b/code/datums/components/health_scaling_effects.dm @@ -54,7 +54,7 @@ return ..() /datum/component/health_scaling_effects/Destroy(force, silent) - QDEL_NULL(additional_status_callback) + additional_status_callback = null return ..() /// Called when mob health changes, recalculates the ratio between maximum and minimum diff --git a/code/datums/components/interaction_booby_trap.dm b/code/datums/components/interaction_booby_trap.dm index c099eec9174..6f57e4f6b75 100644 --- a/code/datums/components/interaction_booby_trap.dm +++ b/code/datums/components/interaction_booby_trap.dm @@ -59,8 +59,8 @@ /datum/component/interaction_booby_trap/Destroy(force, silent) UnregisterSignal(parent, list(COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_TOOL_ACT(defuse_tool), COMSIG_ATOM_EXAMINE_MORE) + additional_triggers) QDEL_NULL(active_sound_loop) - QDEL_NULL(on_triggered_callback) - QDEL_NULL(on_defused_callback) + on_triggered_callback = null + on_defused_callback = null return ..() /// Called when someone touches the parent atom with their hands, we want to blow up diff --git a/code/datums/components/jetpack.dm b/code/datums/components/jetpack.dm index 902a4a3430a..f7e1fca70e6 100644 --- a/code/datums/components/jetpack.dm +++ b/code/datums/components/jetpack.dm @@ -63,10 +63,10 @@ if(trail && trail.effect_type != effect_type) setup_trail(trail.holder) -/datum/component/jetpack/Destroy() +/datum/component/jetpack/Destroy(force, silent) if(trail) QDEL_NULL(trail) - QDEL_NULL(check_on_move) + check_on_move = null return ..() /datum/component/jetpack/proc/setup_trail(mob/user) diff --git a/code/datums/components/keep_me_secure.dm b/code/datums/components/keep_me_secure.dm index 903d3bf1d5d..9bce3ab5e86 100644 --- a/code/datums/components/keep_me_secure.dm +++ b/code/datums/components/keep_me_secure.dm @@ -22,6 +22,11 @@ src.secured_callback = secured_callback src.unsecured_callback = unsecured_callback +/datum/component/keep_me_secure/Destroy(force, silent) + secured_callback = null + unsecured_callback = null + return ..() + /datum/component/keep_me_secure/RegisterWithParent() last_move = world.time if (secured_callback || unsecured_callback) diff --git a/code/datums/components/label.dm b/code/datums/components/label.dm index 1b4257abc21..24b01ee52a3 100644 --- a/code/datums/components/label.dm +++ b/code/datums/components/label.dm @@ -83,7 +83,7 @@ /datum/component/label/proc/apply_label() var/atom/owner = parent owner.name += " ([label_name])" - ADD_TRAIT(owner, TRAIT_HAS_LABEL, src) + ADD_TRAIT(owner, TRAIT_HAS_LABEL, REF(src)) owner.update_appearance(UPDATE_ICON) /// Removes the label from the parent's name @@ -91,5 +91,5 @@ var/atom/owner = parent owner.name = replacetext(owner.name, "([label_name])", "") // Remove the label text from the parent's name, wherever it's located. owner.name = trim(owner.name) // Shave off any white space from the beginning or end of the parent's name. - REMOVE_TRAIT(owner, TRAIT_HAS_LABEL, src) + REMOVE_TRAIT(owner, TRAIT_HAS_LABEL, REF(src)) owner.update_appearance(UPDATE_ICON) diff --git a/code/datums/components/lock_on_cursor.dm b/code/datums/components/lock_on_cursor.dm index 1811a13aa9b..0ccac6ee2f9 100644 --- a/code/datums/components/lock_on_cursor.dm +++ b/code/datums/components/lock_on_cursor.dm @@ -62,12 +62,14 @@ mouse_tracker.assign_to_mob(owner) START_PROCESSING(SSfastprocess, src) -/datum/component/lock_on_cursor/Destroy() +/datum/component/lock_on_cursor/Destroy(force, silent) clear_visuals() STOP_PROCESSING(SSfastprocess, src) mouse_tracker = null var/mob/owner = parent owner.clear_fullscreen("lock_on") + on_lock = null + can_target_callback = null return ..() /// Adds overlays to all targets diff --git a/code/datums/components/magnet.dm b/code/datums/components/magnet.dm new file mode 100644 index 00000000000..5c78b8665ce --- /dev/null +++ b/code/datums/components/magnet.dm @@ -0,0 +1,70 @@ +/// Attracts items of a certain typepath +/datum/component/magnet + /// Range at which to pull items + var/pull_range + /// List of things we attract + var/list/attracted_typecache + /// What to do when we pull something + var/datum/callback/on_pulled + /// What to do when something reaches us + var/datum/callback/on_contact + /// Are we currently working? + var/active = TRUE + +/datum/component/magnet/Initialize( + pull_range = 5, + attracted_typecache = list(/obj/item/kitchen/spoon, /obj/item/kitchen/fork, /obj/item/knife), + on_pulled, + on_contact, +) + . = ..() + if (!length(attracted_typecache)) + CRASH("Attempted to instantiate a [src] on [parent] which does not do anything.") + if (!isatom(parent)) + return COMPONENT_INCOMPATIBLE + + src.pull_range = pull_range + src.attracted_typecache = typecacheof(attracted_typecache) + src.on_pulled = on_pulled + src.on_contact = on_contact + +/datum/component/magnet/RegisterWithParent() + . = ..() + START_PROCESSING(SSdcs, src) + if (!isliving(parent)) + return + RegisterSignal(parent, COMSIG_MOB_STATCHANGE, PROC_REF(toggle_on_stat_change)) + +/datum/component/magnet/UnregisterFromParent() + . = ..() + STOP_PROCESSING(SSdcs, src) + UnregisterSignal(parent, COMSIG_MOB_STATCHANGE) + +/datum/component/magnet/Destroy(force, silent) + STOP_PROCESSING(SSdcs, src) + on_pulled = null + on_contact = null + return ..() + +/// If a mob dies we stop attracting stuff +/datum/component/magnet/proc/toggle_on_stat_change(mob/living/source) + SIGNAL_HANDLER + if (source.stat == DEAD) + STOP_PROCESSING(SSdcs, src) + else + START_PROCESSING(SSdcs, src) + +/datum/component/magnet/process(seconds_per_tick) + for (var/atom/movable/thing in orange(pull_range, parent)) + if (!is_type_in_typecache(thing, attracted_typecache)) + continue + var/range = get_dist(thing, parent) + if (range == 0) + continue + if (range == 1 && !isnull(on_contact)) + on_contact.Invoke(thing) + continue + var/moved = thing.Move(get_step_towards(thing, parent)) + if (moved && !isnull(on_pulled)) + on_pulled.Invoke(thing) + CHECK_TICK diff --git a/code/datums/components/material/material_container.dm b/code/datums/components/material/material_container.dm index 99769ce7996..7f07c6cb91d 100644 --- a/code/datums/components/material/material_container.dm +++ b/code/datums/components/material/material_container.dm @@ -131,19 +131,27 @@ * - [source][/obj/item]: The source of the materials we are inserting. * - multiplier: The multiplier for the materials extract from this item being inserted. * - breakdown_flags: The breakdown bitflags that will be used to retrieve the materials from the source + * - context: the atom performing the operation, this is the last argument sent in COMSIG_MATCONTAINER_ITEM_CONSUMED and is used mostly for silo logging */ -/datum/component/material_container/proc/insert_item_materials(obj/item/source, multiplier = 1, breakdown_flags = mat_container_flags) +/datum/component/material_container/proc/insert_item_materials(obj/item/source, multiplier = 1, breakdown_flags = mat_container_flags, atom/context = parent) var/primary_mat var/max_mat_value = 0 + var/material_amount = 0 var/list/item_materials = source.get_material_composition(breakdown_flags) + var/list/mats_consumed = list() for(var/MAT in item_materials) if(!can_hold_material(MAT)) continue - materials[MAT] += OPTIMAL_COST(item_materials[MAT] * multiplier) + var/mat_amount = OPTIMAL_COST(item_materials[MAT] * multiplier) + materials[MAT] += mat_amount if(item_materials[MAT] > max_mat_value) max_mat_value = item_materials[MAT] primary_mat = MAT + mats_consumed[MAT] = mat_amount + material_amount += mat_amount + if(length(mats_consumed)) + SEND_SIGNAL(src, COMSIG_MATCONTAINER_ITEM_CONSUMED, source, primary_mat, mats_consumed, material_amount, context) return primary_mat //=================================================================================== @@ -188,15 +196,16 @@ * - [weapon][obj/item]: the item you are trying to insert * - multiplier: The multiplier for the materials being inserted * - breakdown_flags: The breakdown bitflags that will be used to retrieve the materials from the source + * - context: the atom performing the operation, this is the last argument sent in COMSIG_MATCONTAINER_ITEM_CONSUMED and is used mostly for silo logging */ -/datum/component/material_container/proc/insert_item(obj/item/weapon, multiplier = 1, breakdown_flags = mat_container_flags) +/datum/component/material_container/proc/insert_item(obj/item/weapon, multiplier = 1, breakdown_flags = mat_container_flags, atom/context = parent) if(QDELETED(weapon)) return MATERIAL_INSERT_ITEM_NO_MATS multiplier = CEILING(multiplier, 0.01) var/obj/item/target = weapon - var/material_amount = get_item_material_amount(target, breakdown_flags) * multiplier + var/material_amount = OPTIMAL_COST(get_item_material_amount(target, breakdown_flags) * multiplier) if(!material_amount) return MATERIAL_INSERT_ITEM_NO_MATS var/obj/item/stack/item_stack @@ -218,9 +227,8 @@ return MATERIAL_INSERT_ITEM_NO_SPACE //do the insert - var/last_inserted_id = insert_item_materials(target, multiplier, breakdown_flags) + var/last_inserted_id = insert_item_materials(target, multiplier, breakdown_flags, context) if(!isnull(last_inserted_id)) - SEND_SIGNAL(src, COMSIG_MATCONTAINER_ITEM_CONSUMED, target, last_inserted_id, material_amount, src) qdel(target) //item gone return material_amount else if(!isnull(item_stack) && item_stack != target) //insertion failed, merge the split stack back into the original @@ -242,8 +250,9 @@ * * held_item - the item to insert * * user - the mob inserting this item * * breakdown_flags - how this item and all it's contents inside are broken down during insertion. This is unique to the machine doing the insertion + * * context - the atom performing the operation, this is the last argument sent in COMSIG_MATCONTAINER_ITEM_CONSUMED and is used mostly for silo logging */ -/datum/component/material_container/proc/user_insert(obj/item/held_item, mob/living/user, breakdown_flags = mat_container_flags) +/datum/component/material_container/proc/user_insert(obj/item/held_item, mob/living/user, breakdown_flags = mat_container_flags, atom/context = parent) set waitfor = FALSE . = 0 @@ -327,7 +336,7 @@ //insert the item var/item_name = target.name - var/inserted = insert_item(target, breakdown_flags = mat_container_flags) + var/inserted = insert_item(target, 1, mat_container_flags, context) if(inserted > 0) . += inserted inserted /= SHEET_MATERIAL_AMOUNT // display units inserted as sheets for improved readability @@ -438,7 +447,7 @@ * * Arguments: * -[mat][datum/material] : the material type to check for 3 cases - * a) If it's an path its ref is retrived + * a) If it's an path its ref is retrieved * b) If it's text then its an category material & there is no way to deal with it so return 0 * c) If normal material proceeds as usual */ @@ -452,7 +461,7 @@ * if this container does not support glass, any glass in 'I' will not be taken into account * * Arguments: - * - [I][obj/item]: the item whos materials must be retrived + * - [I][obj/item]: the item whos materials must be retrieved * - breakdown_flags: how this item must be broken down to retrive its materials */ /datum/component/material_container/proc/get_item_material_amount(obj/item/I, breakdown_flags = mat_container_flags) @@ -564,44 +573,52 @@ * sheet_amt: number of sheets to extract * [material][datum/material]: type of sheets present in this container to extract * [target][atom]: drop location + * [atom][context]: context - the atom performing the operation, this is the last argument sent in COMSIG_MATCONTAINER_SHEETS_RETRIEVED and is used mostly for silo logging */ -/datum/component/material_container/proc/retrieve_sheets(sheet_amt, datum/material/material, atom/target = null) +/datum/component/material_container/proc/retrieve_sheets(sheet_amt, datum/material/material, atom/target = null, atom/context = parent) + //do we support sheets of this material if(!material.sheet_type) return 0 //Add greyscale sheet handling here later - if(sheet_amt <= 0) + if(!can_hold_material(material)) return 0 + //requested amount greater than available amount or just an invalid value + sheet_amt = min(round(materials[material] / SHEET_MATERIAL_AMOUNT), sheet_amt) + if(sheet_amt <= 0) + return 0 + //auto drop location if(!target) var/atom/parent_atom = parent target = parent_atom.drop_location() - if(materials[material] < (sheet_amt * SHEET_MATERIAL_AMOUNT)) - sheet_amt = round(materials[material] / SHEET_MATERIAL_AMOUNT) - var/count = 0 - while(sheet_amt > MAX_STACK_SIZE) - var/obj/item/stack/sheet/new_sheets = new material.sheet_type(target, MAX_STACK_SIZE, null, list((material) = SHEET_MATERIAL_AMOUNT)) - count += MAX_STACK_SIZE - use_amount_mat(sheet_amt * SHEET_MATERIAL_AMOUNT, material) - sheet_amt -= MAX_STACK_SIZE - SEND_SIGNAL(src, COMSIG_MATCONTAINER_SHEETS_RETRIVED, new_sheets) - if(sheet_amt >= 1) - var/obj/item/stack/sheet/new_sheets = new material.sheet_type(target, sheet_amt, null, list((material) = SHEET_MATERIAL_AMOUNT)) - count += sheet_amt - use_amount_mat(sheet_amt * SHEET_MATERIAL_AMOUNT, material) - SEND_SIGNAL(src, COMSIG_MATCONTAINER_SHEETS_RETRIVED, new_sheets) - return count + if(!target) + return 0 + //eject sheets based on available amount after each iteration + var/count = 0 + while(sheet_amt > 0) + //create sheets in null space so it doesn't merge & delete itself + var/obj/item/stack/sheet/new_sheets = new material.sheet_type(null, min(sheet_amt, MAX_STACK_SIZE), FALSE, list((material) = SHEET_MATERIAL_AMOUNT)) + count += new_sheets.amount + //use material & deduct work needed + use_amount_mat(new_sheets.amount * SHEET_MATERIAL_AMOUNT, material) + sheet_amt -= new_sheets.amount + //send signal + SEND_SIGNAL(src, COMSIG_MATCONTAINER_SHEETS_RETRIEVED, new_sheets, context) + //now move to target so it gets merged + new_sheets.forceMove(target) + return count /** * Proc to get all the materials and dump them as sheets * * Arguments: * - target: drop location of the sheets + * - context: the atom which is ejecting the sheets. Used mostly in silo logging */ -/datum/component/material_container/proc/retrieve_all(target = null) +/datum/component/material_container/proc/retrieve_all(target = null, atom/context = parent) var/result = 0 for(var/MAT in materials) - var/amount = materials[MAT] - result += retrieve_sheets(amount2sheet(amount), MAT, target) + result += retrieve_sheets(amount2sheet(materials[MAT]), MAT, target, context) return result //============================================================================================ diff --git a/code/datums/components/material/remote_materials.dm b/code/datums/components/material/remote_materials.dm index 8d91ba7a75c..c9677ecec44 100644 --- a/code/datums/components/material/remote_materials.dm +++ b/code/datums/components/material/remote_materials.dm @@ -22,13 +22,6 @@ handles linking back and forth. ///Flags used when converting inserted materials into their component materials. var/mat_container_flags = NONE - //Internal vars - - ///Prepare storage when component is registered to parent. This allows local material container(if created) to be first in the component list so it gets GC'd properly - var/_prepare_on_register = FALSE - ///Are we trying to to connect to remote ore silo or not - var/_connect_to_silo = FALSE - /datum/component/remote_materials/Initialize(mapload, allow_standalone = TRUE, force_connect = FALSE, mat_container_flags = NONE) if (!isatom(parent)) return COMPONENT_INCOMPATIBLE @@ -36,23 +29,26 @@ handles linking back and forth. src.allow_standalone = allow_standalone src.mat_container_flags = mat_container_flags - RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(OnAttackBy)) RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), PROC_REF(OnMultitool)) var/turf/T = get_turf(parent) - _connect_to_silo = FALSE + var/connect_to_silo = FALSE if(force_connect || (mapload && is_station_level(T.z))) - _connect_to_silo = TRUE + connect_to_silo = TRUE + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, TYPE_PROC_REF(/datum/component/remote_materials, SiloAttackBy)) if(mapload) // wait for silo to initialize during mapload - addtimer(CALLBACK(src, PROC_REF(_PrepareStorage), _connect_to_silo)) + addtimer(CALLBACK(src, PROC_REF(_PrepareStorage), connect_to_silo)) else //directly register in round - _prepare_on_register = TRUE - -/datum/component/remote_materials/RegisterWithParent() - if(_prepare_on_register) - _PrepareStorage(_connect_to_silo) + _PrepareStorage(connect_to_silo) +/** + * Internal proc. prepares local storage if onnect_to_silo = FALSE + * + * Arguments + * connect_to_silo- if true connect to global silo. If not successfull then go to local storage + * only if allow_standalone = TRUE, else you a null mat_container + */ /datum/component/remote_materials/proc/_PrepareStorage(connect_to_silo) if (connect_to_silo) silo = GLOB.ore_silo_default @@ -112,7 +108,12 @@ handles linking back and forth. if (!silo && mat_container) mat_container.max_amount = size -// called if disconnected by ore silo UI or destruction +/** + * Disconnect this component from the remote silo + * + * Arguments + * old_silo- The silo we are trying to disconnect from + */ /datum/component/remote_materials/proc/disconnect_from(obj/machinery/ore_silo/old_silo) if (!old_silo || silo != old_silo) return @@ -122,12 +123,14 @@ handles linking back and forth. if (allow_standalone) _MakeLocal() -/datum/component/remote_materials/proc/OnAttackBy(datum/source, obj/item/I, mob/user) +///Insert mats into silo +/datum/component/remote_materials/proc/SiloAttackBy(datum/source, obj/item/target, mob/user) SIGNAL_HANDLER - if (silo && isstack(I)) - if (silo.remote_attackby(parent, user, I, mat_container_flags)) - return COMPONENT_NO_AFTERATTACK + if(silo) + mat_container.user_insert(target, user, mat_container_flags, parent) + + return COMPONENT_NO_AFTERATTACK /datum/component/remote_materials/proc/OnMultitool(datum/source, mob/user, obj/item/I) SIGNAL_HANDLER @@ -152,52 +155,87 @@ handles linking back and forth. silo.ore_connected_machines += src silo.updateUsrDialog() mat_container = silo.GetComponent(/datum/component/material_container) + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, TYPE_PROC_REF(/datum/component/remote_materials, SiloAttackBy)) to_chat(user, span_notice("You connect [parent] to [silo] from the multitool's buffer.")) return COMPONENT_BLOCK_TOOL_ATTACK -/datum/component/remote_materials/proc/check_z_level(obj/silo_to_check) - SIGNAL_HANDLER - if(!silo_to_check) - if(isnull(silo)) - return FALSE - silo_to_check = silo +/** + * Checks if the param silo is in the same level as this components parent i.e. connected machine, rcd, etc + * + * Arguments + * silo_to_check- Is this components parent in the same Z level as this param silo. If null + * then check this components connected silo + * + * Returns true if both are on the station or same z level + */ +/datum/component/remote_materials/proc/check_z_level(obj/silo_to_check = silo) + if(isnull(silo_to_check)) + return FALSE - var/turf/current_turf = get_turf(parent) - var/turf/silo_turf = get_turf(silo_to_check) - if(!is_valid_z_level(silo_turf, current_turf)) + return is_valid_z_level(get_turf(silo_to_check), get_turf(parent)) + +/// returns TRUE if this connection put on hold by the silo +/datum/component/remote_materials/proc/on_hold() + return check_z_level() ? silo.holds[src] : FALSE + +/** + * Internal proc to check if this connection can use any materials from the silo + * Returns true only if + * - The parent is of type movable atom + * - A mat container is actually present + * - The silo in not on hold + */ +/datum/component/remote_materials/proc/_can_use_resource() + var/atom/movable/movable_parent = parent + if (!istype(movable_parent)) + return FALSE + if (!mat_container) //no silolink & local storage not supported + movable_parent.say("No access to material storage, please contact the quartermaster.") + return FALSE + if(on_hold()) //silo on hold + movable_parent.say("Mineral access is on hold, please contact the quartermaster.") return FALSE return TRUE -/datum/component/remote_materials/proc/on_hold() - if(!check_z_level()) - return FALSE - return silo.holds[src] +/** + * Use materials from either the silo(if connected) or from the local storage. If silo then this action + * is logged else not e.g. action="build" & name="matter bin" means you are trying to build an matter bin + * + * Arguments + * [mats][list]- list of materials to use + * coefficient- each mat unit is scaled by this value then rounded. This value if usually your machine efficiency e.g. upgraded protolathe has reduced costs + * multiplier- each mat unit is scaled by this value then rounded after it is scaled by coefficient. This value is your print quatity e.g. printing multiple items + * action- For logging only. e.g. build, create, i.e. the action you are trying to perform + * name- For logging only. the design you are trying to build e.g. matter bin, etc. + */ +/datum/component/remote_materials/proc/use_materials(list/mats, coefficient = 1, multiplier = 1, action = "build", name = "design") + if(!_can_use_resource()) + return 0 -/datum/component/remote_materials/proc/silo_log(obj/machinery/M, action, amount, noun, list/mats) - if (silo) - silo.silo_log(M || parent, action, amount, noun, mats) + var/amount_consumed = mat_container.use_materials(mats, coefficient, multiplier) + + if (silo)//log only if silo is linked + var/list/scaled_mats = list() + for(var/i in mats) + scaled_mats[i] = OPTIMAL_COST(OPTIMAL_COST(mats[i] * coefficient) * multiplier) + silo.silo_log(parent, action, -multiplier, name, scaled_mats) + + return amount_consumed + +/** + * Ejects the given material ref and logs it + * + * Arguments + * [material_ref][datum/material]- The material type you are trying to eject + * eject_amount- how many sheets to eject + * [drop_target][atom]- optional where to drop the sheets. null means it is dropped at this components parent location + */ +/datum/component/remote_materials/proc/eject_sheets(datum/material/material_ref, eject_amount, atom/drop_target = null) + if(!_can_use_resource()) + return 0 -/// Ejects the given material ref and logs it, or says out loud the problem. -/datum/component/remote_materials/proc/eject_sheets(datum/material/material_ref, eject_amount) var/atom/movable/movable_parent = parent - if (!istype(movable_parent)) - return 0 + if(isnull(drop_target)) + drop_target = movable_parent.drop_location() - if (!mat_container) //no silolink & local storage not supported - movable_parent.say("No access to material storage, please contact the quartermaster.") - return 0 - if(!mat_container.can_hold_material(material_ref)) //material not supported by container - movable_parent.say("Invalid material requested.") - return 0 - if(eject_amount <= 0) //invalid amount - movable_parent.say("Invalid amount requested.") - return 0 - if(on_hold()) //silo on hold - movable_parent.say("Mineral access is on hold, please contact the quartermaster.") - return 0 - - var/count = mat_container.retrieve_sheets(eject_amount, material_ref, movable_parent.drop_location()) - var/list/matlist = list() - matlist[material_ref] = eject_amount - silo_log(parent, "ejected", -count, "sheets", matlist) - return count + return mat_container.retrieve_sheets(eject_amount, material_ref, target = drop_target, context = parent) diff --git a/code/datums/components/mind_linker.dm b/code/datums/components/mind_linker.dm index 7a499484ea8..41ed23ecc2f 100644 --- a/code/datums/components/mind_linker.dm +++ b/code/datums/components/mind_linker.dm @@ -76,7 +76,7 @@ unlink_mob(remaining_mob) linked_mobs.Cut() QDEL_NULL(master_speech) - QDEL_NULL(post_unlink_callback) + post_unlink_callback = null return ..() /datum/component/mind_linker/RegisterWithParent() diff --git a/code/datums/components/nuclear_bomb_operator.dm b/code/datums/components/nuclear_bomb_operator.dm index 2224f95803b..da6e8b0cab1 100644 --- a/code/datums/components/nuclear_bomb_operator.dm +++ b/code/datums/components/nuclear_bomb_operator.dm @@ -50,6 +50,8 @@ /datum/component/nuclear_bomb_operator/Destroy(force, silent) QDEL_NULL(disky) + on_disk_collected = null + add_disk_overlays = null return ..() /// Drop the disk on the floor, if we have it diff --git a/code/datums/components/on_hit_effect.dm b/code/datums/components/on_hit_effect.dm index 062c335a7ee..38610395248 100644 --- a/code/datums/components/on_hit_effect.dm +++ b/code/datums/components/on_hit_effect.dm @@ -18,6 +18,11 @@ if(!(ismachinery(parent) || isstructure(parent) || isgun(parent) || isprojectilespell(parent) || isitem(parent) || isanimal_or_basicmob(parent) || isprojectile(parent))) return ELEMENT_INCOMPATIBLE +/datum/component/on_hit_effect/Destroy(force, silent) + on_hit_callback = null + extra_check_callback = null + return ..() + /datum/component/on_hit_effect/RegisterWithParent() if(ismachinery(parent) || isstructure(parent) || isgun(parent) || isprojectilespell(parent)) RegisterSignal(parent, COMSIG_PROJECTILE_ON_HIT, PROC_REF(on_projectile_hit)) diff --git a/code/datums/components/pet_commands/pet_commands_basic.dm b/code/datums/components/pet_commands/pet_commands_basic.dm index fb6dde9bc8d..40ec41aa3d6 100644 --- a/code/datums/components/pet_commands/pet_commands_basic.dm +++ b/code/datums/components/pet_commands/pet_commands_basic.dm @@ -164,3 +164,43 @@ // We also don't check if the cooldown is over because there's no way a pet owner can know that, the behaviour will handle it controller.queue_behavior(/datum/ai_behavior/pet_use_ability, pet_ability_key, BB_CURRENT_PET_TARGET) return SUBTREE_RETURN_FINISH_PLANNING + +/datum/pet_command/protect_owner + command_name = "Protect owner" + command_desc = "Your pet will run to your aid." + hidden = TRUE + ///the range our owner needs to be in for us to protect him + var/protect_range = 9 + ///the behavior we will use when he is attacked + var/protect_behavior = /datum/ai_behavior/basic_melee_attack + +/datum/pet_command/protect_owner/add_new_friend(mob/living/tamer) + RegisterSignal(tamer, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(set_attacking_target)) + if(!HAS_TRAIT(tamer, TRAIT_RELAYING_ATTACKER)) + tamer.AddElement(/datum/element/relay_attackers) + +/datum/pet_command/protect_owner/remove_friend(mob/living/unfriended) + UnregisterSignal(unfriended, COMSIG_ATOM_WAS_ATTACKED) + +/datum/pet_command/protect_owner/execute_action(datum/ai_controller/controller) + var/datum/targetting_datum/basic/targetting = controller.blackboard[BB_TARGETTING_DATUM] + var/mob/living/victim = controller.blackboard[BB_CURRENT_PET_TARGET] + if(victim.stat > targetting.stat_attack) + controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND) + return + controller.queue_behavior(protect_behavior, BB_CURRENT_PET_TARGET, BB_PET_TARGETTING_DATUM) + return SUBTREE_RETURN_FINISH_PLANNING + +/datum/pet_command/protect_owner/set_command_active(mob/living/parent, mob/living/victim) + . = ..() + set_command_target(parent, victim) + +/datum/pet_command/protect_owner/proc/set_attacking_target(atom/source, mob/living/attacker) + var/mob/living/basic/owner = weak_parent.resolve() + if(isnull(owner)) + return + var/mob/living/current_target = owner.ai_controller?.blackboard[BB_CURRENT_PET_TARGET] + if(attacker == current_target) //we are already dealing with this target + return + if(isliving(attacker) && can_see(owner, attacker, protect_range)) + set_command_active(owner, attacker) diff --git a/code/datums/components/puzzgrid.dm b/code/datums/components/puzzgrid.dm index 0f54fce9929..8a7620b06e3 100644 --- a/code/datums/components/puzzgrid.dm +++ b/code/datums/components/puzzgrid.dm @@ -55,6 +55,12 @@ addtimer(CALLBACK(src, PROC_REF(out_of_time)), timer) time_to_finish = world.time + timer +/datum/component/puzzgrid/Destroy(force, silent) + puzzgrid = null + on_victory_callback = null + on_fail_callback = null + return ..() + /datum/component/puzzgrid/RegisterWithParent() RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_attack_hand)) diff --git a/code/datums/components/ranged_attacks.dm b/code/datums/components/ranged_attacks.dm new file mode 100644 index 00000000000..0d76c21aaf7 --- /dev/null +++ b/code/datums/components/ranged_attacks.dm @@ -0,0 +1,72 @@ +/** + * Configurable ranged attack for basic mobs. + */ +/datum/component/ranged_attacks + /// What kind of casing do we use to fire? + var/casing_type + /// What kind of projectile to we fire? Use only one of this or casing_type + var/projectile_type + /// Sound to play when we fire our projectile + var/projectile_sound + /// Time to wait between shots + var/cooldown_time + /// Tracks time between shots + COOLDOWN_DECLARE(fire_cooldown) + +/datum/component/ranged_attacks/Initialize( + casing_type, + projectile_type, + projectile_sound = 'sound/weapons/gun/pistol/shot.ogg', + cooldown_time = 3 SECONDS, +) + . = ..() + if(!isbasicmob(parent)) + return COMPONENT_INCOMPATIBLE + + src.casing_type = casing_type + src.projectile_sound = projectile_sound + src.projectile_type = projectile_type + src.cooldown_time = cooldown_time + + if (casing_type && projectile_type) + CRASH("Set both casing type and projectile type in [parent]'s ranged attacks component! uhoh! stinky!") + if (!casing_type && !projectile_type) + CRASH("Set neither casing type nor projectile type in [parent]'s ranged attacks component! What are they supposed to be attacking with, air?") + +/datum/component/ranged_attacks/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_MOB_ATTACK_RANGED, PROC_REF(fire_ranged_attack)) + ADD_TRAIT(parent, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, type) + +/datum/component/ranged_attacks/UnregisterFromParent() + . = ..() + UnregisterSignal(parent, COMSIG_MOB_ATTACK_RANGED) + REMOVE_TRAIT(parent, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, type) + +/datum/component/ranged_attacks/proc/fire_ranged_attack(mob/living/basic/firer, atom/target, modifiers) + SIGNAL_HANDLER + if (!COOLDOWN_FINISHED(src, fire_cooldown)) + return + COOLDOWN_START(src, fire_cooldown, cooldown_time) + INVOKE_ASYNC(src, PROC_REF(async_fire_ranged_attack), firer, target, modifiers) + SEND_SIGNAL(parent, COMSIG_BASICMOB_POST_ATTACK_RANGED, target, modifiers) + +/// Actually fire the damn thing +/datum/component/ranged_attacks/proc/async_fire_ranged_attack(mob/living/basic/firer, atom/target, modifiers) + if(projectile_type) + firer.fire_projectile(projectile_type, target, projectile_sound) + return + playsound(firer, projectile_sound, 100, TRUE) + var/turf/startloc = get_turf(firer) + var/obj/item/ammo_casing/casing = new casing_type(startloc) + var/target_zone + if(ismob(target)) + var/mob/target_mob = target + target_zone = target_mob.get_random_valid_zone() + else + target_zone = ran_zone() + casing.fire_casing(target, firer, null, null, null, target_zone, 0, firer) + casing.update_appearance() + casing.AddElement(/datum/element/temporary_atom, 30 SECONDS) + return + diff --git a/code/datums/components/reagent_refiller.dm b/code/datums/components/reagent_refiller.dm index ae223488bc0..4e2da58c79b 100644 --- a/code/datums/components/reagent_refiller.dm +++ b/code/datums/components/reagent_refiller.dm @@ -28,6 +28,10 @@ return ..() +/datum/component/reagent_refiller/Destroy(force, silent) + power_draw_callback = null + return ..() + /datum/component/reagent_refiller/RegisterWithParent() RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, PROC_REF(refill)) RegisterSignal(parent, COMSIG_ATOM_EXITED, PROC_REF(delete_self)) diff --git a/code/datums/components/reflection.dm b/code/datums/components/reflection.dm index b8b51359ec6..80532ca2a61 100644 --- a/code/datums/components/reflection.dm +++ b/code/datums/components/reflection.dm @@ -11,7 +11,7 @@ */ var/reflected_dir /// the movable which the reflected movables are attached to, in turn added to the vis contents of the parent. - var/atom/movable/reflection_holder + var/obj/effect/abstract/reflection_holder /// A lazy assoc list that keeps track of which movables are being reflected and the associated reflections. var/list/reflected_movables /// A callback used check to know which movables should be reflected and which not. @@ -34,31 +34,31 @@ COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON = PROC_REF(on_movable_entered_or_initialized), COMSIG_ATOM_EXITED = PROC_REF(on_movable_exited) ) - var/atom/movable/mov_parent = parent AddComponent(/datum/component/connect_range, parent, connections, 1, works_in_containers = FALSE) src.reflected_dir = reflected_dir src.reflection_matrix = reflection_matrix src.reflection_filter = reflection_filter src.can_reflect = can_reflect - reflection_holder = new + reflection_holder = new(parent) reflection_holder.alpha = alpha reflection_holder.appearance_flags = KEEP_TOGETHER reflection_holder.vis_flags = VIS_INHERIT_ID - reflection_holder.alpha = alpha reflection_holder.mouse_opacity = MOUSE_OPACITY_TRANSPARENT if(reflection_filter) reflection_holder.add_filter("reflection", 1, reflection_filter) - mov_parent.vis_contents += reflection_holder + var/atom/movable/mov_parent = parent + mov_parent.vis_contents += reflection_holder set_reflection(new_dir = mov_parent.dir) RegisterSignal(parent, COMSIG_ATOM_DIR_CHANGE, PROC_REF(on_dir_change)) var/list/reflect_update_signals = list(COMSIG_MOVABLE_MOVED) + update_signals RegisterSignals(parent, reflect_update_signals, PROC_REF(get_reflection_targets)) -/datum/component/reflection/Destroy() +/datum/component/reflection/Destroy(force, silent) QDEL_LIST_ASSOC_VAL(reflected_movables) QDEL_NULL(reflection_holder) + can_reflect = null return ..() ///Called when the parent changes its direction. @@ -112,8 +112,15 @@ ///Sets up a visual overlay of the target movables, which is added to the parent's vis contents. /datum/component/reflection/proc/set_reflected(atom/movable/target) SIGNAL_HANDLER - var/atom/movable/reflection = new - reflection.vis_contents += target + /** + * If the loc is null, only a black (or grey depending on alpha) silhouette of the target will be rendered + * Just putting this information here in case you want something like that in the future. + */ + var/obj/effect/abstract/reflection = new(parent) + reflection.vis_flags = VIS_INHERIT_ID + if(!target.render_target) + target.render_target = REF(target) + reflection.render_source = target.render_target ///The filter is added to the reflection holder; the matrix is not, otherwise that'd go affecting the filter. if(reflection_matrix) reflection.transform = reflection_matrix diff --git a/code/datums/components/religious_tool.dm b/code/datums/components/religious_tool.dm index 2571f0c13d4..fabed36595c 100644 --- a/code/datums/components/religious_tool.dm +++ b/code/datums/components/religious_tool.dm @@ -28,6 +28,13 @@ if(override_catalyst_type) catalyst_type = override_catalyst_type +/datum/component/religious_tool/Destroy(force, silent) + easy_access_sect = null + performing_rite = null + catalyst_type = null + after_sect_select_cb = null + return ..() + /datum/component/religious_tool/RegisterWithParent() RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(AttemptActions)) RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) diff --git a/code/datums/components/riding/riding_mob.dm b/code/datums/components/riding/riding_mob.dm index 3ea9b598089..f7b48ecb01b 100644 --- a/code/datums/components/riding/riding_mob.dm +++ b/code/datums/components/riding/riding_mob.dm @@ -109,7 +109,27 @@ var/turf/next = get_step(living_parent, direction) step(living_parent, direction) last_move_diagonal = ((direction & (direction - 1)) && (living_parent.loc == next)) - COOLDOWN_START(src, vehicle_move_cooldown, (last_move_diagonal? 2 : 1) * vehicle_move_delay) + var/modified_move_cooldown = vehicle_move_cooldown + var/modified_move_delay = vehicle_move_delay + if(ishuman(user) && HAS_TRAIT(user, TRAIT_SETTLER)) + var/mob/living/carbon/human/settler_rider = user + switch(settler_rider.mob_mood.sanity_level) + if(SANITY_LEVEL_GREAT) + modified_move_cooldown *= 0.5 + modified_move_delay *= 0.5 + if(SANITY_LEVEL_NEUTRAL) + modified_move_cooldown *= 0.8 + modified_move_delay *= 0.8 + if(SANITY_LEVEL_DISTURBED) + modified_move_cooldown *= 1 + modified_move_delay *= 1 + if(SANITY_LEVEL_CRAZY) + modified_move_cooldown *= 1.2 + modified_move_delay *= 1.2 + if(SANITY_LEVEL_INSANE) + modified_move_cooldown *= 1.5 + modified_move_delay *= 1.5 + COOLDOWN_START(src, vehicle_move_cooldown = modified_move_cooldown, (last_move_diagonal ? 2 : 1) * modified_move_delay) return ..() /// Yeets the rider off, used for animals and cyborgs, redefined for humans who shove their piggyback rider off @@ -481,6 +501,15 @@ return ..() return charger.summoner == user +/datum/component/riding/creature/goldgrub + +/datum/component/riding/creature/goldgrub/handle_specials() + . = ..() + set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(11, 3), TEXT_SOUTH = list(11, 3), TEXT_EAST = list(9, 3), TEXT_WEST = list(14, 3))) + set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER) + set_vehicle_dir_layer(NORTH, OBJ_LAYER) + set_vehicle_dir_layer(EAST, OBJ_LAYER) + set_vehicle_dir_layer(WEST, OBJ_LAYER) //SKYRAT EDIT START: Human Riding Defines #undef OVERSIZED_OFFSET diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm index dc009ffbf89..4bcfa8b01c9 100644 --- a/code/datums/components/rotation.dm +++ b/code/datums/components/rotation.dm @@ -32,7 +32,7 @@ /datum/component/simple_rotation/RegisterWithParent() AddSignals() - . = ..() + return ..() /datum/component/simple_rotation/PostTransfer() //Because of the callbacks which we don't track cleanly we can't transfer this @@ -42,12 +42,12 @@ /datum/component/simple_rotation/UnregisterFromParent() RemoveSignals() - . = ..() + return ..() /datum/component/simple_rotation/Destroy() - QDEL_NULL(AfterRotation) + AfterRotation = null //Signals + verbs removed via UnRegister - . = ..() + return ..() /datum/component/simple_rotation/ClearFromParent() return ..() diff --git a/code/datums/components/seethrough_mob.dm b/code/datums/components/seethrough_mob.dm new file mode 100644 index 00000000000..b52cfb334ab --- /dev/null +++ b/code/datums/components/seethrough_mob.dm @@ -0,0 +1,135 @@ +///A component that lets you turn your character transparent in order to see and click through yourself. +/datum/component/seethrough_mob + ///The atom that enables our dark magic + var/atom/movable/render_source_atom + ///The fake version of ourselves + var/image/trickery_image + ///Which alpha do we animate towards? + var/target_alpha + ///How long our faze in/out takes + var/animation_time + ///Does this object let clicks from players its transparent to pass through it + var/clickthrough + ///Is the seethrough effect currently active + var/is_active + ///The mob's original render_target value + var/initial_render_target_value + ///This component's personal uid + var/personal_uid + +/datum/component/seethrough_mob/Initialize(target_alpha = 100, animation_time = 0.5 SECONDS, clickthrough = TRUE) + . = ..() + + if(!ismob(parent)) + return COMPONENT_INCOMPATIBLE + + src.target_alpha = target_alpha + src.animation_time = animation_time + src.clickthrough = clickthrough + src.is_active = FALSE + src.render_source_atom = new() + + var/static/uid = 0 + uid++ + src.personal_uid = uid + + render_source_atom.appearance_flags |= ( RESET_COLOR | RESET_TRANSFORM) + + render_source_atom.vis_flags |= (VIS_INHERIT_ID | VIS_INHERIT_PLANE | VIS_INHERIT_LAYER) + + render_source_atom.render_source = "*transparent_bigmob[personal_uid]" + + var/datum/action/toggle_seethrough/action = new(src) + action.Grant(parent) + +/datum/component/seethrough_mob/Destroy(force, silent) + QDEL_NULL(render_source_atom) + return ..() + +///Set up everything we need to trick the client and keep it looking normal for everyone else +/datum/component/seethrough_mob/proc/trick_mob() + SIGNAL_HANDLER + + var/mob/fool = parent + var/datum/hud/our_hud = fool.hud_used + for(var/atom/movable/screen/plane_master/seethrough as anything in our_hud.get_true_plane_masters(SEETHROUGH_PLANE)) + seethrough.unhide_plane(fool) + + var/icon/current_mob_icon = icon(fool.icon, fool.icon_state) + render_source_atom.pixel_x = -fool.pixel_x + render_source_atom.pixel_y = ((current_mob_icon.Height() - 32) * 0.5) + + initial_render_target_value = fool.render_target + fool.render_target = "*transparent_bigmob[personal_uid]" + fool.vis_contents.Add(render_source_atom) + + trickery_image = new(render_source_atom) + trickery_image.loc = render_source_atom + trickery_image.override = TRUE + + trickery_image.pixel_x = 0 + trickery_image.pixel_y = 0 + + if(clickthrough) + //Special plane so we can click through the overlay + SET_PLANE_EXPLICIT(trickery_image, SEETHROUGH_PLANE, fool) + + fool.client.images += trickery_image + + animate(trickery_image, alpha = target_alpha, time = animation_time) + + RegisterSignal(fool, COMSIG_MOB_LOGOUT, PROC_REF(on_client_disconnect)) + +///Remove the screen object and make us appear solid to ourselves again +/datum/component/seethrough_mob/proc/untrick_mob() + var/mob/fool = parent + animate(trickery_image, alpha = 255, time = animation_time) + UnregisterSignal(fool, COMSIG_MOB_LOGOUT) + + //after playing the fade-in animation, remove the image and the trick atom + addtimer(CALLBACK(src, PROC_REF(clear_image), trickery_image, fool.client), animation_time) + +///Remove the image and the trick atom +/datum/component/seethrough_mob/proc/clear_image(image/removee, client/remove_from) + var/atom/movable/atom_parent = parent + atom_parent.vis_contents -= render_source_atom + atom_parent.render_target = initial_render_target_value + remove_from?.images -= removee + +///Effect is disabled when they log out because client gets deleted +/datum/component/seethrough_mob/proc/on_client_disconnect() + SIGNAL_HANDLER + + var/mob/fool = parent + UnregisterSignal(fool, COMSIG_MOB_LOGOUT) + var/datum/hud/our_hud = fool.hud_used + for(var/atom/movable/screen/plane_master/seethrough as anything in our_hud.get_true_plane_masters(SEETHROUGH_PLANE)) + seethrough.hide_plane(fool) + clear_image(trickery_image, fool.client) + +/datum/component/seethrough_mob/proc/toggle_active() + is_active = !is_active + if(is_active) + trick_mob() + else + untrick_mob() + +/datum/action/toggle_seethrough + name = "Toggle Seethrough" + desc = "Allows you to see behind your massive body and click through it." + button_icon = 'icons/mob/actions/actions_xeno.dmi' + button_icon_state = "alien_sneak" + background_icon_state = "bg_alien" + +/datum/action/toggle_seethrough/Remove(mob/remove_from) + var/datum/component/seethrough_mob/seethroughComp = target + if(seethroughComp.is_active) + seethroughComp.untrick_mob() + return ..() + +/datum/action/toggle_seethrough/Trigger(trigger_flags) + . = ..() + if(!.) + return + var/datum/component/seethrough_mob/seethroughComp = target + seethroughComp.toggle_active() diff --git a/code/datums/components/shielded.dm b/code/datums/components/shielded.dm index eeca72b5815..b33f3d986fd 100644 --- a/code/datums/components/shielded.dm +++ b/code/datums/components/shielded.dm @@ -62,7 +62,7 @@ UnregisterSignal(wearer, COMSIG_ATOM_UPDATE_OVERLAYS) wearer.update_appearance(UPDATE_ICON) wearer = null - QDEL_NULL(on_hit_effects) + on_hit_effects = null return ..() /datum/component/shielded/RegisterWithParent() diff --git a/code/datums/components/shuttle_cling.dm b/code/datums/components/shuttle_cling.dm index f045555c98a..bc6f022ab86 100644 --- a/code/datums/components/shuttle_cling.dm +++ b/code/datums/components/shuttle_cling.dm @@ -35,7 +35,7 @@ src.direction = direction - ADD_TRAIT(parent, TRAIT_HYPERSPACED, src) + ADD_TRAIT(parent, TRAIT_HYPERSPACED, REF(src)) RegisterSignals(parent, list(COMSIG_MOVABLE_MOVED, COMSIG_MOVABLE_UNBUCKLE, COMSIG_ATOM_NO_LONGER_PULLED), PROC_REF(update_state)) RegisterSignal(parent, SIGNAL_REMOVETRAIT(TRAIT_FREE_HYPERSPACE_MOVEMENT), PROC_REF(initialize_loop)) @@ -85,6 +85,10 @@ if(ALL_GOOD) should_loop = FALSE + // the hyperloop can get reset to null from the above procs + if(!hyperloop) + return + //Do pause/unpause/nothing for the hyperloop if(should_loop && hyperloop.paused) hyperloop.resume_loop() @@ -97,8 +101,12 @@ return ALL_GOOD if(!isliving(movee)) + if(HAS_TRAIT(movee, TRAIT_FORCED_GRAVITY)) // nothing can block the singularity + return SUPER_NOT_HOLDING_ON + if(is_tile_solid(get_step(movee, direction))) //something is blocking us so do the cool drift return CLINGING + return SUPER_NOT_HOLDING_ON var/mob/living/living = movee @@ -170,7 +178,7 @@ qdel(src) /datum/component/shuttle_cling/Destroy(force, silent) - REMOVE_TRAIT(parent, TRAIT_HYPERSPACED, src) + REMOVE_TRAIT(parent, TRAIT_HYPERSPACED, REF(src)) QDEL_NULL(hyperloop) return ..() diff --git a/code/datums/components/singularity.dm b/code/datums/components/singularity.dm index 043be3e50c0..75fd4fd0abc 100644 --- a/code/datums/components/singularity.dm +++ b/code/datums/components/singularity.dm @@ -110,7 +110,7 @@ /datum/component/singularity/Destroy(force, silent) GLOB.singularities -= src - QDEL_NULL(consume_callback) + consume_callback = null target = null return ..() diff --git a/code/datums/components/sitcomlaughter.dm b/code/datums/components/sitcomlaughter.dm index 04a190d15f0..8ca335eb8b5 100644 --- a/code/datums/components/sitcomlaughter.dm +++ b/code/datums/components/sitcomlaughter.dm @@ -22,6 +22,9 @@ if(laugh_delay) src.laugh_delay = laugh_delay +/datum/component/wearertargeting/sitcomlaughter/Destroy(force, silent) + post_comedy_callback = null + return ..() ///Play the laugh track if any of the signals related to comedy have been sent. /datum/component/wearertargeting/sitcomlaughter/proc/EngageInComedy(datum/source) diff --git a/code/datums/components/slippery.dm b/code/datums/components/slippery.dm index 7288ae0e275..be1d674eb4d 100644 --- a/code/datums/components/slippery.dm +++ b/code/datums/components/slippery.dm @@ -58,6 +58,12 @@ else RegisterSignal(parent, COMSIG_ATOM_ENTERED, PROC_REF(Slip)) +/datum/component/slippery/Destroy(force, silent) + can_slip_callback = null + on_slip_callback = null + holder = null + return ..() + /datum/component/slippery/proc/apply_fantasy_bonuses(obj/item/source, bonus) SIGNAL_HANDLER knockdown_time = source.modify_fantasy_variable("knockdown_time", knockdown_time, bonus) @@ -73,6 +79,7 @@ knockdown_time = source.reset_fantasy_variable("knockdown_time", knockdown_time) paralyze_time = source.reset_fantasy_variable("paralyze_time", paralyze_time) var/previous_lube_flags = LAZYACCESS(source.fantasy_modifications, "lube_flags") + LAZYREMOVE(source.fantasy_modifications, "lube_flags") if(!isnull(previous_lube_flags)) lube_flags = previous_lube_flags diff --git a/code/datums/components/spin2win.dm b/code/datums/components/spin2win.dm index c1c935509f9..19eebfed509 100644 --- a/code/datums/components/spin2win.dm +++ b/code/datums/components/spin2win.dm @@ -37,8 +37,8 @@ src.end_spin_message = end_spin_message /datum/component/spin2win/Destroy(force, silent) - QDEL_NULL(on_spin_callback) - QDEL_NULL(on_unspin_callback) + on_spin_callback = null + on_unspin_callback = null return ..() /datum/component/spin2win/RegisterWithParent() diff --git a/code/datums/components/squashable.dm b/code/datums/components/squashable.dm index a79a1802f04..5fc489873bf 100644 --- a/code/datums/components/squashable.dm +++ b/code/datums/components/squashable.dm @@ -29,6 +29,10 @@ AddComponent(/datum/component/connect_loc_behalf, parent, loc_connections) +/datum/component/squashable/Destroy(force, silent) + on_squash_callback = null + return ..() + ///Handles the squashing of the mob /datum/component/squashable/proc/on_entered(turf/source_turf, atom/movable/crossing_movable) SIGNAL_HANDLER diff --git a/code/datums/components/style/style.dm b/code/datums/components/style/style.dm index 55684bcc7b7..42f5de156e0 100644 --- a/code/datums/components/style/style.dm +++ b/code/datums/components/style/style.dm @@ -98,7 +98,7 @@ RegisterSignal(src, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), PROC_REF(on_parent_multitool)) - ADD_TRAIT(mob_parent, TRAIT_STYLISH, src) // SKYRAT EDIT ADD - allows style meter chads to do flips + ADD_TRAIT(mob_parent, TRAIT_STYLISH, REF(src)) // SKYRAT EDIT ADD - allows style meter chads to do flips /datum/component/style/RegisterWithParent() RegisterSignal(parent, COMSIG_MOB_ITEM_AFTERATTACK, PROC_REF(hotswap)) @@ -119,7 +119,7 @@ /datum/component/projectile_parry,\ list(\ /obj/projectile/colossus,\ - /obj/projectile/temp/basilisk,\ + /obj/projectile/temp/watcher,\ /obj/projectile/kinetic,\ /obj/projectile/bileworm_acid,\ /obj/projectile/herald,\ @@ -152,7 +152,7 @@ if(mob_parent.hud_used) mob_parent.hud_used.static_inventory -= meter mob_parent.hud_used.show_hud(mob_parent.hud_used.hud_version) - REMOVE_TRAIT(mob_parent, TRAIT_STYLISH, src) // SKYRAT EDIT ADD - allows style meter chads to do flips + REMOVE_TRAIT(mob_parent, TRAIT_STYLISH, REF(src)) // SKYRAT EDIT ADD - allows style meter chads to do flips return ..() diff --git a/code/datums/components/subtype_picker.dm b/code/datums/components/subtype_picker.dm index 5ab4785e7a7..2bc429f9b70 100644 --- a/code/datums/components/subtype_picker.dm +++ b/code/datums/components/subtype_picker.dm @@ -22,6 +22,10 @@ src.on_picked_callback = on_picked_callback build_radial_list() +/datum/component/subtype_picker/Destroy(force, silent) + on_picked_callback = null + return ..() + /datum/component/subtype_picker/RegisterWithParent() . = ..() RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(on_attack_self)) diff --git a/code/datums/components/supermatter_crystal.dm b/code/datums/components/supermatter_crystal.dm index 6337b729923..65c11ce2417 100644 --- a/code/datums/components/supermatter_crystal.dm +++ b/code/datums/components/supermatter_crystal.dm @@ -21,6 +21,11 @@ src.tool_act_callback = tool_act_callback src.consume_callback = consume_callback +/datum/component/supermatter_crystal/Destroy(force, silent) + tool_act_callback = null + consume_callback = null + return ..() + /datum/component/supermatter_crystal/UnregisterFromParent(force, silent) var/list/signals_to_remove = list( COMSIG_ATOM_BLOB_ACT, diff --git a/code/datums/components/swabbing.dm b/code/datums/components/swabbing.dm index 0fb13e6055d..fa649a5e018 100644 --- a/code/datums/components/swabbing.dm +++ b/code/datums/components/swabbing.dm @@ -32,12 +32,12 @@ This component is used in vat growing to swab for microbiological samples which src.update_icons = update_icons src.update_overlays = update_overlays -/datum/component/swabbing/Destroy() - . = ..() +/datum/component/swabbing/Destroy(force, silent) for(var/swabbed in swabbed_items) qdel(swabbed) - QDEL_NULL(update_icons) - QDEL_NULL(update_overlays) + update_icons = null + update_overlays = null + return ..() ///Changes examine based on your sample diff --git a/code/datums/components/takes_reagent_appearance.dm b/code/datums/components/takes_reagent_appearance.dm index 0d5730fc80d..6505290b4cb 100644 --- a/code/datums/components/takes_reagent_appearance.dm +++ b/code/datums/components/takes_reagent_appearance.dm @@ -43,9 +43,9 @@ src.base_container_type = base_container_type || parent.type -/datum/component/takes_reagent_appearance/Destroy() - QDEL_NULL(on_icon_changed) - QDEL_NULL(on_icon_reset) +/datum/component/takes_reagent_appearance/Destroy(force, silent) + on_icon_changed = null + on_icon_reset = null return ..() /datum/component/takes_reagent_appearance/RegisterWithParent() diff --git a/code/datums/components/tameable.dm b/code/datums/components/tameable.dm index fa342bbbbd4..81228b2c3cc 100644 --- a/code/datums/components/tameable.dm +++ b/code/datums/components/tameable.dm @@ -32,6 +32,10 @@ RegisterSignal(parent, COMSIG_SIMPLEMOB_SENTIENCEPOTION, PROC_REF(on_tame)) //Instantly succeeds RegisterSignal(parent, COMSIG_SIMPLEMOB_TRANSFERPOTION, PROC_REF(on_tame)) //Instantly succeeds +/datum/component/tameable/Destroy(force, silent) + after_tame = null + return ..() + /datum/component/tameable/proc/try_tame(datum/source, obj/item/food, mob/living/attacker, params) SIGNAL_HANDLER if(!is_type_in_list(food, food_types)) @@ -43,10 +47,15 @@ return COMPONENT_CANCEL_ATTACK_CHAIN var/atom/atom_parent = source + var/inform_tamer = FALSE atom_parent.balloon_alert(attacker, "fed") + var/modified_tame_chance = current_tame_chance + if(HAS_TRAIT(attacker, TRAIT_SETTLER)) + modified_tame_chance += 50 + inform_tamer = TRUE if(unique || !already_friends(attacker)) - if(prob(current_tame_chance)) //note: lack of feedback message is deliberate, keep them guessing! - on_tame(source, attacker, food) + if(prob(modified_tame_chance)) //note: lack of feedback message is deliberate, keep them guessing unless they're an expert! + on_tame(source, attacker, food, inform_tamer) else current_tame_chance += bonus_tame_chance @@ -61,13 +70,16 @@ return living_parent.faction.Find(REF(potential_friend)) ///Ran once taming succeeds -/datum/component/tameable/proc/on_tame(datum/source, mob/living/tamer, atom/food) +/datum/component/tameable/proc/on_tame(datum/source, mob/living/tamer, atom/food, inform_tamer = FALSE) SIGNAL_HANDLER after_tame?.Invoke(tamer, food)//Run custom behavior if needed if(isliving(parent) && isliving(tamer)) var/mob/living/tamed = parent INVOKE_ASYNC(tamed, TYPE_PROC_REF(/mob/living, befriend), tamer) + if(inform_tamer) + var/atom/atom_parent = source + atom_parent.balloon_alert(tamer, "tamed") if(unique) qdel(src) diff --git a/code/datums/components/telegraph_ability.dm b/code/datums/components/telegraph_ability.dm new file mode 100644 index 00000000000..bff2ea7ea8f --- /dev/null +++ b/code/datums/components/telegraph_ability.dm @@ -0,0 +1,50 @@ +/** + * Component given to creatures to telegraph their abilities! + */ +/datum/component/basic_mob_ability_telegraph + /// how long before we use our attack + var/telegraph_time + /// sound to play, if any + var/sound_path + /// are we currently telegraphing + var/currently_telegraphing = FALSE + +/datum/component/basic_mob_ability_telegraph/Initialize(telegraph_time = 1 SECONDS, sound_path) + + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + src.telegraph_time = telegraph_time + src.sound_path = sound_path + +/datum/component/basic_mob_ability_telegraph/RegisterWithParent() + RegisterSignal(parent, COMSIG_MOB_ABILITY_STARTED, PROC_REF(on_ability_activate)) + +/datum/component/basic_mob_ability_telegraph/UnregisterFromParent() + UnregisterSignal(parent, COMSIG_MOB_ABILITY_STARTED) + +///delay the ability +/datum/component/basic_mob_ability_telegraph/proc/on_ability_activate(mob/living/source, datum/action/cooldown/activated, atom/target) + SIGNAL_HANDLER + + if(currently_telegraphing) + return COMPONENT_BLOCK_ABILITY_START + + if(!activated.IsAvailable()) + return + + currently_telegraphing = TRUE + generate_tell_signs(source) + addtimer(CALLBACK(src, PROC_REF(use_ability), source, activated, target), telegraph_time) + return COMPONENT_BLOCK_ABILITY_START + +///generates the telegraph signs to inform the player we're about to launch an attack +/datum/component/basic_mob_ability_telegraph/proc/generate_tell_signs(mob/living/source) + if(sound_path) + playsound(source, sound_path, 50, FALSE) + source.Shake(duration = telegraph_time) + +///use the ability +/datum/component/basic_mob_ability_telegraph/proc/use_ability(mob/living/source, datum/action/cooldown/activated, atom/target) + if(!QDELETED(target) && source.stat != DEAD) //target is gone or we died + activated.Activate(target) + currently_telegraphing = FALSE diff --git a/code/datums/components/thermite.dm b/code/datums/components/thermite.dm index 2ae5071ad58..7ab8b755ca1 100644 --- a/code/datums/components/thermite.dm +++ b/code/datums/components/thermite.dm @@ -58,7 +58,7 @@ deltimer(burn_timer) burn_timer = null if(burn_callback) - QDEL_NULL(burn_callback) + burn_callback = null if(fakefire) QDEL_NULL(fakefire) return ..() diff --git a/code/datums/components/tippable.dm b/code/datums/components/tippable.dm index e4ecd8a91f4..eafb2345818 100644 --- a/code/datums/components/tippable.dm +++ b/code/datums/components/tippable.dm @@ -63,14 +63,10 @@ UnregisterSignal(parent, COMSIG_ATOM_ATTACK_HAND_SECONDARY) /datum/component/tippable/Destroy() - if(pre_tipped_callback) - QDEL_NULL(pre_tipped_callback) - if(post_tipped_callback) - QDEL_NULL(post_tipped_callback) - if(post_untipped_callback) - QDEL_NULL(post_untipped_callback) - if(roleplay_callback) - QDEL_NULL(roleplay_callback) + pre_tipped_callback = null + post_tipped_callback = null + post_untipped_callback = null + roleplay_callback = null return ..() /** diff --git a/code/datums/components/toggle_attached_clothing.dm b/code/datums/components/toggle_attached_clothing.dm index 9735b056ec3..5d8f7c2b3ea 100644 --- a/code/datums/components/toggle_attached_clothing.dm +++ b/code/datums/components/toggle_attached_clothing.dm @@ -81,9 +81,11 @@ unequip_deployable() QDEL_NULL(deployable) QDEL_NULL(toggle_action) - QDEL_NULL(on_created) - QDEL_NULL(on_deployed) - QDEL_NULL(on_removed) + undeployed_overlay = null + pre_creation_check = null + on_created = null + on_deployed = null + on_removed = null return ..() /// Toggle deployable when the UI button is clicked diff --git a/code/datums/components/twohanded.dm b/code/datums/components/twohanded.dm index 9b51d6830e5..3b015c95383 100644 --- a/code/datums/components/twohanded.dm +++ b/code/datums/components/twohanded.dm @@ -56,6 +56,12 @@ if(require_twohands) ADD_TRAIT(parent, TRAIT_NEEDS_TWO_HANDS, ABSTRACT_ITEM_TRAIT) +/datum/component/two_handed/Destroy(force, silent) + offhand_item = null + wield_callback = null + unwield_callback = null + return ..() + // Inherit the new values passed to the component /datum/component/two_handed/InheritComponent(datum/component/two_handed/new_comp, original, require_twohands, wieldsound, unwieldsound, \ force_multiplier, force_wielded, force_unwielded, icon_wielded, \ @@ -167,13 +173,6 @@ /datum/component/two_handed/proc/wield(mob/living/carbon/user) if(wielded) return - if(ismonkey(user)) - if(require_twohands) - to_chat(user, span_notice("[parent] is too heavy and cumbersome for you to carry!")) - user.dropItemToGround(parent, force=TRUE) - else - to_chat(user, span_notice("It's too heavy for you to wield fully.")) - return if(user.get_inactive_held_item()) if(require_twohands) to_chat(user, span_notice("[parent] is too cumbersome to carry in one hand!")) diff --git a/code/datums/components/udder.dm b/code/datums/components/udder.dm index a72d67e0c9f..bd622a944d7 100644 --- a/code/datums/components/udder.dm +++ b/code/datums/components/udder.dm @@ -22,6 +22,7 @@ /datum/component/udder/UnregisterFromParent() QDEL_NULL(udder) + on_milk_callback = null UnregisterSignal(parent, list(COMSIG_ATOM_EXAMINE, COMSIG_ATOM_ATTACKBY)) ///signal called on parent being examined @@ -82,6 +83,7 @@ . = ..() STOP_PROCESSING(SSobj, src) udder_mob = null + on_generate_callback = null /obj/item/udder/process(seconds_per_tick) if(udder_mob.stat != DEAD) diff --git a/code/datums/components/weatherannouncer.dm b/code/datums/components/weatherannouncer.dm new file mode 100644 index 00000000000..fec31ccf9d3 --- /dev/null +++ b/code/datums/components/weatherannouncer.dm @@ -0,0 +1,175 @@ +#define WEATHER_ALERT_CLEAR 0 +#define WEATHER_ALERT_INCOMING 1 +#define WEATHER_ALERT_IMMINENT_OR_ACTIVE 2 + +/// Component which makes you yell about what the weather is +/datum/component/weather_announcer + /// Currently displayed warning level + var/warning_level = WEATHER_ALERT_CLEAR + /// Whether the incoming weather is actually going to harm you + var/is_weather_dangerous = TRUE + /// Are we actually turned on right now? + var/enabled = TRUE + /// Overlay added when things are alright + var/state_normal + /// Overlay added when you should start looking for shelter + var/state_warning + /// Overlay added when you are in danger + var/state_danger + +/datum/component/weather_announcer/Initialize( + state_normal, + state_warning, + state_danger, +) + . = ..() + if (!ismovable(parent)) + return COMPONENT_INCOMPATIBLE + + START_PROCESSING(SSprocessing, src) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_update_overlays)) + RegisterSignal(parent, COMSIG_MACHINERY_POWER_RESTORED, PROC_REF(on_powered)) + RegisterSignal(parent, COMSIG_MACHINERY_POWER_LOST, PROC_REF(on_power_lost)) + + src.state_normal = state_normal + src.state_warning = state_warning + src.state_danger = state_danger + var/atom/speaker = parent + speaker.update_appearance(UPDATE_ICON) + update_light_color() + +/datum/component/weather_announcer/Destroy(force, silent) + STOP_PROCESSING(SSprocessing, src) + return ..() + +/// Add appropriate overlays +/datum/component/weather_announcer/proc/on_update_overlays(atom/parent_atom, list/overlays) + SIGNAL_HANDLER + if (!enabled || !state_normal || !state_warning || !state_danger) + return + + switch (warning_level) + if(WEATHER_ALERT_CLEAR) + overlays += state_normal + if(WEATHER_ALERT_INCOMING) + overlays += state_warning + if(WEATHER_ALERT_IMMINENT_OR_ACTIVE) + overlays += (is_weather_dangerous) ? state_danger : state_warning + +/// If powered, receive updates +/datum/component/weather_announcer/proc/on_powered() + SIGNAL_HANDLER + enabled = TRUE + var/atom/speaker = parent + speaker.update_appearance(UPDATE_ICON) + +/// If no power, don't receive updates +/datum/component/weather_announcer/proc/on_power_lost() + SIGNAL_HANDLER + enabled = FALSE + var/atom/speaker = parent + speaker.update_appearance(UPDATE_ICON) + +/datum/component/weather_announcer/process(seconds_per_tick) + if (!enabled) + return + + var/previous_level = warning_level + var/previous_danger = is_weather_dangerous + set_current_alert_level() + if(previous_level == warning_level && previous_danger == is_weather_dangerous) + return // No change + var/atom/movable/speaker = parent + speaker.say(get_warning_message()) + speaker.update_appearance(UPDATE_ICON) + update_light_color() + +/datum/component/weather_announcer/proc/update_light_color() + var/atom/movable/light = parent + switch(warning_level) + if(WEATHER_ALERT_CLEAR) + light.set_light_color(LIGHT_COLOR_GREEN) + if(WEATHER_ALERT_INCOMING) + light.set_light_color(LIGHT_COLOR_DIM_YELLOW) + if(WEATHER_ALERT_IMMINENT_OR_ACTIVE) + light.set_light_color(LIGHT_COLOR_INTENSE_RED) + light.update_light() + +/// Returns a string we should display to communicate what you should be doing +/datum/component/weather_announcer/proc/get_warning_message() + if (!is_weather_dangerous) + return "No risk expected from incoming weather front." + switch(warning_level) + if(WEATHER_ALERT_CLEAR) + return "All clear, no weather alerts to report." + if(WEATHER_ALERT_INCOMING) + return "Weather front incoming, begin to seek shelter." + if(WEATHER_ALERT_IMMINENT_OR_ACTIVE) + return "Weather front imminent, find shelter immediately." + return "Error in meteorological calculation. Please report this deviation to a trained programmer." + +/datum/component/weather_announcer/proc/time_till_storm() + var/list/mining_z_levels = SSmapping.levels_by_trait(ZTRAIT_MINING) + if(!length(mining_z_levels)) + return // No problems if there are no mining z levels + + + for(var/datum/weather/check_weather as anything in SSweather.processing) + if(!check_weather.barometer_predictable || check_weather.stage == WIND_DOWN_STAGE || check_weather.stage == END_STAGE) + continue + for (var/mining_level in mining_z_levels) + if(mining_level in check_weather.impacted_z_levels) + warning_level = WEATHER_ALERT_IMMINENT_OR_ACTIVE + return 0 + + var/time_until_next = INFINITY + for(var/mining_level in mining_z_levels) + var/next_time = timeleft(SSweather.next_hit_by_zlevel["[mining_level ]"]) || INFINITY + if (next_time && next_time < time_until_next) + time_until_next = next_time + return time_until_next + +/// Polls existing weather for what kind of warnings we should be displaying. +/datum/component/weather_announcer/proc/set_current_alert_level() + var/time_until_next = time_till_storm() + if(isnull(time_until_next)) + return // No problems if there are no mining z levels + if(time_until_next >= 2 MINUTES) + warning_level = WEATHER_ALERT_CLEAR + return + + if(time_until_next >= 30 SECONDS) + warning_level = WEATHER_ALERT_INCOMING + return + + // Weather is here, now we need to figure out if it is dangerous + warning_level = WEATHER_ALERT_IMMINENT_OR_ACTIVE + + for(var/datum/weather/check_weather as anything in SSweather.processing) + if(!check_weather.barometer_predictable || check_weather.stage == WIND_DOWN_STAGE || check_weather.stage == END_STAGE) + continue + var/list/mining_z_levels = SSmapping.levels_by_trait(ZTRAIT_MINING) + for(var/mining_level in mining_z_levels) + if(mining_level in check_weather.impacted_z_levels) + is_weather_dangerous = !check_weather.aesthetic + return + +/datum/component/weather_announcer/proc/on_examine(atom/radio, mob/examiner, list/examine_texts) + var/time_until_next = time_till_storm() + if(isnull(time_until_next)) + return + if (time_until_next == 0) + examine_texts += span_warning ("A storm is currently active, please seek shelter.") + else + examine_texts += span_notice("The next storm is inbound in [DisplayTimeText(time_until_next)].") + +/datum/component/weather_announcer/RegisterWithParent() + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + +/datum/component/weather_announcer/UnregisterFromParent() + .=..() + UnregisterSignal(parent, COMSIG_ATOM_EXAMINE) + +#undef WEATHER_ALERT_CLEAR +#undef WEATHER_ALERT_INCOMING +#undef WEATHER_ALERT_IMMINENT_OR_ACTIVE diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 67db3f62e28..75605917ef8 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -75,6 +75,10 @@ #endif #endif + // If we have called dump_harddel_info already. Used to avoid duped calls (since we call it immediately in some cases on failure to process) + // Create and destroy is weird and I wanna cover my bases + var/harddel_deets_dumped = FALSE + #ifdef DATUMVAR_DEBUGGING_MODE var/list/cached_vars #endif @@ -128,13 +132,14 @@ //BEGIN: ECS SHIT var/list/dc = _datum_components if(dc) - var/all_components = dc[/datum/component] - if(length(all_components)) - for(var/datum/component/component as anything in all_components) - qdel(component, FALSE, TRUE) - else - var/datum/component/C = all_components - qdel(C, FALSE, TRUE) + for(var/component_key in dc) + var/component_or_list = dc[component_key] + if(islist(component_or_list)) + for(var/datum/component/component as anything in component_or_list) + qdel(component, FALSE, TRUE) + else + var/datum/component/C = component_or_list + qdel(C, FALSE, TRUE) dc.Cut() _clear_signal_refs() @@ -405,5 +410,6 @@ /// Return text from this proc to provide extra context to hard deletes that happen to it /// Optional, you should use this for cases where replication is difficult and extra context is required +/// Can be called more then once per object, use harddel_deets_dumped to avoid duplicate calls (I am so sorry) /datum/proc/dump_harddel_info() return diff --git a/code/datums/diseases/decloning.dm b/code/datums/diseases/decloning.dm index 0b7c74f9a03..5716b2910c9 100644 --- a/code/datums/diseases/decloning.dm +++ b/code/datums/diseases/decloning.dm @@ -3,17 +3,20 @@ name = "Cellular Degeneration" max_stages = 5 stage_prob = 0.5 - cure_text = "Rezadone or death." + cure_text = "Rezadone, Mutadone for prolonging, or death." agent = "Severe Genetic Damage" viable_mobtypes = list(/mob/living/carbon/human) desc = @"If left untreated the subject will [REDACTED]!" severity = "Dangerous!" cures = list(/datum/reagent/medicine/rezadone) - disease_flags = CAN_CARRY|CAN_RESIST spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS spread_text = "Organic meltdown" process_dead = TRUE +/datum/disease/decloning/cure() + affected_mob.remove_status_effect(/datum/status_effect/decloning) + return ..() + /datum/disease/decloning/stage_act(seconds_per_tick, times_fired) . = ..() if(!.) @@ -35,18 +38,17 @@ if(SPT_PROB(1, seconds_per_tick)) affected_mob.emote("drool") if(SPT_PROB(1.5, seconds_per_tick)) - affected_mob.adjustCloneLoss(1, FALSE) + affected_mob.apply_status_effect(/datum/status_effect/decloning) if(SPT_PROB(1, seconds_per_tick)) to_chat(affected_mob, span_danger("Your skin feels strange.")) - if(4) if(SPT_PROB(1, seconds_per_tick)) affected_mob.emote("itch") if(SPT_PROB(1, seconds_per_tick)) affected_mob.emote("drool") if(SPT_PROB(2.5, seconds_per_tick)) + affected_mob.apply_status_effect(/datum/status_effect/decloning) affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1, 170) - affected_mob.adjustCloneLoss(2, FALSE) if(SPT_PROB(7.5, seconds_per_tick)) affected_mob.adjust_stutter(6 SECONDS) if(5) @@ -57,9 +59,5 @@ if(SPT_PROB(2.5, seconds_per_tick)) to_chat(affected_mob, span_danger("Your skin starts degrading!")) if(SPT_PROB(5, seconds_per_tick)) - affected_mob.adjustCloneLoss(5, FALSE) + affected_mob.apply_status_effect(/datum/status_effect/decloning) affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2, 170) - if(affected_mob.cloneloss >= 100) - affected_mob.visible_message(span_danger("[affected_mob] skin turns to dust!"), span_boldwarning("Your skin turns to dust!")) - affected_mob.dust() - return FALSE diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index dc047fecfd9..15f56f8ec2f 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -61,7 +61,7 @@ if(affected_mob.notransform) return affected_mob.notransform = 1 - for(var/obj/item/W in affected_mob.get_equipped_items(TRUE)) + for(var/obj/item/W in affected_mob.get_equipped_items(include_pockets = TRUE)) affected_mob.dropItemToGround(W) for(var/obj/item/I in affected_mob.held_items) affected_mob.dropItemToGround(I) @@ -314,7 +314,7 @@ stage3 = list(span_danger("Your appendages are melting away."), span_danger("Your limbs begin to lose their shape.")) stage4 = list(span_danger("You're ravenous.")) stage5 = list(span_danger("You have become a morph.")) - new_form = /mob/living/simple_animal/hostile/morph + new_form = /mob/living/basic/morph infectable_biotypes = MOB_ORGANIC|MOB_MINERAL|MOB_UNDEAD //magic! transformed_antag_datum = /datum/antagonist/morph diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 71675c67eaa..8261718dc3c 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -907,7 +907,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) apply_status_effect(/datum/status_effect/go_away) if(7) to_chat(src, span_notice("Oh, I actually feel quite alright!")) - ForceContractDisease(new/datum/disease/decloning()) //slow acting, non-viral clone damage based GBS + ForceContractDisease(new /datum/disease/decloning) // slow acting, non-viral GBS if(8) var/list/elligible_organs = list() for(var/obj/item/organ/internal/internal_organ in organs) //make sure we dont get an implant or cavity item diff --git a/code/datums/elements/ai_retaliate.dm b/code/datums/elements/ai_retaliate.dm index 3fb8494a99e..4cca4089633 100644 --- a/code/datums/elements/ai_retaliate.dm +++ b/code/datums/elements/ai_retaliate.dm @@ -12,6 +12,8 @@ target.AddElement(/datum/element/relay_attackers) RegisterSignal(target, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked)) + ADD_TRAIT(target, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, type) + /datum/element/ai_retaliate/Detach(datum/source, ...) . = ..() UnregisterSignal(source, COMSIG_ATOM_WAS_ATTACKED) diff --git a/code/datums/elements/appearance_on_aggro.dm b/code/datums/elements/appearance_on_aggro.dm deleted file mode 100644 index 1e64eb6140a..00000000000 --- a/code/datums/elements/appearance_on_aggro.dm +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Element gave to basic creatures to allow them to change appearance when find a target - */ -/datum/element/appearance_on_aggro - element_flags = ELEMENT_BESPOKE - argument_hash_start_idx = 2 - /// the target key - var/target_key = BB_BASIC_MOB_CURRENT_TARGET - /// path of the overlay to apply - var/mutable_appearance/overlay_path - -/datum/element/appearance_on_aggro/Attach(datum/target, overlay_icon, overlay_state) - . = ..() - if(!isliving(target)) - return ELEMENT_INCOMPATIBLE - src.overlay_path = mutable_appearance(overlay_icon, overlay_state) - RegisterSignal(target, COMSIG_AI_BLACKBOARD_KEY_SET(target_key), PROC_REF(add_overlay)) - RegisterSignal(target, COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_key), PROC_REF(remove_overlay)) - -/datum/element/appearance_on_aggro/proc/remove_overlay(mob/living/source) - SIGNAL_HANDLER - - source.cut_overlay(overlay_path) - -/datum/element/appearance_on_aggro/Detach(datum/target) - . = ..() - UnregisterSignal(target, list(COMSIG_AI_BLACKBOARD_KEY_SET(target_key), COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_key))) - -/datum/element/appearance_on_aggro/proc/add_overlay(mob/living/source) - SIGNAL_HANDLER - var/atom/target = source.ai_controller.blackboard[target_key] - if(isnull(target)) - return - source.add_overlay(overlay_path) diff --git a/code/datums/elements/caseless.dm b/code/datums/elements/caseless.dm index 9f3dd1431f4..a8a1d3df3e4 100644 --- a/code/datums/elements/caseless.dm +++ b/code/datums/elements/caseless.dm @@ -8,7 +8,7 @@ argument_hash_start_idx = 2 var/reusable = FALSE -/datum/element/caseless/Attach(datum/target, reusable) +/datum/element/caseless/Attach(datum/target, reusable = FALSE) . = ..() if(!isammocasing(target)) return ELEMENT_INCOMPATIBLE @@ -17,9 +17,8 @@ /datum/element/caseless/proc/on_fired_casing(obj/item/ammo_casing/shell, atom/target, mob/living/user, fired_from, randomspread, spread, zone_override, params, distro, obj/projectile/proj) SIGNAL_HANDLER - if(!proj) + if(isnull(proj)) return - if(reusable) proj.AddElement(/datum/element/projectile_drop, shell.type) @@ -27,4 +26,4 @@ var/obj/item/gun/shot_from = fired_from if(shot_from.chambered == shell) shot_from.chambered = null //Nuke it. Nuke it now. - qdel(shell) + QDEL_NULL(shell) diff --git a/code/datums/elements/climbable.dm b/code/datums/elements/climbable.dm index 64bb61e89ce..e953766571c 100644 --- a/code/datums/elements/climbable.dm +++ b/code/datums/elements/climbable.dm @@ -70,6 +70,9 @@ if(HAS_TRAIT(user, TRAIT_FREERUNNING)) //do you have any idea how fast I am??? adjusted_climb_time *= 0.8 adjusted_climb_stun *= 0.8 + if(HAS_TRAIT(user, TRAIT_SETTLER)) //hold on, gimme a moment, my tiny legs can't get over the goshdamn table + adjusted_climb_time *= 1.5 + adjusted_climb_stun *= 1.5 LAZYADDASSOCLIST(current_climbers, climbed_thing, user) if(do_after(user, adjusted_climb_time, climbed_thing)) if(QDELETED(climbed_thing)) //Checking if structure has been destroyed diff --git a/code/datums/elements/content_barfer.dm b/code/datums/elements/content_barfer.dm index 782574a2221..e683db3782a 100644 --- a/code/datums/elements/content_barfer.dm +++ b/code/datums/elements/content_barfer.dm @@ -12,10 +12,10 @@ if(!isliving(target)) return ELEMENT_INCOMPATIBLE - RegisterSignals(target, list(COMSIG_LIVING_DEATH, COMSIG_LIVING_ON_WABBAJACKED), PROC_REF(barf_contents)) + RegisterSignals(target, list(COMSIG_LIVING_DEATH, COMSIG_LIVING_ON_WABBAJACKED, COMSIG_LIVING_UNSHAPESHIFTED), PROC_REF(barf_contents)) /datum/element/content_barfer/Detach(datum/target) - UnregisterSignal(target, list(COMSIG_LIVING_DEATH, COMSIG_LIVING_ON_WABBAJACKED)) + UnregisterSignal(target, list(COMSIG_LIVING_DEATH, COMSIG_LIVING_ON_WABBAJACKED, COMSIG_LIVING_UNSHAPESHIFTED)) return ..() /datum/element/content_barfer/proc/barf_contents(mob/living/target) diff --git a/code/datums/elements/embed.dm b/code/datums/elements/embed.dm index 854193c1974..0ba3a581d9a 100644 --- a/code/datums/elements/embed.dm +++ b/code/datums/elements/embed.dm @@ -40,23 +40,23 @@ RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(examined)) RegisterSignal(target, COMSIG_EMBED_TRY_FORCE, PROC_REF(tryForceEmbed)) RegisterSignal(target, COMSIG_ITEM_DISABLE_EMBED, PROC_REF(detachFromWeapon)) - if(!initialized) - src.embed_chance = embed_chance - src.fall_chance = fall_chance - src.pain_chance = pain_chance - src.pain_mult = pain_mult - src.remove_pain_mult = remove_pain_mult - src.rip_time = rip_time - src.impact_pain_mult = impact_pain_mult - src.ignore_throwspeed_threshold = ignore_throwspeed_threshold - src.jostle_chance = jostle_chance - src.jostle_pain_mult = jostle_pain_mult - src.pain_stam_pct = pain_stam_pct - initialized = TRUE else payload_type = projectile_payload RegisterSignal(target, COMSIG_PROJECTILE_SELF_ON_HIT, PROC_REF(checkEmbedProjectile)) + if(!initialized) + src.embed_chance = embed_chance + src.fall_chance = fall_chance + src.pain_chance = pain_chance + src.pain_mult = pain_mult + src.remove_pain_mult = remove_pain_mult + src.rip_time = rip_time + src.impact_pain_mult = impact_pain_mult + src.ignore_throwspeed_threshold = ignore_throwspeed_threshold + src.jostle_chance = jostle_chance + src.jostle_pain_mult = jostle_pain_mult + src.pain_stam_pct = pain_stam_pct + initialized = TRUE /datum/element/embed/Detach(obj/target) . = ..() @@ -131,28 +131,30 @@ /** * checkEmbedProjectile() is what we get when a projectile with a defined shrapnel_type impacts a target. * - * If we hit a valid target, we create the shrapnel_type object and immediately call tryEmbed() on it, targeting what we impacted. That will lead - * it to call tryForceEmbed() on its own embed element (it's out of our hands here, our projectile is done), where it will run through all the checks it needs to. + * If we hit a valid target, we create the shrapnel_type object and then forcefully try to embed it on its + * behalf. DO NOT EVER add an embed element to the payload and let it do the rest. + * That's awful, and it'll limit us to drop-deletable shrapnels in the worry of stuff like + * arrows and harpoons being embeddable even when not let loose by their weapons. */ -/datum/element/embed/proc/checkEmbedProjectile(obj/projectile/P, atom/movable/firer, atom/hit, angle, hit_zone) +/datum/element/embed/proc/checkEmbedProjectile(obj/projectile/source, atom/movable/firer, atom/hit, angle, hit_zone) SIGNAL_HANDLER - if(!iscarbon(hit) || HAS_TRAIT(hit, TRAIT_PIERCEIMMUNE)) - Detach(P) + if(!source.can_embed_into(hit)) + Detach(source) return // we don't care var/obj/item/payload = new payload_type(get_turf(hit)) if(istype(payload, /obj/item/shrapnel/bullet)) - payload.name = P.name - payload.embedding = P.embedding - payload.updateEmbedding() + payload.name = source.name + SEND_SIGNAL(source, COMSIG_PROJECTILE_ON_SPAWN_EMBEDDED, payload) var/mob/living/carbon/C = hit var/obj/item/bodypart/limb = C.get_bodypart(hit_zone) if(!limb) limb = C.get_bodypart() - payload.tryEmbed(limb) // at this point we've created our shrapnel baby and set them up to embed in the target, we can now die in peace as they handle their embed try on their own - Detach(P) + if(!tryForceEmbed(payload, limb)) + payload.failedEmbed() + Detach(source) /** * tryForceEmbed() is called here when we fire COMSIG_EMBED_TRY_FORCE from [/obj/item/proc/tryEmbed]. Mostly, this means we're a piece of shrapnel from a projectile that just impacted something, and we're trying to embed in it. diff --git a/code/datums/elements/footstep.dm b/code/datums/elements/footstep.dm index 4dd2eb94133..bb4e13bb85c 100644 --- a/code/datums/elements/footstep.dm +++ b/code/datums/elements/footstep.dm @@ -79,7 +79,7 @@ var/mob/living/carbon/carbon_source = source if(!carbon_source.get_bodypart(BODY_ZONE_L_LEG) && !carbon_source.get_bodypart(BODY_ZONE_R_LEG)) return - if(carbon_source.m_intent == MOVE_INTENT_WALK) + if(carbon_source.move_intent == MOVE_INTENT_WALK) return// stealth steps_for_living[source] += 1 var/steps = steps_for_living[source] diff --git a/code/datums/elements/haunted.dm b/code/datums/elements/haunted.dm index 1ed7f325294..d678083dd19 100644 --- a/code/datums/elements/haunted.dm +++ b/code/datums/elements/haunted.dm @@ -24,3 +24,13 @@ REMOVE_TRAIT(master, TRAIT_MOVE_FLYING, ELEMENT_TRAIT(type)) master.RemoveElement(/datum/element/movetype_handler) return ..() + +/atom/movable/proc/make_haunted(source, color) //if not haunted, make haunted + if(!HAS_TRAIT(src, TRAIT_HAUNTED)) + AddElement(/datum/element/haunted, color) + ADD_TRAIT(src, TRAIT_HAUNTED, source) + +/atom/movable/proc/remove_haunted(source) //if haunted, make not haunted + REMOVE_TRAIT(src, TRAIT_HAUNTED, source) + if(!HAS_TRAIT(src, TRAIT_HAUNTED)) + RemoveElement(/datum/element/haunted) diff --git a/code/datums/elements/immerse.dm b/code/datums/elements/immerse.dm index 4eae1ebaa0b..6449d8de1ad 100644 --- a/code/datums/elements/immerse.dm +++ b/code/datums/elements/immerse.dm @@ -88,6 +88,8 @@ RegisterSignal(source, COMSIG_ATOM_ABSTRACT_EXITED, PROC_REF(on_atom_exited)) attached_turfs_and_movables += source for(var/atom/movable/movable as anything in source) + if(!(movable.flags_1 & INITIALIZED_1)) + continue on_init_or_entered(source, movable) ///Stops the element from affecting on the turf and its contents. Called on Detach() or when TRAIT_IMMERSE_STOPPED is added. @@ -137,9 +139,9 @@ * without otherwise affecting other movables with identical overlays. */ /datum/element/immerse/proc/add_immerse_overlay(atom/movable/movable) - var/icon/movable_icon = icon(movable.icon) - var/width = movable_icon.Width() || world.icon_size - var/height = movable_icon.Height() || world.icon_size + var/list/icon_dimensions = get_icon_dimensions(movable.icon) + var/width = icon_dimensions["width"] || world.icon_size + var/height = icon_dimensions["height"] || world.icon_size var/is_below_water = movable.layer < WATER_LEVEL_LAYER ? "underwater-" : "" @@ -206,6 +208,7 @@ vis_overlay.overlay_appearance = overlay_appearance generated_visual_overlays["[is_below_water][width]x[height]"] = vis_overlay + return vis_overlay ///This proc removes the vis_overlay, the keep together trait and some signals from the movable. /datum/element/immerse/proc/remove_immerse_overlay(atom/movable/movable) diff --git a/code/datums/elements/lazy_fishing_spot.dm b/code/datums/elements/lazy_fishing_spot.dm index ad8b744f364..82323372e6a 100644 --- a/code/datums/elements/lazy_fishing_spot.dm +++ b/code/datums/elements/lazy_fishing_spot.dm @@ -1,4 +1,7 @@ -// Lazy fishing spot element so fisheable turfs do not have a component each since they're usually pretty common on their respective maps (lava/water/etc) +/** + * Lazy fishing spot element so fisheable turfs do not have a component each since + * they're usually pretty common on their respective maps (lava/water/etc) + */ /datum/element/lazy_fishing_spot element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH_ON_HOST_DESTROY // Detach for turfs argument_hash_start_idx = 2 @@ -8,8 +11,8 @@ . = ..() if(!isatom(target)) return ELEMENT_INCOMPATIBLE - if(!configuration) - CRASH("Lazy fishing spot had no configuration passed in.") + if(!ispath(configuration, /datum/fish_source) || configuration == /datum/fish_source) + CRASH("Lazy fishing spot has incorrect configuration passed in: [configuration].") src.configuration = configuration RegisterSignal(target, COMSIG_PRE_FISHING, PROC_REF(create_fishing_spot)) @@ -21,5 +24,5 @@ /datum/element/lazy_fishing_spot/proc/create_fishing_spot(datum/source) SIGNAL_HANDLER - source.AddComponent(/datum/component/fishing_spot, configuration) + source.AddComponent(/datum/component/fishing_spot, GLOB.preset_fish_sources[configuration]) Detach(source) diff --git a/code/datums/elements/openspace_item_click_handler.dm b/code/datums/elements/openspace_item_click_handler.dm index f0449892ceb..43c7a60d1ef 100644 --- a/code/datums/elements/openspace_item_click_handler.dm +++ b/code/datums/elements/openspace_item_click_handler.dm @@ -19,7 +19,11 @@ SIGNAL_HANDLER if(target.z == user.z) return - var/turf/turf_above = get_step_multiz(target, UP) - if(turf_above?.z == user.z) - INVOKE_ASYNC(source, TYPE_PROC_REF(/obj/item, handle_openspace_click), turf_above, user, user.CanReach(turf_above, source), click_parameters) + var/turf/checked_turf = get_turf(target) + while(!isnull(checked_turf)) + checked_turf = checked_turf.above() + if(checked_turf?.z == user.z) + INVOKE_ASYNC(source, TYPE_PROC_REF(/obj/item, handle_openspace_click), checked_turf, user, user.CanReach(checked_turf, source), click_parameters) + break + return COMPONENT_AFTERATTACK_PROCESSED_ITEM diff --git a/code/datums/elements/projectile_drop.dm b/code/datums/elements/projectile_drop.dm index 633d43c201b..36e189d6c3a 100644 --- a/code/datums/elements/projectile_drop.dm +++ b/code/datums/elements/projectile_drop.dm @@ -1,4 +1,8 @@ -///A simple element that spawns an atom when the bullet hits an object or reaches the end of its range +/** + * A simple element that spawns an atom when the bullet hits an object or reaches the end of its range + * If the projectile has embedding and it can embed into the target, then it won't spawn the drop, + * since embedding the embed element already handles that. + */ /datum/element/projectile_drop element_flags = ELEMENT_BESPOKE argument_hash_start_idx = 2 @@ -9,7 +13,12 @@ if(!isprojectile(target)) return ELEMENT_INCOMPATIBLE src.drop_type = drop_type - RegisterSignals(target, list(COMSIG_PROJECTILE_RANGE_OUT, COMSIG_PROJECTILE_SELF_ON_HIT), PROC_REF(spawn_drop)) + RegisterSignal(target, COMSIG_PROJECTILE_RANGE_OUT, PROC_REF(spawn_drop)) + RegisterSignal(target, COMSIG_PROJECTILE_SELF_ON_HIT, PROC_REF(spawn_drop_if_not_embeddable)) + +/datum/element/projectile_drop/Detach(datum/source) + UnregisterSignal(source, list(COMSIG_PROJECTILE_RANGE_OUT, COMSIG_PROJECTILE_SELF_ON_HIT)) + return ..() /datum/element/projectile_drop/proc/spawn_drop(obj/projectile/source) SIGNAL_HANDLER @@ -17,4 +26,11 @@ var/atom/new_drop = new drop_type(turf) SEND_SIGNAL(source, COMSIG_PROJECTILE_ON_SPAWN_DROP, new_drop) //Just to be safe, knowing it won't be spawned multiple times. - UnregisterSignal(source, list(COMSIG_PROJECTILE_RANGE_OUT, COMSIG_PROJECTILE_SELF_ON_HIT, COMSIG_QDELETING)) + Detach(source) + +/datum/element/projectile_drop/proc/spawn_drop_if_not_embeddable(obj/projectile/source, atom/movable/firer, atom/hit, angle, hit_zone) + SIGNAL_HANDLER + if(source.can_embed_into(hit)) + Detach(source) + return + spawn_drop(source) diff --git a/code/datums/elements/ranged_attacks.dm b/code/datums/elements/ranged_attacks.dm deleted file mode 100644 index abef602632f..00000000000 --- a/code/datums/elements/ranged_attacks.dm +++ /dev/null @@ -1,57 +0,0 @@ -///This proc is used by basic mobs to give them a simple ranged attack! In theory this could be extended to -/datum/element/ranged_attacks - element_flags = ELEMENT_BESPOKE - argument_hash_start_idx = 2 - var/casingtype = /obj/item/ammo_casing/glockroach - var/projectilesound = 'sound/weapons/gun/pistol/shot.ogg' - var/projectiletype - -/datum/element/ranged_attacks/Attach(atom/movable/target, casingtype, projectilesound, projectiletype) - . = ..() - if(!isbasicmob(target)) - return COMPONENT_INCOMPATIBLE - - src.casingtype = casingtype - src.projectilesound = projectilesound - src.projectiletype = projectiletype - - RegisterSignal(target, COMSIG_MOB_ATTACK_RANGED, PROC_REF(fire_ranged_attack)) - - if(casingtype && projectiletype) - CRASH("Set both casing type and projectile type in [target]'s ranged attacks element! uhoh! stinky!") - -/datum/element/ranged_attacks/Detach(datum/target) - UnregisterSignal(target, COMSIG_MOB_ATTACK_RANGED) - return ..() - -/datum/element/ranged_attacks/proc/fire_ranged_attack(mob/living/basic/firer, atom/target, modifiers) - SIGNAL_HANDLER - INVOKE_ASYNC(src, PROC_REF(async_fire_ranged_attack), firer, target, modifiers) - - -/datum/element/ranged_attacks/proc/async_fire_ranged_attack(mob/living/basic/firer, atom/target, modifiers) - var/turf/startloc = get_turf(firer) - - if(casingtype) - var/obj/item/ammo_casing/casing = new casingtype(startloc) - playsound(firer, projectilesound, 100, TRUE) - var/target_zone - if(ismob(target)) - var/mob/target_mob = target - target_zone = target_mob.get_random_valid_zone() - else - target_zone = ran_zone() - casing.fire_casing(target, firer, null, null, null, target_zone, 0, firer) - casing.AddElement(/datum/element/temporary_atom, 30 SECONDS) - - else if(projectiletype) - var/obj/projectile/P = new projectiletype(startloc) - playsound(firer, projectilesound, 100, TRUE) - P.starting = startloc - P.firer = firer - P.fired_from = firer - P.yo = target.y - startloc.y - P.xo = target.x - startloc.x - P.original = target - P.preparePixelProjectile(target, firer) - P.fire() diff --git a/code/datums/elements/relay_attackers.dm b/code/datums/elements/relay_attackers.dm index 307732c46ed..9f134daf71b 100644 --- a/code/datums/elements/relay_attackers.dm +++ b/code/datums/elements/relay_attackers.dm @@ -15,6 +15,7 @@ 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, ...) . = ..() @@ -30,22 +31,30 @@ COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_MECH, )) + REMOVE_TRAIT(source, TRAIT_RELAYING_ATTACKER, REF(src)) /datum/element/relay_attackers/proc/after_attackby(atom/target, obj/item/weapon, mob/attacker) SIGNAL_HANDLER if(weapon.force) - relay_attacker(target, attacker, weapon.damtype == STAMINA ? ATTACKER_STAMINA_ATTACK : NONE) + relay_attacker(target, attacker, weapon.damtype == STAMINA ? ATTACKER_STAMINA_ATTACK : ATTACKER_DAMAGING_ATTACK) /datum/element/relay_attackers/proc/on_attack_generic(atom/target, mob/living/attacker, list/modifiers) SIGNAL_HANDLER - var/shoving = LAZYACCESS(modifiers, RIGHT_CLICK) ? ATTACKER_SHOVING : NONE - if(attacker.combat_mode || shoving) - relay_attacker(target, attacker, shoving) + + // Check for a shove. + if(LAZYACCESS(modifiers, RIGHT_CLICK)) + relay_attacker(target, attacker, ATTACKER_SHOVING) + return + + // Else check for combat mode. + if(attacker.combat_mode) + relay_attacker(target, attacker, ATTACKER_DAMAGING_ATTACK) + return /datum/element/relay_attackers/proc/on_attack_npc(atom/target, mob/living/attacker) SIGNAL_HANDLER if(attacker.melee_damage_upper > 0) - relay_attacker(target, attacker) + relay_attacker(target, attacker, ATTACKER_DAMAGING_ATTACK) /// Even if another component blocked this hit, someone still shot at us /datum/element/relay_attackers/proc/on_bullet_act(atom/target, list/bullet_args, obj/projectile/hit_projectile) @@ -54,7 +63,7 @@ return if(!ismob(hit_projectile.firer)) return - relay_attacker(target, hit_projectile.firer, hit_projectile.damage_type == STAMINA ? ATTACKER_STAMINA_ATTACK : NONE) + relay_attacker(target, hit_projectile.firer, hit_projectile.damage_type == STAMINA ? ATTACKER_STAMINA_ATTACK : ATTACKER_DAMAGING_ATTACK) /// Even if another component blocked this hit, someone still threw something /datum/element/relay_attackers/proc/on_hitby(atom/target, atom/movable/hit_atom, datum/thrownthing/throwingdatum) @@ -67,15 +76,15 @@ var/mob/thrown_by = hit_item.thrownby?.resolve() if(!ismob(thrown_by)) return - relay_attacker(target, thrown_by, hit_item.damtype == STAMINA ? ATTACKER_STAMINA_ATTACK : NONE) + relay_attacker(target, thrown_by, hit_item.damtype == STAMINA ? ATTACKER_STAMINA_ATTACK : ATTACKER_DAMAGING_ATTACK) /datum/element/relay_attackers/proc/on_attack_hulk(atom/target, mob/attacker) SIGNAL_HANDLER - relay_attacker(target, attacker) + relay_attacker(target, attacker, ATTACKER_DAMAGING_ATTACK) /datum/element/relay_attackers/proc/on_attack_mech(atom/target, obj/vehicle/sealed/mecha/mecha_attacker, mob/living/pilot) SIGNAL_HANDLER - relay_attacker(target, mecha_attacker) + relay_attacker(target, mecha_attacker, ATTACKER_DAMAGING_ATTACK) /// Send out a signal identifying whoever just attacked us (usually a mob but sometimes a mech or turret) /datum/element/relay_attackers/proc/relay_attacker(atom/victim, atom/attacker, attack_flags) diff --git a/code/datums/elements/skill_reward.dm b/code/datums/elements/skill_reward.dm index ac80c53449d..0c0e04754f7 100644 --- a/code/datums/elements/skill_reward.dm +++ b/code/datums/elements/skill_reward.dm @@ -28,7 +28,7 @@ ///We check if the item can be equipped, otherwise we drop it. /datum/element/skill_reward/proc/drop_if_unworthy(datum/source, mob/living/user) SIGNAL_HANDLER - if(check_equippable(user) | !(source in user.get_equipped_items(TRUE))) + if(check_equippable(user) | !(source in user.get_equipped_items(include_pockets = TRUE, include_accessories = TRUE))) return to_chat(user, span_warning("You feel completely and utterly unworthy to even touch \the [source].")) user.dropItemToGround(src, TRUE) diff --git a/code/datums/elements/skittish.dm b/code/datums/elements/skittish.dm index 0690739c539..7f642377370 100644 --- a/code/datums/elements/skittish.dm +++ b/code/datums/elements/skittish.dm @@ -17,7 +17,7 @@ /datum/element/skittish/proc/Bump(mob/living/scooby, atom/target) SIGNAL_HANDLER - if(scooby.stat != CONSCIOUS || scooby.m_intent != MOVE_INTENT_RUN) + if(scooby.stat != CONSCIOUS || scooby.move_intent != MOVE_INTENT_RUN) return if(!istype(target, /obj/structure/closet)) diff --git a/code/datums/elements/sticker.dm b/code/datums/elements/sticker.dm index 57b63dad894..3cc8e977daf 100644 --- a/code/datums/elements/sticker.dm +++ b/code/datums/elements/sticker.dm @@ -39,7 +39,7 @@ ///Add our stick_type to the target with px and py as pixel x and pixel y respectively /datum/element/sticker/proc/do_stick(obj/item/source, atom/target, mob/living/user, px, py) - if(length(GET_TRAIT_SOURCES(target, TRAIT_STICKERED)) >= MAX_ALLOWED_STICKERS) + if(COUNT_TRAIT_SOURCES(target, TRAIT_STICKERED) >= MAX_ALLOWED_STICKERS) source.balloon_alert_to_viewers("sticker won't stick!") return FALSE target.AddComponent(stick_type, px, py, source, user, washable) diff --git a/code/datums/elements/strippable.dm b/code/datums/elements/strippable.dm index 59433abf512..e6f0d257ed7 100644 --- a/code/datums/elements/strippable.dm +++ b/code/datums/elements/strippable.dm @@ -351,7 +351,7 @@ continue var/obj/item/item = item_data.get_item(owner) - if (isnull(item) || (HAS_TRAIT(item, TRAIT_NO_STRIP))) + if (isnull(item) || (HAS_TRAIT(item, TRAIT_NO_STRIP) || (item.item_flags & EXAMINE_SKIP))) items[strippable_key] = result continue diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index ba40fc5f0b4..96a525eecd9 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -122,7 +122,7 @@ for(var/mob/ghost as anything in GLOB.dead_mob_list) if(!ghost.client || isnewplayer(ghost)) continue - if(ghost.client.prefs.chat_toggles & CHAT_GHOSTSIGHT && !(ghost in viewers(user_turf, null))) + if(get_chat_toggles(ghost.client) & CHAT_GHOSTSIGHT && !(ghost in viewers(user_turf, null))) ghost.show_message("[FOLLOW_LINK(ghost, user)] [dchatmsg]") if(emote_type & (EMOTE_AUDIBLE | EMOTE_VISIBLE)) //emote is audible and visible user.audible_message(msg, deaf_message = "You see how [user] [msg]", audible_message_flags = EMOTE_MESSAGE) @@ -351,6 +351,6 @@ for(var/mob/ghost as anything in GLOB.dead_mob_list) if(!ghost.client || isnewplayer(ghost)) continue - if(ghost.client.prefs.chat_toggles & CHAT_GHOSTSIGHT && !(ghost in viewers(origin_turf, null))) + if(get_chat_toggles(ghost.client) & CHAT_GHOSTSIGHT && !(ghost in viewers(origin_turf, null))) ghost.show_message("[FOLLOW_LINK(ghost, src)] [ghost_text]") return TRUE diff --git a/code/datums/forced_movement.dm b/code/datums/forced_movement.dm index 93371f0430b..407f258281c 100644 --- a/code/datums/forced_movement.dm +++ b/code/datums/forced_movement.dm @@ -33,6 +33,7 @@ STOP_PROCESSING(SSfastprocess, src) victim = null target = null + on_step = null return ..() //Todo: convert diff --git a/code/datums/greyscale/_greyscale_config.dm b/code/datums/greyscale/_greyscale_config.dm index f48b6515b62..9d3099d770b 100644 --- a/code/datums/greyscale/_greyscale_config.dm +++ b/code/datums/greyscale/_greyscale_config.dm @@ -193,9 +193,9 @@ /// Reads layer configurations to take out some useful overall information /datum/greyscale_config/proc/ReadMetadata() - var/icon/source = icon(icon_file) - height = source.Height() - width = source.Width() + var/list/icon_dimensions = get_icon_dimensions(icon_file) + height = icon_dimensions["width"] + width = icon_dimensions["height"] var/list/datum/greyscale_layer/all_layers = list() for(var/state in icon_states) diff --git a/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm b/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm index 9d9dcb6c237..95a27524bd0 100644 --- a/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm +++ b/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm @@ -423,6 +423,24 @@ SKYRAT EDIT END */ name = "Oversized Jacket (Worn)" icon_file = 'icons/mob/clothing/suits/jacket.dmi' +/datum/greyscale_config/jacket_lawyer + name = "Formal Suit Jacket" + icon_file = 'icons/obj/clothing/suits/jacket.dmi' + json_config = 'code/datums/greyscale/json_configs/jacket_lawyer.json' + +/datum/greyscale_config/jacket_lawyer/worn + name = "Formal Suit Jacket (Worn)" + icon_file = 'icons/mob/clothing/suits/jacket.dmi' + +/datum/greyscale_config/overalls + name = "Overalls" + icon_file = 'icons/obj/clothing/suits/utility.dmi' + json_config = 'code/datums/greyscale/json_configs/overalls.json' + +/datum/greyscale_config/overalls/worn + name = "Overalls (Worn)" + icon_file = 'icons/mob/clothing/suits/utility.dmi' + // // SHOES // diff --git a/code/datums/greyscale/json_configs/jacket_lawyer.json b/code/datums/greyscale/json_configs/jacket_lawyer.json new file mode 100644 index 00000000000..9593f9c90c3 --- /dev/null +++ b/code/datums/greyscale/json_configs/jacket_lawyer.json @@ -0,0 +1,18 @@ +{ + "jacket_lawyer": [ + { + "type": "icon_state", + "icon_state": "suitjacket", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ], + "jacket_lawyer_t": [ + { + "type": "icon_state", + "icon_state": "suitjacket_t", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/modular_skyrat/modules/GAGS/json_configs/overalls/overalls_worn.json b/code/datums/greyscale/json_configs/overalls.json similarity index 100% rename from modular_skyrat/modules/GAGS/json_configs/overalls/overalls_worn.json rename to code/datums/greyscale/json_configs/overalls.json diff --git a/code/datums/greyscale/json_configs/ties.json b/code/datums/greyscale/json_configs/ties.json index e9c1225d893..7f1e717c5f0 100644 --- a/code/datums/greyscale/json_configs/ties.json +++ b/code/datums/greyscale/json_configs/ties.json @@ -14,5 +14,14 @@ "blend_mode": "overlay", "color_ids": [ 1 ] } + ], + "bowtie_greyscale": [ + { + "type": "icon_state", + "icon_state": "bowtie_greyscale", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } ] + } diff --git a/code/datums/helper_datums/events.dm b/code/datums/helper_datums/events.dm index 512b5097c07..42750c752f1 100644 --- a/code/datums/helper_datums/events.dm +++ b/code/datums/helper_datums/events.dm @@ -11,9 +11,6 @@ events = new /datum/events/Destroy() - for(var/elist in events) - for(var/e in events[elist]) - qdel(e) events = null return ..() @@ -23,8 +20,8 @@ return TRUE return FALSE -// Arguments: event_type as text, proc_holder as datum, proc_name as text -// Returns: New event, null on error. +/// Arguments: event_type as text, proc_holder as datum, proc_name as text +/// Returns: New event, null on error. /datum/events/proc/addEvent(event_type as text, datum/callback/cb) if(!event_type || !cb) return @@ -33,23 +30,20 @@ event += cb return cb -// Arguments: event_type as text, any number of additional arguments to pass to event handler -// Returns: null +/// Arguments: event_type as text, any number of additional arguments to pass to event handler +/// Returns: null /datum/events/proc/fireEvent(eventName, ...) - var/list/event = LAZYACCESS(events,eventName) if(istype(event)) for(var/E in event) var/datum/callback/cb = E cb.InvokeAsync(arglist(args.Copy(2))) -// Arguments: event_type as text, E as /datum/event -// Returns: TRUE if event cleared, FALSE on error - +/// Arguments: event_type as text, E as /datum/event +/// Returns: TRUE if event cleared, FALSE on error /datum/events/proc/clearEvent(event_type as text, datum/callback/cb) if(!event_type || !cb) return FALSE var/list/event = LAZYACCESS(events,event_type) event -= cb - qdel(cb) return TRUE diff --git a/code/datums/keybinding/mob.dm b/code/datums/keybinding/mob.dm index 9c2a15a41e5..a53e3390e12 100644 --- a/code/datums/keybinding/mob.dm +++ b/code/datums/keybinding/mob.dm @@ -82,12 +82,12 @@ . = ..() if(.) return - var/mob/M = user.mob + var/mob/living/M = user.mob M.toggle_move_intent() return TRUE /datum/keybinding/mob/toggle_move_intent/up(client/user) - var/mob/M = user.mob + var/mob/living/M = user.mob M.toggle_move_intent() return TRUE @@ -102,7 +102,7 @@ . = ..() if(.) return - var/mob/M = user.mob + var/mob/living/M = user.mob M.toggle_move_intent() return TRUE diff --git a/code/datums/map_config.dm b/code/datums/map_config.dm index 7a6e7776b1c..9535bcf8576 100644 --- a/code/datums/map_config.dm +++ b/code/datums/map_config.dm @@ -44,6 +44,9 @@ /// List of unit tests that are skipped when running this map var/list/skipped_tests + /// Boolean that tells SSmapping to load all away missions in the codebase. + var/load_all_away_missions = FALSE + /** * Proc that simply loads the default map config, which should always be functional. */ @@ -185,6 +188,9 @@ if ("blacklist_file" in json) blacklist_file = json["blacklist_file"] + if ("load_all_away_missions" in json) + load_all_away_missions = json["load_all_away_missions"] + allow_custom_shuttles = json["allow_custom_shuttles"] != FALSE if ("job_changes" in json) diff --git a/code/datums/mapgen/CaveGenerator.dm b/code/datums/mapgen/CaveGenerator.dm index df74c6d3cd2..48df6e164fb 100644 --- a/code/datums/mapgen/CaveGenerator.dm +++ b/code/datums/mapgen/CaveGenerator.dm @@ -52,10 +52,10 @@ . = ..() if(!weighted_mob_spawn_list) weighted_mob_spawn_list = list( + /mob/living/basic/mining/basilisk = 4, + /mob/living/basic/mining/goldgrub = 1, /mob/living/basic/mining/goliath/ancient = 5, - /mob/living/simple_animal/hostile/asteroid/basilisk = 4, /mob/living/simple_animal/hostile/asteroid/hivelord = 3, - /mob/living/simple_animal/hostile/asteroid/goldgrub = 1, ) mob_spawn_list = expand_weights(weighted_mob_spawn_list) mob_spawn_no_mega_list = expand_weights(weighted_mob_spawn_list - SPAWN_MEGAFAUNA) @@ -148,10 +148,12 @@ //MOB SPAWNING HERE if(mobs_allowed && !spawned_something && prob(mob_spawn_chance)) var/atom/picked_mob = pick(mob_spawn_list) + var/is_megafauna = FALSE if(picked_mob == SPAWN_MEGAFAUNA) if(megas_allowed) //this is danger. it's boss time. picked_mob = pick(megafauna_spawn_list) + is_megafauna = TRUE else //this is not danger, don't spawn a boss, spawn something else picked_mob = pick(mob_spawn_no_mega_list) //What if we used 100% of the brain...and did something (slightly) less shit than a while loop? @@ -162,12 +164,16 @@ for(var/obj/structure/spawner/lavaland/spawn_blocker in range(2, turf)) can_spawn = FALSE break - //if the random is a standard mob, avoid spawning if there's another one within 12 tiles - else if(isminingpath(picked_mob)) - for(var/mob/living/mob_blocker in range(12, turf)) + // if the random is not a tendril (hopefully meaning it is a mob), avoid spawning if there's another one within 12 tiles + else + var/list/things_in_range = range(12, turf) + for(var/mob/living/mob_blocker in things_in_range) if(ismining(mob_blocker)) can_spawn = FALSE break + // Also block spawns if there's a random lavaland mob spawner nearby and it's not a mega + if(!is_megafauna) + can_spawn = can_spawn && !(locate(/obj/effect/spawner/random/lavaland_mob) in things_in_range) //if there's a megafauna within standard view don't spawn anything at all (This isn't really consistent, I don't know why we do this. you do you tho) if(can_spawn) for(var/mob/living/simple_animal/hostile/megafauna/found_fauna in range(7, turf)) diff --git a/code/datums/mapgen/Cavegens/IcemoonCaves.dm b/code/datums/mapgen/Cavegens/IcemoonCaves.dm index 8e94c9563bd..89a153aedd7 100644 --- a/code/datums/mapgen/Cavegens/IcemoonCaves.dm +++ b/code/datums/mapgen/Cavegens/IcemoonCaves.dm @@ -5,7 +5,7 @@ weighted_mob_spawn_list = list( /mob/living/basic/mining/lobstrosity = 15, - /mob/living/simple_animal/hostile/asteroid/goldgrub = 10, + /mob/living/basic/mining/goldgrub = 10, /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow = 50, /mob/living/simple_animal/hostile/asteroid/polarbear = 30, /mob/living/simple_animal/hostile/asteroid/wolf = 50, @@ -62,12 +62,12 @@ weighted_closed_turf_types = list(/turf/closed/mineral/random/snow/underground = 1) weighted_mob_spawn_list = list( SPAWN_MEGAFAUNA = 1, - /mob/living/simple_animal/hostile/asteroid/ice_demon = 100, - /mob/living/simple_animal/hostile/asteroid/ice_whelp = 60, + /mob/living/basic/mining/ice_whelp = 60, /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow = 100, + /mob/living/simple_animal/hostile/asteroid/ice_demon = 100, /obj/structure/spawner/ice_moon/demonic_portal = 6, - /obj/structure/spawner/ice_moon/demonic_portal/ice_whelp = 6, /obj/structure/spawner/ice_moon/demonic_portal/snowlegion = 6, + /obj/structure/spawner/ice_moon/demonic_portal/ice_whelp = 6, ) weighted_megafauna_spawn_list = list(/mob/living/simple_animal/hostile/megafauna/colossus = 1) weighted_flora_spawn_list = list( diff --git a/code/datums/mapgen/Cavegens/LavalandGenerator.dm b/code/datums/mapgen/Cavegens/LavalandGenerator.dm index ea440d2cf21..be8294fada6 100644 --- a/code/datums/mapgen/Cavegens/LavalandGenerator.dm +++ b/code/datums/mapgen/Cavegens/LavalandGenerator.dm @@ -4,13 +4,13 @@ weighted_mob_spawn_list = list( SPAWN_MEGAFAUNA = 2, + /obj/effect/spawner/random/lavaland_mob/goliath = 50, + /obj/effect/spawner/random/lavaland_mob/legion = 30, + /obj/effect/spawner/random/lavaland_mob/watcher = 40, /mob/living/basic/mining/bileworm = 20, - /mob/living/basic/mining/goliath/random = 50, /mob/living/basic/mining/lobstrosity/lava = 20, /mob/living/simple_animal/hostile/asteroid/brimdemon = 20, - /mob/living/simple_animal/hostile/asteroid/goldgrub = 10, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/random = 30, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random = 40, + /mob/living/basic/mining/goldgrub = 10, /obj/structure/spawner/lavaland = 2, /obj/structure/spawner/lavaland/goliath = 3, /obj/structure/spawner/lavaland/legion = 3, diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm index 44061746eaf..fcef1b5d3d8 100644 --- a/code/datums/materials/basemats.dm +++ b/code/datums/materials/basemats.dm @@ -332,10 +332,12 @@ Unless you know what you're doing, only use the first three numbers. They're in . = ..() if(isitem(source)) source.AddComponent(/datum/component/fantasy) + ADD_TRAIT(source, TRAIT_INNATELY_FANTASTICAL_ITEM, REF(src)) // DO THIS LAST OR WE WILL NEVER GET OUR BONUSES!!! /datum/material/mythril/on_removed_obj(atom/source, amount, material_flags) . = ..() if(isitem(source)) + REMOVE_TRAIT(source, TRAIT_INNATELY_FANTASTICAL_ITEM, REF(src)) // DO THIS FIRST OR WE WILL NEVER GET OUR BONUSES DELETED!!! qdel(source.GetComponent(/datum/component/fantasy)) /datum/material/mythril/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) diff --git a/code/datums/materials/hauntium.dm b/code/datums/materials/hauntium.dm index 9a4e09f9081..79e25441720 100644 --- a/code/datums/materials/hauntium.dm +++ b/code/datums/materials/hauntium.dm @@ -15,10 +15,8 @@ /datum/material/hauntium/on_applied_obj(obj/o, amount, material_flags) . = ..() - if(isitem(o)) - o.AddElement(/datum/element/haunted) + o.make_haunted(INNATE_TRAIT, "#f8f8ff") /datum/material/hauntium/on_removed_obj(obj/o, amount, material_flags) . = ..() - if(isitem(o)) - o.RemoveElement(/datum/element/haunted) + o.remove_haunted(INNATE_TRAIT) diff --git a/code/datums/memory/_memory.dm b/code/datums/memory/_memory.dm index 808be225ef9..35d1a6683f3 100644 --- a/code/datums/memory/_memory.dm +++ b/code/datums/memory/_memory.dm @@ -255,26 +255,26 @@ /mob/living/basic/cow, /mob/living/basic/cow/wisdom, /mob/living/basic/crab, - /mob/living/basic/giant_spider, - /mob/living/basic/giant_spider/hunter, - /mob/living/basic/mining/goliath, /mob/living/basic/headslug, /mob/living/basic/killer_tomato, /mob/living/basic/lizard, + /mob/living/basic/mining/goliath, + /mob/living/basic/mining/watcher, + /mob/living/basic/morph, /mob/living/basic/mouse, /mob/living/basic/mushroom, /mob/living/basic/pet/dog/breaddog, /mob/living/basic/pet/dog/corgi, /mob/living/basic/pet/dog/pug, /mob/living/basic/pet/fox, + /mob/living/basic/spider/giant, + /mob/living/basic/spider/giant/hunter, /mob/living/basic/statue, /mob/living/basic/stickman, /mob/living/basic/stickman/dog, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher, /mob/living/simple_animal/hostile/blob/blobbernaut/independent, /mob/living/simple_animal/hostile/gorilla, /mob/living/simple_animal/hostile/megafauna/dragon/lesser, - /mob/living/simple_animal/hostile/morph, /mob/living/simple_animal/hostile/retaliate/goat, /mob/living/simple_animal/parrot, /mob/living/simple_animal/pet/cat, diff --git a/code/datums/memory/general_memories.dm b/code/datums/memory/general_memories.dm index e3a4a88cd76..3e5eb05cf40 100644 --- a/code/datums/memory/general_memories.dm +++ b/code/datums/memory/general_memories.dm @@ -725,14 +725,14 @@ return list("[protagonist_name] [mood_verb] as they [result] the deadly game of roulette.") /// When a heretic finishes their ritual of knowledge -/datum/memory/heretic_knowlege_ritual +/datum/memory/heretic_knowledge_ritual story_value = STORY_VALUE_AMAZING // Protagonist = heretic -/datum/memory/heretic_knowlege_ritual/get_names() +/datum/memory/heretic_knowledge_ritual/get_names() return list("[protagonist_name] absorbing boundless knowledge through eldritch research.") -/datum/memory/heretic_knowlege_ritual/get_starts() +/datum/memory/heretic_knowledge_ritual/get_starts() return list( "[protagonist_name] laying out a circle of green tar and candles", "multiple books around [protagonist_name] flipping open", @@ -742,16 +742,16 @@ "a wide, strange looking circle, with [protagonist_name] sketching it" ) -/datum/memory/heretic_knowlege_ritual/get_moods() +/datum/memory/heretic_knowledge_ritual/get_moods() return list("[protagonist_name] [mood_verb] as their hand glows with power.") -/datum/memory/heretic_knowlege_ritual/get_happy_moods() +/datum/memory/heretic_knowledge_ritual/get_happy_moods() return list("cackling madly") -/datum/memory/heretic_knowlege_ritual/get_neutral_moods() +/datum/memory/heretic_knowledge_ritual/get_neutral_moods() return list("staring blankly with a wide grin") -/datum/memory/heretic_knowlege_ritual/get_sad_moods() +/datum/memory/heretic_knowledge_ritual/get_sad_moods() return list("cackling insanely") /// Failed to defuse a bomb, by triggering it early. diff --git a/code/datums/mood_events/drink_events.dm b/code/datums/mood_events/drink_events.dm index e2d539940bd..5b08b0122d8 100644 --- a/code/datums/mood_events/drink_events.dm +++ b/code/datums/mood_events/drink_events.dm @@ -48,14 +48,7 @@ mood_change = 50 timeout = 10 MINUTES -// SKYRAT ADD BEGIN -/datum/mood_event/race_drink - description = "That drink was made for me!\n" - mood_change = 12 - timeout = 9 MINUTES - -//SKYRAT ADD END /datum/mood_event/wellcheers - description = "What a tasty can of Wellcheers! The salty grape taste is a great pick-me-up." + description = "What a tasty can of Wellcheers! The salty grape flavor is a great pick-me-up." mood_change = 3 timeout = 7 MINUTES diff --git a/code/datums/mood_events/drug_events.dm b/code/datums/mood_events/drug_events.dm index 05d6eabd7d7..c734f2797b4 100644 --- a/code/datums/mood_events/drug_events.dm +++ b/code/datums/mood_events/drug_events.dm @@ -121,3 +121,8 @@ /datum/mood_event/nicotine_withdrawal_severe description = "Head pounding. Cold sweating. Feeling anxious. Need a smoke to calm down!" mood_change = -8 + +/datum/mood_event/hauntium_spirits + description = "I feel my soul degrading!" + mood_change = -8 + timeout = 8 MINUTES diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 27e2645efd3..28526d9b8b3 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -82,6 +82,19 @@ mood_change = -10 timeout = 8 MINUTES +/datum/mood_event/dismembered/add_effects(obj/item/bodypart/limb) + if(limb) + description = "AHH! I WAS USING THAT [full_capitalize(limb.plaintext_zone)]" + +/datum/mood_event/reattachment + description = "Ouch! My limb feels like I fell asleep on it." + mood_change = -3 + timeout = 2 MINUTES + +/datum/mood_event/reattachment/add_effects(obj/item/bodypart/limb) + if(limb) + description = "Ouch! My [limb.plaintext_zone] feels like I fell asleep on it." + /datum/mood_event/tased description = "There's no \"z\" in \"taser\". It's in the zap." mood_change = -3 diff --git a/code/datums/mood_events/morbid_events.dm b/code/datums/mood_events/morbid_events.dm index ce3ba60738f..b21548c8122 100644 --- a/code/datums/mood_events/morbid_events.dm +++ b/code/datums/mood_events/morbid_events.dm @@ -32,6 +32,11 @@ Intended to push a creepy, mad scientist/doctor vibe, or someone who is downrigh mood_change = 2 timeout = 2 MINUTES +/datum/mood_event/morbid_hauntium + description = "I feel a better connection with the spirits, I love this!" + mood_change = 3 + timeout = 6 MINUTES + // Negative Events - We helped someone stay alive. /datum/mood_event/morbid_tend_wounds diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm index 5794f0577dd..0de7daa6589 100644 --- a/code/datums/mutations/hulk.dm +++ b/code/datums/mutations/hulk.dm @@ -12,7 +12,7 @@ var/scream_delay = 50 var/last_scream = 0 /// List of traits to add/remove when someone gets this mutation. - var/static/list/mutation_traits = list( + var/list/mutation_traits = list( TRAIT_CHUNKYFINGERS, TRAIT_HULK, TRAIT_IGNOREDAMAGESLOWDOWN, @@ -257,4 +257,17 @@ yeeted_person.throw_at(T, 10, 6, the_hulk, TRUE, TRUE) log_combat(the_hulk, yeeted_person, "has thrown by tail") +/datum/mutation/human/hulk/wizardly + species_allowed = null //yes skeleton/lizard hulk - note that species that dont have skintone changing (like skellies) get custom handling + health_req = 0 + instability = 0 + scream_delay = 2.5 SECONDS // halved to be more annoying (spell doesn't last long anyways) + /// List of traits to add/remove when someone gets this mutation. + mutation_traits = list( + TRAIT_HULK, + TRAIT_IGNOREDAMAGESLOWDOWN, + TRAIT_PUSHIMMUNE, + TRAIT_STUNIMMUNE, + ) // no chunk + #undef HULK_TAILTHROW_STEPS diff --git a/code/datums/mutations/sight.dm b/code/datums/mutations/sight.dm index 684513bc601..69514ded90f 100644 --- a/code/datums/mutations/sight.dm +++ b/code/datums/mutations/sight.dm @@ -167,7 +167,7 @@ to_chat(source, span_warning("You shoot with your laser eyes!")) source.changeNext_move(CLICK_CD_RANGE) source.newtonian_move(get_dir(target, source)) - var/obj/projectile/beam/laser_eyes/LE = new(source.loc) + var/obj/projectile/beam/laser/laser_eyes/LE = new(source.loc) LE.firer = source LE.def_zone = ran_zone(source.zone_selected) LE.preparePixelProjectile(target, source, modifiers) @@ -175,7 +175,7 @@ playsound(source, 'sound/weapons/taser2.ogg', 75, TRUE) ///Projectile type used by laser eyes -/obj/projectile/beam/laser_eyes +/obj/projectile/beam/laser/laser_eyes name = "beam" icon = 'icons/mob/effects/genetics.dmi' icon_state = "eyelasers" diff --git a/code/datums/mutations/webbing.dm b/code/datums/mutations/webbing.dm index 4fce0e29da0..0fda118d0ed 100644 --- a/code/datums/mutations/webbing.dm +++ b/code/datums/mutations/webbing.dm @@ -5,12 +5,12 @@ quality = POSITIVE text_gain_indication = "Your skin feels webby." instability = 15 - power_path = /datum/action/cooldown/lay_web/genetic + power_path = /datum/action/cooldown/mob_cooldown/lay_web/genetic energy_coeff = 1 /datum/mutation/human/webbing/modify() . = ..() - var/datum/action/cooldown/lay_web/genetic/to_modify = . + var/datum/action/cooldown/mob_cooldown/lay_web/genetic/to_modify = . if(!istype(to_modify)) // null or invalid return diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm index 003b68bea53..6175dd157c4 100644 --- a/code/datums/progressbar.dm +++ b/code/datums/progressbar.dm @@ -18,7 +18,8 @@ var/listindex = 0 ///The type of our last value for bar_loc, for debugging var/location_type - + ///Where to draw the progress bar above the icon + var/offset_y /datum/progressbar/New(mob/User, goal_number, atom/target) . = ..() @@ -37,7 +38,12 @@ goal = goal_number bar_loc = target location_type = bar_loc.type - bar = image('icons/effects/progressbar.dmi', bar_loc, "prog_bar_0") + + var/list/icon_offsets = target.get_oversized_icon_offsets() + var/offset_x = icon_offsets["x"] + offset_y = icon_offsets["y"] + + bar = image('icons/effects/progressbar.dmi', bar_loc, "prog_bar_0", pixel_x = offset_x) SET_PLANE_EXPLICIT(bar, ABOVE_HUD_PLANE, User) bar.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA user = User @@ -63,8 +69,8 @@ continue progress_bar.listindex-- - progress_bar.bar.pixel_y = 32 + (PROGRESSBAR_HEIGHT * (progress_bar.listindex - 1)) - var/dist_to_travel = 32 + (PROGRESSBAR_HEIGHT * (progress_bar.listindex - 1)) - PROGRESSBAR_HEIGHT + progress_bar.bar.pixel_y = world.icon_size + offset_y + (PROGRESSBAR_HEIGHT * (progress_bar.listindex - 1)) + var/dist_to_travel = world.icon_size + offset_y + (PROGRESSBAR_HEIGHT * (progress_bar.listindex - 1)) - PROGRESSBAR_HEIGHT animate(progress_bar.bar, pixel_y = dist_to_travel, time = PROGRESSBAR_ANIMATION_TIME, easing = SINE_EASING) LAZYREMOVEASSOC(user.progressbars, bar_loc, src) @@ -119,7 +125,7 @@ bar.pixel_y = 0 bar.alpha = 0 user_client.images += bar - animate(bar, pixel_y = 32 + (PROGRESSBAR_HEIGHT * (listindex - 1)), alpha = 255, time = PROGRESSBAR_ANIMATION_TIME, easing = SINE_EASING) + animate(bar, pixel_y = world.icon_size + offset_y + (PROGRESSBAR_HEIGHT * (listindex - 1)), alpha = 255, time = PROGRESSBAR_ANIMATION_TIME, easing = SINE_EASING) ///Updates the progress bar image visually. @@ -143,6 +149,9 @@ ///Progress bars are very generic, and what hangs a ref to them depends heavily on the context in which they're used ///So let's make hunting harddels easier yeah? /datum/progressbar/dump_harddel_info() + if(harddel_deets_dumped) + return + harddel_deets_dumped = TRUE return "Owner's type: [location_type]" #undef PROGRESSBAR_ANIMATION_TIME diff --git a/code/datums/proximity_monitor/fields/gravity.dm b/code/datums/proximity_monitor/fields/gravity.dm index 4cfc8600895..e2604267657 100644 --- a/code/datums/proximity_monitor/fields/gravity.dm +++ b/code/datums/proximity_monitor/fields/gravity.dm @@ -23,7 +23,7 @@ if(isnull(modified_turfs[target])) return var/grav_value = modified_turfs[target] || 0 - target.RemoveElement(/datum/element/forced_gravity, grav_value) + target.RemoveElement(/datum/element/forced_gravity, grav_value, can_override = TRUE) modified_turfs -= target // Subtype which pops up a balloon alert when a mob enters the field diff --git a/code/datums/quirks/negative_quirks/negative_quirks.dm b/code/datums/quirks/negative_quirks/negative_quirks.dm index 5ac6d5493ad..02b27a0a436 100644 --- a/code/datums/quirks/negative_quirks/negative_quirks.dm +++ b/code/datums/quirks/negative_quirks/negative_quirks.dm @@ -440,7 +440,7 @@ quirk_holder.clear_mood_event("nyctophobia") return - if(quirk_holder.m_intent == MOVE_INTENT_RUN) + if(quirk_holder.move_intent == MOVE_INTENT_RUN) to_chat(quirk_holder, span_warning("Easy, easy, take it slow... you're in the dark...")) quirk_holder.toggle_move_intent() quirk_holder.add_mood_event("nyctophobia", /datum/mood_event/nyctophobia) diff --git a/code/datums/quirks/positive_quirks/positive_quirks.dm b/code/datums/quirks/positive_quirks/positive_quirks.dm index ccac84802ae..e49aed64ee6 100644 --- a/code/datums/quirks/positive_quirks/positive_quirks.dm +++ b/code/datums/quirks/positive_quirks/positive_quirks.dm @@ -362,3 +362,36 @@ /datum/quirk/item_quirk/signer/remove() qdel(quirk_holder.GetComponent(/datum/component/sign_language)) + +/datum/quirk/item_quirk/settler + name = "Settler" + desc = "You are from a lineage of the earliest space settlers! While your family's generational exposure to varying gravity \ + has resulted in a ... smaller height than is typical for your species, you make up for it by being much better at outdoorsmanship and \ + carrying heavy equipment. You also get along great with animals. However, you are a bit on the slow side due to your small legs." + gain_text = span_bold("You feel like the world is your oyster!") + lose_text = span_danger("You think you might stay home today.") + icon = FA_ICON_HOUSE + value = 4 + mob_trait = TRAIT_SETTLER + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE + medical_record_text = "Patient appears to be abnormally stout." + mail_goodies = list( + /obj/item/clothing/shoes/workboots/mining, + /obj/item/gps, + ) + +/datum/quirk/item_quirk/settler/add_unique(client/client_source) + give_item_to_holder(/obj/item/storage/box/papersack/wheat, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) + give_item_to_holder(/obj/item/storage/toolbox/fishing/small, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) + var/mob/living/carbon/human/human_quirkholder = quirk_holder + human_quirkholder.set_mob_height(HUMAN_HEIGHT_SHORTEST) + human_quirkholder.add_movespeed_modifier(/datum/movespeed_modifier/settler) + human_quirkholder.physiology.hunger_mod *= 0.5 //good for you, shortass, you don't get hungry nearly as often + +/datum/quirk/item_quirk/settler/remove() + if(QDELING(quirk_holder)) + return + var/mob/living/carbon/human/human_quirkholder = quirk_holder + human_quirkholder.set_mob_height(HUMAN_HEIGHT_MEDIUM) + human_quirkholder.remove_movespeed_modifier(/datum/movespeed_modifier/settler) + human_quirkholder.physiology.hunger_mod *= 2 diff --git a/code/datums/shuttles/_shuttle.dm b/code/datums/shuttles/_shuttle.dm new file mode 100644 index 00000000000..0100a3d85da --- /dev/null +++ b/code/datums/shuttles/_shuttle.dm @@ -0,0 +1,83 @@ +/datum/map_template/shuttle + name = "Base Shuttle Template" + var/prefix = "_maps/shuttles/" + var/suffix + /** + * Port ID is the place this template should be docking at, set on '/obj/docking_port/stationary' + * Because getShuttle() compares port_id to shuttle_id to find an already existing shuttle, + * you should set shuttle_id to be the same as port_id if you want them to be replacable. + */ + var/port_id + /// ID of the shuttle, make sure it matches port_id if necessary. + var/shuttle_id + /// Information to display on communication console about the shuttle + var/description + /// The recommended occupancy limit for the shuttle (count chairs, beds, and benches then round to 5) + var/occupancy_limit + /// Description of the prerequisition that has to be achieved for the shuttle to be purchased + var/prerequisites + /// Shuttle warnings and hazards to the admin who spawns the shuttle + var/admin_notes + /// How much does this shuttle cost the cargo budget to purchase? Put in terms of CARGO_CRATE_VALUE to properly scale the cost with the current balance of cargo's income. + var/credit_cost = INFINITY + /// What job accesses can buy this shuttle? If null, this shuttle cannot be bought. + var/list/who_can_purchase = list(ACCESS_CAPTAIN) + /// Whether or not this shuttle is locked to emags only. + var/emag_only = FALSE + /// If set, overrides default movement_force on shuttle + var/list/movement_force + + var/port_x_offset + var/port_y_offset + var/extra_desc = "" + +/datum/map_template/shuttle/proc/prerequisites_met() + return TRUE + +/datum/map_template/shuttle/New() + shuttle_id = "[port_id]_[suffix]" + mappath = "[prefix][shuttle_id].dmm" + . = ..() + +/datum/map_template/shuttle/preload_size(path, cache) + . = ..(path, TRUE) // Done this way because we still want to know if someone actualy wanted to cache the map + if(!cached_map) + return + + var/offset = discover_offset(/obj/docking_port/mobile) + + port_x_offset = offset[1] + port_y_offset = offset[2] + + if(!cache) + cached_map = null + +/datum/map_template/shuttle/load(turf/T, centered, register=TRUE) + . = ..() + if(!.) + return + var/list/turfs = block( locate(.[MAP_MINX], .[MAP_MINY], .[MAP_MINZ]), + locate(.[MAP_MAXX], .[MAP_MAXY], .[MAP_MAXZ])) + for(var/i in 1 to turfs.len) + var/turf/place = turfs[i] + if(isspaceturf(place)) // This assumes all shuttles are loaded in a single spot then moved to their real destination. + continue + + if (place.count_baseturfs() < 2) // Some snowflake shuttle shit + continue + + place.insert_baseturf(3, /turf/baseturf_skipover/shuttle) + + for(var/obj/docking_port/mobile/port in place) + port.calculate_docking_port_information(src) + // initTemplateBounds explicitly ignores the shuttle's docking port, to ensure that it calculates the bounds of the shuttle correctly + // so we need to manually initialize it here + SSatoms.InitializeAtoms(list(port)) + if(register) + port.register() + +//Whatever special stuff you want +/datum/map_template/shuttle/post_load(obj/docking_port/mobile/M) + if(movement_force) + M.movement_force = movement_force.Copy() + M.linkup() diff --git a/code/datums/shuttles/arrival.dm b/code/datums/shuttles/arrival.dm new file mode 100644 index 00000000000..376de809afa --- /dev/null +++ b/code/datums/shuttles/arrival.dm @@ -0,0 +1,35 @@ +/datum/map_template/shuttle/arrival + port_id = "arrival" + who_can_purchase = null + +/datum/map_template/shuttle/arrival/box + suffix = "box" + name = "arrival shuttle (Box)" + +/datum/map_template/shuttle/arrival/donut + suffix = "donut" + name = "arrival shuttle (Donut)" + +/datum/map_template/shuttle/arrival/birdshot + suffix = "birdshot" + name = "arrival shuttle (Birdshot)" + +/datum/map_template/shuttle/arrival/delta + suffix = "delta" + name = "arrival shuttle (Delta)" + +/datum/map_template/shuttle/arrival/kilo + suffix = "kilo" + name = "arrival shuttle (Kilo)" + +/datum/map_template/shuttle/arrival/pubby + suffix = "pubby" + name = "arrival shuttle (Pubby)" + +/datum/map_template/shuttle/arrival/omega + suffix = "omega" + name = "arrival shuttle (Omega)" + +/datum/map_template/shuttle/arrival/northstar + suffix = "northstar" + name = "arrival shuttle (North Star)" diff --git a/code/datums/shuttles/assault_pod.dm b/code/datums/shuttles/assault_pod.dm new file mode 100644 index 00000000000..63a885f92ea --- /dev/null +++ b/code/datums/shuttles/assault_pod.dm @@ -0,0 +1,7 @@ +/datum/map_template/shuttle/assault_pod + port_id = "assault_pod" + who_can_purchase = null + +/datum/map_template/shuttle/assault_pod/default + suffix = "default" + name = "assault pod (Default)" diff --git a/code/datums/shuttles/aux_base.dm b/code/datums/shuttles/aux_base.dm new file mode 100644 index 00000000000..c377e278b90 --- /dev/null +++ b/code/datums/shuttles/aux_base.dm @@ -0,0 +1,11 @@ +/datum/map_template/shuttle/aux_base + port_id = "aux_base" + who_can_purchase = null + +/datum/map_template/shuttle/aux_base/default + suffix = "default" + name = "auxilliary base (Default)" + +/datum/map_template/shuttle/aux_base/small + suffix = "small" + name = "auxilliary base (Small)" diff --git a/code/datums/shuttles/cargo.dm b/code/datums/shuttles/cargo.dm new file mode 100644 index 00000000000..a18b7a4ac9a --- /dev/null +++ b/code/datums/shuttles/cargo.dm @@ -0,0 +1,36 @@ +/datum/map_template/shuttle/cargo + port_id = "cargo" + name = "Base Shuttle Template (Cargo)" + who_can_purchase = null + +/datum/map_template/shuttle/cargo/kilo + suffix = "kilo" + name = "supply shuttle (Kilo)" + +/datum/map_template/shuttle/cargo/birdboat + suffix = "birdboat" + name = "supply shuttle (Birdboat)" + +/datum/map_template/shuttle/cargo/donut + suffix = "donut" + name = "supply shuttle (Donut)" + +/datum/map_template/shuttle/cargo/pubby + suffix = "pubby" + name = "supply shuttle (Pubby)" + +/datum/map_template/shuttle/cargo/birdshot + suffix = "birdshot" + name = "supply shuttle (Birdshot)" + +/datum/map_template/shuttle/cargo/box + suffix = "box" + name = "cargo ferry (Box)" + +/datum/map_template/shuttle/cargo/delta + suffix = "delta" + name = "cargo ferry (Delta)" + +/datum/map_template/shuttle/cargo/northstar + suffix = "northstar" + name = "cargo ferry (North Star)" diff --git a/code/datums/shuttles.dm b/code/datums/shuttles/emergency.dm similarity index 56% rename from code/datums/shuttles.dm rename to code/datums/shuttles/emergency.dm index d5630e25e4b..af87dc641d8 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles/emergency.dm @@ -1,154 +1,13 @@ #define EMAG_LOCKED_SHUTTLE_COST (CARGO_CRATE_VALUE * 50) -/datum/map_template/shuttle - name = "Base Shuttle Template" - var/prefix = "_maps/shuttles/" - var/suffix - /** - * Port ID is the place this template should be docking at, set on '/obj/docking_port/stationary' - * Because getShuttle() compares port_id to shuttle_id to find an already existing shuttle, - * you should set shuttle_id to be the same as port_id if you want them to be replacable. - */ - var/port_id - ///ID of the shuttle, make sure it matches port_id if necessary. - var/shuttle_id - - var/description - var/prerequisites - var/admin_notes - /// How much does this shuttle cost the cargo budget to purchase? Put in terms of CARGO_CRATE_VALUE to properly scale the cost with the current balance of cargo's income. - var/credit_cost = INFINITY - /// What job accesses can buy this shuttle? If null, this shuttle cannot be bought. - var/list/who_can_purchase = list(ACCESS_CAPTAIN) - /// Whether or not this shuttle is locked to emags only. - var/emag_only = FALSE - /// If set, overrides default movement_force on shuttle - var/list/movement_force - - var/port_x_offset - var/port_y_offset - var/extra_desc = "" - -/datum/map_template/shuttle/proc/prerequisites_met() - return TRUE - -/datum/map_template/shuttle/New() - shuttle_id = "[port_id]_[suffix]" - mappath = "[prefix][shuttle_id].dmm" - . = ..() - -/datum/map_template/shuttle/preload_size(path, cache) - . = ..(path, TRUE) // Done this way because we still want to know if someone actualy wanted to cache the map - if(!cached_map) - return - - var/offset = discover_offset(/obj/docking_port/mobile) - - port_x_offset = offset[1] - port_y_offset = offset[2] - - if(!cache) - cached_map = null - -/datum/map_template/shuttle/load(turf/T, centered, register=TRUE) - . = ..() - if(!.) - return - var/list/turfs = block( locate(.[MAP_MINX], .[MAP_MINY], .[MAP_MINZ]), - locate(.[MAP_MAXX], .[MAP_MAXY], .[MAP_MAXZ])) - for(var/i in 1 to turfs.len) - var/turf/place = turfs[i] - if(isspaceturf(place)) // This assumes all shuttles are loaded in a single spot then moved to their real destination. - continue - - if (place.count_baseturfs() < 2) // Some snowflake shuttle shit - continue - - place.insert_baseturf(3, /turf/baseturf_skipover/shuttle) - - for(var/obj/docking_port/mobile/port in place) - port.calculate_docking_port_information(src) - // initTemplateBounds explicitly ignores the shuttle's docking port, to ensure that it calculates the bounds of the shuttle correctly - // so we need to manually initialize it here - SSatoms.InitializeAtoms(list(port)) - if(register) - port.register() - -//Whatever special stuff you want -/datum/map_template/shuttle/post_load(obj/docking_port/mobile/M) - if(movement_force) - M.movement_force = movement_force.Copy() - M.linkup() - /datum/map_template/shuttle/emergency // SKYRAT EDIT OVERRIDE - OVERRIDEN IN ADVANCED_SHUTTLES - shuttles.dm port_id = "emergency" name = "Base Shuttle Template (Emergency)" -/datum/map_template/shuttle/cargo - port_id = "cargo" - name = "Base Shuttle Template (Cargo)" - who_can_purchase = null - -/datum/map_template/shuttle/ferry - port_id = "ferry" - name = "Base Shuttle Template (Ferry)" - -/datum/map_template/shuttle/whiteship - port_id = "whiteship" - -/datum/map_template/shuttle/labour - port_id = "labour" - who_can_purchase = null - -/datum/map_template/shuttle/mining - port_id = "mining" - who_can_purchase = null - -/datum/map_template/shuttle/mining_common - port_id = "mining_common" - who_can_purchase = null - -/datum/map_template/shuttle/arrival - port_id = "arrival" - who_can_purchase = null - -/datum/map_template/shuttle/infiltrator - port_id = "infiltrator" - who_can_purchase = null - -/datum/map_template/shuttle/aux_base - port_id = "aux_base" - who_can_purchase = null - -/datum/map_template/shuttle/escape_pod - port_id = "escape_pod" - who_can_purchase = null - -/datum/map_template/shuttle/assault_pod - port_id = "assault_pod" - who_can_purchase = null - -/datum/map_template/shuttle/pirate - port_id = "pirate" - who_can_purchase = null - -/datum/map_template/shuttle/hunter - port_id = "hunter" - who_can_purchase = null - -/datum/map_template/shuttle/ruin //For random shuttles in ruins - port_id = "ruin" - who_can_purchase = null - -/datum/map_template/shuttle/snowdin - port_id = "snowdin" - who_can_purchase = null - -/datum/map_template/shuttle/ert - port_id = "ert" - who_can_purchase = null - -// Shuttles start here: +/datum/map_template/shuttle/emergency/New() + . = ..() + if(!occupancy_limit && who_can_purchase) + CRASH("The [name] needs an occupancy limit!") /datum/map_template/shuttle/emergency/backup prefix = "_maps/shuttles/" @@ -163,6 +22,7 @@ admin_notes = "No brig, no medical facilities." credit_cost = CARGO_CRATE_VALUE * 5 who_can_purchase = list(ACCESS_CAPTAIN, ACCESS_CE) + occupancy_limit = "Flexible" /datum/map_template/shuttle/emergency/construction/post_load() . = ..() @@ -170,18 +30,19 @@ var/datum/supply_pack/P = SSshuttle.supply_packs[/datum/supply_pack/engineering/shuttle_engine] P.special_enabled = TRUE - /datum/map_template/shuttle/emergency/asteroid suffix = "asteroid" name = "Asteroid Station Emergency Shuttle" description = "A respectable mid-sized shuttle that first saw service shuttling Nanotrasen crew to and from their asteroid belt embedded facilities." credit_cost = CARGO_CRATE_VALUE * 6 + occupancy_limit = "50" /datum/map_template/shuttle/emergency/venture suffix = "venture" name = "Venture Emergency Shuttle" description = "A mid-sized shuttle for those who like a lot of space for their legs." credit_cost = CARGO_CRATE_VALUE * 10 + occupancy_limit = "45" /datum/map_template/shuttle/emergency/bar suffix = "bar" @@ -190,6 +51,7 @@ admin_notes = "Bardrone and Barmaid are GODMODE, will be automatically sentienced by the fun balloon at 60 seconds before arrival. \ Has medical facilities." credit_cost = CARGO_CRATE_VALUE * 10 + occupancy_limit = "30" /datum/map_template/shuttle/emergency/pod suffix = "pod" @@ -197,6 +59,7 @@ description = "We did not expect an evacuation this quickly. All we have available is two escape pods." admin_notes = "For player punishment." who_can_purchase = null + occupancy_limit = "10" /datum/map_template/shuttle/emergency/russiafightpit suffix = "russiafightpit" @@ -204,6 +67,7 @@ description = "Dis is a high-quality shuttle, da. Many seats, lots of space, all equipment! Even includes entertainment! Such as lots to drink, and a fighting arena for drunk crew to have fun! If arena not fun enough, simply press button of releasing bears. Do not worry, bears trained not to break out of fighting pit, so totally safe so long as nobody stupid or drunk enough to leave door open. Try not to let asimov babycons ruin fun!" admin_notes = "Includes a small variety of weapons. And bears. Only captain-access can release the bears. Bears won't smash the windows themselves, but they can escape if someone lets them." credit_cost = CARGO_CRATE_VALUE * 10 // While the shuttle is rusted and poorly maintained, trained bears are costly. + occupancy_limit = "40" /datum/map_template/shuttle/emergency/meteor suffix = "meteor" @@ -212,6 +76,7 @@ admin_notes = "This shuttle will likely crush escape, killing anyone there." credit_cost = CARGO_CRATE_VALUE * 30 movement_force = list("KNOCKDOWN" = 3, "THROW" = 2) + occupancy_limit = "CONDEMNED" /datum/map_template/shuttle/emergency/monastery suffix = "monastery" @@ -221,7 +86,8 @@ emag_only = TRUE credit_cost = EMAG_LOCKED_SHUTTLE_COST * 1.8 movement_force = list("KNOCKDOWN" = 3, "THROW" = 5) - who_can_purchase = null //SKYRAT EDIT CHANGE + occupancy_limit = "70" + who_can_purchase = null //SKYRAT EDIT ADDITION /datum/map_template/shuttle/emergency/luxury suffix = "luxury" @@ -231,13 +97,16 @@ admin_notes = "Due to the limited space for non paying crew, this shuttle may cause a riot." emag_only = TRUE credit_cost = EMAG_LOCKED_SHUTTLE_COST + occupancy_limit = "75" /datum/map_template/shuttle/emergency/medisim suffix = "medisim" name = "Medieval Reality Simulation Dome" description = "A state of the art simulation dome, loaded onto your shuttle! Watch and laugh at how petty humanity used to be before it reached the stars. Guaranteed to be at least 40% historically accurate." + prerequisites = "A special holodeck simulation might allow this shuttle to be loaded." admin_notes = "Ghosts can spawn in and fight as knights or archers. The CTF auto restarts, so no admin intervention necessary." credit_cost = 20000 + occupancy_limit = "30" /datum/map_template/shuttle/emergency/medisim/prerequisites_met() return SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_MEDISIM] @@ -249,13 +118,16 @@ admin_notes = "Flaming hot. The main area has a dance machine as well as plasma floor tiles that will be ignited by players every single time." emag_only = TRUE credit_cost = EMAG_LOCKED_SHUTTLE_COST + occupancy_limit = "10" /datum/map_template/shuttle/emergency/arena suffix = "arena" name = "The Arena" - description = "The crew must pass through an otherworldy arena to board this shuttle. Expect massive casualties. The source of the Bloody Signal must be tracked down and eliminated to unlock this shuttle." + description = "The crew must pass through an otherworldy arena to board this shuttle. Expect massive casualties." + prerequisites = "The source of the Bloody Signal must be tracked down and eliminated to unlock this shuttle." admin_notes = "RIP AND TEAR." credit_cost = CARGO_CRATE_VALUE * 20 + occupancy_limit = "1/2" /// Whether the arena z-level has been created var/arena_loaded = FALSE @@ -278,12 +150,14 @@ name = "Birdboat Station Emergency Shuttle" description = "Though a little on the small side, this shuttle is feature complete, which is more than can be said for the pattern of station it was commissioned for." credit_cost = CARGO_CRATE_VALUE * 2 + occupancy_limit = "25" /datum/map_template/shuttle/emergency/box suffix = "box" name = "Box Station Emergency Shuttle" credit_cost = CARGO_CRATE_VALUE * 4 description = "The gold standard in emergency exfiltration, this tried and true design is equipped with everything the crew needs for a safe flight home." + occupancy_limit = "45" /datum/map_template/shuttle/emergency/donut suffix = "donut" @@ -291,6 +165,7 @@ description = "The perfect spearhead for any crude joke involving the station's shape, this shuttle supports a separate containment cell for prisoners and a compact medical wing." admin_notes = "Has airlocks on both sides of the shuttle and will probably intersect near the front on some stations that build past departures." credit_cost = CARGO_CRATE_VALUE * 5 + occupancy_limit = "60" /datum/map_template/shuttle/emergency/clown suffix = "clown" @@ -302,6 +177,7 @@ Have a fun ride!" admin_notes = "Brig is replaced by anchored greentext book surrounded by lavaland chasms, stationside door has been removed to prevent accidental dropping. No brig." credit_cost = CARGO_CRATE_VALUE * 16 + occupancy_limit = "HONK" /datum/map_template/shuttle/emergency/cramped suffix = "cramped" @@ -311,44 +187,54 @@ \n\ Contains contraband armory guns, maintenance loot, and abandoned crates!" admin_notes = "Due to origin as a solo piloted secure vessel, has an active GPS onboard labeled STV5. Has roughly as much space as Hi Daniel, except with explosive crates." + occupancy_limit = "5" /datum/map_template/shuttle/emergency/meta suffix = "meta" name = "Meta Station Emergency Shuttle" credit_cost = CARGO_CRATE_VALUE * 8 description = "A fairly standard shuttle, though larger and slightly better equipped than the Box Station variant." + occupancy_limit = "45" /datum/map_template/shuttle/emergency/kilo suffix = "kilo" name = "Kilo Station Emergency Shuttle" credit_cost = CARGO_CRATE_VALUE * 10 description = "A fully functional shuttle including a complete infirmary, storage facilties and regular amenities." + occupancy_limit = "55" /datum/map_template/shuttle/emergency/mini suffix = "mini" name = "Ministation emergency shuttle" credit_cost = CARGO_CRATE_VALUE * 2 description = "Despite its namesake, this shuttle is actually only slightly smaller than standard, and still complete with a brig and medbay." + occupancy_limit = "35" /datum/map_template/shuttle/emergency/tram suffix = "tram" name = "Tram Station Emergency Shuttle" credit_cost = CARGO_CRATE_VALUE * 4 description = "A train but in space, choo choo!" + occupancy_limit = "35" /datum/map_template/shuttle/emergency/birdshot suffix = "birdshot" name = "Birdshot Station Emergency Shuttle" credit_cost = CARGO_CRATE_VALUE * 2 description = "We pulled this one out of Mothball just for you!" + occupancy_limit = "40" /datum/map_template/shuttle/emergency/scrapheap suffix = "scrapheap" name = "Standby Evacuation Vessel \"Scrapheap Challenge\"" - credit_cost = CARGO_CRATE_VALUE * -2 - description = "Due to a lack of functional emergency shuttles, we bought this second hand from a scrapyard and pressed it into service. Please do not lean too heavily on the exterior windows, they are fragile." - admin_notes = "An abomination with no functional medbay, sections missing, and some very fragile windows. Surprisingly airtight." + credit_cost = CARGO_CRATE_VALUE * -18 + description = "Comrade! We see you are having trouble with money, yes? If you have money issue, very little money, we are looking for good shuttle, emergency shuttle. You take best in sector shuttle, we take yours, you get money, da? Please do not lean on window, fragile like fina china. -Ivan" + admin_notes = "An abomination with no functional medbay, sections missing, and some very fragile windows. Surprisingly airtight. When bought, gives a good influx of money, but can only be bought if the budget is literally 0 credits." movement_force = list("KNOCKDOWN" = 3, "THROW" = 2) + occupancy_limit = "30" + +/datum/map_template/shuttle/emergency/scrapheap/prerequisites_met() + return SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_SCRAPHEAP] /datum/map_template/shuttle/emergency/narnar suffix = "narnar" @@ -356,7 +242,9 @@ description = "Looks like this shuttle may have wandered into the darkness between the stars on route to the station. Let's not think too hard about where all the bodies came from." admin_notes = "Contains real cult ruins, mob eyeballs, and inactive constructs. Cult mobs will automatically be sentienced by fun balloon. \ Cloning pods in 'medbay' area are showcases and nonfunctional." + prerequisites = "Mysterious cult runes may need to be banished before this shuttle can be summoned." credit_cost = 6667 ///The joke is the number so no defines + occupancy_limit = "666" /datum/map_template/shuttle/emergency/narnar/prerequisites_met() return SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_NARNAR] @@ -367,6 +255,7 @@ description = "A train but in space! Complete with a first, second class, brig and storage area." admin_notes = "Choo choo motherfucker!" credit_cost = CARGO_CRATE_VALUE * 2 + occupancy_limit = "50" /datum/map_template/shuttle/emergency/cere suffix = "cere" @@ -375,6 +264,7 @@ an engine room stocked with various supplies, and a crew capacity of 80+ to top it all off. Live large, live Cere." admin_notes = "Seriously big, even larger than the Delta shuttle." credit_cost = CARGO_CRATE_VALUE * 20 + occupancy_limit = "110" /datum/map_template/shuttle/emergency/supermatter suffix = "supermatter" @@ -390,6 +280,7 @@ emag_only = TRUE credit_cost = EMAG_LOCKED_SHUTTLE_COST movement_force = list("KNOCKDOWN" = 3, "THROW" = 2) + occupancy_limit = "15" /datum/map_template/shuttle/emergency/imfedupwiththisworld suffix = "imfedupwiththisworld" @@ -400,12 +291,14 @@ emag_only = TRUE credit_cost = EMAG_LOCKED_SHUTTLE_COST movement_force = list("KNOCKDOWN" = 3, "THROW" = 2) + occupancy_limit = "5" /datum/map_template/shuttle/emergency/goon suffix = "goon" name = "NES Port" description = "The Nanotrasen Emergency Shuttle Port(NES Port for short) is a shuttle used at other less known Nanotrasen facilities and has a more open inside for larger crowds, but fewer onboard shuttle facilities." credit_cost = CARGO_CRATE_VALUE + occupancy_limit = "40" /datum/map_template/shuttle/emergency/rollerdome suffix = "rollerdome" @@ -413,7 +306,8 @@ description = "Developed by a member of Nanotrasen's R&D crew that claims to have travelled from the year 2028. \ He says this shuttle is based off an old entertainment complex from the 1990s, though our database has no records on anything pertaining to that decade." admin_notes = "ONLY NINETIES KIDS REMEMBER. Uses the fun balloon and drone from the Emergency Bar." - credit_cost = CARGO_CRATE_VALUE * 5 + credit_cost = CARGO_CRATE_VALUE * 30 + occupancy_limit = "5" /datum/map_template/shuttle/emergency/basketball suffix = "bballhooper" @@ -423,6 +317,7 @@ It also wasn't manufactured to deal with the form-factor of some of your stations... good luck with that." admin_notes = "A larger shuttle built around a basketball stadium: entirely impractical but just a complete blast!" credit_cost = CARGO_CRATE_VALUE * 10 + occupancy_limit = "30" /datum/map_template/shuttle/emergency/wabbajack suffix = "wabbajack" @@ -432,12 +327,17 @@ Needless to say, no engineering team wanted to go near the thing, and it's only being used as an Emergency Escape Shuttle because there is literally nothing else available." admin_notes = "If the crew can solve the puzzle, they will wake the wabbajack statue. It will likely not end well. There's a reason it's boarded up. Maybe they should have just left it alone." credit_cost = CARGO_CRATE_VALUE * 30 + occupancy_limit = "30" + +/datum/map_template/shuttle/emergency/wabbajack/prerequisites_met() + return SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_WABBAJACK] /datum/map_template/shuttle/emergency/omega suffix = "omega" name = "Omegastation Emergency Shuttle" description = "On the smaller size with a modern design, this shuttle is for the crew who like the cosier things, while still being able to stretch their legs." credit_cost = CARGO_CRATE_VALUE * 2 + occupancy_limit = "30" /datum/map_template/shuttle/emergency/cruise suffix = "cruise" @@ -445,6 +345,7 @@ description = "Ordinarily reserved for special functions and events, the Cruise Shuttle Independence can bring a summery cheer to your next station evacuation for a 'modest' fee!" admin_notes = "This motherfucker is BIG. You might need to force dock it." credit_cost = CARGO_CRATE_VALUE * 100 + occupancy_limit = "80" /datum/map_template/shuttle/emergency/monkey suffix = "nature" @@ -452,6 +353,7 @@ description = "A large shuttle with a center biodome that is flourishing with life. Frolick with the monkeys! (Extra monkeys are stored on the bridge.)" admin_notes = "Pretty freakin' large, almost as big as Raven or Cere. Excercise caution with it." credit_cost = CARGO_CRATE_VALUE * 16 + occupancy_limit = "45" /datum/map_template/shuttle/emergency/casino suffix = "casino" @@ -459,6 +361,7 @@ description = "A luxurious casino packed to the brim with everything you need to start new gambling addicitions!" admin_notes = "The ship is a bit chunky, so watch where you park it." credit_cost = 7777 + occupancy_limit = "85" /datum/map_template/shuttle/emergency/shadow suffix = "shadow" @@ -466,6 +369,7 @@ description = "Guaranteed to get you somewhere FAST. With a custom-built plasma engine, this bad boy will put more distance between you and certain danger than any other!" admin_notes = "The aft of the ship has a plasma tank that starts ignited. May get released by crew. The plasma windows next to the engine heaters will also erupt into flame, and also risk getting released by crew." credit_cost = CARGO_CRATE_VALUE * 50 + occupancy_limit = "40" /datum/map_template/shuttle/emergency/fish suffix = "fish" @@ -473,6 +377,7 @@ description = "Trades such amenities as 'storage space' and 'sufficient seating' for an artifical environment ideal for fishing, plus ample supplies (also for fishing)." admin_notes = "There's a chasm in it, it has railings but that won't stop determined players." credit_cost = CARGO_CRATE_VALUE * 10 + occupancy_limit = "35" /datum/map_template/shuttle/emergency/lance suffix = "lance" @@ -480,6 +385,7 @@ description = "A brand new shuttle by Nanotrasen's finest in shuttle-engineering, it's designed to tactically slam into a destroyed station, dispatching threats and saving crew at the same time! Be careful to stay out of it's path." admin_notes = "WARNING: This shuttle is designed to crash into the station. It has turrets, similar to the raven." credit_cost = CARGO_CRATE_VALUE * 70 + occupancy_limit = "50" /datum/map_template/shuttle/emergency/tranquility suffix = "tranquility" @@ -487,6 +393,7 @@ description = "A large shuttle, covered in flora and comfortable resting areas. The perfect way to end a peaceful shift" admin_notes = "it's pretty big, and comfy. Be careful when placing it down!" credit_cost = CARGO_CRATE_VALUE * 25 + occupancy_limit = "40" /datum/map_template/shuttle/emergency/hugcage suffix = "hugcage" @@ -494,6 +401,7 @@ description = "A small cozy shuttle with plenty of beds for tired or sensitive spacemen, and a box for pillow-fights." admin_notes = "Has a sentience fun balloon for pets." credit_cost = CARGO_CRATE_VALUE * 16 + occupancy_limit = "20" /datum/map_template/shuttle/emergency/fame suffix = "fame" @@ -501,124 +409,7 @@ description = "A grandiose shuttle that has a red carpet leading to the hall of fame. Are you worthy to stand among the best spessmen in existence?" admin_notes = "Designed around persistence from memories, trophies, photos, and statues." credit_cost = CARGO_CRATE_VALUE * 25 - -/datum/map_template/shuttle/ferry/base - suffix = "base" - name = "transport ferry" - description = "Standard issue Box/Metastation CentCom ferry." - -/datum/map_template/shuttle/ferry/meat - suffix = "meat" - name = "\"meat\" ferry" - description = "Ahoy! We got all kinds o' meat aft here. Meat from plant people, people who be dark, not in a racist way, just they're dark black. \ - Oh and lizard meat too,mighty popular that is. Definitely 100% fresh, just ask this guy here. *person on meatspike moans* See? \ - Definitely high quality meat, nothin' wrong with it, nothin' added, definitely no zombifyin' reagents!" - admin_notes = "Meat currently contains no zombifying reagents, lizard on meatspike must be spawned in." - -/datum/map_template/shuttle/ferry/lighthouse - suffix = "lighthouse" - name = "The Lighthouse(?)" - description = "*static*... part of a much larger vessel, possibly military in origin. \ - The weapon markings aren't anything we've seen ...static... by almost never the same person twice, possible use of unknown storage ...static... \ - seeing ERT officers onboard, but no missions are on file for ...static...static...annoying jingle... only at The LIGHTHOUSE! \ - Fulfilling needs you didn't even know you had. We've got EVERYTHING, and something else!" - admin_notes = "Currently larger than ferry docking port on Box, will not hit anything, but must be force docked. Trader and ERT bodyguards are not included." - -/datum/map_template/shuttle/ferry/fancy - suffix = "fancy" - name = "fancy transport ferry" - description = "At some point, someone upgraded the ferry to have fancier flooring... and fewer seats." - -/datum/map_template/shuttle/ferry/kilo - suffix = "kilo" - name = "kilo transport ferry" - description = "Standard issue CentCom Ferry for Kilo pattern stations. Includes additional equipment and rechargers." - -/datum/map_template/shuttle/ferry/northstar - suffix = "northstar" - name = "north star transport ferry" - description = "In the very depths of the frontier, you'll need a rugged shuttle capable of delivering crew, this is that." - -/datum/map_template/shuttle/whiteship/box - suffix = "box" - name = "Hospital Ship" - description = "Whiteship with medical supplies. Zombies do not currently spawn corpses, and are not infectious." - -/datum/map_template/shuttle/whiteship/meta - suffix = "meta" - name = "Salvage Ship" - description = "Whiteship that focuses on a large cargo bay that players can build in. Spawns with Syndicate mobs who do not drop corpses and are highly aggressive." - -/datum/map_template/shuttle/whiteship/pubby - suffix = "pubby" - name = "NT Science Vessel" - description = "A small science vessel that uses just one area and is full of angry ants." - -/datum/map_template/shuttle/whiteship/cere - suffix = "cere" - name = "NT Heavy Salvage Vessel" - description = "A beefy, well-rounded salvage vessel with a pair of corpses (miner and engineer) and a Captain's hat. Equipped with solar sails and a PACMAN generator." - -/datum/map_template/shuttle/whiteship/birdshot - suffix = "birdshot" - name = "NT Patrol Bee" - description = "A small patrol vessel with a central corridor connecting all rooms. Features 2 small cargo bays and a brig. Spawns with an agressive and deadly Gelatinous Cube" - -/datum/map_template/shuttle/whiteship/kilo - suffix = "kilo" - name = "NT Mining Shuttle" - description = "A mining vessel with a curious shape starting with a few angry netherworld mobs." - -/datum/map_template/shuttle/whiteship/donut - suffix = "donut" - name = "NT Long-Distance Bluespace Jumper" - description = "A ship hit with an engine blowout, leaving it as a depressurised husk. Has infinite power, although likely to bait people into removing that property. Also the most open out of all the whiteships, and starts with a 25% ripley chance." - -/datum/map_template/shuttle/whiteship/tram - suffix = "tram" - name = "NT Long-Distance Bluespace Freighter" - description = "A long shuttle that starts with Nanotrasen private security corpses. DOES NOT FIT IN THE BASE DOCKS! Does fit in Deep Space's dock though." - -/datum/map_template/shuttle/whiteship/delta - suffix = "delta" - name = "NT Frigate" - description = "A standard whiteship with big spiders onboard. PACMAN generator is not wired and next to main grid cabling, so it requires some work." - -/datum/map_template/shuttle/whiteship/pod - suffix = "whiteship_pod" - name = "Salvage Pod" - description = "There is no map for this vessel and it was supposed to be used with the Meta-class. Do not try to spawn it!" - -/datum/map_template/shuttle/whiteship/personalshuttle - suffix = "personalshuttle" - name = "Personal Travel Shuttle" - description = "A small vessel with a few zombies and an engineer's corpse that can be looted." - -/datum/map_template/shuttle/whiteship/obelisk - suffix = "obelisk" - name = "Obelisk" - description = "A large research vessel affected by the Cult of Nar'Sie. PACMAN generator is not wired and next to main grid cabling, so it requires some work." - admin_notes = "Not actually an obelisk, has nonsentient cult constructs." - -/datum/map_template/shuttle/cargo/kilo - suffix = "kilo" - name = "supply shuttle (Kilo)" - -/datum/map_template/shuttle/cargo/birdboat - suffix = "birdboat" - name = "supply shuttle (Birdboat)" - -/datum/map_template/shuttle/cargo/donut - suffix = "donut" - name = "supply shuttle (Donut)" - -/datum/map_template/shuttle/cargo/pubby - suffix = "pubby" - name = "supply shuttle (Pubby)" - -/datum/map_template/shuttle/cargo/birdshot - suffix = "birdshot" - name = "supply shuttle (Birdshot)" + occupancy_limit = "55" /datum/map_template/shuttle/emergency/delta suffix = "delta" @@ -626,6 +417,7 @@ description = "A large shuttle for a large station, this shuttle can comfortably fit all your overpopulation and crowding needs. Complete with all facilities plus additional equipment." admin_notes = "Go big or go home." credit_cost = CARGO_CRATE_VALUE * 15 + occupancy_limit = "75" /datum/map_template/shuttle/emergency/northstar suffix = "northstar" @@ -633,6 +425,7 @@ description = "A rugged shuttle meant for long-distance transit from the tips of the frontier to Central Command and back. \ moderately comfortable and large, but cramped." credit_cost = CARGO_CRATE_VALUE * 14 + occupancy_limit = "55" /datum/map_template/shuttle/emergency/raven suffix = "raven" @@ -642,252 +435,19 @@ This escape shuttle boasts shields and numerous anti-personnel turrets guarding its perimeter to fend off meteors and enemy boarding attempts." admin_notes = "Comes with turrets that will target anything without the neutral faction (nuke ops, xenos etc, but not pets)." credit_cost = CARGO_CRATE_VALUE * 60 + occupancy_limit = "CLASSIFIED" /datum/map_template/shuttle/emergency/zeta suffix = "zeta" name = "Tr%nPo2r& Z3TA" description = "A glitch appears on your monitor, flickering in and out of the options laid before you. \ - It seems strange and alien, you may need a special technology to access the signal.." + It seems strange and alien..." + prerequisites = "You may need a special technology to access the signal." admin_notes = "Has alien surgery tools, and a void core that provides unlimited power." credit_cost = CARGO_CRATE_VALUE * 16 + occupancy_limit = "xxx" /datum/map_template/shuttle/emergency/zeta/prerequisites_met() return SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_ALIENTECH] -/datum/map_template/shuttle/arrival/box - suffix = "box" - name = "arrival shuttle (Box)" - -/datum/map_template/shuttle/cargo/box - suffix = "box" - name = "cargo ferry (Box)" - -/datum/map_template/shuttle/mining/box - suffix = "box" - name = "mining shuttle (Box)" - -/datum/map_template/shuttle/labour/box - suffix = "box" - name = "labour shuttle (Box)" - -/datum/map_template/shuttle/labour/generic - suffix = "generic" - name = "labour shuttle (Generic)" - -/datum/map_template/shuttle/arrival/donut - suffix = "donut" - name = "arrival shuttle (Donut)" - -/datum/map_template/shuttle/arrival/birdshot - suffix = "birdshot" - name = "arrival shuttle (Birdshot)" - -/datum/map_template/shuttle/infiltrator/basic - suffix = "basic" - name = "basic syndicate infiltrator" - description = "Base Syndicate infiltrator, spawned by default for nukeops to use." - -/datum/map_template/shuttle/infiltrator/advanced - suffix = "advanced" - name = "advanced syndicate infiltrator" - description = "A much larger version of the standard Syndicate infiltrator that feels more like Kilostation. Has APCs, but power is not a concern for nuclear operatives. Also comes with atmos!" - -/datum/map_template/shuttle/cargo/delta - suffix = "delta" - name = "cargo ferry (Delta)" - -/datum/map_template/shuttle/mining/delta - suffix = "delta" - name = "mining shuttle (Delta)" - -/datum/map_template/shuttle/mining/kilo - suffix = "kilo" - name = "mining shuttle (Kilo)" - -/datum/map_template/shuttle/mining/large - suffix = "large" - name = "mining shuttle (Large)" - -/datum/map_template/shuttle/mining/northstar - suffix = "northstar" - name = "mining shuttle (North Star)" - -/datum/map_template/shuttle/labour/delta - suffix = "delta" - name = "labour shuttle (Delta)" - -/datum/map_template/shuttle/labour/kilo - suffix = "kilo" - name = "labour shuttle (Kilo)" - -/datum/map_template/shuttle/mining_common/meta - suffix = "meta" - name = "lavaland shuttle (Meta)" - -/datum/map_template/shuttle/mining_common/kilo - suffix = "kilo" - name = "lavaland shuttle (Kilo)" - -/datum/map_template/shuttle/mining_common/northstar - suffix = "northstar" - name = "lavaland shuttle (North Star)" - -/datum/map_template/shuttle/arrival/delta - suffix = "delta" - name = "arrival shuttle (Delta)" - -/datum/map_template/shuttle/arrival/kilo - suffix = "kilo" - name = "arrival shuttle (Kilo)" - -/datum/map_template/shuttle/arrival/pubby - suffix = "pubby" - name = "arrival shuttle (Pubby)" - -/datum/map_template/shuttle/arrival/omega - suffix = "omega" - name = "arrival shuttle (Omega)" - -/datum/map_template/shuttle/aux_base/default - suffix = "default" - name = "auxilliary base (Default)" - -/datum/map_template/shuttle/aux_base/small - suffix = "small" - name = "auxilliary base (Small)" - -/datum/map_template/shuttle/escape_pod/default - suffix = "default" - name = "escape pod (Default)" - description = "Base escape pod with 2 tiles of interior space." - -/datum/map_template/shuttle/escape_pod/large - suffix = "large" - name = "escape pod (Large)" - description = "Actually the old Pubbystation monastery shuttle." - -/datum/map_template/shuttle/escape_pod/luxury - suffix = "luxury" - name = "escape pod (Luxury)" - description = "Upgraded escape pod with 3 tiles of interior space." - -/datum/map_template/shuttle/escape_pod/cramped - suffix = "cramped" - name = "escape pod (Cramped)" - description = "Downgraded escape pod that lacks a window and only has one seat, alongside lacking an emergency safe." - -/datum/map_template/shuttle/assault_pod/default - suffix = "default" - name = "assault pod (Default)" - -/datum/map_template/shuttle/pirate/default - suffix = "default" - name = "pirate ship (Default)" - -/datum/map_template/shuttle/pirate/silverscale - suffix = "silverscale" - name = "pirate ship (Silver Scales)" - -/datum/map_template/shuttle/pirate/dutchman - suffix = "dutchman" - name = "pirate ship (Flying Dutchman)" - -/datum/map_template/shuttle/pirate/interdyne - suffix = "interdyne" - name = "pirate ship (Pharmaceutics Biocraft)" - -/datum/map_template/shuttle/pirate/grey - suffix = "grey" - name = "pirate ship (The Space Toolbox)" - -/datum/map_template/shuttle/pirate/irs - suffix = "irs" - name = "pirate ship (Space IRS)" - -/datum/map_template/shuttle/pirate/geode - suffix = "geode" - name = "pirate ship (Lustrous Geode)" - -/datum/map_template/shuttle/hunter/space_cop - suffix = "space_cop" - name = "Police Spacevan" - -/datum/map_template/shuttle/hunter/russian - suffix = "russian" - name = "Russian Cargo Ship" - -/datum/map_template/shuttle/hunter/bounty - suffix = "bounty" - name = "Bounty Hunter Ship" - -/datum/map_template/shuttle/hunter/psyker - suffix = "psyker" - name = "Psyker Fortune-Telling Ship" - -/datum/map_template/shuttle/starfury - port_id = "starfury" - who_can_purchase = null - -/datum/map_template/shuttle/starfury/fighter_one - suffix = "fighter1" - name = "SBC Starfury Fighter (1)" - -/datum/map_template/shuttle/starfury/fighter_two - suffix = "fighter2" - name = "SBC Starfury Fighter (2)" - -/datum/map_template/shuttle/starfury/fighter_three - suffix = "fighter3" - name = "SBC Starfury Fighter (3)" - -/datum/map_template/shuttle/starfury/corvette - suffix = "corvette" - name = "SBC Starfury Corvette" - -/datum/map_template/shuttle/ruin/cyborg_mothership - suffix = "cyborg_mothership" - name = "Cyborg Mothership" - description = "A highly industrialised vessel designed for silicon operation infested with hivebots and space vines." - -/datum/map_template/shuttle/ruin/caravan_victim - suffix = "caravan_victim" - name = "Small Freighter" - description = "Small freight vessel, starts near blacked-out with 3 Syndicate Commandos and 1 Syndicate Stormtrooper, alongside a large hull breach." - -/datum/map_template/shuttle/ruin/pirate_cutter - suffix = "pirate_cutter" - name = "Pirate Cutter" - description = "Small pirate vessel with ballistic turrets. Spawns with 3 pirate mobs, one of which drops an energy cutlass." - -/datum/map_template/shuttle/ruin/syndicate_dropship - suffix = "syndicate_dropship" - name = "Syndicate Dropship" - description = "Light Syndicate vessel with laser turrets. Spawns with a Syndicate mob in the bridge." - -/datum/map_template/shuttle/ruin/syndicate_fighter_shiv - suffix = "syndicate_fighter_shiv" - name = "Syndicate Fighter" - description = "A small Syndicate vessel with exactly one tile of useful interior space and 4 laser turrets. Starts with a Syndicate mob in the pilot's seat, and extremely cramped." - -/datum/map_template/shuttle/snowdin/mining - suffix = "mining" - name = "Snowdin Mining Elevator" - -/datum/map_template/shuttle/snowdin/excavation - suffix = "excavation" - name = "Snowdin Excavation Elevator" - -/datum/map_template/shuttle/arrival/northstar - suffix = "northstar" - name = "arrival shuttle (North Star)" - -/datum/map_template/shuttle/cargo/northstar - suffix = "northstar" - name = "cargo ferry (North Star)" - -// Custom ERT shuttles -/datum/map_template/shuttle/ert/bounty - suffix = "bounty" - name = "Bounty Hunter ERT Shuttle" - #undef EMAG_LOCKED_SHUTTLE_COST diff --git a/code/datums/shuttles/ert.dm b/code/datums/shuttles/ert.dm new file mode 100644 index 00000000000..843daf34c80 --- /dev/null +++ b/code/datums/shuttles/ert.dm @@ -0,0 +1,8 @@ +/datum/map_template/shuttle/ert + port_id = "ert" + who_can_purchase = null + +// Custom ERT shuttles +/datum/map_template/shuttle/ert/bounty + suffix = "bounty" + name = "Bounty Hunter ERT Shuttle" diff --git a/code/datums/shuttles/escape_pod.dm b/code/datums/shuttles/escape_pod.dm new file mode 100644 index 00000000000..0b2f35dd9dd --- /dev/null +++ b/code/datums/shuttles/escape_pod.dm @@ -0,0 +1,23 @@ +/datum/map_template/shuttle/escape_pod + port_id = "escape_pod" + who_can_purchase = null + +/datum/map_template/shuttle/escape_pod/default + suffix = "default" + name = "escape pod (Default)" + description = "Base escape pod with 2 tiles of interior space." + +/datum/map_template/shuttle/escape_pod/large + suffix = "large" + name = "escape pod (Large)" + description = "Actually the old Pubbystation monastery shuttle." + +/datum/map_template/shuttle/escape_pod/luxury + suffix = "luxury" + name = "escape pod (Luxury)" + description = "Upgraded escape pod with 3 tiles of interior space." + +/datum/map_template/shuttle/escape_pod/cramped + suffix = "cramped" + name = "escape pod (Cramped)" + description = "Downgraded escape pod that lacks a window and only has one seat, alongside lacking an emergency safe." diff --git a/code/datums/shuttles/ferry.dm b/code/datums/shuttles/ferry.dm new file mode 100644 index 00000000000..e4f540992ff --- /dev/null +++ b/code/datums/shuttles/ferry.dm @@ -0,0 +1,40 @@ +/datum/map_template/shuttle/ferry + port_id = "ferry" + name = "Base Shuttle Template (Ferry)" + +/datum/map_template/shuttle/ferry/base + suffix = "base" + name = "transport ferry" + description = "Standard issue Box/Metastation CentCom ferry." + +/datum/map_template/shuttle/ferry/meat + suffix = "meat" + name = "\"meat\" ferry" + description = "Ahoy! We got all kinds o' meat aft here. Meat from plant people, people who be dark, not in a racist way, just they're dark black. \ + Oh and lizard meat too,mighty popular that is. Definitely 100% fresh, just ask this guy here. *person on meatspike moans* See? \ + Definitely high quality meat, nothin' wrong with it, nothin' added, definitely no zombifyin' reagents!" + admin_notes = "Meat currently contains no zombifying reagents, lizard on meatspike must be spawned in." + +/datum/map_template/shuttle/ferry/lighthouse + suffix = "lighthouse" + name = "The Lighthouse(?)" + description = "*static*... part of a much larger vessel, possibly military in origin. \ + The weapon markings aren't anything we've seen ...static... by almost never the same person twice, possible use of unknown storage ...static... \ + seeing ERT officers onboard, but no missions are on file for ...static...static...annoying jingle... only at The LIGHTHOUSE! \ + Fulfilling needs you didn't even know you had. We've got EVERYTHING, and something else!" + admin_notes = "Currently larger than ferry docking port on Box, will not hit anything, but must be force docked. Trader and ERT bodyguards are not included." + +/datum/map_template/shuttle/ferry/fancy + suffix = "fancy" + name = "fancy transport ferry" + description = "At some point, someone upgraded the ferry to have fancier flooring... and fewer seats." + +/datum/map_template/shuttle/ferry/kilo + suffix = "kilo" + name = "kilo transport ferry" + description = "Standard issue CentCom Ferry for Kilo pattern stations. Includes additional equipment and rechargers." + +/datum/map_template/shuttle/ferry/northstar + suffix = "northstar" + name = "north star transport ferry" + description = "In the very depths of the frontier, you'll need a rugged shuttle capable of delivering crew, this is that." diff --git a/code/datums/shuttles/hunter.dm b/code/datums/shuttles/hunter.dm new file mode 100644 index 00000000000..d8b7f708324 --- /dev/null +++ b/code/datums/shuttles/hunter.dm @@ -0,0 +1,19 @@ +/datum/map_template/shuttle/hunter + port_id = "hunter" + who_can_purchase = null + +/datum/map_template/shuttle/hunter/space_cop + suffix = "space_cop" + name = "Police Spacevan" + +/datum/map_template/shuttle/hunter/russian + suffix = "russian" + name = "Russian Cargo Ship" + +/datum/map_template/shuttle/hunter/bounty + suffix = "bounty" + name = "Bounty Hunter Ship" + +/datum/map_template/shuttle/hunter/psyker + suffix = "psyker" + name = "Psyker Fortune-Telling Ship" diff --git a/code/datums/shuttles/infiltrator.dm b/code/datums/shuttles/infiltrator.dm new file mode 100644 index 00000000000..26f877f996e --- /dev/null +++ b/code/datums/shuttles/infiltrator.dm @@ -0,0 +1,13 @@ +/datum/map_template/shuttle/infiltrator + port_id = "infiltrator" + who_can_purchase = null + +/datum/map_template/shuttle/infiltrator/basic + suffix = "basic" + name = "basic syndicate infiltrator" + description = "Base Syndicate infiltrator, spawned by default for nukeops to use." + +/datum/map_template/shuttle/infiltrator/advanced + suffix = "advanced" + name = "advanced syndicate infiltrator" + description = "A much larger version of the standard Syndicate infiltrator that feels more like Kilostation. Has APCs, but power is not a concern for nuclear operatives. Also comes with atmos!" diff --git a/code/datums/shuttles/mining.dm b/code/datums/shuttles/mining.dm new file mode 100644 index 00000000000..ffd5cb04785 --- /dev/null +++ b/code/datums/shuttles/mining.dm @@ -0,0 +1,62 @@ +// LABOUR SHUTTLES +/datum/map_template/shuttle/labour + port_id = "labour" + who_can_purchase = null + +/datum/map_template/shuttle/labour/box + suffix = "box" + name = "labour shuttle (Box)" + +/datum/map_template/shuttle/labour/generic + suffix = "generic" + name = "labour shuttle (Generic)" + +/datum/map_template/shuttle/labour/delta + suffix = "delta" + name = "labour shuttle (Delta)" + +/datum/map_template/shuttle/labour/kilo + suffix = "kilo" + name = "labour shuttle (Kilo)" + +// MINING SHUTTLES +/datum/map_template/shuttle/mining + port_id = "mining" + who_can_purchase = null + +/datum/map_template/shuttle/mining/box + suffix = "box" + name = "mining shuttle (Box)" + +/datum/map_template/shuttle/mining/delta + suffix = "delta" + name = "mining shuttle (Delta)" + +/datum/map_template/shuttle/mining/kilo + suffix = "kilo" + name = "mining shuttle (Kilo)" + +/datum/map_template/shuttle/mining/large + suffix = "large" + name = "mining shuttle (Large)" + +/datum/map_template/shuttle/mining/northstar + suffix = "northstar" + name = "mining shuttle (North Star)" + +// MINING COMMON SHUTTLES +/datum/map_template/shuttle/mining_common + port_id = "mining_common" + who_can_purchase = null + +/datum/map_template/shuttle/mining_common/meta + suffix = "meta" + name = "lavaland shuttle (Meta)" + +/datum/map_template/shuttle/mining_common/kilo + suffix = "kilo" + name = "lavaland shuttle (Kilo)" + +/datum/map_template/shuttle/mining_common/northstar + suffix = "northstar" + name = "lavaland shuttle (North Star)" diff --git a/code/datums/shuttles/pirate.dm b/code/datums/shuttles/pirate.dm new file mode 100644 index 00000000000..27360a92cf4 --- /dev/null +++ b/code/datums/shuttles/pirate.dm @@ -0,0 +1,31 @@ +/datum/map_template/shuttle/pirate + port_id = "pirate" + who_can_purchase = null + +/datum/map_template/shuttle/pirate/default + suffix = "default" + name = "pirate ship (Default)" + +/datum/map_template/shuttle/pirate/silverscale + suffix = "silverscale" + name = "pirate ship (Silver Scales)" + +/datum/map_template/shuttle/pirate/dutchman + suffix = "dutchman" + name = "pirate ship (Flying Dutchman)" + +/datum/map_template/shuttle/pirate/interdyne + suffix = "interdyne" + name = "pirate ship (Pharmaceutics Biocraft)" + +/datum/map_template/shuttle/pirate/grey + suffix = "grey" + name = "pirate ship (The Space Toolbox)" + +/datum/map_template/shuttle/pirate/irs + suffix = "irs" + name = "pirate ship (Space IRS)" + +/datum/map_template/shuttle/pirate/geode + suffix = "geode" + name = "pirate ship (Lustrous Geode)" diff --git a/code/datums/shuttles/ruin.dm b/code/datums/shuttles/ruin.dm new file mode 100644 index 00000000000..511e2d6ecdc --- /dev/null +++ b/code/datums/shuttles/ruin.dm @@ -0,0 +1,28 @@ +/datum/map_template/shuttle/ruin + port_id = "ruin" + who_can_purchase = null + +/datum/map_template/shuttle/ruin/cyborg_mothership + suffix = "cyborg_mothership" + name = "Cyborg Mothership" + description = "A highly industrialised vessel designed for silicon operation infested with hivebots and space vines." + +/datum/map_template/shuttle/ruin/caravan_victim + suffix = "caravan_victim" + name = "Small Freighter" + description = "Small freight vessel, starts near blacked-out with 3 Syndicate Commandos and 1 Syndicate Stormtrooper, alongside a large hull breach." + +/datum/map_template/shuttle/ruin/pirate_cutter + suffix = "pirate_cutter" + name = "Pirate Cutter" + description = "Small pirate vessel with ballistic turrets. Spawns with 3 pirate mobs, one of which drops an energy cutlass." + +/datum/map_template/shuttle/ruin/syndicate_dropship + suffix = "syndicate_dropship" + name = "Syndicate Dropship" + description = "Light Syndicate vessel with laser turrets. Spawns with a Syndicate mob in the bridge." + +/datum/map_template/shuttle/ruin/syndicate_fighter_shiv + suffix = "syndicate_fighter_shiv" + name = "Syndicate Fighter" + description = "A small Syndicate vessel with exactly one tile of useful interior space and 4 laser turrets. Starts with a Syndicate mob in the pilot's seat, and extremely cramped." diff --git a/code/datums/shuttles/snowdin.dm b/code/datums/shuttles/snowdin.dm new file mode 100644 index 00000000000..bbee38ed991 --- /dev/null +++ b/code/datums/shuttles/snowdin.dm @@ -0,0 +1,11 @@ +/datum/map_template/shuttle/snowdin + port_id = "snowdin" + who_can_purchase = null + +/datum/map_template/shuttle/snowdin/mining + suffix = "mining" + name = "Snowdin Mining Elevator" + +/datum/map_template/shuttle/snowdin/excavation + suffix = "excavation" + name = "Snowdin Excavation Elevator" diff --git a/code/datums/shuttles/starfury.dm b/code/datums/shuttles/starfury.dm new file mode 100644 index 00000000000..510033d6436 --- /dev/null +++ b/code/datums/shuttles/starfury.dm @@ -0,0 +1,20 @@ +/datum/map_template/shuttle/starfury + port_id = "starfury" + who_can_purchase = null + +/datum/map_template/shuttle/starfury/fighter_one + suffix = "fighter1" + name = "SBC Starfury Fighter (1)" + +/datum/map_template/shuttle/starfury/fighter_two + suffix = "fighter2" + name = "SBC Starfury Fighter (2)" + +/datum/map_template/shuttle/starfury/fighter_three + suffix = "fighter3" + name = "SBC Starfury Fighter (3)" + +/datum/map_template/shuttle/starfury/corvette + suffix = "corvette" + name = "SBC Starfury Corvette" + diff --git a/code/datums/shuttles/whiteship.dm b/code/datums/shuttles/whiteship.dm new file mode 100644 index 00000000000..0b48575e057 --- /dev/null +++ b/code/datums/shuttles/whiteship.dm @@ -0,0 +1,58 @@ +/datum/map_template/shuttle/whiteship + port_id = "whiteship" + +/datum/map_template/shuttle/whiteship/box + suffix = "box" + name = "Hospital Ship" + description = "Whiteship with medical supplies. Zombies do not currently spawn corpses, and are not infectious." + +/datum/map_template/shuttle/whiteship/meta + suffix = "meta" + name = "Salvage Ship" + description = "Whiteship that focuses on a large cargo bay that players can build in. Spawns with Syndicate mobs who do not drop corpses and are highly aggressive." + +/datum/map_template/shuttle/whiteship/pubby + suffix = "pubby" + name = "NT Science Vessel" + description = "A small science vessel that uses just one area and is full of angry ants." + +/datum/map_template/shuttle/whiteship/cere + suffix = "cere" + name = "NT Heavy Salvage Vessel" + description = "A beefy, well-rounded salvage vessel with a pair of corpses (miner and engineer) and a Captain's hat. Equipped with solar sails and a PACMAN generator." + +/datum/map_template/shuttle/whiteship/birdshot + suffix = "birdshot" + name = "NT Patrol Bee" + description = "A small patrol vessel with a central corridor connecting all rooms. Features 2 small cargo bays and a brig. Spawns with an agressive and deadly Gelatinous Cube" + +/datum/map_template/shuttle/whiteship/kilo + suffix = "kilo" + name = "NT Mining Shuttle" + description = "A mining vessel with a curious shape starting with a few angry netherworld mobs." + +/datum/map_template/shuttle/whiteship/donut + suffix = "donut" + name = "NT Long-Distance Bluespace Jumper" + description = "A ship hit with an engine blowout, leaving it as a depressurised husk. Has infinite power, although likely to bait people into removing that property. Also the most open out of all the whiteships, and starts with a 25% ripley chance." + +/datum/map_template/shuttle/whiteship/tram + suffix = "tram" + name = "NT Long-Distance Bluespace Freighter" + description = "A long shuttle that starts with Nanotrasen private security corpses. DOES NOT FIT IN THE BASE DOCKS! Does fit in Deep Space's dock though." + +/datum/map_template/shuttle/whiteship/delta + suffix = "delta" + name = "NT Frigate" + description = "A standard whiteship with big spiders onboard. PACMAN generator is not wired and next to main grid cabling, so it requires some work." + +/datum/map_template/shuttle/whiteship/personalshuttle + suffix = "personalshuttle" + name = "Personal Travel Shuttle" + description = "A small vessel with a few zombies and an engineer's corpse that can be looted." + +/datum/map_template/shuttle/whiteship/obelisk + suffix = "obelisk" + name = "Obelisk" + description = "A large research vessel affected by the Cult of Nar'Sie. PACMAN generator is not wired and next to main grid cabling, so it requires some work." + admin_notes = "Not actually an obelisk, has nonsentient cult constructs." diff --git a/code/datums/sprite_accessories.dm b/code/datums/sprite_accessories.dm index b6efb687014..22e2473f2e4 100644 --- a/code/datums/sprite_accessories.dm +++ b/code/datums/sprite_accessories.dm @@ -840,6 +840,10 @@ name = "None" icon_state = "none" +/datum/sprite_accessory/gradient/full + name = "Full" + icon_state = "full" + /datum/sprite_accessory/gradient/fadeup name = "Fade Up" icon_state = "fadeup" diff --git a/code/datums/station_traits/negative_traits.dm b/code/datums/station_traits/negative_traits.dm index ec907e97ea2..86724170a96 100644 --- a/code/datums/station_traits/negative_traits.dm +++ b/code/datums/station_traits/negative_traits.dm @@ -694,3 +694,4 @@ storm_type = /datum/weather/snow_storm/forever_storm +#undef GLOW_NEBULA diff --git a/code/datums/status_effects/_status_effect.dm b/code/datums/status_effects/_status_effect.dm index 8c33d6a9d0c..b8d77db4ff7 100644 --- a/code/datums/status_effects/_status_effect.dm +++ b/code/datums/status_effects/_status_effect.dm @@ -29,6 +29,8 @@ var/remove_on_fullheal = FALSE /// If remove_on_fullheal is TRUE, what flag do we need to be removed? var/heal_flag_necessary = HEAL_STATUS + /// A particle effect, for things like embers - Should be set on update_particles() + var/obj/effect/abstract/particle_holder/particle_effect /datum/status_effect/New(list/arguments) on_creation(arglist(arguments)) @@ -63,6 +65,8 @@ if(STATUS_EFFECT_NORMAL_PROCESS) START_PROCESSING(SSprocessing, src) + update_particles() + return TRUE /datum/status_effect/Destroy() @@ -78,6 +82,8 @@ on_remove() UnregisterSignal(owner, COMSIG_LIVING_POST_FULLY_HEAL) owner = null + if(particle_effect) + QDEL_NULL(particle_effect) return ..() // Status effect process. Handles adjusting its duration and ticks. @@ -181,6 +187,14 @@ return FALSE +/** + * Updates the particles for the status effects + * Should be handled by subtypes! + */ + +/datum/status_effect/proc/update_particles() + SHOULD_CALL_PARENT(FALSE) + /// Alert base type for status effect alerts /atom/movable/screen/alert/status_effect name = "Curse of Mundanity" @@ -191,3 +205,4 @@ /atom/movable/screen/alert/status_effect/Destroy() attached_effect = null //Don't keep a ref now return ..() + diff --git a/code/datums/status_effects/debuffs/cursed.dm b/code/datums/status_effects/debuffs/cursed.dm new file mode 100644 index 00000000000..2ee7266f7b9 --- /dev/null +++ b/code/datums/status_effects/debuffs/cursed.dm @@ -0,0 +1,193 @@ +#define DEFAULT_MAX_CURSE_COUNT 5 + +/// Status effect that gives the target miscellanous debuffs while throwing a status alert and causing them to smoke from the damage they're incurring. +/// Purposebuilt for cursed slot machines. +/datum/status_effect/grouped/cursed + id = "cursed" + alert_type = /atom/movable/screen/alert/status_effect/cursed + /// The max number of curses a target can incur with this status effect. + var/max_curse_count = DEFAULT_MAX_CURSE_COUNT + /// The amount of times we have been "applied" to the target. + var/curse_count = 0 + /// Raw probability we have to deal damage this tick. + var/damage_chance = 10 + /// Are we currently in the process of sending a monologue? + var/monologuing = FALSE + /// The hand we are branded to. + var/obj/item/bodypart/branded_hand = null + /// The cached path of the particles we're using to smoke + var/smoke_path = null + +/datum/status_effect/grouped/cursed/on_apply() + RegisterSignal(owner, COMSIG_MOB_STATCHANGE, PROC_REF(on_stat_changed)) + RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(on_death)) + RegisterSignal(owner, COMSIG_CURSED_SLOT_MACHINE_USE, PROC_REF(check_curses)) + RegisterSignal(owner, COMSIG_CURSED_SLOT_MACHINE_LOST, PROC_REF(update_curse_count)) + RegisterSignal(SSdcs, COMSIG_GLOB_CURSED_SLOT_MACHINE_WON, PROC_REF(clear_curses)) + return ..() + +/datum/status_effect/grouped/cursed/Destroy() + UnregisterSignal(SSdcs, COMSIG_GLOB_CURSED_SLOT_MACHINE_WON) + branded_hand = null + return ..() + +/// Checks the number of curses we have and returns information back to the slot machine. `max_curse_amount` is set by the slot machine itself. +/datum/status_effect/grouped/cursed/proc/check_curses(max_curse_amount) + SIGNAL_HANDLER + if(curse_count >= max_curse_amount) + return SLOT_MACHINE_USE_CANCEL + + if(monologuing) + to_chat(owner, span_warning("Your arm is resisting your attempts to pull the lever!")) // listening to kitschy monologues to postpone your powergaming is the true curse here. + return SLOT_MACHINE_USE_POSTPONE + +/// Handles the debuffs of this status effect and incrementing the number of curses we have. +/datum/status_effect/grouped/cursed/proc/update_curse_count() + SIGNAL_HANDLER + curse_count++ + + linked_alert?.update_appearance() // we may have not initialized it yet + + addtimer(CALLBACK(src, PROC_REF(handle_after_effects), 1 SECONDS)) // give it a second to let the failure sink in before we exact our toll + +/// Makes a nice lorey message about the curse level we're at. I think it's nice +/datum/status_effect/grouped/cursed/proc/handle_after_effects() + if(QDELETED(src)) + return + + monologuing = TRUE + var/list/messages = list() + switch(curse_count) + if(1) // basically your first is a "freebie" that will still require urgent medical attention and will leave you smoking forever but could be worse tbh + if(ishuman(owner)) + var/mob/living/carbon/human/human_owner = owner + playsound(human_owner, SFX_SEAR, 50, TRUE) + var/obj/item/bodypart/affecting = human_owner.get_active_hand() + branded_hand = affecting + affecting.force_wound_upwards(/datum/wound/burn/severe/cursed_brand, wound_source = "curse of the slot machine") + + messages += span_boldwarning("Your hand burns, and you quickly let go of the lever! You feel a little sick as the nerves deaden in your hand...") + messages += span_boldwarning("Some smoke appears to be coming out of your hand now, but it's not too bad...") + messages += span_boldwarning("Fucking stupid machine.") + + if(2) + messages += span_boldwarning("The machine didn't burn you this time, it must be some arcane work of the brand recognizing a source...") + messages += span_boldwarning("Blisters and boils start to appear over your skin. Each one hissing searing hot steam out of its own pocket...") + messages += span_boldwarning("You understand that the machine tortures you with its simplistic allure. It can kill you at any moment, but it derives a sick satisfaction at forcing you to keep going.") + messages += span_boldwarning("If you could get away from here, you might be able to live with some medical supplies. Is it too late to stop now?") + messages += span_boldwarning("As you shut your eyes to dwell on this conundrum, the brand surges in pain. You shudder to think what might happen if you go unconscious.") + + if(3) + owner.emote("cough") + messages += span_boldwarning("Your throat becomes to feel like it's slowly caking up with sand and dust. You eject the contents of the back of your throat onto your sleeve.") + messages += span_boldwarning("It is sand. Crimson red. You've never felt so thirsty in your life, yet you don't trust your own hand to carry the glass to your lips.") + messages += span_boldwarning("You get the sneaking feeling that if someone else were to win, that it might clear your curse too. Saving your life is a noble cause.") + messages += span_boldwarning("Of course, you might have to not speak on the nature of this machine, in case they scamper off to leave you to die.") + messages += span_boldwarning("Is it truly worth it to condemn someone to this fate to cure the manifestation of your own hedonistic urges? You'll have to decide quickly.") + + if(4) + messages += span_boldwarning("A migraine swells over your head as your thoughts become hazy. Your hand desperately inches closer towards the slot machine for one final pull...") + messages += span_boldwarning("The ultimate test of mind over matter. You can jerk your own muscle back in order to prevent a terrible fate, but your life already is worth so little now.") + messages += span_boldwarning("This is what they want, is it not? To witness your failure against itself? The compulsion carries you forward as a sinking feeling of dread fills your stomach.") + messages += span_boldwarning("Paradoxically, where there is hopelessness, there is elation. Elation at the fact that there's still enough power in you for one more pull.") + messages += span_boldwarning("Your legs desperate wish to jolt away on the thought of running away from this wretched machination, but your own arm remains complacent in the thought of seeing spinning wheels.") + messages += span_userdanger("The toll has already been exacted. There is no longer death on 'your' terms. Is your dignity worth more than your life?") + + if(5 to INFINITY) + if(max_curse_count != DEFAULT_MAX_CURSE_COUNT) // this probably will only happen through admin schenanigans letting people stack up infinite curses or something + to_chat(owner, span_boldwarning("Do you still think you're in control?")) + return + + to_chat(owner, span_userdanger("Why couldn't I get one more try?!")) + owner.investigate_log("has been gibbed by the cursed status effect after accumulating [curse_count] curses.", INVESTIGATE_DEATHS) + owner.gib() + qdel(src) + return + + for(var/message in messages) + to_chat(owner, message) + sleep(1.5 SECONDS) // yes yes a bit fast but it can be a lot of text and i want the whole thing to send before the cooldown on the slot machine might expire + monologuing = FALSE + +/// Cleans ourselves up and removes our curses. Meant to be done in a "positive" way, when the curse is broken. Directly use qdel otherwise. +/datum/status_effect/grouped/cursed/proc/clear_curses() + SIGNAL_HANDLER + + if(!isnull(branded_hand)) + var/datum/wound/brand = branded_hand.get_wound_type(/datum/wound/burn/severe/cursed_brand) + brand?.remove_wound() + + owner.visible_message( + span_notice("The smoke slowly clears from [owner.name]..."), + span_notice("Your skin finally settles down and your throat no longer feels as dry... The brand disappearing confirms that the curse has been lifted."), + ) + QDEL_NULL(particle_effect) + qdel(src) + +/// If our owner's stat changes, rapidly surge the damage chance. +/datum/status_effect/grouped/cursed/proc/on_stat_changed() + SIGNAL_HANDLER + if(owner.stat == CONSCIOUS || owner.stat == DEAD) // reset on these two states + damage_chance = initial(damage_chance) + return + + to_chat(owner, span_userdanger("As your body crumbles, you feel the curse of the slot machine surge through your body!")) + damage_chance += 75 //ruh roh raggy + +/// If our owner dies without getting gibbed (as in of other causes), stop smoking because we've "expended all the life energy". +/datum/status_effect/grouped/cursed/proc/on_death(mob/living/source, gibbed) + SIGNAL_HANDLER + + if(gibbed) + return + + QDEL_NULL(particle_effect) + +/datum/status_effect/grouped/cursed/update_particles() + var/particle_path = /particles/smoke/steam/mild + switch(curse_count) + if(2 to 3) + particle_path = /particles/smoke/steam + if(4 to INFINITY) + particle_path = /particles/smoke/steam/bad + + if(smoke_path == particle_path) + return + + QDEL_NULL(particle_effect) + smoke_path = particle_path + particle_effect = new(owner, particle_path) + +/datum/status_effect/grouped/cursed/tick(seconds_between_ticks) + if(curse_count <= 1) + return // you get one "freebie" (single damage) to nudge you into thinking this is a bad idea before the house begins to win. + + // the house won. + var/ticked_coefficient = (rand(15, 40) / 100) + var/effective_percentile_chance = ((curse_count == 2 ? 1 : curse_count) * damage_chance * ticked_coefficient) + + if(SPT_PROB(effective_percentile_chance, seconds_between_ticks)) + owner.apply_damages( + brute = (curse_count * ticked_coefficient), + burn = (curse_count * ticked_coefficient), + oxy = (curse_count * ticked_coefficient), + ) + +/atom/movable/screen/alert/status_effect/cursed + name = "Cursed!" + desc = "The brand on your hand reminds you of your greed, yet you seem to be okay otherwise." + icon_state = "cursed_by_slots" + +/atom/movable/screen/alert/status_effect/cursed/update_desc() + . = ..() + var/datum/status_effect/grouped/cursed/linked_effect = attached_effect + var/curses = linked_effect.curse_count + switch(curses) + if(2) + desc = "Your greed is catching up to you..." + if(3) + desc = "You really don't feel good right now... But why stop now?" + if(4 to INFINITY) + desc = "Real winners quit before they reach the ultimate prize." + +#undef DEFAULT_MAX_CURSE_COUNT diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm index 5aee1cbfcdf..50fe9690b41 100644 --- a/code/datums/status_effects/debuffs/debuffs.dm +++ b/code/datums/status_effects/debuffs/debuffs.dm @@ -134,9 +134,10 @@ . = ..() if(!.) return - if(!HAS_TRAIT(owner, TRAIT_SLEEPIMMUNE)) - ADD_TRAIT(owner, TRAIT_KNOCKEDOUT, TRAIT_STATUS_EFFECT(id)) + if(HAS_TRAIT(owner, TRAIT_SLEEPIMMUNE)) tick_interval = -1 + else + ADD_TRAIT(owner, TRAIT_KNOCKEDOUT, TRAIT_STATUS_EFFECT(id)) RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_SLEEPIMMUNE), PROC_REF(on_owner_insomniac)) RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_SLEEPIMMUNE), PROC_REF(on_owner_sleepy)) @@ -249,7 +250,7 @@ var/delta = world.time - last_dead_time var/new_timeofdeath = owner.timeofdeath + delta owner.timeofdeath = new_timeofdeath - owner.tod = station_time_timestamp(wtime=new_timeofdeath) + owner.station_timestamp_timeofdeath = station_time_timestamp(wtime=new_timeofdeath) last_dead_time = null if(owner.stat == DEAD) last_dead_time = world.time diff --git a/code/datums/status_effects/debuffs/decloning.dm b/code/datums/status_effects/debuffs/decloning.dm new file mode 100644 index 00000000000..0f76f10f470 --- /dev/null +++ b/code/datums/status_effects/debuffs/decloning.dm @@ -0,0 +1,86 @@ +/// The amount of mutadone we can process for strike recovery at once. +#define MUTADONE_HEAL 1 + +/datum/status_effect/decloning + id = "decloning" + tick_interval = 3 SECONDS + alert_type = /atom/movable/screen/alert/status_effect/decloning + remove_on_fullheal = TRUE + + /// How many strikes our status effect holder has left before they are dusted. + var/strikes_left = 100 + +/datum/status_effect/decloning/on_apply() + if(owner.has_reagent(/datum/reagent/medicine/mutadone)) + return FALSE + to_chat(owner, span_userdanger("You've noticed your body has begun deforming. This can't be good.")) + return TRUE + +/datum/status_effect/decloning/on_remove() + if(!QDELETED(owner)) // bigger problems to worry about + owner.remove_movespeed_modifier(/datum/movespeed_modifier/decloning) + +/datum/status_effect/decloning/tick(seconds_between_ticks) + if(owner.has_reagent(/datum/reagent/medicine/mutadone, MUTADONE_HEAL * seconds_between_ticks)) + var/strike_restore = MUTADONE_HEAL * seconds_between_ticks + + if(strikes_left <= 50 && strikes_left + strike_restore > 50) + to_chat(owner, span_notice("Controlling your muscles feels easier now.")) + owner.remove_movespeed_modifier(/datum/movespeed_modifier/decloning) + else if(SPT_PROB(5, seconds_between_ticks)) + to_chat(owner, span_warning("Your body is growing and shifting back into place.")) + + strikes_left = min(strikes_left + strike_restore, 100) + + owner.reagents.remove_reagent(/datum/reagent/medicine/mutadone, MUTADONE_HEAL * seconds_between_ticks) + + if(strikes_left == 100) + qdel(src) + + return + + if(!SPT_PROB(5, seconds_between_ticks)) + return + + var/strike_reduce = 3 + if(strikes_left > 50 && strikes_left - strike_reduce <= 50) + to_chat(owner, span_danger("You're having a hard time controlling your muscles.")) + owner.add_movespeed_modifier(/datum/movespeed_modifier/decloning) + + strikes_left = max(strikes_left - strike_reduce, 0) + + if(prob(50)) + to_chat(owner, span_danger(pick( + "Your body is giving in.", + "You feel some muscles twitching.", + "Your skin feels sandy.", + "You feel your limbs shifting around.", + ))) + else if(prob(33)) + to_chat(owner, span_danger("You are twitching uncontrollably.")) + owner.set_jitter_if_lower(30 SECONDS) + + if(strikes_left == 0) + owner.visible_message(span_danger("[owner]'s skin turns to dust!"), span_boldwarning("Your skin turns to dust!")) + owner.dust() + return + +/datum/status_effect/decloning/get_examine_text() + switch(strikes_left) + if(68 to 100) + return span_warning("[owner.p_Their()] body looks a bit deformed.") + if(34 to 67) + return span_warning("[owner.p_Their()] body looks very deformed.") + if(-INFINITY to 33) + return span_boldwarning("[owner.p_Their()] body looks severely deformed!") + +/atom/movable/screen/alert/status_effect/decloning + name = "Cellular Meltdown" + desc = "Your body is deforming, and doesn't feel like it's going to hold up much longer. You are going to need treatment soon." + icon_state = "dna_melt" + +/datum/movespeed_modifier/decloning + multiplicative_slowdown = 0.7 + blacklisted_movetypes = (FLYING|FLOATING) + +#undef MUTADONE_HEAL diff --git a/code/datums/status_effects/debuffs/fire_stacks.dm b/code/datums/status_effects/debuffs/fire_stacks.dm index e4c13b06255..112e8bd8614 100644 --- a/code/datums/status_effects/debuffs/fire_stacks.dm +++ b/code/datums/status_effects/debuffs/fire_stacks.dm @@ -17,9 +17,6 @@ /// For how much firestacks does one our stack count var/stack_modifier = 1 - /// A particle effect, for things like embers - Should be set on update_particles() - var/obj/effect/abstract/particle_holder/particle_effect - /datum/status_effect/fire_handler/refresh(mob/living/new_owner, new_stacks, forced = FALSE) if(forced) set_stacks(new_stacks) @@ -81,23 +78,6 @@ adjust_stacks(override_effect.stacks) qdel(override_effect) -/datum/status_effect/fire_handler/on_apply() - . = ..() - update_particles() - -/datum/status_effect/fire_handler/on_remove() - if(particle_effect) - QDEL_NULL(particle_effect) - return ..() - -/** - * Updates the particles for the status effects - * Should be handled by subtypes! - */ - -/datum/status_effect/fire_handler/proc/update_particles() - SHOULD_CALL_PARENT(FALSE) - /** * Setter and adjuster procs for firestacks * diff --git a/code/datums/status_effects/debuffs/slimed.dm b/code/datums/status_effects/debuffs/slimed.dm new file mode 100644 index 00000000000..15632277f3d --- /dev/null +++ b/code/datums/status_effects/debuffs/slimed.dm @@ -0,0 +1,85 @@ +/// The minimum amount of water stacks needed to start washing off the slime. +#define MIN_WATER_STACKS 5 +/// The minimum amount of health a mob has to have before the status effect is removed. +#define MIN_HEALTH 10 + +/atom/movable/screen/alert/status_effect/slimed + name = "Covered in Slime" + desc = "You are covered in slime and it's eating away at you! Find a way to wash it off!" + icon_state = "slimed" + +/datum/status_effect/slimed + id = "slimed" + tick_interval = 3 SECONDS + alert_type = /atom/movable/screen/alert/status_effect/slimed + remove_on_fullheal = TRUE + + /// The amount of slime stacks that were applied, reduced by showering yourself under water. + var/slime_stacks = 10 // ~10 seconds of standing under a shower + /// Slime color, used for particles. + var/slime_color + /// Changes particle colors to rainbow, this overrides `slime_color`. + var/rainbow + +/datum/status_effect/slimed/on_creation(mob/living/new_owner, slime_color = COLOR_SLIME_GREY, rainbow = FALSE) + src.slime_color = slime_color + src.rainbow = rainbow + return ..() + +/datum/status_effect/slimed/on_apply() + if(owner.get_organic_health() <= MIN_HEALTH) + return FALSE + to_chat(owner, span_userdanger("You have been covered in a thick layer of slime! Find a way to wash it off!")) + return ..() + +/datum/status_effect/slimed/tick(seconds_between_ticks) + // remove from the mob once we have dealt enough damage + if(owner.get_organic_health() <= MIN_HEALTH) + to_chat(owner, span_warning("You feel the layer of slime crawling off of your weakened body.")) + qdel(src) + return + + // handle washing slime off + var/datum/status_effect/fire_handler/wet_stacks/wetness = locate() in owner.status_effects + if(istype(wetness) && wetness.stacks > (MIN_WATER_STACKS * seconds_between_ticks)) + slime_stacks -= seconds_between_ticks // lose 1 stack per second + wetness.adjust_stacks(-5 * seconds_between_ticks) + + // got rid of it + if(slime_stacks <= 0) + to_chat(owner, span_notice("You manage to wash off the layer of slime completely.")) + qdel(src) + return + + if(SPT_PROB(10, seconds_between_ticks)) + to_chat(owner,span_warning("The layer of slime is slowly getting thinner as it's washing off your skin.")) + + return + + // otherwise deal brute damage + owner.apply_damage(rand(2,4) * seconds_between_ticks, damagetype = BRUTE) + + if(SPT_PROB(10, seconds_between_ticks)) + var/feedback_text = pick(list( + "Your entire body screams with pain", + "Your skin feels like it's coming off", + "Your body feels like it's melting together" + )) + to_chat(owner, span_userdanger("[feedback_text] as the layer of slime eats away at you!")) + +/datum/status_effect/slimed/update_particles() + if(particle_effect) + return + + // taste the rainbow + var/particle_type = rainbow ? /particles/slime/rainbow : /particles/slime + particle_effect = new(owner, particle_type) + + if(!rainbow) + particle_effect.particles.color = "[slime_color]a0" + +/datum/status_effect/slimed/get_examine_text() + return span_warning("[owner.p_They()] [owner.p_are()] covered in bubbling slime!") + +#undef MIN_HEALTH +#undef MIN_WATER_STACKS diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm index 3daec2dd4b9..bcc0a50e707 100644 --- a/code/datums/status_effects/gas.dm +++ b/code/datums/status_effects/gas.dm @@ -52,6 +52,9 @@ duration = 8 can_melt = FALSE +/datum/status_effect/freon/watcher/extended + duration = 5 SECONDS + /datum/status_effect/freon/lasting id = "lasting_frozen" duration = -1 diff --git a/code/datums/storage/subtypes/pockets.dm b/code/datums/storage/subtypes/pockets.dm index 2b71b35508c..2d0c57ccd75 100644 --- a/code/datums/storage/subtypes/pockets.dm +++ b/code/datums/storage/subtypes/pockets.dm @@ -173,7 +173,7 @@ set_holdable(list(/obj/item/reagent_containers/cup/glass/bottle/vodka, /obj/item/reagent_containers/cup/glass/bottle/molotov, /obj/item/reagent_containers/cup/glass/drinkingglass, - /obj/item/ammo_box/a762)) + /obj/item/ammo_box/strilka310)) /datum/storage/pockets/void_cloak @@ -184,7 +184,7 @@ /datum/storage/pockets/void_cloak/New() . = ..() set_holdable(list( - /obj/item/ammo_box/a762/lionhunter, + /obj/item/ammo_box/strilka310/lionhunter, /obj/item/bodypart, // Bodyparts are often used in rituals. They're also often normal sized, so you can only fit one. /obj/item/clothing/neck/eldritch_amulet, /obj/item/clothing/neck/heretic_focus, diff --git a/code/datums/voice_of_god_command.dm b/code/datums/voice_of_god_command.dm index a66da9ba6ef..f1ce13f9fa5 100644 --- a/code/datums/voice_of_god_command.dm +++ b/code/datums/voice_of_god_command.dm @@ -348,7 +348,7 @@ GLOBAL_LIST_INIT(voice_of_god_commands, init_voice_of_god_commands()) /datum/voice_of_god_command/walk/execute(list/listeners, mob/living/user, power_multiplier = 1, message) for(var/mob/living/target as anything in listeners) - if(target.m_intent != MOVE_INTENT_WALK) + if(target.move_intent != MOVE_INTENT_WALK) target.toggle_move_intent() /// This command forces the listeners to switch to run intent. @@ -358,7 +358,7 @@ GLOBAL_LIST_INIT(voice_of_god_commands, init_voice_of_god_commands()) /datum/voice_of_god_command/walk/execute(list/listeners, mob/living/user, power_multiplier = 1, message) for(var/mob/living/target as anything in listeners) - if(target.m_intent != MOVE_INTENT_RUN) + if(target.move_intent != MOVE_INTENT_RUN) target.toggle_move_intent() /// This command turns the listeners' throw mode on. diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm index 8dbc20ff92c..823585a9d73 100644 --- a/code/datums/wires/_wires.dm +++ b/code/datums/wires/_wires.dm @@ -191,14 +191,6 @@ if(S && istype(S) && S.attachable && !is_attached(color)) assemblies[color] = S S.forceMove(holder) - /** - * special snowflake check for machines - * someone attached a signaler to the machines wires - * move it to the machines component parts so it doesn't get moved out in dump_inventory_contents() which gets called a lot - */ - if(istype(holder, /obj/machinery)) - var/obj/machinery/machine = holder - LAZYADD(machine.component_parts, S) S.connected = src S.on_attach() // Notify assembly that it is attached return S diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm index 400b0be5d3b..8f768d407c2 100644 --- a/code/datums/wires/airlock.dm +++ b/code/datums/wires/airlock.dm @@ -45,7 +45,7 @@ WIRE_BACKUP2, WIRE_BOLTS, WIRE_IDSCAN, - WIRE_LIGHT, + WIRE_BOLTLIGHT, WIRE_OPEN, WIRE_POWER1, WIRE_POWER2, @@ -142,7 +142,7 @@ A.close() if(WIRE_TIMING) A.normalspeed = !A.normalspeed - if(WIRE_LIGHT) + if(WIRE_BOLTLIGHT) A.lights = !A.lights A.update_appearance() if(WIRE_UNRESTRICTED_EXIT) // Pulse to switch the direction around by 180 degrees (North goes to South, East goes to West, vice-versa) @@ -206,7 +206,7 @@ A.autoclose = mend if(A.autoclose && !A.density) INVOKE_ASYNC(A, TYPE_PROC_REF(/obj/machinery/door/airlock, close)) - if(WIRE_LIGHT) // Cut to disable lights, mend to re-enable. + if(WIRE_BOLTLIGHT) // Cut to disable lights, mend to re-enable. A.lights = mend A.update_appearance() if(WIRE_ZAP1, WIRE_ZAP2) // Ouch. diff --git a/code/datums/wires/mecha.dm b/code/datums/wires/mecha.dm new file mode 100644 index 00000000000..07bc1190148 --- /dev/null +++ b/code/datums/wires/mecha.dm @@ -0,0 +1,78 @@ +/datum/wires/mecha + holder_type = /obj/vehicle/sealed/mecha + proper_name = "Mecha Control" + +/datum/wires/mecha/New(atom/holder) + wires = list(WIRE_IDSCAN, WIRE_DISARM, WIRE_ZAP, WIRE_OVERCLOCK) + var/obj/vehicle/sealed/mecha/mecha = holder + if(mecha.mecha_flags & HAS_LIGHTS) + wires += WIRE_LIGHT + add_duds(3) + ..() + +/datum/wires/mecha/interactable(mob/user) + if(!..()) + return FALSE + var/obj/vehicle/sealed/mecha/mecha = holder + return mecha.mecha_flags & PANEL_OPEN + +/datum/wires/mecha/get_status() + var/obj/vehicle/sealed/mecha/mecha = holder + var/list/status = list() + status += "The orange light is [mecha.internal_damage & MECHA_INT_SHORT_CIRCUIT ? "on" : "off"]." + status += "The red light is [mecha.overclock_mode ? "blinking" : "off"]." + status += "The green light is [(mecha.mecha_flags & ID_LOCK_ON) || mecha.dna_lock ? "on" : "off"]." + if(mecha.mecha_flags & HAS_LIGHTS) + status += "The yellow light is [mecha.light_on ? "on" : "off"]." + status += "The blue light is [mecha.equipment_disabled ? "on" : "off"]." + return status + +/datum/wires/mecha/on_pulse(wire) + var/obj/vehicle/sealed/mecha/mecha = holder + switch(wire) + if(WIRE_IDSCAN) + mecha.mecha_flags ^= ID_LOCK_ON + mecha.dna_lock = null + if(WIRE_DISARM) + mecha.equipment_disabled = TRUE + mecha.set_mouse_pointer() + if(WIRE_ZAP) + mecha.internal_damage ^= MECHA_INT_SHORT_CIRCUIT + if(WIRE_LIGHT) + mecha.set_light_on(!mecha.light_on) + if(WIRE_OVERCLOCK) + mecha.toggle_overclock() + +/datum/wires/mecha/on_cut(wire, mend, source) + var/obj/vehicle/sealed/mecha/mecha = holder + switch(wire) + if(WIRE_IDSCAN) + if(!mend) + mecha.mecha_flags &= ~ID_LOCK_ON + mecha.dna_lock = null + if(WIRE_DISARM) + mecha.equipment_disabled = !mend + mecha.set_mouse_pointer() + if(WIRE_ZAP) + if(mend) + mecha.internal_damage &= ~MECHA_INT_SHORT_CIRCUIT + else + mecha.internal_damage |= MECHA_INT_SHORT_CIRCUIT + if(WIRE_LIGHT) + mecha.set_light_on(!mend) + if(WIRE_OVERCLOCK) + if(!mend) + mecha.toggle_overclock(FALSE) + +/datum/wires/mecha/ui_act(action, params) + . = ..() + if(.) + return + var/obj/vehicle/sealed/mecha/mecha = holder + if(!issilicon(usr) && mecha.internal_damage & MECHA_INT_SHORT_CIRCUIT && mecha.shock(usr)) + return FALSE + +/datum/wires/mecha/can_reveal_wires(mob/user) + if(HAS_TRAIT(user, TRAIT_KNOW_ROBO_WIRES)) + return TRUE + return ..() diff --git a/code/datums/wires/mod.dm b/code/datums/wires/mod.dm index 2ce7b48440f..09274880367 100644 --- a/code/datums/wires/mod.dm +++ b/code/datums/wires/mod.dm @@ -55,3 +55,8 @@ if(!issilicon(usr) && mod.seconds_electrified && mod.shock(usr)) return FALSE return ..() + +/datum/wires/mod/can_reveal_wires(mob/user) + if(HAS_TRAIT(user, TRAIT_KNOW_ROBO_WIRES)) + return TRUE + return ..() diff --git a/code/datums/wires/robot.dm b/code/datums/wires/robot.dm index dee0112f375..8e3870acb47 100644 --- a/code/datums/wires/robot.dm +++ b/code/datums/wires/robot.dm @@ -105,7 +105,7 @@ log_silicon("[key_name(usr)] reset [key_name(R)]'s module via wire") /datum/wires/robot/can_reveal_wires(mob/user) - if(HAS_TRAIT(user, TRAIT_KNOW_CYBORG_WIRES)) + if(HAS_TRAIT(user, TRAIT_KNOW_ROBO_WIRES)) return TRUE return ..() diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm index ceb6cf75112..33686d6bc24 100644 --- a/code/datums/wounds/_wounds.dm +++ b/code/datums/wounds/_wounds.dm @@ -444,3 +444,8 @@ return "Severe" if(WOUND_SEVERITY_CRITICAL) return "Critical" + +/// Returns what string is displayed when a limb that has sustained this wound is examined +/// (This is examining the LIMB ITSELF, when it's not attached to someone.) +/datum/wound/proc/get_limb_examine_description() + return diff --git a/code/datums/wounds/bones.dm b/code/datums/wounds/bones.dm index 16417cca48b..aa6cad87ed8 100644 --- a/code/datums/wounds/bones.dm +++ b/code/datums/wounds/bones.dm @@ -176,6 +176,9 @@ msg += "!" return "[msg.Join()]" +/datum/wound/blunt/get_limb_examine_description() + return span_warning("The bones in this limb appear badly cracked.") + /* New common procs for /datum/wound/blunt/ */ diff --git a/code/datums/wounds/burns.dm b/code/datums/wounds/burns.dm index 0add2e5acbd..d3e7221d8f3 100644 --- a/code/datums/wounds/burns.dm +++ b/code/datums/wounds/burns.dm @@ -258,6 +258,9 @@ /datum/wound/burn/on_synthflesh(amount) flesh_healing += amount * 0.5 // 20u patch will heal 10 flesh standard +/datum/wound/burn/get_limb_examine_description() + return span_warning("The flesh on this limb appears badly cooked.") + // we don't even care about first degree burns, straight to second /datum/wound/burn/moderate name = "Second Degree Burns" @@ -312,4 +315,14 @@ desc = "Patient is suffering extreme burns from a strange brand marking, creating serious risk of infection and greatly reduced limb integrity." examine_desc = "appears to have holy symbols painfully branded into their flesh, leaving severe burns." occur_text = "chars rapidly into a strange pattern of holy symbols, burned into the flesh." + +/// special severe wound caused by the cursed slot machine. +/datum/wound/burn/severe/cursed_brand + name = "Ancient Brand" + desc = "Patient is suffering extreme burns with oddly ornate brand markings, creating serious risk of infection and greatly reduced limb integrity." + examine_desc = "appears to have ornate symbols painfully branded into their flesh, leaving severe burns" + occur_text = "chars rapidly into a pattern that can only be described as an agglomeration of several financial symbols, burned into the flesh" + +/datum/wound/burn/severe/cursed_brand/get_limb_examine_description() + return span_warning("The flesh on this limb has several ornate symbols burned into it, with pitting throughout.") */ diff --git a/code/datums/wounds/pierce.dm b/code/datums/wounds/pierce.dm index a18e66a3001..0f49496c91b 100644 --- a/code/datums/wounds/pierce.dm +++ b/code/datums/wounds/pierce.dm @@ -157,6 +157,9 @@ if(blood_flow > 0) try_treating(I, user) +/datum/wound/pierce/get_limb_examine_description() + return span_warning("The flesh on this limb appears badly perforated.") + /datum/wound/pierce/moderate name = "Minor Breakage" desc = "Patient's skin has been broken open, causing severe bruising and minor internal bleeding in affected area." diff --git a/code/datums/wounds/slash.dm b/code/datums/wounds/slash.dm index 338c4046432..97fb744d3b3 100644 --- a/code/datums/wounds/slash.dm +++ b/code/datums/wounds/slash.dm @@ -277,6 +277,9 @@ else if(demotes_to) to_chat(user, span_green("You successfully lower the severity of [user == victim ? "your" : "[victim]'s"] cuts.")) +/datum/wound/slash/get_limb_examine_description() + return span_warning("The flesh on this limb appears badly lacerated.") + /datum/wound/slash/moderate name = "Rough Abrasion" desc = "Patient's skin has been badly scraped, generating moderate blood loss." diff --git a/code/game/area/areas/misc.dm b/code/game/area/areas/misc.dm index c454f87fd2d..c7273c75aac 100644 --- a/code/game/area/areas/misc.dm +++ b/code/game/area/areas/misc.dm @@ -40,3 +40,8 @@ base_lighting_alpha = 255 name = "Test Room" icon_state = "test_room" + +/area/misc/testroom/gateway_room + name = "Gateway Room" + icon = 'icons/area/areas_station.dmi' + icon_state = "gateway" diff --git a/code/game/area/areas/station.dm b/code/game/area/areas/station.dm deleted file mode 100644 index 128d01e3746..00000000000 --- a/code/game/area/areas/station.dm +++ /dev/null @@ -1,1767 +0,0 @@ -// Station areas and shuttles - -/area/station - name = "Station Areas" - icon = 'icons/area/areas_station.dmi' - icon_state = "station" - -//Maintenance - -/area/station/maintenance - name = "Generic Maintenance" - ambience_index = AMBIENCE_MAINT - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED | PERSISTENT_ENGRAVINGS - airlock_wires = /datum/wires/airlock/maint - sound_environment = SOUND_AREA_TUNNEL_ENCLOSED - forced_ambience = TRUE - ambient_buzz = 'sound/ambience/source_corridor2.ogg' - ambient_buzz_vol = 20 - -//Maintenance - Departmental - -/area/station/maintenance/department/chapel - name = "Chapel Maintenance" - icon_state = "maint_chapel" - -/area/station/maintenance/department/chapel/monastery - name = "Monastery Maintenance" - icon_state = "maint_monastery" - -/area/station/maintenance/department/crew_quarters/bar - name = "Bar Maintenance" - icon_state = "maint_bar" - sound_environment = SOUND_AREA_WOODFLOOR - -/area/station/maintenance/department/crew_quarters/dorms - name = "Dormitory Maintenance" - icon_state = "maint_dorms" - -/area/station/maintenance/department/eva - name = "EVA Maintenance" - icon_state = "maint_eva" - -/area/station/maintenance/department/eva/abandoned - name = "Abandoned EVA Storage" - -/area/station/maintenance/department/electrical - name = "Electrical Maintenance" - icon_state = "maint_electrical" - -/area/station/maintenance/department/engine/atmos - name = "Atmospherics Maintenance" - icon_state = "maint_atmos" - -/area/station/maintenance/department/security - name = "Security Maintenance" - icon_state = "maint_sec" - -/area/station/maintenance/department/security/upper - name = "Upper Security Maintenance" - -/area/station/maintenance/department/security/brig - name = "Brig Maintenance" - icon_state = "maint_brig" - -/area/station/maintenance/department/medical - name = "Medbay Maintenance" - icon_state = "medbay_maint" - -/area/station/maintenance/department/medical/central - name = "Central Medbay Maintenance" - icon_state = "medbay_maint_central" - -/area/station/maintenance/department/medical/morgue - name = "Morgue Maintenance" - icon_state = "morgue_maint" - -/area/station/maintenance/department/science - name = "Science Maintenance" - icon_state = "maint_sci" - -/area/station/maintenance/department/science/central - name = "Central Science Maintenance" - icon_state = "maint_sci_central" - -/area/station/maintenance/department/cargo - name = "Cargo Maintenance" - icon_state = "maint_cargo" - -/area/station/maintenance/department/bridge - name = "Bridge Maintenance" - icon_state = "maint_bridge" - -/area/station/maintenance/department/engine - name = "Engineering Maintenance" - icon_state = "maint_engi" - -/area/station/maintenance/department/prison - name = "Prison Maintenance" - icon_state = "sec_prison" - -/area/station/maintenance/department/science/xenobiology - name = "Xenobiology Maintenance" - icon_state = "xenomaint" - area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA | XENOBIOLOGY_COMPATIBLE | CULT_PERMITTED - -//Maintenance - Generic Tunnels - -/area/station/maintenance/aft - name = "Aft Maintenance" - icon_state = "aftmaint" - -/area/station/maintenance/aft/upper - name = "Upper Aft Maintenance" - icon_state = "upperaftmaint" - -/area/station/maintenance/aft/greater //use greater variants of area definitions for when the station has two different sections of maintenance on the same z-level. Can stand alone without "lesser". This one means that this goes more fore/north than the "lesser" maintenance area. - name = "Greater Aft Maintenance" - icon_state = "greateraftmaint" - -/area/station/maintenance/aft/lesser //use lesser variants of area definitions for when the station has two different sections of maintenance on the same z-level in conjunction with "greater" (just because it follows better). This one means that this goes more aft/south than the "greater" maintenance area. - name = "Lesser Aft Maintenance" - icon_state = "lesseraftmaint" - -/area/station/maintenance/central - name = "Central Maintenance" - icon_state = "centralmaint" - -/area/station/maintenance/central/greater - name = "Greater Central Maintenance" - icon_state = "greatercentralmaint" - -/area/station/maintenance/central/lesser - name = "Lesser Central Maintenance" - icon_state = "lessercentralmaint" - -/area/station/maintenance/fore - name = "Fore Maintenance" - icon_state = "foremaint" - -/area/station/maintenance/fore/upper - name = "Upper Fore Maintenance" - icon_state = "upperforemaint" - -/area/station/maintenance/fore/greater - name = "Greater Fore Maintenance" - icon_state = "greaterforemaint" - -/area/station/maintenance/fore/lesser - name = "Lesser Fore Maintenance" - icon_state = "lesserforemaint" - -/area/station/maintenance/starboard - name = "Starboard Maintenance" - icon_state = "starboardmaint" - -/area/station/maintenance/starboard/upper - name = "Upper Starboard Maintenance" - icon_state = "upperstarboardmaint" - -/area/station/maintenance/starboard/central - name = "Central Starboard Maintenance" - icon_state = "centralstarboardmaint" - -/area/station/maintenance/starboard/greater - name = "Greater Starboard Maintenance" - icon_state = "greaterstarboardmaint" - -/area/station/maintenance/starboard/lesser - name = "Lesser Starboard Maintenance" - icon_state = "lesserstarboardmaint" - -/area/station/maintenance/starboard/aft - name = "Aft Starboard Maintenance" - icon_state = "asmaint" - -/area/station/maintenance/starboard/fore - name = "Fore Starboard Maintenance" - icon_state = "fsmaint" - -/area/station/maintenance/port - name = "Port Maintenance" - icon_state = "portmaint" - -/area/station/maintenance/port/central - name = "Central Port Maintenance" - icon_state = "centralportmaint" - -/area/station/maintenance/port/greater - name = "Greater Port Maintenance" - icon_state = "greaterportmaint" - -/area/station/maintenance/port/lesser - name = "Lesser Port Maintenance" - icon_state = "lesserportmaint" - -/area/station/maintenance/port/aft - name = "Aft Port Maintenance" - icon_state = "apmaint" - -/area/station/maintenance/port/fore - name = "Fore Port Maintenance" - icon_state = "fpmaint" - -/area/station/maintenance/tram - name = "Primary Tram Maintenance" - -/area/station/maintenance/tram/left - name = "\improper Port Tram Underpass" - icon_state = "mainttramL" - -/area/station/maintenance/tram/mid - name = "\improper Central Tram Underpass" - icon_state = "mainttramM" - -/area/station/maintenance/tram/right - name = "\improper Starboard Tram Underpass" - icon_state = "mainttramR" - -//Maintenance - Discrete Areas -/area/station/maintenance/disposal - name = "Waste Disposal" - icon_state = "disposal" - -/area/station/maintenance/hallway/abandoned_command - name = "\improper Abandoned Command Hallway" - icon_state = "maint_bridge" - -/area/station/maintenance/hallway/abandoned_recreation - name = "\improper Abandoned Recreation Hallway" - icon_state = "maint_dorms" - -/area/station/maintenance/disposal/incinerator - name = "\improper Incinerator" - icon_state = "incinerator" - -/area/station/maintenance/space_hut - name = "\improper Space Hut" - icon_state = "spacehut" - -/area/station/maintenance/space_hut/cabin - name = "Abandoned Cabin" - -/area/station/maintenance/space_hut/plasmaman - name = "\improper Abandoned Plasmaman Friendly Startup" - -/area/station/maintenance/space_hut/observatory - name = "\improper Space Observatory" - -//Radation storm shelter -/area/station/maintenance/radshelter - name = "\improper Radstorm Shelter" - icon_state = "radstorm_shelter" - -/area/station/maintenance/radshelter/medical - name = "\improper Medical Radstorm Shelter" - -/area/station/maintenance/radshelter/sec - name = "\improper Security Radstorm Shelter" - -/area/station/maintenance/radshelter/service - name = "\improper Service Radstorm Shelter" - -/area/station/maintenance/radshelter/civil - name = "\improper Civilian Radstorm Shelter" - -/area/station/maintenance/radshelter/sci - name = "\improper Science Radstorm Shelter" - -/area/station/maintenance/radshelter/cargo - name = "\improper Cargo Radstorm Shelter" - - -//Hallway - -/area/station/hallway - icon_state = "hall" - sound_environment = SOUND_AREA_STANDARD_STATION - -/area/station/hallway/primary - name = "\improper Primary Hallway" - icon_state = "primaryhall" - -/area/station/hallway/primary/aft - name = "\improper Aft Primary Hallway" - icon_state = "afthall" - -/area/station/hallway/primary/fore - name = "\improper Fore Primary Hallway" - icon_state = "forehall" - -/area/station/hallway/primary/starboard - name = "\improper Starboard Primary Hallway" - icon_state = "starboardhall" - -/area/station/hallway/primary/port - name = "\improper Port Primary Hallway" - icon_state = "porthall" - -/area/station/hallway/primary/central - name = "\improper Central Primary Hallway" - icon_state = "centralhall" - -/area/station/hallway/primary/central/fore - name = "\improper Fore Central Primary Hallway" - icon_state = "hallCF" - -/area/station/hallway/primary/central/aft - name = "\improper Aft Central Primary Hallway" - icon_state = "hallCA" - -/area/station/hallway/primary/upper - name = "\improper Upper Central Primary Hallway" - icon_state = "centralhall" - -/area/station/hallway/primary/tram - name = "\improper Primary Tram" - -/area/station/hallway/primary/tram/left - name = "\improper Port Tram Dock" - icon_state = "halltramL" - -/area/station/hallway/primary/tram/center - name = "\improper Central Tram Dock" - icon_state = "halltramM" - -/area/station/hallway/primary/tram/right - name = "\improper Starboard Tram Dock" - icon_state = "halltramR" - -/area/station/hallway/secondary // This shouldn't be used, but it gives an icon for the enviornment tree in the map editor - icon_state = "secondaryhall" - -/area/station/hallway/secondary/command - name = "\improper Command Hallway" - icon_state = "bridge_hallway" - -/area/station/hallway/secondary/construction - name = "\improper Construction Area" - icon_state = "construction" - -/area/station/hallway/secondary/construction/engineering - name = "\improper Engineering Hallway" - -/area/station/hallway/secondary/exit - name = "\improper Escape Shuttle Hallway" - icon_state = "escape" - -/area/station/hallway/secondary/exit/escape_pod - name = "\improper Escape Pod Bay" - icon_state = "escape_pods" - -/area/station/hallway/secondary/exit/departure_lounge - name = "\improper Departure Lounge" - icon_state = "escape_lounge" - -/area/station/hallway/secondary/entry - name = "\improper Arrival Shuttle Hallway" - icon_state = "entry" - area_flags = UNIQUE_AREA | EVENT_PROTECTED - -/area/station/hallway/secondary/dock - name = "\improper Secondary Station Dock Hallway" - icon_state = "hall" - -/area/station/hallway/secondary/service - name = "\improper Service Hallway" - icon_state = "hall_service" - -/area/station/hallway/secondary/spacebridge - name = "\improper Space Bridge" - icon_state = "hall" - -/area/station/hallway/secondary/recreation - name = "\improper Recreation Hallway" - icon_state = "hall" - -//Command - -/area/station/command - name = "Command" - icon_state = "command" - ambientsounds = list('sound/ambience/signal.ogg') - airlock_wires = /datum/wires/airlock/command - sound_environment = SOUND_AREA_STANDARD_STATION - -/area/station/command/bridge - name = "\improper Bridge" - icon_state = "bridge" - -/area/station/command/meeting_room - name = "\improper Heads of Staff Meeting Room" - icon_state = "meeting" - sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR - -/area/station/command/meeting_room/council - name = "\improper Council Chamber" - icon_state = "meeting" - sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR - -/area/station/command/corporate_showroom - name = "\improper Corporate Showroom" - icon_state = "showroom" - sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR - -/area/station/command/corporate_suite - name = "\improper Corporate Guest Suite" - icon_state = "command" - sound_environment = SOUND_AREA_WOODFLOOR - -/area/station/command/heads_quarters - icon_state = "heads_quarters" - -/area/station/command/heads_quarters/captain - name = "\improper Captain's Office" - icon_state = "captain" - sound_environment = SOUND_AREA_WOODFLOOR - -/area/station/command/heads_quarters/captain/private - name = "\improper Captain's Quarters" - icon_state = "captain_private" - sound_environment = SOUND_AREA_WOODFLOOR - -/area/station/command/heads_quarters/ce - name = "\improper Chief Engineer's Office" - icon_state = "ce_office" - -/area/station/command/heads_quarters/cmo - name = "\improper Chief Medical Officer's Office" - icon_state = "cmo_office" - -/area/station/command/heads_quarters/hop - name = "\improper Head of Personnel's Office" - icon_state = "hop_office" - -/area/station/command/heads_quarters/hos - name = "\improper Head of Security's Office" - icon_state = "hos_office" - -/area/station/command/heads_quarters/rd - name = "\improper Research Director's Office" - icon_state = "rd_office" - -/area/station/command/heads_quarters/qm - name = "\improper Quartermaster's Office" - icon_state = "qm_office" - -//Command - Teleporters - -/area/station/command/teleporter - name = "\improper Teleporter Room" - icon_state = "teleporter" - ambience_index = AMBIENCE_ENGI - -/area/station/command/gateway - name = "\improper Gateway" - icon_state = "gateway" - ambience_index = AMBIENCE_ENGI - -//Command - Bonus - -/area/station/command/corporate_dock - name = "\improper Corporate Private Dock" - icon_state = "command" - sound_environment = SOUND_AREA_SMALL_SOFTFLOOR - -//Commons - -/area/station/commons - name = "\improper Crew Facilities" - icon_state = "commons" - sound_environment = SOUND_AREA_STANDARD_STATION - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED - -/area/station/commons/dorms - name = "\improper Dormitories" - icon_state = "dorms" - -/area/station/commons/dorms/room1 - name = "\improper Dorms Room 1" - icon_state = "room1" - -/area/station/commons/dorms/room2 - name = "\improper Dorms Room 2" - icon_state = "room2" - -/area/station/commons/dorms/room3 - name = "\improper Dorms Room 3" - icon_state = "room3" - -/area/station/commons/dorms/room4 - name = "\improper Dorms Room 4" - icon_state = "room4" - -/area/station/commons/dorms/apartment1 - name = "\improper Dorms Apartment 1" - icon_state = "apartment1" - -/area/station/commons/dorms/apartment2 - name = "\improper Dorms Apartment 2" - icon_state = "apartment2" - -/area/station/commons/dorms/barracks - name = "\improper Sleep Barracks" - -/area/station/commons/dorms/barracks/male - name = "\improper Male Sleep Barracks" - icon_state = "dorms_male" - -/area/station/commons/dorms/barracks/female - name = "\improper Female Sleep Barracks" - icon_state = "dorms_female" - -/area/station/commons/dorms/laundry - name = "\improper Laundry Room" - icon_state = "laundry_room" - -/area/station/commons/toilet - name = "\improper Dormitory Toilets" - icon_state = "toilet" - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/commons/toilet/auxiliary - name = "\improper Auxiliary Restrooms" - icon_state = "toilet" - -/area/station/commons/toilet/locker - name = "\improper Locker Toilets" - icon_state = "toilet" - -/area/station/commons/toilet/restrooms - name = "\improper Restrooms" - icon_state = "toilet" - -/area/station/commons/locker - name = "\improper Locker Room" - icon_state = "locker" - -/area/station/commons/lounge - name = "\improper Bar Lounge" - icon_state = "lounge" - mood_bonus = 5 - mood_message = "I love being in the bar!" - mood_trait = TRAIT_EXTROVERT - sound_environment = SOUND_AREA_SMALL_SOFTFLOOR - -/area/station/commons/fitness - name = "\improper Fitness Room" - icon_state = "fitness" - -/area/station/commons/fitness/locker_room - name = "\improper Unisex Locker Room" - icon_state = "locker" - -/area/station/commons/fitness/locker_room/male - name = "\improper Male Locker Room" - icon_state = "locker_male" - -/area/station/commons/fitness/locker_room/female - name = "\improper Female Locker Room" - icon_state = "locker_female" - -/area/station/commons/fitness/recreation - name = "\improper Recreation Area" - icon_state = "rec" - -/area/station/commons/fitness/recreation/entertainment - name = "\improper Entertainment Center" - icon_state = "entertainment" - -// Commons - Vacant Rooms -/area/station/commons/vacant_room - name = "\improper Vacant Room" - icon_state = "vacant_room" - ambience_index = AMBIENCE_MAINT - -/area/station/commons/vacant_room/office - name = "\improper Vacant Office" - icon_state = "vacant_office" - -/area/station/commons/vacant_room/commissary - name = "\improper Vacant Commissary" - icon_state = "vacant_commissary" - -//Commons - Storage -/area/station/commons/storage - name = "\improper Commons Storage" - -/area/station/commons/storage/tools - name = "\improper Auxiliary Tool Storage" - icon_state = "tool_storage" - -/area/station/commons/storage/primary - name = "\improper Primary Tool Storage" - icon_state = "primary_storage" - -/area/station/commons/storage/art - name = "\improper Art Supply Storage" - icon_state = "art_storage" - -/area/station/commons/storage/emergency/starboard - name = "\improper Starboard Emergency Storage" - icon_state = "emergency_storage" - -/area/station/commons/storage/emergency/port - name = "\improper Port Emergency Storage" - icon_state = "emergency_storage" - -/area/station/commons/storage/mining - name = "\improper Public Mining Storage" - icon_state = "mining_storage" - -//Service - -/area/station/service - airlock_wires = /datum/wires/airlock/service - -/area/station/service/cafeteria - name = "\improper Cafeteria" - icon_state = "cafeteria" - -/area/station/service/barber - name = "\improper Barber" - icon_state = "barber" - -/area/station/service/kitchen - name = "\improper Kitchen" - icon_state = "kitchen" - -/area/station/service/kitchen/coldroom - name = "\improper Kitchen Cold Room" - icon_state = "kitchen_cold" - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/service/kitchen/diner - name = "\improper Diner" - icon_state = "diner" - -/area/station/service/kitchen/kitchen_backroom - name = "\improper Kitchen Backroom" - icon_state = "kitchen_backroom" - -/area/station/service/kitchen/abandoned - name = "\improper Abandoned Kitchen" - icon_state = "abandoned_kitchen" - -/area/station/service/bar - name = "\improper Bar" - icon_state = "bar" - mood_bonus = 5 - mood_message = "I love being in the bar!" - mood_trait = TRAIT_EXTROVERT - airlock_wires = /datum/wires/airlock/service - sound_environment = SOUND_AREA_WOODFLOOR - -/area/station/service/bar/Initialize(mapload) - . = ..() - GLOB.bar_areas += src - -/area/station/service/bar/atrium - name = "\improper Atrium" - icon_state = "bar" - sound_environment = SOUND_AREA_WOODFLOOR - -/area/station/service/bar/backroom - name = "\improper Bar Backroom" - icon_state = "bar_backroom" - -/area/station/service/electronic_marketing_den - name = "\improper Electronic Marketing Den" - icon_state = "abandoned_marketing_den" - -/area/station/service/abandoned_gambling_den - name = "\improper Abandoned Gambling Den" - icon_state = "abandoned_gambling_den" - -/area/station/service/abandoned_gambling_den/gaming - name = "\improper Abandoned Gaming Den" - icon_state = "abandoned_gaming_den" - -/area/station/service/theater - name = "\improper Theater" - icon_state = "theatre" - sound_environment = SOUND_AREA_WOODFLOOR - -/area/station/service/greenroom - name = "\improper Greenroom" - icon_state = "theatre" - sound_environment = SOUND_AREA_SMALL_SOFTFLOOR - -/area/station/service/theater/abandoned - name = "\improper Abandoned Theater" - icon_state = "abandoned_theatre" - -/area/station/service/library - name = "\improper Library" - icon_state = "library" - mood_bonus = 5 - mood_message = "I love being in the library!" - mood_trait = TRAIT_INTROVERT - area_flags = CULT_PERMITTED | BLOBS_ALLOWED | UNIQUE_AREA - sound_environment = SOUND_AREA_LARGE_SOFTFLOOR - -/area/station/service/library/garden - name = "\improper Library Garden" - icon_state = "library_garden" - -/area/station/service/library/lounge - name = "\improper Library Lounge" - icon_state = "library_lounge" - sound_environment = SOUND_AREA_SMALL_SOFTFLOOR - -/area/station/service/library/artgallery - name = "\improper Art Gallery" - icon_state = "library_gallery" - -/area/station/service/library/private - name = "\improper Library Private Study" - icon_state = "library_gallery_private" - -/area/station/service/library/upper - name = "\improper Library Upper Floor" - icon_state = "library" - -/area/station/service/library/printer - name = "\improper Library Printer Room" - icon_state = "library" - -/area/station/service/library/abandoned - name = "\improper Abandoned Library" - icon_state = "abandoned_library" - -/area/station/service/chapel - name = "\improper Chapel" - icon_state = "chapel" - mood_bonus = 5 - mood_message = "Being in the chapel brings me peace." - mood_trait = TRAIT_SPIRITUAL - ambience_index = AMBIENCE_HOLY - flags_1 = NONE - sound_environment = SOUND_AREA_LARGE_ENCLOSED - -/area/station/service/chapel/monastery - name = "\improper Monastery" - -/area/station/service/chapel/office - name = "\improper Chapel Office" - icon_state = "chapeloffice" - -/area/station/service/chapel/asteroid - name = "\improper Chapel Asteroid" - icon_state = "explored" - sound_environment = SOUND_AREA_ASTEROID - -/area/station/service/chapel/asteroid/monastery - name = "\improper Monastery Asteroid" - -/area/station/service/chapel/dock - name = "\improper Chapel Dock" - icon_state = "construction" - -/area/station/service/chapel/storage - name = "\improper Chapel Storage" - icon_state = "chapelstorage" - -/area/station/service/chapel/funeral - name = "\improper Chapel Funeral Room" - icon_state = "chapelfuneral" - -/area/station/service/lawoffice - name = "\improper Law Office" - icon_state = "law" - sound_environment = SOUND_AREA_SMALL_SOFTFLOOR - -/area/station/service/janitor - name = "\improper Custodial Closet" - icon_state = "janitor" - area_flags = CULT_PERMITTED | BLOBS_ALLOWED | UNIQUE_AREA - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/service/hydroponics - name = "Hydroponics" - icon_state = "hydro" - airlock_wires = /datum/wires/airlock/service - sound_environment = SOUND_AREA_STANDARD_STATION - -/area/station/service/hydroponics/upper - name = "Upper Hydroponics" - icon_state = "hydro" - -/area/station/service/hydroponics/garden - name = "Garden" - icon_state = "garden" - -/area/station/service/hydroponics/garden/abandoned - name = "\improper Abandoned Garden" - icon_state = "abandoned_garden" - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/service/hydroponics/garden/monastery - name = "\improper Monastery Garden" - icon_state = "hydro" - -//Engineering - -/area/station/engineering - icon_state = "engie" - ambience_index = AMBIENCE_ENGI - airlock_wires = /datum/wires/airlock/engineering - sound_environment = SOUND_AREA_LARGE_ENCLOSED - -/area/station/engineering/engine_smes - name = "\improper Engineering SMES" - icon_state = "engine_smes" - -/area/station/engineering/main - name = "Engineering" - icon_state = "engine" - -/area/station/engineering/hallway - name = "Engineering Hallway" - icon_state = "engine_hallway" - -/area/station/engineering/atmos - name = "Atmospherics" - icon_state = "atmos" - -/area/station/engineering/atmos/upper - name = "Upper Atmospherics" - -/area/station/engineering/atmos/project - name = "\improper Atmospherics Project Room" - icon_state = "atmos_projectroom" - -/area/station/engineering/atmos/pumproom - name = "\improper Atmospherics Pumping Room" - icon_state = "atmos_pump_room" - -/area/station/engineering/atmos/mix - name = "\improper Atmospherics Mixing Room" - icon_state = "atmos_mix" - -/area/station/engineering/atmos/storage - name = "\improper Atmospherics Storage Room" - icon_state = "atmos_storage" - -/area/station/engineering/atmos/storage/gas - name = "\improper Atmospherics Gas Storage" - icon_state = "atmos_storage_gas" - -/area/station/engineering/atmos/office - name = "\improper Atmospherics Office" - icon_state = "atmos_office" - -/area/station/engineering/atmos/hfr_room - name = "\improper Atmospherics HFR Room" - icon_state = "atmos_HFR" - -/area/station/engineering/atmospherics_engine - name = "\improper Atmospherics Engine" - icon_state = "atmos_engine" - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED - -/area/station/engineering/lobby - name = "\improper Engineering Lobby" - icon_state = "engi_lobby" - -/area/station/engineering/supermatter - name = "\improper Supermatter Engine" - icon_state = "engine_sm" - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/engineering/supermatter/room - name = "\improper Supermatter Engine Room" - icon_state = "engine_sm_room" - sound_environment = SOUND_AREA_LARGE_ENCLOSED - -/area/station/engineering/break_room - name = "\improper Engineering Foyer" - icon_state = "engine_break" - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/engineering/gravity_generator - name = "\improper Gravity Generator Room" - icon_state = "grav_gen" - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/engineering/storage - name = "Engineering Storage" - icon_state = "engine_storage" - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/engineering/storage_shared - name = "Shared Engineering Storage" - icon_state = "engine_storage_shared" - -/area/station/engineering/transit_tube - name = "\improper Transit Tube" - icon_state = "transit_tube" - -/area/station/engineering/storage/tech - name = "Technical Storage" - icon_state = "tech_storage" - -/area/station/engineering/storage/tcomms - name = "Telecomms Storage" - icon_state = "tcom_storage" - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED - -//Engineering - Construction - -/area/station/construction - name = "\improper Construction Area" - icon_state = "construction" - ambience_index = AMBIENCE_ENGI - sound_environment = SOUND_AREA_STANDARD_STATION - -/area/station/construction/mining/aux_base - name = "Auxiliary Base Construction" - icon_state = "aux_base_construction" - sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR - -/area/station/construction/storage_wing - name = "\improper Storage Wing" - icon_state = "storage_wing" - -//Solars - -/area/station/solars - icon_state = "panels" - requires_power = FALSE - area_flags = UNIQUE_AREA | AREA_USES_STARLIGHT - flags_1 = NONE - ambience_index = AMBIENCE_ENGI - airlock_wires = /datum/wires/airlock/engineering - sound_environment = SOUND_AREA_SPACE - -/area/station/solars/fore - name = "\improper Fore Solar Array" - icon_state = "panelsF" - sound_environment = SOUND_AREA_STANDARD_STATION - -/area/station/solars/aft - name = "\improper Aft Solar Array" - icon_state = "panelsAF" - -/area/station/solars/aux/port - name = "\improper Port Bow Auxiliary Solar Array" - icon_state = "panelsA" - -/area/station/solars/aux/starboard - name = "\improper Starboard Bow Auxiliary Solar Array" - icon_state = "panelsA" - -/area/station/solars/starboard - name = "\improper Starboard Solar Array" - icon_state = "panelsS" - -/area/station/solars/starboard/aft - name = "\improper Starboard Quarter Solar Array" - icon_state = "panelsAS" - -/area/station/solars/starboard/fore - name = "\improper Starboard Bow Solar Array" - icon_state = "panelsFS" - -/area/station/solars/port - name = "\improper Port Solar Array" - icon_state = "panelsP" - -/area/station/solars/port/aft - name = "\improper Port Quarter Solar Array" - icon_state = "panelsAP" - -/area/station/solars/port/fore - name = "\improper Port Bow Solar Array" - icon_state = "panelsFP" - -/area/station/solars/aisat - name = "\improper AI Satellite Solars" - icon_state = "panelsAI" - - -//Solar Maint - -/area/station/maintenance/solars - name = "Solar Maintenance" - icon_state = "yellow" - -/area/station/maintenance/solars/port - name = "Port Solar Maintenance" - icon_state = "SolarcontrolP" - -/area/station/maintenance/solars/port/aft - name = "Port Quarter Solar Maintenance" - icon_state = "SolarcontrolAP" - -/area/station/maintenance/solars/port/fore - name = "Port Bow Solar Maintenance" - icon_state = "SolarcontrolFP" - -/area/station/maintenance/solars/starboard - name = "Starboard Solar Maintenance" - icon_state = "SolarcontrolS" - -/area/station/maintenance/solars/starboard/aft - name = "Starboard Quarter Solar Maintenance" - icon_state = "SolarcontrolAS" - -/area/station/maintenance/solars/starboard/fore - name = "Starboard Bow Solar Maintenance" - icon_state = "SolarcontrolFS" - -//MedBay - -/area/station/medical - name = "Medical" - icon_state = "medbay" - ambience_index = AMBIENCE_MEDICAL - airlock_wires = /datum/wires/airlock/medbay - sound_environment = SOUND_AREA_STANDARD_STATION - min_ambience_cooldown = 90 SECONDS - max_ambience_cooldown = 180 SECONDS - -/area/station/medical/abandoned - name = "\improper Abandoned Medbay" - icon_state = "abandoned_medbay" - ambientsounds = list('sound/ambience/signal.ogg') - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/medical/medbay/central - name = "Medbay Central" - icon_state = "med_central" - -/area/station/medical/medbay/lobby - name = "\improper Medbay Lobby" - icon_state = "med_lobby" - -//Medbay is a large area, these additional areas help level out APC load. - -/area/station/medical/medbay/aft - name = "Medbay Aft" - icon_state = "med_aft" - -/area/station/medical/storage - name = "Medbay Storage" - icon_state = "med_storage" - -/area/station/medical/paramedic - name = "Paramedic Dispatch" - icon_state = "paramedic" - -/area/station/medical/office - name = "\improper Medical Office" - icon_state = "med_office" - -/area/station/medical/break_room - name = "\improper Medical Break Room" - icon_state = "med_break" - -/area/station/medical/coldroom - name = "\improper Medical Cold Room" - icon_state = "kitchen_cold" - -/area/station/medical/patients_rooms - name = "\improper Patients' Rooms" - icon_state = "patients" - sound_environment = SOUND_AREA_SMALL_SOFTFLOOR - -/area/station/medical/patients_rooms/room_a - name = "Patient Room A" - icon_state = "patients" - -/area/station/medical/patients_rooms/room_b - name = "Patient Room B" - icon_state = "patients" - -/area/station/medical/virology - name = "Virology" - icon_state = "virology" - ambience_index = AMBIENCE_VIROLOGY - -/area/station/medical/virology/isolation - name = "Virology Isolation" - icon_state = "virology_isolation" - -/area/station/medical/morgue - name = "\improper Morgue" - icon_state = "morgue" - ambience_index = AMBIENCE_SPOOKY - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/medical/chemistry - name = "Chemistry" - icon_state = "chem" - -/area/station/medical/pharmacy - name = "\improper Pharmacy" - icon_state = "pharmacy" - -/area/station/medical/chem_storage - name = "\improper Chemical Storage" - icon_state = "chem_storage" - -/area/station/medical/surgery - name = "\improper Operating Room" - icon_state = "surgery" - -/area/station/medical/surgery/fore - name = "\improper Fore Operating Room" - icon_state = "foresurgery" - -/area/station/medical/surgery/aft - name = "\improper Aft Operating Room" - icon_state = "aftsurgery" - -/area/station/medical/surgery/theatre - name = "\improper Grand Surgery Theatre" - icon_state = "surgerytheatre" - -/area/station/medical/cryo - name = "Cryogenics" - icon_state = "cryo" - -/area/station/medical/exam_room - name = "\improper Exam Room" - icon_state = "exam_room" - -/area/station/medical/treatment_center - name = "\improper Medbay Treatment Center" - icon_state = "exam_room" - -/area/station/medical/psychology - name = "\improper Psychology Office" - icon_state = "psychology" - mood_bonus = 3 - mood_message = "I feel at ease here." - ambientsounds = list('sound/ambience/aurora_caelus_short.ogg') - -//Security -///When adding a new area to the security areas, make sure to add it to /datum/bounty/item/security/paperwork as well! - -/area/station/security - name = "Security" - icon_state = "security" - ambience_index = AMBIENCE_DANGER - airlock_wires = /datum/wires/airlock/security - sound_environment = SOUND_AREA_STANDARD_STATION - -/area/station/security/office - name = "\improper Security Office" - icon_state = "security" - -/area/station/security/breakroom - name = "\improper Security Break Room" - icon_state = "brig" - -/area/station/security/tram - name = "\improper Security Transfer Tram" - icon_state = "security" - -/area/station/security/lockers - name = "\improper Security Locker Room" - icon_state = "securitylockerroom" - -/area/station/security/brig - name = "\improper Brig" - icon_state = "brig" - -/area/station/security/holding_cell - name = "\improper Holding Cell" - icon_state = "holding_cell" - -/area/station/security/medical - name = "\improper Security Medical" - icon_state = "security_medical" - -/area/station/security/brig/upper - name = "\improper Brig Overlook" - icon_state = "upperbrig" - -/area/station/security/brig/entrance - name = "\improper Brig Entrance" - icon_state = "brigentry" - -/area/station/security/courtroom - name = "\improper Courtroom" - icon_state = "courtroom" - sound_environment = SOUND_AREA_LARGE_ENCLOSED - -/area/station/security/courtroom/holding - name = "\improper Courtroom Prisoner Holding Room" - -/area/station/security/prison - name = "\improper Prison Wing" - icon_state = "sec_prison" - area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED | PERSISTENT_ENGRAVINGS - -//Rad proof -/area/station/security/prison/toilet - name = "\improper Prison Toilet" - icon_state = "sec_prison_safe" - -// Rad proof -/area/station/security/prison/safe - name = "\improper Prison Wing Cells" - icon_state = "sec_prison_safe" - -/area/station/security/prison/upper - name = "\improper Upper Prison Wing" - icon_state = "prison_upper" - -/area/station/security/prison/visit - name = "\improper Prison Visitation Area" - icon_state = "prison_visit" - -/area/station/security/prison/rec - name = "\improper Prison Rec Room" - icon_state = "prison_rec" - -/area/station/security/prison/mess - name = "\improper Prison Mess Hall" - icon_state = "prison_mess" - -/area/station/security/prison/work - name = "\improper Prison Work Room" - icon_state = "prison_work" - -/area/station/security/prison/shower - name = "\improper Prison Shower" - icon_state = "prison_shower" - -/area/station/security/prison/workout - name = "\improper Prison Gym" - icon_state = "prison_workout" - -/area/station/security/prison/garden - name = "\improper Prison Garden" - icon_state = "prison_garden" - -/area/station/security/processing - name = "\improper Labor Shuttle Dock" - icon_state = "sec_labor_processing" - -/area/station/security/processing/cremation - name = "\improper Security Crematorium" - icon_state = "sec_cremation" - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/security/interrogation - name = "\improper Interrogation Room" - icon_state = "interrogation" - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/security/warden - name = "Brig Control" - icon_state = "warden" - sound_environment = SOUND_AREA_SMALL_SOFTFLOOR - -/area/station/security/evidence - name = "Evidence Storage" - icon_state = "evidence" - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/security/detectives_office - name = "\improper Detective's Office" - icon_state = "detective" - ambientsounds = list('sound/ambience/ambidet1.ogg','sound/ambience/ambidet2.ogg') - -/area/station/security/detectives_office/private_investigators_office - name = "\improper Private Investigator's Office" - icon_state = "investigate_office" - sound_environment = SOUND_AREA_SMALL_SOFTFLOOR - -/area/station/security/range - name = "\improper Firing Range" - icon_state = "firingrange" - -/area/station/security/eva - name = "\improper Security EVA" - icon_state = "sec_eva" - -/area/station/security/execution - icon_state = "execution_room" - -/area/station/security/execution/transfer - name = "\improper Transfer Centre" - icon_state = "sec_processing" - -/area/station/security/execution/education - name = "\improper Prisoner Education Chamber" - -/area/station/security/checkpoint - name = "\improper Security Checkpoint" - icon_state = "checkpoint" - -/area/station/security/checkpoint/escape - name = "\improper Departures Security Checkpoint" - icon_state = "checkpoint_esc" - -/area/station/security/checkpoint/arrivals - name = "\improper Arrivals Security Checkpoint" - icon_state = "checkpoint_arr" - -/area/station/security/checkpoint/supply - name = "Security Post - Cargo Bay" - icon_state = "checkpoint_supp" - -/area/station/security/checkpoint/engineering - name = "Security Post - Engineering" - icon_state = "checkpoint_engi" - -/area/station/security/checkpoint/medical - name = "Security Post - Medbay" - icon_state = "checkpoint_med" - -/area/station/security/checkpoint/medical/medsci - name = "Security Post - Medsci" - -/area/station/security/checkpoint/science - name = "Security Post - Science" - icon_state = "checkpoint_sci" - -/area/station/security/checkpoint/science/research - name = "Security Post - Research Division" - icon_state = "checkpoint_res" - -/area/station/security/checkpoint/customs - name = "Customs" - icon_state = "customs_point" - -/area/station/security/checkpoint/customs/auxiliary - name = "Auxiliary Customs" - icon_state = "customs_point_aux" - -/area/station/security/checkpoint/customs/fore - name = "Fore Customs" - icon_state = "customs_point_fore" - -/area/station/security/checkpoint/customs/aft - name = "Aft Customs" - icon_state = "customs_point_aft" - -/area/station/security/checkpoint/first - name = "Security Post - First Floor" - icon_state = "checkpoint_1" - -/area/station/security/checkpoint/second - name = "Security Post - Second Floor" - icon_state = "checkpoint_2" - -/area/station/security/checkpoint/third - name = "Security Post - Third Floor" - icon_state = "checkpoint_3" -//Cargo - -/area/station/cargo - name = "Quartermasters" - icon_state = "quart" - airlock_wires = /datum/wires/airlock/service - sound_environment = SOUND_AREA_STANDARD_STATION - -/area/station/cargo/sorting - name = "\improper Delivery Office" - icon_state = "cargo_delivery" - -/area/station/cargo/warehouse - name = "\improper Warehouse" - icon_state = "cargo_warehouse" - sound_environment = SOUND_AREA_LARGE_ENCLOSED - -/area/station/cargo/drone_bay - name = "\improper Drone Bay" - icon_state = "cargo_drone" - -/area/station/cargo/boutique - name = "\improper Boutique" - icon_state = "cargo_delivery" - sound_environment = SOUND_AREA_WOODFLOOR - -/area/station/cargo/warehouse/upper - name = "\improper Upper Warehouse" - -/area/station/cargo/office - name = "\improper Cargo Office" - icon_state = "cargo_office" - -/area/station/cargo/storage - name = "\improper Cargo Bay" - icon_state = "cargo_bay" - sound_environment = SOUND_AREA_LARGE_ENCLOSED - -/area/station/cargo/lobby - name = "\improper Cargo Lobby" - icon_state = "cargo_lobby" - -/area/station/cargo/miningdock - name = "\improper Mining Dock" - icon_state = "mining_dock" - -/area/station/cargo/miningdock/cafeteria - name = "\improper Mining Cafeteria" - icon_state = "mining_cafe" - -/area/station/cargo/miningdock/oresilo - name = "\improper Mining Ore Silo Storage" - icon_state = "mining_silo" - -/area/station/cargo/miningoffice - name = "\improper Mining Office" - icon_state = "mining" - -//Science - -/area/station/science - name = "\improper Science Division" - icon_state = "science" - airlock_wires = /datum/wires/airlock/science - sound_environment = SOUND_AREA_STANDARD_STATION - -/area/station/science/lobby - name = "\improper Science Lobby" - icon_state = "science_lobby" - -/area/station/science/lower - name = "\improper Lower Science Division" - icon_state = "lower_science" - -/area/station/science/breakroom - name = "\improper Science Break Room" - icon_state = "science_breakroom" - -/area/station/science/lab - name = "Research and Development" - icon_state = "research" - -/area/station/science/xenobiology - name = "\improper Xenobiology Lab" - icon_state = "xenobio" - -/area/station/science/xenobiology/hallway - name = "\improper Xenobiology Hallway" - icon_state = "xenobio_hall" - -/area/station/science/cytology - name = "\improper Cytology Lab" - icon_state = "cytology" - -/area/station/science/cubicle - name = "\improper Science Cubicles" - icon_state = "science" - sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR - -// Use this for the main lab. If test equipment, storage, etc is also present use this one too. -/area/station/science/ordnance - name = "\improper Ordnance Lab" - icon_state = "ord_main" - -/area/station/science/ordnance/office - name = "\improper Ordnance Office" - icon_state = "ord_office" - -/area/station/science/ordnance/storage - name = "\improper Ordnance Storage" - icon_state = "ord_storage" - -/area/station/science/ordnance/burnchamber - name = "\improper Ordnance Burn Chamber" - icon_state = "ord_burn" - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED - -/area/station/science/ordnance/freezerchamber - name = "\improper Ordnance Freezer Chamber" - icon_state = "ord_freeze" - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED - -// Room for equipments and such -/area/station/science/ordnance/testlab - name = "\improper Ordnance Testing Lab" - icon_state = "ord_test" - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED - -/area/station/science/ordnance/bomb - name = "\improper Ordnance Bomb Site" - icon_state = "ord_boom" - area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED - -/area/station/science/genetics - name = "\improper Genetics Lab" - icon_state = "geneticssci" - -/area/station/science/server - name = "\improper Research Division Server Room" - icon_state = "server" - -/area/station/science/circuits - name = "\improper Circuit Lab" - icon_state = "cir_lab" - -/area/station/science/explab - name = "\improper Experimentation Lab" - icon_state = "exp_lab" - -// Useless room -/area/station/science/auxlab - name = "\improper Auxiliary Lab" - icon_state = "aux_lab" - -/area/station/science/auxlab/firing_range - name = "\improper Research Firing Range" - -/area/station/science/robotics - name = "Robotics" - icon_state = "robotics" - -/area/station/science/robotics/mechbay - name = "\improper Mech Bay" - icon_state = "mechbay" - -/area/station/science/robotics/lab - name = "\improper Robotics Lab" - icon_state = "ass_line" - -/area/station/science/robotics/augments - name = "improper Augmentation Theater" - icon_state = "robotics" - sound_environment = SOUND_AREA_TUNNEL_ENCLOSED - -/area/station/science/research - name = "\improper Research Division" - icon_state = "science" - -/area/station/science/research/abandoned - name = "\improper Abandoned Research Lab" - icon_state = "abandoned_sci" - sound_environment = SOUND_AREA_SMALL_ENCLOSED - -/area/station/escapepodbay - name = "\improper Pod Bay" - icon_state = "podbay" - -/area/station/asteroid - name = "\improper Station Asteroid" - icon_state = "station_asteroid" - always_unpowered = TRUE - power_environ = FALSE - power_equip = FALSE - power_light = FALSE - requires_power = TRUE - ambience_index = AMBIENCE_MINING - area_flags = UNIQUE_AREA - -// Telecommunications Satellite - -/area/station/tcommsat - icon_state = "tcomsatcham" - ambientsounds = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen9.ogg', 'sound/ambience/ambitech.ogg',\ - 'sound/ambience/ambitech2.ogg', 'sound/ambience/ambitech3.ogg', 'sound/ambience/ambimystery.ogg') - airlock_wires = /datum/wires/airlock/engineering - -/area/station/tcommsat/computer - name = "\improper Telecomms Control Room" - icon_state = "tcomsatcomp" - sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR - -/area/station/tcommsat/server - name = "\improper Telecomms Server Room" - icon_state = "tcomsatcham" - -/area/station/tcommsat/server/upper - name = "\improper Upper Telecomms Server Room" - -//Telecommunications - On Station - -/area/station/comms - name = "\improper Communications Relay" - icon_state = "tcomsatcham" - sound_environment = SOUND_AREA_STANDARD_STATION - -/area/station/server - name = "\improper Messaging Server Room" - icon_state = "server" - sound_environment = SOUND_AREA_STANDARD_STATION - -//External Hull Access -/area/station/maintenance/external - name = "\improper External Hull Access" - icon_state = "amaint" - -/area/station/maintenance/external/aft - name = "\improper Aft External Hull Access" - -/area/station/maintenance/external/port - name = "\improper Port External Hull Access" - -/area/station/maintenance/external/port/bow - name = "\improper Port Bow External Hull Access" - -//Tramstation - External -/area/misc/asteroid - name = "\improper Asteroid" - icon = 'icons/area/areas_station.dmi' - icon_state = "asteroid" - has_gravity = STANDARD_GRAVITY - sound_environment = SOUND_AREA_ASTEROID - ambient_buzz = 'sound/ambience/ambiatmos.ogg' - outdoors = TRUE - always_unpowered = TRUE - power_environ = FALSE - power_equip = FALSE - power_light = FALSE - requires_power = TRUE - ambience_index = AMBIENCE_MINING - -//North Star Specific Areas -//1 -/area/station/hallway/floor1 - name = "\improper First Floor Hallway" - -/area/station/hallway/floor1/aft - name = "\improper First Floor Aft Hallway" - icon_state = "1_aft" - -/area/station/hallway/floor1/fore - name = "\improper First Floor Fore Hallway" - icon_state = "1_fore" -//2 -/area/station/hallway/floor2 - name = "\improper Second Floor Hallway" - -/area/station/hallway/floor2/aft - name = "\improper Second Floor Aft Hallway" - icon_state = "2_aft" - -/area/station/hallway/floor2/fore - name = "\improper Second Floor Fore Hallway" - icon_state = "2_fore" -//3 -/area/station/hallway/floor3 - name = "\improper Third Floor Hallway" - -/area/station/hallway/floor3/aft - name = "\improper Third Floor Aft Hallway" - icon_state = "3_aft" - -/area/station/hallway/floor3/fore - name = "\improper Third Floor Fore Hallway" - icon_state = "3_fore" -//4 -/area/station/hallway/floor4 - name = "\improper Fourth Floor Hallway" - -/area/station/hallway/floor4/aft - name = "\improper Fourth Floor Aft Hallway" - icon_state = "4_aft" - -/area/station/hallway/floor4/fore - name = "\improper Fourth Floor Fore Hallway" - icon_state = "4_fore" - -//North Star Maintenance -//1 -/area/station/maintenance/floor1 - name = "\improper 1st Floor Maint" - -/area/station/maintenance/floor1/port - name = "\improper 1st Floor Central Port Maint" - icon_state = "maintcentral" - -/area/station/maintenance/floor1/port/fore - name = "\improper 1st Floor Fore Port Maint" - icon_state = "maintfore" -/area/station/maintenance/floor1/port/aft - name = "\improper 1st Floor Aft Port Maint" - icon_state = "maintaft" - -/area/station/maintenance/floor1/starboard - name = "\improper 1st Floor Central Starboard Maint" - icon_state = "maintcentral" - -/area/station/maintenance/floor1/starboard/fore - name = "\improper 1st Floor Fore Starboard Maint" - icon_state = "maintfore" - -/area/station/maintenance/floor1/starboard/aft - name = "\improper 1st Floor Aft Starboard Maint" - icon_state = "maintaft" -//2 -/area/station/maintenance/floor2 - name = "\improper 2nd Floor Maint" -/area/station/maintenance/floor2/port - name = "\improper 2nd Floor Central Port Maint" - icon_state = "maintcentral" - -/area/station/maintenance/floor2/port/fore - name = "\improper 2nd Floor Fore Port Maint" - icon_state = "maintfore" - -/area/station/maintenance/floor2/port/aft - name = "\improper 2nd Floor Aft Port Maint" - icon_state = "maintaft" - -/area/station/maintenance/floor2/starboard - name = "\improper 2nd Floor Central Starboard Maint" - icon_state = "maintcentral" - -/area/station/maintenance/floor2/starboard/fore - name = "\improper 2nd Floor Fore Starboard Maint" - icon_state = "maintfore" - -/area/station/maintenance/floor2/starboard/aft - name = "\improper 2nd Floor Aft Starboard Maint" - icon_state = "maintaft" -//3 -/area/station/maintenance/floor3 - name = "\improper 3rd Floor Maint" - -/area/station/maintenance/floor3/port - name = "\improper 3rd Floor Central Port Maint" - icon_state = "maintcentral" - -/area/station/maintenance/floor3/port/fore - name = "\improper 3rd Floor Fore Port Maint" - icon_state = "maintfore" - -/area/station/maintenance/floor3/port/aft - name = "\improper 3rd Floor Aft Port Maint" - icon_state = "maintaft" - -/area/station/maintenance/floor3/starboard - name = "\improper 3rd Floor Central Starboard Maint" - icon_state = "maintcentral" - -/area/station/maintenance/floor3/starboard/fore - name = "\improper 3rd Floor Fore Starboard Maint" - icon_state = "maintfore" - -/area/station/maintenance/floor3/starboard/aft - name = "\improper 3rd Floor Aft Starboard Maint" - icon_state = "maintaft" -//4 -/area/station/maintenance/floor4 - name = "\improper 4th Floor Maint" - -/area/station/maintenance/floor4/port - name = "\improper 4th Floor Central Port Maint" - icon_state = "maintcentral" - -/area/station/maintenance/floor4/port/fore - name = "\improper 4th Floor Fore Port Maint" - icon_state = "maintfore" - -/area/station/maintenance/floor4/port/aft - name = "\improper 4th Floor Aft Port Maint" - icon_state = "maintaft" - -/area/station/maintenance/floor4/starboard - name = "\improper 4th Floor Central Starboard Maint" - icon_state = "maintcentral" - -/area/station/maintenance/floor4/starboard/fore - name = "\improper 4th Floor Fore Starboard Maint" - icon_state = "maintfore" - -/area/station/maintenance/floor4/starboard/aft - name = "\improper 4th Floor Aft Starboard Maint" - icon_state = "maintaft" diff --git a/code/game/area/areas/station/cargo.dm b/code/game/area/areas/station/cargo.dm new file mode 100644 index 00000000000..8bb5229320d --- /dev/null +++ b/code/game/area/areas/station/cargo.dm @@ -0,0 +1,55 @@ +/area/station/cargo + name = "Quartermasters" + icon_state = "quart" + airlock_wires = /datum/wires/airlock/service + sound_environment = SOUND_AREA_STANDARD_STATION + +/area/station/cargo/sorting + name = "\improper Delivery Office" + icon_state = "cargo_delivery" + +/area/station/cargo/warehouse + name = "\improper Warehouse" + icon_state = "cargo_warehouse" + sound_environment = SOUND_AREA_LARGE_ENCLOSED + +/area/station/cargo/drone_bay + name = "\improper Drone Bay" + icon_state = "cargo_drone" + +/area/station/cargo/boutique + name = "\improper Boutique" + icon_state = "cargo_delivery" + sound_environment = SOUND_AREA_WOODFLOOR + +/area/station/cargo/warehouse/upper + name = "\improper Upper Warehouse" + +/area/station/cargo/office + name = "\improper Cargo Office" + icon_state = "cargo_office" + +/area/station/cargo/storage + name = "\improper Cargo Bay" + icon_state = "cargo_bay" + sound_environment = SOUND_AREA_LARGE_ENCLOSED + +/area/station/cargo/lobby + name = "\improper Cargo Lobby" + icon_state = "cargo_lobby" + +/area/station/cargo/miningdock + name = "\improper Mining Dock" + icon_state = "mining_dock" + +/area/station/cargo/miningdock/cafeteria + name = "\improper Mining Cafeteria" + icon_state = "mining_cafe" + +/area/station/cargo/miningdock/oresilo + name = "\improper Mining Ore Silo Storage" + icon_state = "mining_silo" + +/area/station/cargo/miningoffice + name = "\improper Mining Office" + icon_state = "mining" diff --git a/code/game/area/areas/station/command.dm b/code/game/area/areas/station/command.dm new file mode 100644 index 00000000000..a1a521e77a8 --- /dev/null +++ b/code/game/area/areas/station/command.dm @@ -0,0 +1,96 @@ +/area/station/command + name = "Command" + icon_state = "command" + ambientsounds = list( + 'sound/ambience/signal.ogg', + ) + airlock_wires = /datum/wires/airlock/command + sound_environment = SOUND_AREA_STANDARD_STATION + +/area/station/command/bridge + name = "\improper Bridge" + icon_state = "bridge" + +/area/station/command/meeting_room + name = "\improper Heads of Staff Meeting Room" + icon_state = "meeting" + sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR + +/area/station/command/meeting_room/council + name = "\improper Council Chamber" + icon_state = "meeting" + sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR + +/area/station/command/corporate_showroom + name = "\improper Corporate Showroom" + icon_state = "showroom" + sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR + +/area/station/command/corporate_suite + name = "\improper Corporate Guest Suite" + icon_state = "command" + sound_environment = SOUND_AREA_WOODFLOOR + +/* +* Command Head Areas +*/ + +/area/station/command/heads_quarters + icon_state = "heads_quarters" + +/area/station/command/heads_quarters/captain + name = "\improper Captain's Office" + icon_state = "captain" + sound_environment = SOUND_AREA_WOODFLOOR + +/area/station/command/heads_quarters/captain/private + name = "\improper Captain's Quarters" + icon_state = "captain_private" + sound_environment = SOUND_AREA_WOODFLOOR + +/area/station/command/heads_quarters/ce + name = "\improper Chief Engineer's Office" + icon_state = "ce_office" + +/area/station/command/heads_quarters/cmo + name = "\improper Chief Medical Officer's Office" + icon_state = "cmo_office" + +/area/station/command/heads_quarters/hop + name = "\improper Head of Personnel's Office" + icon_state = "hop_office" + +/area/station/command/heads_quarters/hos + name = "\improper Head of Security's Office" + icon_state = "hos_office" + +/area/station/command/heads_quarters/rd + name = "\improper Research Director's Office" + icon_state = "rd_office" + +/area/station/command/heads_quarters/qm + name = "\improper Quartermaster's Office" + icon_state = "qm_office" + +/* +* Command - Teleporter +*/ + +/area/station/command/teleporter + name = "\improper Teleporter Room" + icon_state = "teleporter" + ambience_index = AMBIENCE_ENGI + +/area/station/command/gateway + name = "\improper Gateway" + icon_state = "gateway" + ambience_index = AMBIENCE_ENGI + +/* +* Command - Misc +*/ + +/area/station/command/corporate_dock + name = "\improper Corporate Private Dock" + icon_state = "command" + sound_environment = SOUND_AREA_SMALL_SOFTFLOOR diff --git a/code/game/area/areas/station/common.dm b/code/game/area/areas/station/common.dm new file mode 100644 index 00000000000..eb8a0380ddc --- /dev/null +++ b/code/game/area/areas/station/common.dm @@ -0,0 +1,157 @@ +/area/station/commons + name = "\improper Crew Facilities" + icon_state = "commons" + sound_environment = SOUND_AREA_STANDARD_STATION + area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED + +/* +* Dorm Areas +*/ + +/area/station/commons/dorms + name = "\improper Dormitories" + icon_state = "dorms" + +/area/station/commons/dorms/room1 + name = "\improper Dorms Room 1" + icon_state = "room1" + +/area/station/commons/dorms/room2 + name = "\improper Dorms Room 2" + icon_state = "room2" + +/area/station/commons/dorms/room3 + name = "\improper Dorms Room 3" + icon_state = "room3" + +/area/station/commons/dorms/room4 + name = "\improper Dorms Room 4" + icon_state = "room4" + +/area/station/commons/dorms/apartment1 + name = "\improper Dorms Apartment 1" + icon_state = "apartment1" + +/area/station/commons/dorms/apartment2 + name = "\improper Dorms Apartment 2" + icon_state = "apartment2" + +/area/station/commons/dorms/barracks + name = "\improper Sleep Barracks" + +/area/station/commons/dorms/barracks/male + name = "\improper Male Sleep Barracks" + icon_state = "dorms_male" + +/area/station/commons/dorms/barracks/female + name = "\improper Female Sleep Barracks" + icon_state = "dorms_female" + +/area/station/commons/dorms/laundry + name = "\improper Laundry Room" + icon_state = "laundry_room" + +/area/station/commons/toilet + name = "\improper Dormitory Toilets" + icon_state = "toilet" + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/commons/toilet/auxiliary + name = "\improper Auxiliary Restrooms" + icon_state = "toilet" + +/area/station/commons/toilet/locker + name = "\improper Locker Toilets" + icon_state = "toilet" + +/area/station/commons/toilet/restrooms + name = "\improper Restrooms" + icon_state = "toilet" + +/* +* Rec and Locker Rooms +*/ + +/area/station/commons/locker + name = "\improper Locker Room" + icon_state = "locker" + +/area/station/commons/lounge + name = "\improper Bar Lounge" + icon_state = "lounge" + mood_bonus = 5 + mood_message = "I love being in the bar!" + mood_trait = TRAIT_EXTROVERT + sound_environment = SOUND_AREA_SMALL_SOFTFLOOR + +/area/station/commons/fitness + name = "\improper Fitness Room" + icon_state = "fitness" + +/area/station/commons/fitness/locker_room + name = "\improper Unisex Locker Room" + icon_state = "locker" + +/area/station/commons/fitness/locker_room/male + name = "\improper Male Locker Room" + icon_state = "locker_male" + +/area/station/commons/fitness/locker_room/female + name = "\improper Female Locker Room" + icon_state = "locker_female" + +/area/station/commons/fitness/recreation + name = "\improper Recreation Area" + icon_state = "rec" + +/area/station/commons/fitness/recreation/entertainment + name = "\improper Entertainment Center" + icon_state = "entertainment" + +/* +* Vacant Rooms +*/ + +/area/station/commons/vacant_room + name = "\improper Vacant Room" + icon_state = "vacant_room" + ambience_index = AMBIENCE_MAINT + +/area/station/commons/vacant_room/office + name = "\improper Vacant Office" + icon_state = "vacant_office" + +/area/station/commons/vacant_room/commissary + name = "\improper Vacant Commissary" + icon_state = "vacant_commissary" + +/* +* Storage Rooms +*/ + +/area/station/commons/storage + name = "\improper Commons Storage" + +/area/station/commons/storage/tools + name = "\improper Auxiliary Tool Storage" + icon_state = "tool_storage" + +/area/station/commons/storage/primary + name = "\improper Primary Tool Storage" + icon_state = "primary_storage" + +/area/station/commons/storage/art + name = "\improper Art Supply Storage" + icon_state = "art_storage" + +/area/station/commons/storage/emergency/starboard + name = "\improper Starboard Emergency Storage" + icon_state = "emergency_storage" + +/area/station/commons/storage/emergency/port + name = "\improper Port Emergency Storage" + icon_state = "emergency_storage" + +/area/station/commons/storage/mining + name = "\improper Public Mining Storage" + icon_state = "mining_storage" diff --git a/code/game/area/areas/station/engineering.dm b/code/game/area/areas/station/engineering.dm new file mode 100644 index 00000000000..a7ce535cc5d --- /dev/null +++ b/code/game/area/areas/station/engineering.dm @@ -0,0 +1,127 @@ +/area/station/engineering + icon_state = "engie" + ambience_index = AMBIENCE_ENGI + airlock_wires = /datum/wires/airlock/engineering + sound_environment = SOUND_AREA_LARGE_ENCLOSED + +/area/station/engineering/engine_smes + name = "\improper Engineering SMES" + icon_state = "engine_smes" + +/area/station/engineering/main + name = "Engineering" + icon_state = "engine" + +/area/station/engineering/hallway + name = "Engineering Hallway" + icon_state = "engine_hallway" + +/area/station/engineering/atmos + name = "Atmospherics" + icon_state = "atmos" + +/area/station/engineering/atmos/upper + name = "Upper Atmospherics" + +/area/station/engineering/atmos/project + name = "\improper Atmospherics Project Room" + icon_state = "atmos_projectroom" + +/area/station/engineering/atmos/pumproom + name = "\improper Atmospherics Pumping Room" + icon_state = "atmos_pump_room" + +/area/station/engineering/atmos/mix + name = "\improper Atmospherics Mixing Room" + icon_state = "atmos_mix" + +/area/station/engineering/atmos/storage + name = "\improper Atmospherics Storage Room" + icon_state = "atmos_storage" + +/area/station/engineering/atmos/storage/gas + name = "\improper Atmospherics Gas Storage" + icon_state = "atmos_storage_gas" + +/area/station/engineering/atmos/office + name = "\improper Atmospherics Office" + icon_state = "atmos_office" + +/area/station/engineering/atmos/hfr_room + name = "\improper Atmospherics HFR Room" + icon_state = "atmos_HFR" + +/area/station/engineering/atmospherics_engine + name = "\improper Atmospherics Engine" + icon_state = "atmos_engine" + area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED + +/area/station/engineering/lobby + name = "\improper Engineering Lobby" + icon_state = "engi_lobby" + +/area/station/engineering/supermatter + name = "\improper Supermatter Engine" + icon_state = "engine_sm" + area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/engineering/supermatter/waste + name = "\improper Supermatter Waste Chamber" + icon_state = "engine_sm_waste" + +/area/station/engineering/supermatter/room + name = "\improper Supermatter Engine Room" + icon_state = "engine_sm_room" + sound_environment = SOUND_AREA_LARGE_ENCLOSED + +/area/station/engineering/break_room + name = "\improper Engineering Foyer" + icon_state = "engine_break" + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/engineering/gravity_generator + name = "\improper Gravity Generator Room" + icon_state = "grav_gen" + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/engineering/storage + name = "Engineering Storage" + icon_state = "engine_storage" + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/engineering/storage_shared + name = "Shared Engineering Storage" + icon_state = "engine_storage_shared" + +/area/station/engineering/transit_tube + name = "\improper Transit Tube" + icon_state = "transit_tube" + +/area/station/engineering/storage/tech + name = "Technical Storage" + icon_state = "tech_storage" + +/area/station/engineering/storage/tcomms + name = "Telecomms Storage" + icon_state = "tcom_storage" + area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED + +/* +* Construction Areas +*/ + +/area/station/construction + name = "\improper Construction Area" + icon_state = "construction" + ambience_index = AMBIENCE_ENGI + sound_environment = SOUND_AREA_STANDARD_STATION + +/area/station/construction/mining/aux_base + name = "Auxiliary Base Construction" + icon_state = "aux_base_construction" + sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR + +/area/station/construction/storage_wing + name = "\improper Storage Wing" + icon_state = "storage_wing" diff --git a/code/game/area/areas/station/hallway.dm b/code/game/area/areas/station/hallway.dm new file mode 100644 index 00000000000..9512f20c709 --- /dev/null +++ b/code/game/area/areas/station/hallway.dm @@ -0,0 +1,154 @@ +/area/station/hallway + icon_state = "hall" + sound_environment = SOUND_AREA_STANDARD_STATION + +/area/station/hallway/primary + name = "\improper Primary Hallway" + icon_state = "primaryhall" + +/area/station/hallway/primary/aft + name = "\improper Aft Primary Hallway" + icon_state = "afthall" + +/area/station/hallway/primary/fore + name = "\improper Fore Primary Hallway" + icon_state = "forehall" + +/area/station/hallway/primary/starboard + name = "\improper Starboard Primary Hallway" + icon_state = "starboardhall" + +/area/station/hallway/primary/port + name = "\improper Port Primary Hallway" + icon_state = "porthall" + +/area/station/hallway/primary/central + name = "\improper Central Primary Hallway" + icon_state = "centralhall" + +/area/station/hallway/primary/central/fore + name = "\improper Fore Central Primary Hallway" + icon_state = "hallCF" + +/area/station/hallway/primary/central/aft + name = "\improper Aft Central Primary Hallway" + icon_state = "hallCA" + +/area/station/hallway/primary/upper + name = "\improper Upper Central Primary Hallway" + icon_state = "centralhall" + +/area/station/hallway/primary/tram + name = "\improper Primary Tram" + +/area/station/hallway/primary/tram/left + name = "\improper Port Tram Dock" + icon_state = "halltramL" + +/area/station/hallway/primary/tram/center + name = "\improper Central Tram Dock" + icon_state = "halltramM" + +/area/station/hallway/primary/tram/right + name = "\improper Starboard Tram Dock" + icon_state = "halltramR" + +// This shouldn't be used, but it gives an icon for the enviornment tree in the map editor +/area/station/hallway/secondary + icon_state = "secondaryhall" + +/area/station/hallway/secondary/command + name = "\improper Command Hallway" + icon_state = "bridge_hallway" + +/area/station/hallway/secondary/construction + name = "\improper Construction Area" + icon_state = "construction" + +/area/station/hallway/secondary/construction/engineering + name = "\improper Engineering Hallway" + +/area/station/hallway/secondary/exit + name = "\improper Escape Shuttle Hallway" + icon_state = "escape" + +/area/station/hallway/secondary/exit/escape_pod + name = "\improper Escape Pod Bay" + icon_state = "escape_pods" + +/area/station/hallway/secondary/exit/departure_lounge + name = "\improper Departure Lounge" + icon_state = "escape_lounge" + +/area/station/hallway/secondary/entry + name = "\improper Arrival Shuttle Hallway" + icon_state = "entry" + area_flags = UNIQUE_AREA | EVENT_PROTECTED + +/area/station/hallway/secondary/dock + name = "\improper Secondary Station Dock Hallway" + icon_state = "hall" + +/area/station/hallway/secondary/service + name = "\improper Service Hallway" + icon_state = "hall_service" + +/area/station/hallway/secondary/spacebridge + name = "\improper Space Bridge" + icon_state = "hall" + +/area/station/hallway/secondary/recreation + name = "\improper Recreation Hallway" + icon_state = "hall" + +/* +* Station Specific Areas +* If another station gets added, and you make specific areas for it +* Please make its own section in this file +* The areas below belong to North Star's Hallways +*/ + +//1 +/area/station/hallway/floor1 + name = "\improper First Floor Hallway" + +/area/station/hallway/floor1/aft + name = "\improper First Floor Aft Hallway" + icon_state = "1_aft" + +/area/station/hallway/floor1/fore + name = "\improper First Floor Fore Hallway" + icon_state = "1_fore" +//2 +/area/station/hallway/floor2 + name = "\improper Second Floor Hallway" + +/area/station/hallway/floor2/aft + name = "\improper Second Floor Aft Hallway" + icon_state = "2_aft" + +/area/station/hallway/floor2/fore + name = "\improper Second Floor Fore Hallway" + icon_state = "2_fore" +//3 +/area/station/hallway/floor3 + name = "\improper Third Floor Hallway" + +/area/station/hallway/floor3/aft + name = "\improper Third Floor Aft Hallway" + icon_state = "3_aft" + +/area/station/hallway/floor3/fore + name = "\improper Third Floor Fore Hallway" + icon_state = "3_fore" +//4 +/area/station/hallway/floor4 + name = "\improper Fourth Floor Hallway" + +/area/station/hallway/floor4/aft + name = "\improper Fourth Floor Aft Hallway" + icon_state = "4_aft" + +/area/station/hallway/floor4/fore + name = "\improper Fourth Floor Fore Hallway" + icon_state = "4_fore" diff --git a/code/game/area/areas/station/maintenance.dm b/code/game/area/areas/station/maintenance.dm new file mode 100644 index 00000000000..53e6da606d0 --- /dev/null +++ b/code/game/area/areas/station/maintenance.dm @@ -0,0 +1,411 @@ +/area/station/maintenance + name = "Generic Maintenance" + ambience_index = AMBIENCE_MAINT + area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED | PERSISTENT_ENGRAVINGS + airlock_wires = /datum/wires/airlock/maint + sound_environment = SOUND_AREA_TUNNEL_ENCLOSED + forced_ambience = TRUE + ambient_buzz = 'sound/ambience/source_corridor2.ogg' + ambient_buzz_vol = 20 + +/* +* Departmental Maintenance +*/ + +/area/station/maintenance/department/chapel + name = "Chapel Maintenance" + icon_state = "maint_chapel" + +/area/station/maintenance/department/chapel/monastery + name = "Monastery Maintenance" + icon_state = "maint_monastery" + +/area/station/maintenance/department/crew_quarters/bar + name = "Bar Maintenance" + icon_state = "maint_bar" + sound_environment = SOUND_AREA_WOODFLOOR + +/area/station/maintenance/department/crew_quarters/dorms + name = "Dormitory Maintenance" + icon_state = "maint_dorms" + +/area/station/maintenance/department/eva + name = "EVA Maintenance" + icon_state = "maint_eva" + +/area/station/maintenance/department/eva/abandoned + name = "Abandoned EVA Storage" + +/area/station/maintenance/department/electrical + name = "Electrical Maintenance" + icon_state = "maint_electrical" + +/area/station/maintenance/department/engine/atmos + name = "Atmospherics Maintenance" + icon_state = "maint_atmos" + +/area/station/maintenance/department/security + name = "Security Maintenance" + icon_state = "maint_sec" + +/area/station/maintenance/department/security/upper + name = "Upper Security Maintenance" + +/area/station/maintenance/department/security/brig + name = "Brig Maintenance" + icon_state = "maint_brig" + +/area/station/maintenance/department/medical + name = "Medbay Maintenance" + icon_state = "medbay_maint" + +/area/station/maintenance/department/medical/central + name = "Central Medbay Maintenance" + icon_state = "medbay_maint_central" + +/area/station/maintenance/department/medical/morgue + name = "Morgue Maintenance" + icon_state = "morgue_maint" + +/area/station/maintenance/department/science + name = "Science Maintenance" + icon_state = "maint_sci" + +/area/station/maintenance/department/science/central + name = "Central Science Maintenance" + icon_state = "maint_sci_central" + +/area/station/maintenance/department/cargo + name = "Cargo Maintenance" + icon_state = "maint_cargo" + +/area/station/maintenance/department/bridge + name = "Bridge Maintenance" + icon_state = "maint_bridge" + +/area/station/maintenance/department/engine + name = "Engineering Maintenance" + icon_state = "maint_engi" + +/area/station/maintenance/department/prison + name = "Prison Maintenance" + icon_state = "sec_prison" + +/area/station/maintenance/department/science/xenobiology + name = "Xenobiology Maintenance" + icon_state = "xenomaint" + area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA | XENOBIOLOGY_COMPATIBLE | CULT_PERMITTED + +/* +* Generic Maintenance Tunnels +*/ + +/area/station/maintenance/aft + name = "Aft Maintenance" + icon_state = "aftmaint" + +/area/station/maintenance/aft/upper + name = "Upper Aft Maintenance" + icon_state = "upperaftmaint" + +/* Use greater variants of area definitions for when the station has two different sections of maintenance on the same z-level. +* Can stand alone without "lesser". +* This one means that this goes more fore/north than the "lesser" maintenance area. +*/ +/area/station/maintenance/aft/greater + name = "Greater Aft Maintenance" + icon_state = "greateraftmaint" + +/* Use lesser variants of area definitions for when the station has two different sections of maintenance on the same z-level in conjunction with "greater". +* (just because it follows better). +* This one means that this goes more aft/south than the "greater" maintenance area. +*/ + +/area/station/maintenance/aft/lesser + name = "Lesser Aft Maintenance" + icon_state = "lesseraftmaint" + +/area/station/maintenance/central + name = "Central Maintenance" + icon_state = "centralmaint" + +/area/station/maintenance/central/greater + name = "Greater Central Maintenance" + icon_state = "greatercentralmaint" + +/area/station/maintenance/central/lesser + name = "Lesser Central Maintenance" + icon_state = "lessercentralmaint" + +/area/station/maintenance/fore + name = "Fore Maintenance" + icon_state = "foremaint" + +/area/station/maintenance/fore/upper + name = "Upper Fore Maintenance" + icon_state = "upperforemaint" + +/area/station/maintenance/fore/greater + name = "Greater Fore Maintenance" + icon_state = "greaterforemaint" + +/area/station/maintenance/fore/lesser + name = "Lesser Fore Maintenance" + icon_state = "lesserforemaint" + +/area/station/maintenance/starboard + name = "Starboard Maintenance" + icon_state = "starboardmaint" + +/area/station/maintenance/starboard/upper + name = "Upper Starboard Maintenance" + icon_state = "upperstarboardmaint" + +/area/station/maintenance/starboard/central + name = "Central Starboard Maintenance" + icon_state = "centralstarboardmaint" + +/area/station/maintenance/starboard/greater + name = "Greater Starboard Maintenance" + icon_state = "greaterstarboardmaint" + +/area/station/maintenance/starboard/lesser + name = "Lesser Starboard Maintenance" + icon_state = "lesserstarboardmaint" + +/area/station/maintenance/starboard/aft + name = "Aft Starboard Maintenance" + icon_state = "asmaint" + +/area/station/maintenance/starboard/fore + name = "Fore Starboard Maintenance" + icon_state = "fsmaint" + +/area/station/maintenance/port + name = "Port Maintenance" + icon_state = "portmaint" + +/area/station/maintenance/port/central + name = "Central Port Maintenance" + icon_state = "centralportmaint" + +/area/station/maintenance/port/greater + name = "Greater Port Maintenance" + icon_state = "greaterportmaint" + +/area/station/maintenance/port/lesser + name = "Lesser Port Maintenance" + icon_state = "lesserportmaint" + +/area/station/maintenance/port/aft + name = "Aft Port Maintenance" + icon_state = "apmaint" + +/area/station/maintenance/port/fore + name = "Fore Port Maintenance" + icon_state = "fpmaint" + +/area/station/maintenance/tram + name = "Primary Tram Maintenance" + +/area/station/maintenance/tram/left + name = "\improper Port Tram Underpass" + icon_state = "mainttramL" + +/area/station/maintenance/tram/mid + name = "\improper Central Tram Underpass" + icon_state = "mainttramM" + +/area/station/maintenance/tram/right + name = "\improper Starboard Tram Underpass" + icon_state = "mainttramR" + +/* +* Discrete Maintenance Areas +*/ + +/area/station/maintenance/disposal + name = "Waste Disposal" + icon_state = "disposal" + +/area/station/maintenance/hallway/abandoned_command + name = "\improper Abandoned Command Hallway" + icon_state = "maint_bridge" + +/area/station/maintenance/hallway/abandoned_recreation + name = "\improper Abandoned Recreation Hallway" + icon_state = "maint_dorms" + +/area/station/maintenance/disposal/incinerator + name = "\improper Incinerator" + icon_state = "incinerator" + +/area/station/maintenance/space_hut + name = "\improper Space Hut" + icon_state = "spacehut" + +/area/station/maintenance/space_hut/cabin + name = "Abandoned Cabin" + +/area/station/maintenance/space_hut/plasmaman + name = "\improper Abandoned Plasmaman Friendly Startup" + +/area/station/maintenance/space_hut/observatory + name = "\improper Space Observatory" + +/* +* Radation Storm Shelters +*/ + +/area/station/maintenance/radshelter + name = "\improper Radstorm Shelter" + icon_state = "radstorm_shelter" + +/area/station/maintenance/radshelter/medical + name = "\improper Medical Radstorm Shelter" + +/area/station/maintenance/radshelter/sec + name = "\improper Security Radstorm Shelter" + +/area/station/maintenance/radshelter/service + name = "\improper Service Radstorm Shelter" + +/area/station/maintenance/radshelter/civil + name = "\improper Civilian Radstorm Shelter" + +/area/station/maintenance/radshelter/sci + name = "\improper Science Radstorm Shelter" + +/area/station/maintenance/radshelter/cargo + name = "\improper Cargo Radstorm Shelter" + +/* +* External Hull Access Areas +*/ + +/area/station/maintenance/external + name = "\improper External Hull Access" + icon_state = "amaint" + +/area/station/maintenance/external/aft + name = "\improper Aft External Hull Access" + +/area/station/maintenance/external/port + name = "\improper Port External Hull Access" + +/area/station/maintenance/external/port/bow + name = "\improper Port Bow External Hull Access" + +/* +* Station Specific Areas +* If another station gets added, and you make specific areas for it +* Please make its own section in this file +* The areas below belong to North Star's Maintenance +*/ + +//1 +/area/station/maintenance/floor1 + name = "\improper 1st Floor Maint" + +/area/station/maintenance/floor1/port + name = "\improper 1st Floor Central Port Maint" + icon_state = "maintcentral" + +/area/station/maintenance/floor1/port/fore + name = "\improper 1st Floor Fore Port Maint" + icon_state = "maintfore" +/area/station/maintenance/floor1/port/aft + name = "\improper 1st Floor Aft Port Maint" + icon_state = "maintaft" + +/area/station/maintenance/floor1/starboard + name = "\improper 1st Floor Central Starboard Maint" + icon_state = "maintcentral" + +/area/station/maintenance/floor1/starboard/fore + name = "\improper 1st Floor Fore Starboard Maint" + icon_state = "maintfore" + +/area/station/maintenance/floor1/starboard/aft + name = "\improper 1st Floor Aft Starboard Maint" + icon_state = "maintaft" +//2 +/area/station/maintenance/floor2 + name = "\improper 2nd Floor Maint" +/area/station/maintenance/floor2/port + name = "\improper 2nd Floor Central Port Maint" + icon_state = "maintcentral" + +/area/station/maintenance/floor2/port/fore + name = "\improper 2nd Floor Fore Port Maint" + icon_state = "maintfore" + +/area/station/maintenance/floor2/port/aft + name = "\improper 2nd Floor Aft Port Maint" + icon_state = "maintaft" + +/area/station/maintenance/floor2/starboard + name = "\improper 2nd Floor Central Starboard Maint" + icon_state = "maintcentral" + +/area/station/maintenance/floor2/starboard/fore + name = "\improper 2nd Floor Fore Starboard Maint" + icon_state = "maintfore" + +/area/station/maintenance/floor2/starboard/aft + name = "\improper 2nd Floor Aft Starboard Maint" + icon_state = "maintaft" +//3 +/area/station/maintenance/floor3 + name = "\improper 3rd Floor Maint" + +/area/station/maintenance/floor3/port + name = "\improper 3rd Floor Central Port Maint" + icon_state = "maintcentral" + +/area/station/maintenance/floor3/port/fore + name = "\improper 3rd Floor Fore Port Maint" + icon_state = "maintfore" + +/area/station/maintenance/floor3/port/aft + name = "\improper 3rd Floor Aft Port Maint" + icon_state = "maintaft" + +/area/station/maintenance/floor3/starboard + name = "\improper 3rd Floor Central Starboard Maint" + icon_state = "maintcentral" + +/area/station/maintenance/floor3/starboard/fore + name = "\improper 3rd Floor Fore Starboard Maint" + icon_state = "maintfore" + +/area/station/maintenance/floor3/starboard/aft + name = "\improper 3rd Floor Aft Starboard Maint" + icon_state = "maintaft" +//4 +/area/station/maintenance/floor4 + name = "\improper 4th Floor Maint" + +/area/station/maintenance/floor4/port + name = "\improper 4th Floor Central Port Maint" + icon_state = "maintcentral" + +/area/station/maintenance/floor4/port/fore + name = "\improper 4th Floor Fore Port Maint" + icon_state = "maintfore" + +/area/station/maintenance/floor4/port/aft + name = "\improper 4th Floor Aft Port Maint" + icon_state = "maintaft" + +/area/station/maintenance/floor4/starboard + name = "\improper 4th Floor Central Starboard Maint" + icon_state = "maintcentral" + +/area/station/maintenance/floor4/starboard/fore + name = "\improper 4th Floor Fore Starboard Maint" + icon_state = "maintfore" + +/area/station/maintenance/floor4/starboard/aft + name = "\improper 4th Floor Aft Starboard Maint" + icon_state = "maintaft" diff --git a/code/game/area/areas/station/medical.dm b/code/game/area/areas/station/medical.dm new file mode 100644 index 00000000000..33d4973f623 --- /dev/null +++ b/code/game/area/areas/station/medical.dm @@ -0,0 +1,125 @@ +/area/station/medical + name = "Medical" + icon_state = "medbay" + ambience_index = AMBIENCE_MEDICAL + airlock_wires = /datum/wires/airlock/medbay + sound_environment = SOUND_AREA_STANDARD_STATION + min_ambience_cooldown = 90 SECONDS + max_ambience_cooldown = 180 SECONDS + +/area/station/medical/abandoned + name = "\improper Abandoned Medbay" + icon_state = "abandoned_medbay" + ambientsounds = list( + 'sound/ambience/signal.ogg', + ) + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/medical/medbay/central + name = "Medbay Central" + icon_state = "med_central" + +/area/station/medical/medbay/lobby + name = "\improper Medbay Lobby" + icon_state = "med_lobby" + +/area/station/medical/medbay/aft + name = "Medbay Aft" + icon_state = "med_aft" + +/area/station/medical/storage + name = "Medbay Storage" + icon_state = "med_storage" + +/area/station/medical/paramedic + name = "Paramedic Dispatch" + icon_state = "paramedic" + +/area/station/medical/office + name = "\improper Medical Office" + icon_state = "med_office" + +/area/station/medical/break_room + name = "\improper Medical Break Room" + icon_state = "med_break" + +/area/station/medical/coldroom + name = "\improper Medical Cold Room" + icon_state = "kitchen_cold" + +/area/station/medical/patients_rooms + name = "\improper Patients' Rooms" + icon_state = "patients" + sound_environment = SOUND_AREA_SMALL_SOFTFLOOR + +/area/station/medical/patients_rooms/room_a + name = "Patient Room A" + icon_state = "patients" + +/area/station/medical/patients_rooms/room_b + name = "Patient Room B" + icon_state = "patients" + +/area/station/medical/virology + name = "Virology" + icon_state = "virology" + ambience_index = AMBIENCE_VIROLOGY + +/area/station/medical/virology/isolation + name = "Virology Isolation" + icon_state = "virology_isolation" + +/area/station/medical/morgue + name = "\improper Morgue" + icon_state = "morgue" + ambience_index = AMBIENCE_SPOOKY + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/medical/chemistry + name = "Chemistry" + icon_state = "chem" + +/area/station/medical/pharmacy + name = "\improper Pharmacy" + icon_state = "pharmacy" + +/area/station/medical/chem_storage + name = "\improper Chemical Storage" + icon_state = "chem_storage" + +/area/station/medical/surgery + name = "\improper Operating Room" + icon_state = "surgery" + +/area/station/medical/surgery/fore + name = "\improper Fore Operating Room" + icon_state = "foresurgery" + +/area/station/medical/surgery/aft + name = "\improper Aft Operating Room" + icon_state = "aftsurgery" + +/area/station/medical/surgery/theatre + name = "\improper Grand Surgery Theatre" + icon_state = "surgerytheatre" + +/area/station/medical/cryo + name = "Cryogenics" + icon_state = "cryo" + +/area/station/medical/exam_room + name = "\improper Exam Room" + icon_state = "exam_room" + +/area/station/medical/treatment_center + name = "\improper Medbay Treatment Center" + icon_state = "exam_room" + +/area/station/medical/psychology + name = "\improper Psychology Office" + icon_state = "psychology" + mood_bonus = 3 + mood_message = "I feel at ease here." + ambientsounds = list( + 'sound/ambience/aurora_caelus_short.ogg', + ) diff --git a/code/game/area/areas/station/misc.dm b/code/game/area/areas/station/misc.dm new file mode 100644 index 00000000000..48d5793b522 --- /dev/null +++ b/code/game/area/areas/station/misc.dm @@ -0,0 +1,33 @@ +/* +* Only put an area here if it wouldn't fit sorting criteria +* If more areas are created of an area in this file, please +* make a new file for it! +*/ + +/* +* This is the ROOT for all station areas +* It keeps the work tree in SDMM nice and pretty :) +*/ +/area/station + name = "Station Areas" + icon = 'icons/area/areas_station.dmi' + icon_state = "station" + +/* +* Tramstation unique areas +*/ + +/area/station/escapepodbay + name = "\improper Pod Bay" + icon_state = "podbay" + +/area/station/asteroid + name = "\improper Station Asteroid" + icon_state = "station_asteroid" + always_unpowered = TRUE + power_environ = FALSE + power_equip = FALSE + power_light = FALSE + requires_power = TRUE + ambience_index = AMBIENCE_MINING + area_flags = UNIQUE_AREA diff --git a/code/game/area/areas/station/science.dm b/code/game/area/areas/station/science.dm new file mode 100644 index 00000000000..fc968699df0 --- /dev/null +++ b/code/game/area/areas/station/science.dm @@ -0,0 +1,125 @@ +/area/station/science + name = "\improper Science Division" + icon_state = "science" + airlock_wires = /datum/wires/airlock/science + sound_environment = SOUND_AREA_STANDARD_STATION + +/area/station/science/lobby + name = "\improper Science Lobby" + icon_state = "science_lobby" + +/area/station/science/lower + name = "\improper Lower Science Division" + icon_state = "lower_science" + +/area/station/science/breakroom + name = "\improper Science Break Room" + icon_state = "science_breakroom" + +/area/station/science/lab + name = "Research and Development" + icon_state = "research" + +/area/station/science/xenobiology + name = "\improper Xenobiology Lab" + icon_state = "xenobio" + +/area/station/science/xenobiology/hallway + name = "\improper Xenobiology Hallway" + icon_state = "xenobio_hall" + +/area/station/science/cytology + name = "\improper Cytology Lab" + icon_state = "cytology" + +/area/station/science/cubicle + name = "\improper Science Cubicles" + icon_state = "science" + sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR + +/area/station/science/genetics + name = "\improper Genetics Lab" + icon_state = "geneticssci" + +/area/station/science/server + name = "\improper Research Division Server Room" + icon_state = "server" + +/area/station/science/circuits + name = "\improper Circuit Lab" + icon_state = "cir_lab" + +/area/station/science/explab + name = "\improper Experimentation Lab" + icon_state = "exp_lab" + +/area/station/science/auxlab + name = "\improper Auxiliary Lab" + icon_state = "aux_lab" + +/area/station/science/auxlab/firing_range + name = "\improper Research Firing Range" + +/area/station/science/robotics + name = "Robotics" + icon_state = "robotics" + +/area/station/science/robotics/mechbay + name = "\improper Mech Bay" + icon_state = "mechbay" + +/area/station/science/robotics/lab + name = "\improper Robotics Lab" + icon_state = "ass_line" + +/area/station/science/robotics/augments + name = "improper Augmentation Theater" + icon_state = "robotics" + sound_environment = SOUND_AREA_TUNNEL_ENCLOSED + +/area/station/science/research + name = "\improper Research Division" + icon_state = "science" + +/area/station/science/research/abandoned + name = "\improper Abandoned Research Lab" + icon_state = "abandoned_sci" + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/* +* Ordnance Areas +*/ + +// Use this for the main lab. If test equipment, storage, etc is also present use this one too. +/area/station/science/ordnance + name = "\improper Ordnance Lab" + icon_state = "ord_main" + +/area/station/science/ordnance/office + name = "\improper Ordnance Office" + icon_state = "ord_office" + +/area/station/science/ordnance/storage + name = "\improper Ordnance Storage" + icon_state = "ord_storage" + +/area/station/science/ordnance/burnchamber + name = "\improper Ordnance Burn Chamber" + icon_state = "ord_burn" + area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED + +/area/station/science/ordnance/freezerchamber + name = "\improper Ordnance Freezer Chamber" + icon_state = "ord_freeze" + area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED + +// Room for equipments and such +/area/station/science/ordnance/testlab + name = "\improper Ordnance Testing Lab" + icon_state = "ord_test" + area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED + +/area/station/science/ordnance/bomb + name = "\improper Ordnance Bomb Site" + icon_state = "ord_boom" + area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED diff --git a/code/game/area/areas/station/security.dm b/code/game/area/areas/station/security.dm new file mode 100644 index 00000000000..918cf30ceb8 --- /dev/null +++ b/code/game/area/areas/station/security.dm @@ -0,0 +1,225 @@ +// When adding a new area to the security areas, make sure to add it to /datum/bounty/item/security/paperwork as well! + +/area/station/security + name = "Security" + icon_state = "security" + ambience_index = AMBIENCE_DANGER + airlock_wires = /datum/wires/airlock/security + sound_environment = SOUND_AREA_STANDARD_STATION + +/area/station/security/office + name = "\improper Security Office" + icon_state = "security" + +/area/station/security/breakroom + name = "\improper Security Break Room" + icon_state = "brig" + +/area/station/security/tram + name = "\improper Security Transfer Tram" + icon_state = "security" + +/area/station/security/lockers + name = "\improper Security Locker Room" + icon_state = "securitylockerroom" + +/area/station/security/brig + name = "\improper Brig" + icon_state = "brig" + +/area/station/security/holding_cell + name = "\improper Holding Cell" + icon_state = "holding_cell" + +/area/station/security/medical + name = "\improper Security Medical" + icon_state = "security_medical" + +/area/station/security/brig/upper + name = "\improper Brig Overlook" + icon_state = "upperbrig" + +/area/station/security/brig/entrance + name = "\improper Brig Entrance" + icon_state = "brigentry" + +/area/station/security/courtroom + name = "\improper Courtroom" + icon_state = "courtroom" + sound_environment = SOUND_AREA_LARGE_ENCLOSED + +/area/station/security/courtroom/holding + name = "\improper Courtroom Prisoner Holding Room" + +/area/station/security/processing + name = "\improper Labor Shuttle Dock" + icon_state = "sec_labor_processing" + +/area/station/security/processing/cremation + name = "\improper Security Crematorium" + icon_state = "sec_cremation" + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/security/interrogation + name = "\improper Interrogation Room" + icon_state = "interrogation" + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/security/warden + name = "Brig Control" + icon_state = "warden" + sound_environment = SOUND_AREA_SMALL_SOFTFLOOR + +/area/station/security/evidence + name = "Evidence Storage" + icon_state = "evidence" + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/security/detectives_office + name = "\improper Detective's Office" + icon_state = "detective" + ambientsounds = list( + 'sound/ambience/ambidet1.ogg', + 'sound/ambience/ambidet2.ogg', + ) + +/area/station/security/detectives_office/private_investigators_office + name = "\improper Private Investigator's Office" + icon_state = "investigate_office" + sound_environment = SOUND_AREA_SMALL_SOFTFLOOR + +/area/station/security/range + name = "\improper Firing Range" + icon_state = "firingrange" + +/area/station/security/eva + name = "\improper Security EVA" + icon_state = "sec_eva" + +/area/station/security/execution + icon_state = "execution_room" + +/area/station/security/execution/transfer + name = "\improper Transfer Centre" + icon_state = "sec_processing" + +/area/station/security/execution/education + name = "\improper Prisoner Education Chamber" + +/* +* Security Checkpoints +*/ + +/area/station/security/checkpoint + name = "\improper Security Checkpoint" + icon_state = "checkpoint" + +/area/station/security/checkpoint/escape + name = "\improper Departures Security Checkpoint" + icon_state = "checkpoint_esc" + +/area/station/security/checkpoint/arrivals + name = "\improper Arrivals Security Checkpoint" + icon_state = "checkpoint_arr" + +/area/station/security/checkpoint/supply + name = "Security Post - Cargo Bay" + icon_state = "checkpoint_supp" + +/area/station/security/checkpoint/engineering + name = "Security Post - Engineering" + icon_state = "checkpoint_engi" + +/area/station/security/checkpoint/medical + name = "Security Post - Medbay" + icon_state = "checkpoint_med" + +/area/station/security/checkpoint/medical/medsci + name = "Security Post - Medsci" + +/area/station/security/checkpoint/science + name = "Security Post - Science" + icon_state = "checkpoint_sci" + +/area/station/security/checkpoint/science/research + name = "Security Post - Research Division" + icon_state = "checkpoint_res" + +/area/station/security/checkpoint/customs + name = "Customs" + icon_state = "customs_point" + +/area/station/security/checkpoint/customs/auxiliary + name = "Auxiliary Customs" + icon_state = "customs_point_aux" + +/area/station/security/checkpoint/customs/fore + name = "Fore Customs" + icon_state = "customs_point_fore" + +/area/station/security/checkpoint/customs/aft + name = "Aft Customs" + icon_state = "customs_point_aft" + +/area/station/security/checkpoint/first + name = "Security Post - First Floor" + icon_state = "checkpoint_1" + +/area/station/security/checkpoint/second + name = "Security Post - Second Floor" + icon_state = "checkpoint_2" + +/area/station/security/checkpoint/third + name = "Security Post - Third Floor" + icon_state = "checkpoint_3" + +/* +* Prison Areas +*/ + +/area/station/security/prison + name = "\improper Prison Wing" + icon_state = "sec_prison" + area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED | PERSISTENT_ENGRAVINGS + +//Rad proof +/area/station/security/prison/toilet + name = "\improper Prison Toilet" + icon_state = "sec_prison_safe" + +// Rad proof +/area/station/security/prison/safe + name = "\improper Prison Wing Cells" + icon_state = "sec_prison_safe" + +/area/station/security/prison/upper + name = "\improper Upper Prison Wing" + icon_state = "prison_upper" + +/area/station/security/prison/visit + name = "\improper Prison Visitation Area" + icon_state = "prison_visit" + +/area/station/security/prison/rec + name = "\improper Prison Rec Room" + icon_state = "prison_rec" + +/area/station/security/prison/mess + name = "\improper Prison Mess Hall" + icon_state = "prison_mess" + +/area/station/security/prison/work + name = "\improper Prison Work Room" + icon_state = "prison_work" + +/area/station/security/prison/shower + name = "\improper Prison Shower" + icon_state = "prison_shower" + +/area/station/security/prison/workout + name = "\improper Prison Gym" + icon_state = "prison_workout" + +/area/station/security/prison/garden + name = "\improper Prison Garden" + icon_state = "prison_garden" diff --git a/code/game/area/areas/station/service.dm b/code/game/area/areas/station/service.dm new file mode 100644 index 00000000000..6d3054f934f --- /dev/null +++ b/code/game/area/areas/station/service.dm @@ -0,0 +1,212 @@ +/area/station/service + airlock_wires = /datum/wires/airlock/service + +/* +* Bar/Kitchen Areas +*/ + +/area/station/service/cafeteria + name = "\improper Cafeteria" + icon_state = "cafeteria" + +/area/station/service/kitchen + name = "\improper Kitchen" + icon_state = "kitchen" + +/area/station/service/kitchen/coldroom + name = "\improper Kitchen Cold Room" + icon_state = "kitchen_cold" + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/service/kitchen/diner + name = "\improper Diner" + icon_state = "diner" + +/area/station/service/kitchen/kitchen_backroom + name = "\improper Kitchen Backroom" + icon_state = "kitchen_backroom" + +/area/station/service/bar + name = "\improper Bar" + icon_state = "bar" + mood_bonus = 5 + mood_message = "I love being in the bar!" + mood_trait = TRAIT_EXTROVERT + airlock_wires = /datum/wires/airlock/service + sound_environment = SOUND_AREA_WOODFLOOR + +/area/station/service/bar/Initialize(mapload) + . = ..() + GLOB.bar_areas += src + +/area/station/service/bar/atrium + name = "\improper Atrium" + icon_state = "bar" + sound_environment = SOUND_AREA_WOODFLOOR + +/area/station/service/bar/backroom + name = "\improper Bar Backroom" + icon_state = "bar_backroom" + +/* +* Entertainment/Library Areas +*/ + +/area/station/service/theater + name = "\improper Theater" + icon_state = "theatre" + sound_environment = SOUND_AREA_WOODFLOOR + +/area/station/service/greenroom + name = "\improper Greenroom" + icon_state = "theatre" + sound_environment = SOUND_AREA_SMALL_SOFTFLOOR + +/area/station/service/library + name = "\improper Library" + icon_state = "library" + mood_bonus = 5 + mood_message = "I love being in the library!" + mood_trait = TRAIT_INTROVERT + area_flags = CULT_PERMITTED | BLOBS_ALLOWED | UNIQUE_AREA + sound_environment = SOUND_AREA_LARGE_SOFTFLOOR + +/area/station/service/library/garden + name = "\improper Library Garden" + icon_state = "library_garden" + +/area/station/service/library/lounge + name = "\improper Library Lounge" + icon_state = "library_lounge" + sound_environment = SOUND_AREA_SMALL_SOFTFLOOR + +/area/station/service/library/artgallery + name = "\improper Art Gallery" + icon_state = "library_gallery" + +/area/station/service/library/private + name = "\improper Library Private Study" + icon_state = "library_gallery_private" + +/area/station/service/library/upper + name = "\improper Library Upper Floor" + icon_state = "library" + +/area/station/service/library/printer + name = "\improper Library Printer Room" + icon_state = "library" + +/* +* Chapel/Pubby Monestary Areas +*/ + +/area/station/service/chapel + name = "\improper Chapel" + icon_state = "chapel" + mood_bonus = 5 + mood_message = "Being in the chapel brings me peace." + mood_trait = TRAIT_SPIRITUAL + ambience_index = AMBIENCE_HOLY + flags_1 = NONE + sound_environment = SOUND_AREA_LARGE_ENCLOSED + +/area/station/service/chapel/monastery + name = "\improper Monastery" + +/area/station/service/chapel/office + name = "\improper Chapel Office" + icon_state = "chapeloffice" + +/area/station/service/chapel/asteroid + name = "\improper Chapel Asteroid" + icon_state = "explored" + sound_environment = SOUND_AREA_ASTEROID + +/area/station/service/chapel/asteroid/monastery + name = "\improper Monastery Asteroid" + +/area/station/service/chapel/dock + name = "\improper Chapel Dock" + icon_state = "construction" + +/area/station/service/chapel/storage + name = "\improper Chapel Storage" + icon_state = "chapelstorage" + +/area/station/service/chapel/funeral + name = "\improper Chapel Funeral Room" + icon_state = "chapelfuneral" + +/area/station/service/hydroponics/garden/monastery + name = "\improper Monastery Garden" + icon_state = "hydro" + +/* +* Hydroponics/Garden Areas +*/ + +/area/station/service/hydroponics + name = "Hydroponics" + icon_state = "hydro" + airlock_wires = /datum/wires/airlock/service + sound_environment = SOUND_AREA_STANDARD_STATION + +/area/station/service/hydroponics/upper + name = "Upper Hydroponics" + icon_state = "hydro" + +/area/station/service/hydroponics/garden + name = "Garden" + icon_state = "garden" + +/* +* Misc/Unsorted Rooms +*/ + +/area/station/service/lawoffice + name = "\improper Law Office" + icon_state = "law" + sound_environment = SOUND_AREA_SMALL_SOFTFLOOR + +/area/station/service/janitor + name = "\improper Custodial Closet" + icon_state = "janitor" + area_flags = CULT_PERMITTED | BLOBS_ALLOWED | UNIQUE_AREA + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/service/barber + name = "\improper Barber" + icon_state = "barber" + +/* +* Abandoned Rooms +*/ + +/area/station/service/hydroponics/garden/abandoned + name = "\improper Abandoned Garden" + icon_state = "abandoned_garden" + sound_environment = SOUND_AREA_SMALL_ENCLOSED + +/area/station/service/kitchen/abandoned + name = "\improper Abandoned Kitchen" + icon_state = "abandoned_kitchen" + +/area/station/service/electronic_marketing_den + name = "\improper Electronic Marketing Den" + icon_state = "abandoned_marketing_den" + +/area/station/service/abandoned_gambling_den + name = "\improper Abandoned Gambling Den" + icon_state = "abandoned_gambling_den" + +/area/station/service/abandoned_gambling_den/gaming + name = "\improper Abandoned Gaming Den" + icon_state = "abandoned_gaming_den" + +/area/station/service/theater/abandoned + name = "\improper Abandoned Theater" + icon_state = "abandoned_theatre" + +/area/station/service/library/abandoned + name = "\improper Abandoned Library" + icon_state = "abandoned_library" diff --git a/code/game/area/areas/station/solars.dm b/code/game/area/areas/station/solars.dm new file mode 100644 index 00000000000..234e020e8d4 --- /dev/null +++ b/code/game/area/areas/station/solars.dm @@ -0,0 +1,92 @@ +/* +* External Solar Areas +*/ + +/area/station/solars + icon_state = "panels" + requires_power = FALSE + area_flags = UNIQUE_AREA | AREA_USES_STARLIGHT + flags_1 = NONE + ambience_index = AMBIENCE_ENGI + airlock_wires = /datum/wires/airlock/engineering + sound_environment = SOUND_AREA_SPACE + +/area/station/solars/fore + name = "\improper Fore Solar Array" + icon_state = "panelsF" + sound_environment = SOUND_AREA_STANDARD_STATION + +/area/station/solars/aft + name = "\improper Aft Solar Array" + icon_state = "panelsAF" + +/area/station/solars/aux/port + name = "\improper Port Bow Auxiliary Solar Array" + icon_state = "panelsA" + +/area/station/solars/aux/starboard + name = "\improper Starboard Bow Auxiliary Solar Array" + icon_state = "panelsA" + +/area/station/solars/starboard + name = "\improper Starboard Solar Array" + icon_state = "panelsS" + +/area/station/solars/starboard/aft + name = "\improper Starboard Quarter Solar Array" + icon_state = "panelsAS" + +/area/station/solars/starboard/fore + name = "\improper Starboard Bow Solar Array" + icon_state = "panelsFS" + +/area/station/solars/port + name = "\improper Port Solar Array" + icon_state = "panelsP" + +/area/station/solars/port/aft + name = "\improper Port Quarter Solar Array" + icon_state = "panelsAP" + +/area/station/solars/port/fore + name = "\improper Port Bow Solar Array" + icon_state = "panelsFP" + +/area/station/solars/aisat + name = "\improper AI Satellite Solars" + icon_state = "panelsAI" + + +/* +* Internal Solar Areas +* The rooms where the SMES and computer are +* Not in the maintenance file just so we can keep these organized with other the external solar areas +*/ + +/area/station/maintenance/solars + name = "Solar Maintenance" + icon_state = "yellow" + +/area/station/maintenance/solars/port + name = "Port Solar Maintenance" + icon_state = "SolarcontrolP" + +/area/station/maintenance/solars/port/aft + name = "Port Quarter Solar Maintenance" + icon_state = "SolarcontrolAP" + +/area/station/maintenance/solars/port/fore + name = "Port Bow Solar Maintenance" + icon_state = "SolarcontrolFP" + +/area/station/maintenance/solars/starboard + name = "Starboard Solar Maintenance" + icon_state = "SolarcontrolS" + +/area/station/maintenance/solars/starboard/aft + name = "Starboard Quarter Solar Maintenance" + icon_state = "SolarcontrolAS" + +/area/station/maintenance/solars/starboard/fore + name = "Starboard Bow Solar Maintenance" + icon_state = "SolarcontrolFS" diff --git a/code/game/area/areas/station/telecomm.dm b/code/game/area/areas/station/telecomm.dm new file mode 100644 index 00000000000..78ec16a59bf --- /dev/null +++ b/code/game/area/areas/station/telecomm.dm @@ -0,0 +1,43 @@ +/* +* Telecommunications Satellite Areas +*/ + +/area/station/tcommsat + icon_state = "tcomsatcham" + ambientsounds = list( + 'sound/ambience/ambisin2.ogg', + 'sound/ambience/signal.ogg', + 'sound/ambience/signal.ogg', + 'sound/ambience/ambigen9.ogg', + 'sound/ambience/ambitech.ogg', + 'sound/ambience/ambitech2.ogg', + 'sound/ambience/ambitech3.ogg', + 'sound/ambience/ambimystery.ogg', + ) + airlock_wires = /datum/wires/airlock/engineering + +/area/station/tcommsat/computer + name = "\improper Telecomms Control Room" + icon_state = "tcomsatcomp" + sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR + +/area/station/tcommsat/server + name = "\improper Telecomms Server Room" + icon_state = "tcomsatcham" + +/area/station/tcommsat/server/upper + name = "\improper Upper Telecomms Server Room" + +/* +* On-Station Telecommunications Areas +*/ + +/area/station/comms + name = "\improper Communications Relay" + icon_state = "tcomsatcham" + sound_environment = SOUND_AREA_STANDARD_STATION + +/area/station/server + name = "\improper Messaging Server Room" + icon_state = "server" + sound_environment = SOUND_AREA_STANDARD_STATION diff --git a/code/game/area/space_station_13_areas.dm b/code/game/area/space_station_13_areas.dm deleted file mode 100644 index ebf316ea57d..00000000000 --- a/code/game/area/space_station_13_areas.dm +++ /dev/null @@ -1,18 +0,0 @@ -/* - -### This file contains a list of all the areas in your station. Format is as follows: - -/area/CATEGORY/OR/DESCRIPTOR/NAME (you can make as many subdivisions as you want) - name = "NICE NAME" (not required but makes things really nice) - icon = 'ICON FILENAME' (defaults to 'icons/area_misc.dmi') - icon_state = "NAME OF ICON" (defaults to "unknown" (blank)) - requires_power = FALSE (defaults to true) - ambience_index = AMBIENCE_GENERIC (picks the ambience from an assoc list in ambience.dm) - ambientsounds = list() (defaults to ambience_index's assoc on Initialize(). override it as "ambientsounds = list('sound/ambience/signal.ogg')" or by changing ambience_index) - -NOTE: there are two lists of areas in the end of this file: centcom and station itself. Please maintain these lists valid. --rastaf0 - -*/ - - -/*-----------------------------------------------------------------------------*/ diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 3c3d345dd6b..2e0352a05fa 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -203,81 +203,6 @@ //we were deleted return -/** - * The primary method that objects are setup in SS13 with - * - * we don't use New as we have better control over when this is called and we can choose - * to delay calls or hook other logic in and so forth - * - * During roundstart map parsing, atoms are queued for intialization in the base atom/New(), - * After the map has loaded, then Initalize is called on all atoms one by one. NB: this - * is also true for loading map templates as well, so they don't Initalize until all objects - * in the map file are parsed and present in the world - * - * If you're creating an object at any point after SSInit has run then this proc will be - * immediately be called from New. - * - * mapload: This parameter is true if the atom being loaded is either being intialized during - * the Atom subsystem intialization, or if the atom is being loaded from the map template. - * If the item is being created at runtime any time after the Atom subsystem is intialized then - * it's false. - * - * The mapload argument occupies the same position as loc when Initialize() is called by New(). - * loc will no longer be needed after it passed New(), and thus it is being overwritten - * with mapload at the end of atom/New() before this proc (atom/Initialize()) is called. - * - * You must always call the parent of this proc, otherwise failures will occur as the item - * will not be seen as initalized (this can lead to all sorts of strange behaviour, like - * the item being completely unclickable) - * - * You must not sleep in this proc, or any subprocs - * - * Any parameters from new are passed through (excluding loc), naturally if you're loading from a map - * there are no other arguments - * - * Must return an [initialization hint][INITIALIZE_HINT_NORMAL] or a runtime will occur. - * - * Note: the following functions don't call the base for optimization and must copypasta handling: - * * [/turf/proc/Initialize] - * * [/turf/open/space/proc/Initialize] - */ -/atom/proc/Initialize(mapload, ...) - SHOULD_NOT_SLEEP(TRUE) - SHOULD_CALL_PARENT(TRUE) - - if(flags_1 & INITIALIZED_1) - stack_trace("Warning: [src]([type]) initialized multiple times!") - flags_1 |= INITIALIZED_1 - - SET_PLANE_IMPLICIT(src, plane) - - if(greyscale_config && greyscale_colors) //we'll check again at item/init for inhand/belt/worn configs. - update_greyscale() - - //atom color stuff - if(color) - add_atom_colour(color, FIXED_COLOUR_PRIORITY) - - if (light_system == STATIC_LIGHT && light_power && light_range) - update_light() - - SETUP_SMOOTHING() - - if(uses_integrity) - atom_integrity = max_integrity - TEST_ONLY_ASSERT((!armor || istype(armor)), "[type] has an armor that contains an invalid value at intialize") - - // apply materials properly from the default custom_materials value - // This MUST come after atom_integrity is set above, as if old materials get removed, - // atom_integrity is checked against max_integrity and can BREAK the atom. - // The integrity to max_integrity ratio is still preserved. - set_custom_materials(custom_materials) - - if(ispath(ai_controller)) - ai_controller = new ai_controller(src) - - return INITIALIZE_HINT_NORMAL - /** * Late Intialization, for code that should run after all atoms have run Intialization * @@ -1145,14 +1070,6 @@ /atom/proc/get_dumping_location() return null -/** - * This proc is called when an atom in our contents has it's [Destroy][/atom/proc/Destroy] called - * - * Default behaviour is to simply send [COMSIG_ATOM_CONTENTS_DEL] - */ -/atom/proc/handle_atom_del(atom/deleting_atom) - SEND_SIGNAL(src, COMSIG_ATOM_CONTENTS_DEL, deleting_atom) - /** * the vision impairment to give to the mob whose perspective is set to that atom * @@ -1381,6 +1298,7 @@ VV_DROPDOWN_OPTION(VV_HK_TRIGGER_EXPLOSION, "Explosion") VV_DROPDOWN_OPTION(VV_HK_EDIT_FILTERS, "Edit Filters") VV_DROPDOWN_OPTION(VV_HK_EDIT_COLOR_MATRIX, "Edit Color as Matrix") + VV_DROPDOWN_OPTION(VV_HK_TEST_MATRIXES, "Test Matrices") VV_DROPDOWN_OPTION(VV_HK_ADD_AI, "Add AI controller") VV_DROPDOWN_OPTION(VV_HK_ARMOR_MOD, "Modify Armor") if(greyscale_colors) @@ -1464,7 +1382,7 @@ ai_controller = new result(src) if(href_list[VV_HK_MODIFY_TRANSFORM] && check_rights(R_VAREDIT)) - var/result = input(usr, "Choose the transformation to apply","Transform Mod") as null|anything in list("Scale","Translate","Rotate") + var/result = input(usr, "Choose the transformation to apply","Transform Mod") as null|anything in list("Scale","Translate","Rotate","Shear") var/matrix/M = transform if(!result) return @@ -1481,6 +1399,12 @@ if(isnull(x) || isnull(y)) return transform = M.Translate(x,y) + if("Shear") + var/x = input(usr, "Choose x mod","Transform Mod") as null|num + var/y = input(usr, "Choose y mod","Transform Mod") as null|num + if(isnull(x) || isnull(y)) + return + transform = M.Shear(x,y) if("Rotate") var/angle = input(usr, "Choose angle to rotate","Transform Mod") as null|num if(isnull(angle)) @@ -1523,12 +1447,13 @@ vv_auto_rename(newname) if(href_list[VV_HK_EDIT_FILTERS] && check_rights(R_VAREDIT)) - var/client/C = usr.client - C?.open_filter_editor(src) + usr.client?.open_filter_editor(src) if(href_list[VV_HK_EDIT_COLOR_MATRIX] && check_rights(R_VAREDIT)) - var/client/C = usr.client - C?.open_color_matrix_editor(src) + usr.client?.open_color_matrix_editor(src) + + if(href_list[VV_HK_TEST_MATRIXES] && check_rights(R_VAREDIT)) + usr.client?.open_matrix_tester(src) /atom/vv_get_header() . = ..() @@ -1668,18 +1593,19 @@ if(process_item.use_tool(src, user, processing_time, volume=50)) var/atom/atom_to_create = chosen_option[TOOL_PROCESSING_RESULT] var/list/atom/created_atoms = list() - for(var/i = 1 to chosen_option[TOOL_PROCESSING_AMOUNT]) + var/amount_to_create = chosen_option[TOOL_PROCESSING_AMOUNT] + for(var/i = 1 to amount_to_create) var/atom/created_atom = new atom_to_create(drop_location()) if(custom_materials) - created_atom.set_custom_materials(custom_materials, 1 / chosen_option[TOOL_PROCESSING_AMOUNT]) + created_atom.set_custom_materials(custom_materials, 1 / amount_to_create) created_atom.pixel_x = pixel_x created_atom.pixel_y = pixel_y if(i > 1) created_atom.pixel_x += rand(-8,8) created_atom.pixel_y += rand(-8,8) created_atom.OnCreatedFromProcessing(user, process_item, chosen_option, src) - to_chat(user, span_notice("You manage to create [chosen_option[TOOL_PROCESSING_AMOUNT]] [initial(atom_to_create.gender) == PLURAL ? "[initial(atom_to_create.name)]" : "[initial(atom_to_create.name)][plural_s(initial(atom_to_create.name))]"] from [src].")) created_atoms.Add(created_atom) + to_chat(user, span_notice("You manage to create [amount_to_create] [initial(atom_to_create.gender) == PLURAL ? "[initial(atom_to_create.name)]" : "[initial(atom_to_create.name)][plural_s(initial(atom_to_create.name))]"] from [src].")) SEND_SIGNAL(src, COMSIG_ATOM_PROCESSED, user, process_item, created_atoms) UsedforProcessing(user, process_item, chosen_option) return @@ -1714,7 +1640,7 @@ /atom/proc/multitool_act_secondary(mob/living/user, obj/item/tool) return -///Check if the multitool has an item in it's data buffer +///Check if an item supports a data buffer (is a multitool) /atom/proc/multitool_check_buffer(user, obj/item/multitool, silent = FALSE) if(!istype(multitool, /obj/item/multitool)) if(user && !silent) @@ -2213,16 +2139,18 @@ // Now we're gonna do a scanline effect // Gonna take this atom and give it a render target, then use it as a source for a filter // (We use an atom because it seems as if setting render_target on an MA is just invalid. I hate this engine) - var/static/atom/movable/scanline - if(!scanline) - scanline = new(null) - scanline.icon = 'icons/effects/effects.dmi' - scanline.icon_state = "scanline" - // * so it doesn't render - scanline.render_target = "*HoloScanline" + var/atom/movable/scanline = new(null) + scanline.icon = 'icons/effects/effects.dmi' + scanline.icon_state = "scanline" + scanline.appearance_flags |= RESET_TRANSFORM + // * so it doesn't render + var/static/uid_scan = 0 + scanline.render_target = "*HoloScanline [uid_scan]" + uid_scan++ // Now we add it as a filter, and overlay the appearance so the render source is always around add_filter("HOLO: Scanline", 2, alpha_mask_filter(render_source = scanline.render_target)) add_overlay(scanline) + qdel(scanline) // Annd let's make the sucker emissive, so it glows in the dark if(!render_target) var/static/uid = 0 diff --git a/code/game/atoms_initializing_EXPENSIVE.dm b/code/game/atoms_initializing_EXPENSIVE.dm new file mode 100644 index 00000000000..ae729ad1f48 --- /dev/null +++ b/code/game/atoms_initializing_EXPENSIVE.dm @@ -0,0 +1,131 @@ +/// Init this specific atom +/datum/controller/subsystem/atoms/proc/InitAtom(atom/A, from_template = FALSE, list/arguments) + var/the_type = A.type + + if(QDELING(A)) + // Check init_start_time to not worry about atoms created before the atoms SS that are cleaned up before this + if (A.gc_destroyed > init_start_time) + BadInitializeCalls[the_type] |= BAD_INIT_QDEL_BEFORE + return TRUE + + // This is handled and battle tested by dreamchecker. Limit to UNIT_TESTS just in case that ever fails. + #ifdef UNIT_TESTS + var/start_tick = world.time + #endif + + var/result = A.Initialize(arglist(arguments)) + + #ifdef UNIT_TESTS + if(start_tick != world.time) + BadInitializeCalls[the_type] |= BAD_INIT_SLEPT + #endif + + var/qdeleted = FALSE + + switch(result) + if (INITIALIZE_HINT_NORMAL) + // pass + if(INITIALIZE_HINT_LATELOAD) + if(arguments[1]) //mapload + late_loaders += A + else + A.LateInitialize() + if(INITIALIZE_HINT_QDEL) + qdel(A) + qdeleted = TRUE + else + BadInitializeCalls[the_type] |= BAD_INIT_NO_HINT + + if(!A) //possible harddel + qdeleted = TRUE + else if(!(A.flags_1 & INITIALIZED_1)) + BadInitializeCalls[the_type] |= BAD_INIT_DIDNT_INIT + else + SEND_SIGNAL(A, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE) + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_ATOM_AFTER_POST_INIT, A) + var/atom/location = A.loc + if(location) + /// Sends a signal that the new atom `src`, has been created at `loc` + SEND_SIGNAL(location, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, A, arguments[1]) + var/area/atom_area = get_area(location) + if(atom_area) + SEND_SIGNAL(atom_area, COMSIG_AREA_INITIALIZED_IN, A) + if(created_atoms && from_template && ispath(the_type, /atom/movable))//we only want to populate the list with movables + created_atoms += A.get_all_contents() + + return qdeleted || QDELING(A) + +/** + * The primary method that objects are setup in SS13 with + * + * we don't use New as we have better control over when this is called and we can choose + * to delay calls or hook other logic in and so forth + * + * During roundstart map parsing, atoms are queued for intialization in the base atom/New(), + * After the map has loaded, then Initalize is called on all atoms one by one. NB: this + * is also true for loading map templates as well, so they don't Initalize until all objects + * in the map file are parsed and present in the world + * + * If you're creating an object at any point after SSInit has run then this proc will be + * immediately be called from New. + * + * mapload: This parameter is true if the atom being loaded is either being intialized during + * the Atom subsystem intialization, or if the atom is being loaded from the map template. + * If the item is being created at runtime any time after the Atom subsystem is intialized then + * it's false. + * + * The mapload argument occupies the same position as loc when Initialize() is called by New(). + * loc will no longer be needed after it passed New(), and thus it is being overwritten + * with mapload at the end of atom/New() before this proc (atom/Initialize()) is called. + * + * You must always call the parent of this proc, otherwise failures will occur as the item + * will not be seen as initalized (this can lead to all sorts of strange behaviour, like + * the item being completely unclickable) + * + * You must not sleep in this proc, or any subprocs + * + * Any parameters from new are passed through (excluding loc), naturally if you're loading from a map + * there are no other arguments + * + * Must return an [initialization hint][INITIALIZE_HINT_NORMAL] or a runtime will occur. + * + * Note: the following functions don't call the base for optimization and must copypasta handling: + * * [/turf/proc/Initialize] + * * [/turf/open/space/proc/Initialize] + */ +/atom/proc/Initialize(mapload, ...) + SHOULD_NOT_SLEEP(TRUE) + SHOULD_CALL_PARENT(TRUE) + + if(flags_1 & INITIALIZED_1) + stack_trace("Warning: [src]([type]) initialized multiple times!") + flags_1 |= INITIALIZED_1 + + SET_PLANE_IMPLICIT(src, plane) + + if(greyscale_config && greyscale_colors) //we'll check again at item/init for inhand/belt/worn configs. + update_greyscale() + + //atom color stuff + if(color) + add_atom_colour(color, FIXED_COLOUR_PRIORITY) + + if (light_system == STATIC_LIGHT && light_power && light_range) + update_light() + + SETUP_SMOOTHING() + + if(uses_integrity) + atom_integrity = max_integrity + TEST_ONLY_ASSERT((!armor || istype(armor)), "[type] has an armor that contains an invalid value at intialize") + + // apply materials properly from the default custom_materials value + // This MUST come after atom_integrity is set above, as if old materials get removed, + // atom_integrity is checked against max_integrity and can BREAK the atom. + // The integrity to max_integrity ratio is still preserved. + set_custom_materials(custom_materials) + + if(ispath(ai_controller)) + ai_controller = new ai_controller(src) + + return INITIALIZE_HINT_NORMAL diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 35892d79367..41172ff552d 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -197,7 +197,6 @@ if(((can_atmos_pass == ATMOS_PASS_DENSITY && density) || can_atmos_pass == ATMOS_PASS_NO) && isturf(loc)) can_atmos_pass = ATMOS_PASS_YES air_update_turf(TRUE, FALSE) - loc.handle_atom_del(src) if(opacity) RemoveElement(/datum/element/light_blocking) diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm index ca85ecfb459..1c394eaef5d 100644 --- a/code/game/gamemodes/dynamic/dynamic.dm +++ b/code/game/gamemodes/dynamic/dynamic.dm @@ -139,7 +139,7 @@ GLOBAL_LIST_EMPTY(dynamic_station_traits) /// What is the higher bound of when the roundstart annoucement is sent out? var/waittime_h = 1800 - /// Maximum amount of threat allowed to generate. + /// A number between 0 and 100. The maximum amount of threat allowed to generate. var/max_threat_level = 100 /// The extra chance multiplier that a heavy impact midround ruleset will run next time. @@ -202,7 +202,7 @@ GLOBAL_LIST_EMPTY(dynamic_station_traits) dat += "
" dat += "Parameters: centre = [threat_curve_centre] ; width = [threat_curve_width].
" dat += "Split parameters: centre = [roundstart_split_curve_centre] ; width = [roundstart_split_curve_width].
" - dat += "On average, [peaceful_percentage]% of the rounds are more peaceful.
" + dat += "On average, [clamp(peaceful_percentage, 1, 99)]% of the rounds are more peaceful.
" dat += "Forced extended: [GLOB.dynamic_forced_extended ? "On" : "Off"]
" dat += "No stacking (only one round-ender): [GLOB.dynamic_no_stacking ? "On" : "Off"]
" dat += "Stacking limit: [GLOB.dynamic_stacking_limit] \[Adjust\]" @@ -395,8 +395,7 @@ GLOBAL_LIST_EMPTY(dynamic_station_traits) /// Generates the threat level using lorentz distribution and assigns peaceful_percentage. /datum/game_mode/dynamic/proc/generate_threat() - var/relative_threat = LORENTZ_DISTRIBUTION(threat_curve_centre, threat_curve_width) - threat_level = clamp(round(lorentz_to_amount(relative_threat), 0.1), 0, max_threat_level) + threat_level = lorentz_to_amount(threat_curve_centre, threat_curve_width, max_threat_level) for(var/datum/station_trait/station_trait in GLOB.dynamic_station_traits) threat_level = max(threat_level - GLOB.dynamic_station_traits[station_trait], 0) @@ -405,12 +404,11 @@ GLOBAL_LIST_EMPTY(dynamic_station_traits) if (SSticker.totalPlayersReady < low_pop_player_threshold) threat_level = min(threat_level, LERP(low_pop_maximum_threat, max_threat_level, SSticker.totalPlayersReady / low_pop_player_threshold)) - peaceful_percentage = round(LORENTZ_CUMULATIVE_DISTRIBUTION(relative_threat, threat_curve_centre, threat_curve_width), 0.01)*100 + peaceful_percentage = (threat_level/max_threat_level)*100 /// Generates the midround and roundstart budgets /datum/game_mode/dynamic/proc/generate_budgets() - var/relative_round_start_budget_scale = LORENTZ_DISTRIBUTION(roundstart_split_curve_centre, roundstart_split_curve_width) - round_start_budget = round((lorentz_to_amount(relative_round_start_budget_scale) / 100) * threat_level, 0.1) + round_start_budget = lorentz_to_amount(roundstart_split_curve_centre, roundstart_split_curve_width, threat_level, 0.1) initial_round_start_budget = round_start_budget mid_round_budget = threat_level - round_start_budget @@ -852,30 +850,24 @@ GLOBAL_LIST_EMPTY(dynamic_station_traits) if (!isnull(threat_log)) log_threat(-cost, threat_log, reason) -/// Turns the value generated by lorentz distribution to number between 0 and 100. -/// Used for threat level and splitting the budgets. -/datum/game_mode/dynamic/proc/lorentz_to_amount(x) - switch (x) - if (-INFINITY to -20) - return rand(0, 10) - if (-20 to -10) - return RULE_OF_THREE(-40, -20, x) + 50 - if (-10 to -5) - return RULE_OF_THREE(-30, -10, x) + 50 - if (-5 to -2.5) - return RULE_OF_THREE(-20, -5, x) + 50 - if (-2.5 to -0) - return RULE_OF_THREE(-10, -2.5, x) + 50 - if (0 to 2.5) - return RULE_OF_THREE(10, 2.5, x) + 50 - if (2.5 to 5) - return RULE_OF_THREE(20, 5, x) + 50 - if (5 to 10) - return RULE_OF_THREE(30, 10, x) + 50 - if (10 to 20) - return RULE_OF_THREE(40, 20, x) + 50 - if (20 to INFINITY) - return rand(90, 100) +#define MAXIMUM_DYN_DISTANCE 5 + +/** + * Returns the comulative distribution of threat centre and width, and a random location of -0.5 to 0.5 + * plus or minus the otherwise unattainable lower and upper percentiles. All multiplied by the maximum + * threat and then rounded to the nearest interval. + * rand() calls without arguments returns a value between 0 and 1, allowing for smaller intervals. + */ +/datum/game_mode/dynamic/proc/lorentz_to_amount(centre = 0, scale = 1.8, max_threat = 100, interval = 1) + var/location = rand(-MAXIMUM_DYN_DISTANCE, MAXIMUM_DYN_DISTANCE) * rand() + var/lorentz_result = LORENTZ_CUMULATIVE_DISTRIBUTION(centre, location, scale) + var/std_threat = lorentz_result * max_threat + ///Without these, the amount won't come close to hitting 0% or 100% of the max threat. + var/lower_deviation = max(std_threat * (location-centre)/MAXIMUM_DYN_DISTANCE, 0) + var/upper_deviation = max((max_threat - std_threat) * (centre-location)/MAXIMUM_DYN_DISTANCE, 0) + return clamp(round(std_threat + upper_deviation - lower_deviation, interval), 0, 100) + +#undef MAXIMUM_DYN_DISTANCE #undef FAKE_REPORT_CHANCE #undef FAKE_GREENSHIFT_FORM_CHANCE diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 8325c2460ad..c8c951a9fd4 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -124,6 +124,40 @@ targetitem = /obj/item/clothing/shoes/clown_shoes excludefromjob = list(JOB_CLOWN, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER) item_owner = list(JOB_CLOWN) + exists_on_map = TRUE + +/obj/item/clothing/shoes/clown_shoes/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/clothing/shoes/clown_shoes) + +/datum/objective_item/steal/traitor/mime_mask + name = "the mime's mask" + targetitem = /obj/item/clothing/mask/gas/mime + excludefromjob = list(JOB_MIME, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER) + item_owner = list(JOB_MIME) + exists_on_map = TRUE + +/obj/item/clothing/mask/gas/mime/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/clothing/mask/gas/mime) + +/datum/objective_item/steal/traitor/pka + name = "a protokinetic accelerator" + targetitem = /obj/item/gun/energy/recharge/kinetic_accelerator + excludefromjob = list(JOB_SHAFT_MINER, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER) + item_owner = list(JOB_SHAFT_MINER) + exists_on_map = TRUE + +/obj/item/gun/energy/recharge/kinetic_accelerator/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/gun/energy/recharge/kinetic_accelerator) + +/datum/objective_item/steal/traitor/chef_moustache + name = "a fancy fake moustache" + targetitem = /obj/item/clothing/mask/fakemoustache/italian + excludefromjob = list(JOB_COOK, JOB_HEAD_OF_PERSONNEL, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER) + item_owner = list(JOB_COOK) + exists_on_map = TRUE + +/obj/item/clothing/mask/fakemoustache/italian/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/clothing/mask/fakemoustache/italian) /datum/objective_item/steal/traitor/det_revolver name = "detective's revolver" @@ -134,6 +168,16 @@ /obj/item/gun/ballistic/revolver/c38/detective/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/gun/ballistic/revolver/c38/detective) +/datum/objective_item/steal/traitor/lawyers_badge + name = "the lawyer's badge" + targetitem = /obj/item/clothing/accessory/lawyers_badge + excludefromjob = list(JOB_LAWYER) + item_owner = list(JOB_LAWYER) + exists_on_map = TRUE + +/obj/item/clothing/accessory/lawyers_badge/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/clothing/accessory/lawyers_badge) + /datum/objective_item/steal/traitor/chief_engineer_belt name = "the chief engineer's belt" targetitem = /obj/item/storage/belt/utility/chief @@ -216,6 +260,16 @@ /obj/item/gun/energy/e_gun/hos/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/gun/energy/e_gun/hos) +/datum/objective_item/steal/compactshotty + name = "the head of security's personal compact shotgun" + targetitem = /obj/item/gun/ballistic/shotgun/automatic/combat/compact + excludefromjob = list(JOB_HEAD_OF_SECURITY) + item_owner = list(JOB_HEAD_OF_SECURITY) + exists_on_map = TRUE + +/obj/item/gun/ballistic/shotgun/automatic/combat/compact/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/gun/ballistic/shotgun/automatic/combat/compact) + /datum/objective_item/steal/handtele name = "a hand teleporter" targetitem = /obj/item/hand_tele @@ -405,3 +459,79 @@ /obj/item/blackbox/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/blackbox) + + +// A number of special early-game steal objectives intended to be used with the steal-and-destroy objective. +// They're basically items of utility or emotional value that may be found on many players or lying around the station. +/datum/objective_item/steal/traitor/insuls + name = "insulated gloves" + targetitem = /obj/item/clothing/gloves/color/yellow + excludefromjob = list(JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER, JOB_ATMOSPHERIC_TECHNICIAN, JOB_STATION_ENGINEER, JOB_CHIEF_ENGINEER) + item_owner = list(JOB_STATION_ENGINEER, JOB_CHIEF_ENGINEER) + exists_on_map = TRUE + +/obj/item/clothing/gloves/color/yellow/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/clothing/gloves/color/yellow) + +/datum/objective_item/steal/traitor/moth_plush + name = "cute moth plush toy" + targetitem = /obj/item/toy/plush/moth + excludefromjob = list(JOB_PSYCHOLOGIST, JOB_PARAMEDIC, JOB_CHEMIST, JOB_MEDICAL_DOCTOR, JOB_VIROLOGIST, JOB_CHIEF_MEDICAL_OFFICER, JOB_CORONER) + exists_on_map = TRUE + +/obj/item/toy/plush/moth/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/toy/plush/moth) + +/datum/objective_item/steal/traitor/lizard_plush + name = "cute lizard plush toy" + targetitem = /obj/item/toy/plush/lizard_plushie + exists_on_map = TRUE + +/obj/item/toy/plush/lizard_plushie/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/toy/plush/lizard_plushie) + +/datum/objective_item/steal/traitor/denied_stamp + name = "cargo's denied stamp" + targetitem = /obj/item/stamp/denied + excludefromjob = list(JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER, JOB_SHAFT_MINER) + exists_on_map = TRUE + +/obj/item/stamp/denied/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/stamp/denied) + +/datum/objective_item/steal/traitor/granted_stamp + name = "cargo's granted stamp" + targetitem = /obj/item/stamp/granted + excludefromjob = list(JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER, JOB_SHAFT_MINER) + exists_on_map = TRUE + +/obj/item/stamp/granted/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/stamp/granted) + +/datum/objective_item/steal/traitor/space_law + name = "a book on space law" + targetitem = /obj/item/book/manual/wiki/security_space_law + excludefromjob = list(JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_HEAD_OF_SECURITY, JOB_LAWYER, JOB_DETECTIVE) + exists_on_map = TRUE + +/obj/item/book/manual/wiki/security_space_law/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/book/manual/wiki/security_space_law) + +/datum/objective_item/steal/traitor/rpd + name = "rapid pipe dispenser" + targetitem = /obj/item/pipe_dispenser + excludefromjob = list(JOB_ATMOSPHERIC_TECHNICIAN, JOB_STATION_ENGINEER, JOB_CHIEF_ENGINEER, JOB_SCIENTIST, JOB_RESEARCH_DIRECTOR, JOB_GENETICIST, JOB_ROBOTICIST) + item_owner = list(JOB_CHIEF_ENGINEER) + exists_on_map = TRUE + +/obj/item/pipe_dispenser/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/pipe_dispenser) + +/datum/objective_item/steal/traitor/donut_box + name = "a box of prized donuts" + targetitem = /obj/item/storage/fancy/donut_box + excludefromjob = list(JOB_CAPTAIN, JOB_CHIEF_ENGINEER, JOB_HEAD_OF_PERSONNEL, JOB_HEAD_OF_SECURITY, JOB_QUARTERMASTER, JOB_CHIEF_MEDICAL_OFFICER, JOB_RESEARCH_DIRECTOR, JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_LAWYER, JOB_DETECTIVE) + exists_on_map = TRUE + +/obj/item/storage/fancy/donut_box/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/storage/fancy/donut_box) diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index 9c55051ca60..c9680744fcb 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -93,11 +93,12 @@ if(stored_id_card) SSexplosions.low_mov_atom += stored_id_card -/obj/machinery/pdapainter/handle_atom_del(atom/A) - if(A == stored_pda) +/obj/machinery/pdapainter/Exited(atom/movable/gone, direction) + . = ..() + if(gone == stored_pda) stored_pda = null update_appearance(UPDATE_ICON) - if(A == stored_id_card) + if(gone == stored_id_card) stored_id_card = null update_appearance(UPDATE_ICON) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 48f454f0db3..b6327480399 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -91,7 +91,7 @@ verb_say = "beeps" verb_yell = "blares" pressure_resistance = 15 - pass_flags_self = PASSMACHINE + pass_flags_self = PASSMACHINE | LETPASSCLICKS max_integrity = 200 layer = BELOW_OBJ_LAYER //keeps shit coming out of the machine from ending up underneath it. flags_ricochet = RICOCHET_HARD @@ -196,16 +196,10 @@ /obj/machinery/Destroy() SSmachines.unregister_machine(src) end_processing() - dump_inventory_contents() - if (!isnull(component_parts)) - // Don't delete the stock part singletons - for (var/atom/atom_part in component_parts) - qdel(atom_part) - component_parts.Cut() - component_parts = null + clear_components() + dump_contents() - QDEL_NULL(circuit) unset_static_power() return ..() @@ -368,6 +362,10 @@ /obj/machinery/proc/dump_inventory_contents(list/subset = null) var/turf/this_turf = get_turf(src) for(var/atom/movable/movable_atom in contents) + //so machines like microwaves dont dump out signalers after cooking + if(wires && (movable_atom in flatten_list(wires.assemblies))) + continue + if(subset && !(movable_atom in subset)) continue @@ -818,6 +816,7 @@ new datum_part.physical_object_type(loc) else var/obj/item/obj_part = part + component_parts -= part obj_part.forceMove(loc) if(istype(obj_part, /obj/item/circuitboard/machine)) var/obj/item/circuitboard/machine/board = obj_part @@ -879,21 +878,33 @@ if(EXPLODE_LIGHT) SSexplosions.low_mov_atom += occupant -/obj/machinery/handle_atom_del(atom/deleting_atom) - if(deleting_atom == occupant) +/obj/machinery/Exited(atom/movable/gone, direction) + . = ..() + if(gone == occupant) set_occupant(null) update_appearance() - updateUsrDialog() - return ..() // The circuit should also be in component parts, so don't early return. - if(deleting_atom == circuit) + if(gone == circuit) circuit = null - if((deleting_atom in component_parts) && !QDELETED(src)) - component_parts.Remove(deleting_atom) + if((gone in component_parts) && !QDELETED(src)) + component_parts -= gone // It would be unusual for a component_part to be qdel'd ordinarily. deconstruct(FALSE) - return ..() + +/** + * This should be called before mass qdeling components to make space for replacements. + * If not done, things will go awry as Exited() destroys the machine when it detects + * even a single component exiting the atom. + */ +/obj/machinery/proc/clear_components() + if(!component_parts) + return + var/list/old_components = component_parts + circuit = null + component_parts = null + for(var/atom/atom_part in old_components) + qdel(atom_part) /obj/machinery/proc/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver) if((flags_1 & NODECONSTRUCT_1) || screwdriver.tool_behaviour != TOOL_SCREWDRIVER) @@ -1117,14 +1128,6 @@ power -= power * 0.0005 return ..() -/obj/machinery/Exited(atom/movable/gone, direction) - . = ..() - if(gone == occupant) - set_occupant(null) - if(gone == circuit) - LAZYREMOVE(component_parts, gone) - circuit = null - /obj/machinery/proc/adjust_item_drop_location(atom/movable/dropped_atom) // Adjust item drop location to a 3x3 grid inside the tile, returns slot id from 0 to 8 var/md5 = md5(dropped_atom.name) // Oh, and it's deterministic too. A specific item will always drop from the same slot. for (var/i in 1 to 32) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 6ad97655c4c..70451cd8b98 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -24,6 +24,9 @@ ///The container to hold materials var/datum/component/material_container/materials + + ///direction we output onto (if 0, on top of us) + var/drop_direction = 0 /obj/machinery/autolathe/Initialize(mapload) materials = AddComponent( \ @@ -142,6 +145,10 @@ if(busy) say("The autolathe is busy. Please wait for completion of previous operation.") return + + if(isclosedturf(get_step(src, drop_direction))) + say("Output is obstructed.") + return var/design_id = params["id"] if(!istext(design_id)) @@ -199,13 +206,12 @@ //use materials materials.use_materials(materials_used, coeff, multiplier) - busy = TRUE to_chat(usr, span_notice("You print [multiplier] item(s) from the [src]")) update_static_data_for_all_viewers() //print item icon_state = "autolathe_n" var/time = is_stack ? 32 : (32 * coeff * multiplier) ** 0.8 - addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/autolathe, make_item), custom_materials, multiplier, is_stack, usr), time) + make_items(custom_materials, multiplier, is_stack, usr, time / multiplier) return TRUE @@ -279,7 +285,7 @@ return SECONDARY_ATTACK_CALL_NORMAL -/obj/machinery/autolathe/proc/AfterMaterialInsert(obj/machinery/machine, obj/item/item_inserted, last_inserted_id, amount_inserted, container) +/obj/machinery/autolathe/proc/AfterMaterialInsert(container, obj/item/item_inserted, last_inserted_id, mats_consumed, amount_inserted, atom/context) SIGNAL_HANDLER if(ispath(item_inserted, /obj/item/stack/ore/bluespace_crystal)) @@ -292,15 +298,34 @@ use_power(min(active_power_usage * 0.25, amount_inserted / 100)) update_static_data_for_all_viewers() -/obj/machinery/autolathe/proc/make_item(list/picked_materials, multiplier, is_stack, mob/user) - var/atom/A = drop_location() +/obj/machinery/autolathe/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) + . = ..() + if((!issilicon(usr) && !isAdminGhostAI(usr)) && !Adjacent(usr)) + return + var/direction = get_dir(src, over_location) + if(!direction) + return + drop_direction = direction + balloon_alert(usr, "dropping [dir2text(drop_direction)]") - if(is_stack) - var/obj/item/stack/N = new being_built.build_path(A, multiplier, FALSE) - N.update_appearance() - else - for(var/i in 1 to multiplier) - var/obj/item/new_item = new being_built.build_path(A) +/obj/machinery/autolathe/proc/make_items(list/picked_materials, multiplier, is_stack, mob/user, time_per_item) + var/atom/our_loc = drop_location() + var/atom/drop_loc = get_step(src, drop_direction) + + busy = TRUE + while(multiplier > 0) + if(!busy) + break + if(!multiplier) + continue + stoplag(time_per_item) + var/obj/item/new_item + if(is_stack) + new_item = new being_built.build_path(our_loc, multiplier, FALSE) + var/obj/item/stack/stack_item = new_item + stack_item.update_appearance() + else + new_item = new being_built.build_path(our_loc) if(length(picked_materials)) new_item.set_custom_materials(picked_materials, 1 / multiplier) //Ensure we get the non multiplied amount @@ -308,6 +333,9 @@ var/datum/material/M = x if(!istype(M, /datum/material/glass) && !istype(M, /datum/material/iron)) user.client.give_award(/datum/award/achievement/misc/getting_an_upgrade, user) + if(drop_direction) //no need to call if ontop of us + new_item.Move(drop_loc) + multiplier-- icon_state = "autolathe" busy = FALSE @@ -328,6 +356,17 @@ . += ..() if(in_range(user, src) || isobserver(user)) . += span_notice("The status display reads: Storing up to [materials.max_amount] material units.
Material consumption at [creation_efficiency*100]%.") + if(drop_direction) + . += span_notice("Currently configured to drop printed objects [dir2text(drop_direction)].") + . += span_notice("Alt-click to reset.") + else + . += span_notice("Drag towards a direction (while next to it) to change drop direction.") + +/obj/machinery/autolathe/AltClick(mob/user) + . = ..() + if(drop_direction) + balloon_alert(user, "drop direction reset") + drop_direction = 0 /obj/machinery/autolathe/proc/reset(wire) switch(wire) diff --git a/code/game/machinery/botlaunchpad.dm b/code/game/machinery/botlaunchpad.dm index f6fd5843244..f1c85a293c7 100644 --- a/code/game/machinery/botlaunchpad.dm +++ b/code/game/machinery/botlaunchpad.dm @@ -26,7 +26,7 @@ if(!multitool_check_buffer(user, tool)) return var/obj/item/multitool/multitool = tool - multitool.buffer = src + multitool.set_buffer(src) to_chat(user, span_notice("You save the data in the [multitool.name]'s buffer.")) return TOOL_ACT_TOOLTYPE_SUCCESS diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 5cf0ad71911..a47115a9f60 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -18,7 +18,6 @@ var/status = TRUE var/start_active = FALSE //If it ignores the random chance to start broken on round start var/invuln = null - var/obj/item/camera_bug/bug = null var/datum/weakref/assembly_ref = null var/area/myarea = null @@ -129,12 +128,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) LAZYREMOVE(myarea.cameras, src) QDEL_NULL(alarm_manager) QDEL_NULL(assembly_ref) - if(bug) - bug.bugged_cameras -= c_tag - if(bug.current == src) - bug.current = null - bug = null - QDEL_NULL(last_shown_paper) return ..() @@ -202,6 +195,13 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) return FALSE return ..() +/obj/machinery/camera/attack_ai(mob/living/silicon/ai/user) + if (!istype(user)) + return + if (!can_use()) + return + user.switchCamera(src) + /obj/machinery/camera/proc/setViewRange(num = 7) src.view_range = num GLOB.cameranet.updateVisibility(src, 0) @@ -415,21 +415,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) to_chat(potential_viewer, "[span_name(user)] holds \a [item_name] up to your camera...") return - - if(istype(attacking_item, /obj/item/camera_bug)) - if(!can_use()) - to_chat(user, span_notice("Camera non-functional.")) - return - if(bug) - to_chat(user, span_notice("Camera bug removed.")) - bug.bugged_cameras -= src.c_tag - bug = null - else - to_chat(user, span_notice("Camera bugged.")) - bug = attacking_item - bug.bugged_cameras[src.c_tag] = WEAKREF(src) - return - return ..() diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 0156c06a142..37907a5ba29 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -72,8 +72,9 @@ icon_state = "[xray_module ? "xray" : null][initial(icon_state)]" return ..() -/obj/structure/camera_assembly/handle_atom_del(atom/A) - if(A == xray_module) +/obj/structure/camera_assembly/Exited(atom/movable/gone, direction) + . = ..() + if(gone == xray_module) xray_module = null update_appearance() if(malf_xray_firmware_present) @@ -82,7 +83,7 @@ var/obj/machinery/camera/contained_camera = loc contained_camera.removeXRay(malf_xray_firmware_present) //make sure we don't remove MALF upgrades. - else if(A == emp_module) + else if(gone == emp_module) emp_module = null if(malf_emp_firmware_present) malf_emp_firmware_active = malf_emp_firmware_present //re-enable firmware based upgrades after the part is removed. @@ -90,14 +91,12 @@ var/obj/machinery/camera/contained_camera = loc contained_camera.removeEmpProof(malf_emp_firmware_present) //make sure we don't remove MALF upgrades - else if(A == proxy_module) + else if(gone == proxy_module) emp_module = null if(istype(loc, /obj/machinery/camera)) var/obj/machinery/camera/contained_camera = loc contained_camera.removeMotion() - return ..() - /obj/structure/camera_assembly/Destroy() QDEL_NULL(xray_module) diff --git a/code/game/machinery/camera/trackable.dm b/code/game/machinery/camera/trackable.dm new file mode 100644 index 00000000000..8aedd1b80a8 --- /dev/null +++ b/code/game/machinery/camera/trackable.dm @@ -0,0 +1,128 @@ +///How many ticks to try to find a target before giving up. +#define CAMERA_TICK_LIMIT 10 + +/datum/trackable + ///Boolean on whether or not we are currently trying to track something. + var/tracking = FALSE + ///Reference to the atom that owns us, used for tracking. + var/atom/tracking_holder + + ///If there is a mob currently being tracked, this will be the weakref to it. + var/datum/weakref/tracked_mob + ///How many times we've failed to locate our target. + var/cameraticks = 0 + + ///List of all names that can be tracked. + VAR_PRIVATE/list/names = list() + ///List of all namecounts for mobs with the exact same name, just in-case. + VAR_PRIVATE/list/namecounts = list() + ///List of all humans trackable by cameras. + VAR_PRIVATE/static/list/humans = list() + ///List of all non-humans trackable by cameras, split so humans take priority. + VAR_PRIVATE/static/list/others = list() + +/datum/trackable/New(atom/source) + . = ..() + tracking_holder = source + RegisterSignal(tracking_holder, COMSIG_MOB_RESET_PERSPECTIVE, PROC_REF(cancel_target_tracking)) + +/datum/trackable/Destroy(force, ...) + tracking_holder = null + tracked_mob = null + STOP_PROCESSING(SSprocessing, src) + return ..() + +/datum/trackable/process() + var/mob/living/tracked_target = tracked_mob?.resolve() + if(!tracked_target || !tracking) + set_tracking(FALSE) + return + + if(tracked_target.can_track(tracking_holder)) + cameraticks = initial(cameraticks) + SEND_SIGNAL(tracking_holder, COMSIG_TRACKABLE_TRACKING_TARGET, tracked_target) + return + + if(cameraticks < CAMERA_TICK_LIMIT) + if(!cameraticks) + to_chat(tracking_holder, span_warning("Target is not near any active cameras. Attempting to reacquire...")) + cameraticks++ + return + + to_chat(tracking_holder, span_warning("Unable to reacquire, cancelling track...")) + cameraticks = initial(cameraticks) + set_tracking(FALSE) + +///Generates a list of trackable people by name, returning a list of Humans + Non-Humans that can be tracked. +/datum/trackable/proc/find_trackable_mobs() + RETURN_TYPE(/list) + + names.Cut() + namecounts.Cut() + + humans.Cut() + others.Cut() + + for(var/mob/living/living_mob as anything in GLOB.mob_living_list) + if(!living_mob.can_track(usr)) + continue + + var/name = living_mob.name + while(name in names) + namecounts[name]++ + name = "[name] ([namecounts[name]])" + names.Add(name) + namecounts[name] = 1 + + if(ishuman(living_mob)) + humans[name] = WEAKREF(living_mob) + else + others[name] = WEAKREF(living_mob) + + var/list/targets = sort_list(humans) + sort_list(others) + return targets + +///Toggles whether or not we're tracking something. Arg is whether it's on or off. +/datum/trackable/proc/set_tracking(on = FALSE) + if(on) + START_PROCESSING(SSprocessing, src) + tracking = TRUE + else + STOP_PROCESSING(SSprocessing, src) + tracking = FALSE + tracked_mob = null + +///Called by Signals, used to cancel tracking of a target. +/datum/trackable/proc/cancel_target_tracking(atom/source) + SIGNAL_HANDLER + set_tracking(FALSE) + +/** + * set_tracked_mob + * + * Sets a mob as being tracked, if a target is already provided then it will track that directly, + * otherwise it will give a tgui input list to find targets to track. + * Args: + * tracker - The person trying to track, used for feedback messages. This is not the same as tracking_holder + * tracked_mob_name - (Optional) The person being tracked, to skip the input list. + */ +/datum/trackable/proc/set_tracked_mob(mob/living/tracker, tracked_mob_name) + if(!tracker || tracker.stat == DEAD) + return + + if(tracked_mob_name) + find_trackable_mobs() //this is in case the tracked mob is newly/no-longer in camera field of view. + tracked_mob = isnull(humans[tracked_mob_name]) ? others[tracked_mob_name] : humans[tracked_mob_name] + if(isnull(tracked_mob)) + to_chat(tracker, span_notice("Target is not on or near any active cameras. Tracking failed.")) + return + to_chat(tracker, span_notice("Now tracking [tracked_mob_name] on camera.")) + else + var/target_name = tgui_input_list(tracker, "Select a target", "Tracking", find_trackable_mobs()) + if(!target_name || isnull(target_name)) + return + tracked_mob = isnull(humans[target_name]) ? others[target_name] : humans[target_name] + + set_tracking(TRUE) + +#undef CAMERA_TICK_LIMIT diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm deleted file mode 100644 index fb73bf305c0..00000000000 --- a/code/game/machinery/camera/tracking.dm +++ /dev/null @@ -1,158 +0,0 @@ -/mob/living/silicon/ai/proc/get_camera_list() - var/list/L = list() - for (var/obj/machinery/camera/C as anything in GLOB.cameranet.cameras) - L.Add(C) - - camera_sort(L) - - var/list/T = list() - - for (var/obj/machinery/camera/C in L) - var/list/tempnetwork = C.network&src.network - if (length(tempnetwork)) - T["[C.c_tag][C.can_use() ? null : " (Deactivated)"]"] = C - - return T - -/mob/living/silicon/ai/proc/show_camera_list() - var/list/cameras = get_camera_list() - var/camera = tgui_input_list(src, "Choose which camera you want to view", "Cameras", cameras) - if(isnull(camera)) - return - if(isnull(cameras[camera])) - return - switchCamera(cameras[camera]) - -/datum/trackable - var/initialized = FALSE - var/list/names = list() - var/list/namecounts = list() - var/list/humans = list() - var/list/others = list() - -/mob/living/silicon/ai/proc/trackable_mobs() - track.initialized = TRUE - track.names.Cut() - track.namecounts.Cut() - track.humans.Cut() - track.others.Cut() - - if(usr.stat == DEAD) - return list() - - for(var/i in GLOB.mob_living_list) - var/mob/living/L = i - if(!L.can_track(usr)) - continue - - var/name = L.name - while(name in track.names) - track.namecounts[name]++ - name = "[name] ([track.namecounts[name]])" - track.names.Add(name) - track.namecounts[name] = 1 - - if(ishuman(L)) - track.humans[name] = WEAKREF(L) - else - track.others[name] = WEAKREF(L) - - var/list/targets = sort_list(track.humans) + sort_list(track.others) - - return targets - -/mob/living/silicon/ai/verb/ai_camera_track(target_name in trackable_mobs()) - set name = "track" - set hidden = TRUE //Don't display it on the verb lists. This verb exists purely so you can type "track Oldman Robustin" and follow his ass - - if(!target_name) - return - - if(!track.initialized) - trackable_mobs() - - var/datum/weakref/target = (isnull(track.humans[target_name]) ? track.others[target_name] : track.humans[target_name]) - - ai_actual_track(target?.resolve()) - -/mob/living/silicon/ai/proc/ai_actual_track(mob/living/target) - if(!istype(target)) - return - var/mob/living/silicon/ai/U = usr - - U.cameraFollow = target - U.tracking = 1 - - if(!target || !target.can_track(usr)) - to_chat(U, span_warning("Target is not near any active cameras.")) - U.cameraFollow = null - return - - to_chat(U, span_notice("Now tracking [target.get_visible_name()] on camera.")) - - INVOKE_ASYNC(src, PROC_REF(do_track), target, U) - -/mob/living/silicon/ai/proc/do_track(mob/living/target, mob/living/silicon/ai/U) - var/cameraticks = 0 - - while(U.cameraFollow == target) - if(U.cameraFollow == null) - return - - if(!target.can_track(usr)) - U.tracking = TRUE - if(!cameraticks) - to_chat(U, span_warning("Target is not near any active cameras. Attempting to reacquire...")) - cameraticks++ - if(cameraticks > 9) - U.cameraFollow = null - to_chat(U, span_warning("Unable to reacquire, cancelling track...")) - tracking = FALSE - return - else - sleep(1 SECONDS) - continue - - else - cameraticks = 0 - U.tracking = FALSE - - if(U.eyeobj) - U.eyeobj.setLoc(get_turf(target)) - - else - view_core() - U.cameraFollow = null - return - - sleep(1 SECONDS) - -/proc/near_camera(mob/living/M) - if (!isturf(M.loc)) - return FALSE - if(issilicon(M)) - var/mob/living/silicon/S = M - if((QDELETED(S.builtInCamera) || !S.builtInCamera.can_use()) && !GLOB.cameranet.checkCameraVis(M)) - return FALSE - else if(!GLOB.cameranet.checkCameraVis(M)) - return FALSE - return TRUE - -/obj/machinery/camera/attack_ai(mob/living/silicon/ai/user) - if (!istype(user)) - return - if (!can_use()) - return - user.switchCamera(src) - -/proc/camera_sort(list/L) - var/obj/machinery/camera/a - var/obj/machinery/camera/b - - for (var/i = length(L), i > 0, i--) - for (var/j = 1 to i - 1) - a = L[j] - b = L[j + 1] - if (sorttext(a.c_tag, b.c_tag) < 0) - L.Swap(j, j + 1) - return L diff --git a/code/game/machinery/computer/atmos_computers/_air_sensor.dm b/code/game/machinery/computer/atmos_computers/_air_sensor.dm index a34ffedac0b..faef0370ad0 100644 --- a/code/game/machinery/computer/atmos_computers/_air_sensor.dm +++ b/code/game/machinery/computer/atmos_computers/_air_sensor.dm @@ -91,7 +91,7 @@ if(istype(multi_tool.buffer, /obj/machinery/atmospherics/components/unary/outlet_injector)) var/obj/machinery/atmospherics/components/unary/outlet_injector/input = multi_tool.buffer inlet_id = input.id_tag - multi_tool.buffer = null + multi_tool.set_buffer(null) balloon_alert(user, "connected to input") else if(istype(multi_tool.buffer, /obj/machinery/atmospherics/components/unary/vent_pump)) @@ -105,11 +105,11 @@ output.external_pressure_bound = 0 //finally assign it to this sensor outlet_id = output.id_tag - multi_tool.buffer = null + multi_tool.set_buffer(null) balloon_alert(user, "connected to output") else - multi_tool.buffer = src + multi_tool.set_buffer(src) balloon_alert(user, "added to multitool buffer") return TRUE diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index a839322bff3..7d0dfaa127a 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -202,19 +202,7 @@ if(istype(new_machine, /obj/machinery/computer)) var/obj/machinery/computer/new_computer = new_machine - // Machines will init with a set of default components. - // Triggering handle_atom_del will make the machine realise it has lost a component_parts and then deconstruct. - // Move to nullspace so we don't trigger handle_atom_del, then qdel. - // Finally, replace new machine's parts with this frame's parts. - if(new_computer.circuit) - // Move to nullspace and delete. - new_computer.circuit.moveToNullspace() - QDEL_NULL(new_computer.circuit) - for(var/old_part in new_computer.component_parts) - var/atom/movable/movable_part = old_part - // Move to nullspace and delete. - movable_part.moveToNullspace() - qdel(movable_part) + new_machine.clear_components() // Set anchor state and move the frame's parts over to the new machine. // Then refresh parts and call on_construction(). diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index e8fc202feed..5a604cd969b 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -94,7 +94,7 @@ /obj/machinery/computer/security/ui_static_data() var/list/data = list() data["mapRef"] = cam_screen.assigned_map - var/list/cameras = get_available_cameras() + var/list/cameras = get_camera_list(network) data["cameras"] = list() for(var/i in cameras) var/obj/machinery/camera/C = cameras[i] @@ -111,7 +111,7 @@ if(action == "switch_camera") var/c_tag = params["name"] - var/list/cameras = get_available_cameras() + var/list/cameras = get_camera_list(network) var/obj/machinery/camera/selected_camera = cameras[c_tag] active_camera = selected_camera playsound(src, get_sfx(SFX_TERMINAL_TYPE), 25, FALSE) @@ -178,28 +178,6 @@ cam_background.icon_state = "scanline2" cam_background.fill_rect(1, 1, DEFAULT_MAP_SIZE, DEFAULT_MAP_SIZE) -// Returns the list of cameras accessible from this computer -/obj/machinery/computer/security/proc/get_available_cameras() - var/list/L = list() - for (var/obj/machinery/camera/cam as anything in GLOB.cameranet.cameras) - //Get the camera's turf in case it's inside something like a borg - var/turf/camera_turf = get_turf(cam) - if((is_away_level(z) || is_away_level(camera_turf.z)) && (camera_turf.z != z))//if on away mission, can only receive feed from same z_level cameras - continue - L.Add(cam) - var/list/D = list() - for(var/obj/machinery/camera/cam in L) - if(!cam.network) - stack_trace("Camera in a cameranet has no camera network") - continue - if(!(islist(cam.network))) - stack_trace("Camera in a cameranet has a non-list camera network") - continue - var/list/tempnetwork = cam.network & network - if(tempnetwork.len) - D["[cam.c_tag]"] = cam - return D - // SECURITY MONITORS /obj/machinery/computer/security/wooden_tv diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 27f498c6cdf..4a289ae6aee 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -660,6 +660,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) shuttles += list(list( "name" = shuttle_template.name, "description" = shuttle_template.description, + "occupancy_limit" = shuttle_template.occupancy_limit, "creditCost" = shuttle_template.credit_cost, "emagOnly" = shuttle_template.emag_only, "prerequisites" = shuttle_template.prerequisites, @@ -986,6 +987,10 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE) if(new_possible_answers) possible_answers = new_possible_answers +/datum/comm_message/Destroy() + answer_callback = null + return ..() + #undef IMPORTANT_ACTION_COOLDOWN #undef EMERGENCY_ACCESS_COOLDOWN #undef STATE_BUYING_SHUTTLE diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index d584f239697..a579ac14fd0 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -299,7 +299,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) return results -/datum/crewmonitor/ui_act(action,params) +/datum/crewmonitor/ui_act(action, params) . = ..() if(.) return @@ -308,7 +308,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) var/mob/living/silicon/ai/AI = usr if(!istype(AI)) return - AI.ai_camera_track(params["name"]) + AI.ai_tracking_tool.set_tracked_mob(AI, params["name"]) #undef SENSORS_UPDATE_PERIOD #undef UNKNOWN_JOB_ID diff --git a/code/game/machinery/computer/launchpad_control.dm b/code/game/machinery/computer/launchpad_control.dm index 4023192c90c..5590297c54a 100644 --- a/code/game/machinery/computer/launchpad_control.dm +++ b/code/game/machinery/computer/launchpad_control.dm @@ -66,7 +66,7 @@ if(M.buffer && istype(M.buffer, /obj/machinery/launchpad)) if(LAZYLEN(launchpads) < maximum_pads) launchpads |= M.buffer - M.buffer = null + M.set_buffer(null) to_chat(user, span_notice("You upload the data from the [W.name]'s buffer.")) else to_chat(user, span_warning("[src] cannot handle any more connections!")) diff --git a/code/game/machinery/computer/mechlaunchpad.dm b/code/game/machinery/computer/mechlaunchpad.dm index c89bbab7fa0..106f87f1788 100644 --- a/code/game/machinery/computer/mechlaunchpad.dm +++ b/code/game/machinery/computer/mechlaunchpad.dm @@ -100,11 +100,11 @@ if(buffered_pad in mechpads) remove_pad(buffered_pad) connect_launchpad(buffered_pad) - multitool.buffer = null + multitool.set_buffer(null) to_chat(user, span_notice("You connect the console to the pad with data from the [multitool.name]'s buffer.")) else add_pad(buffered_pad) - multitool.buffer = null + multitool.set_buffer(null) to_chat(user, span_notice("You upload the data from the [multitool.name]'s buffer.")) return TRUE diff --git a/code/game/machinery/computer/orders/order_computer/order_computer.dm b/code/game/machinery/computer/orders/order_computer/order_computer.dm index 6efe9dde527..cd716b61e6c 100644 --- a/code/game/machinery/computer/orders/order_computer/order_computer.dm +++ b/code/game/machinery/computer/orders/order_computer/order_computer.dm @@ -163,6 +163,7 @@ GLOBAL_LIST_EMPTY(order_console_products) //So miners cant spam buy crates for a very low price if(get_total_cost() < CARGO_CRATE_VALUE) return + var/obj/item/card/id/used_id_card = living_user.get_idcard(TRUE) if(!used_id_card || !used_id_card.registered_account) say("No bank account detected!") @@ -222,7 +223,7 @@ GLOBAL_LIST_EMPTY(order_console_products) return FALSE /** - * whatever type of points was retrived in retrive_points() subtract those type of points from the card upon confirming order + * whatever type of points was retrieved in retrive_points() subtract those type of points from the card upon confirming order * Args: * final_cost - amount of points to subtract from this card * card - The ID card to subtract these points from diff --git a/code/game/machinery/computer/orders/order_items/cook/order_milk_eggs.dm b/code/game/machinery/computer/orders/order_items/cook/order_milk_eggs.dm index d3fb31fec30..12ceaee8d3f 100644 --- a/code/game/machinery/computer/orders/order_items/cook/order_milk_eggs.dm +++ b/code/game/machinery/computer/orders/order_items/cook/order_milk_eggs.dm @@ -31,6 +31,11 @@ item_path = /obj/item/food/fishmeat cost_per_order = 12 +/datum/orderable_item/milk_eggs/octopus + name = "Octopus Tentacle" + item_path = /obj/item/food/fishmeat/octopus + cost_per_order = 12 + /datum/orderable_item/milk_eggs/spider_eggs name = "Spider Eggs" item_path = /obj/item/food/spidereggs @@ -65,6 +70,16 @@ item_path = /obj/item/food/canned/pine_nuts cost_per_order = 20 +/datum/orderable_item/milk_eggs/canned_squid_ink + name = "Canned Squid Ink" + item_path = /obj/item/food/canned/squid_ink + cost_per_order = 20 + +/datum/orderable_item/milk_eggs/chap + name = "Can of CHAP" + item_path = /obj/item/food/canned/chap + cost_per_order = 20 + /datum/orderable_item/milk_eggs/ready_donk name = "Ready-Donk Meal: Bachelor Chow" item_path = /obj/item/food/ready_donk @@ -80,6 +95,16 @@ item_path = /obj/item/food/ready_donk/donkhiladas cost_per_order = 40 +/datum/orderable_item/milk_eggs/ready_donk_nachos + name = "Ready-Donk Meal: Donk Sol Series Boritos Nachos Grandes" + item_path = /obj/item/food/ready_donk/nachos_grandes + cost_per_order = 40 + +/datum/orderable_item/milk_eggs/ready_donk_orange + name = "Ready-Donk Meal: Donk-range Chicken" + item_path = /obj/item/food/ready_donk/donkrange_chicken + cost_per_order = 40 + /datum/orderable_item/milk_eggs/tiziran_goods name = "Tiziran Farm-Fresh Pack" item_path = /obj/item/storage/box/tiziran_goods diff --git a/code/game/machinery/computer/orders/order_items/cook/order_reagents.dm b/code/game/machinery/computer/orders/order_items/cook/order_reagents.dm index db9d20a676f..584403a1195 100644 --- a/code/game/machinery/computer/orders/order_items/cook/order_reagents.dm +++ b/code/game/machinery/computer/orders/order_items/cook/order_reagents.dm @@ -65,3 +65,33 @@ name = "Cherry Jelly" item_path = /obj/item/reagent_containers/condiment/cherryjelly cost_per_order = 30 + +/datum/orderable_item/reagents/worcestershire + name = "Worcestershire Sauce" + item_path = /obj/item/reagent_containers/condiment/worcestershire + cost_per_order = 30 + +/datum/orderable_item/reagents/red_bay + name = "Red Bay Seasoning" + item_path = /obj/item/reagent_containers/condiment/red_bay + cost_per_order = 30 + +/datum/orderable_item/reagents/curry_powder + name = "Curry Powder" + item_path = /obj/item/reagent_containers/condiment/curry_powder + cost_per_order = 30 + +/datum/orderable_item/reagents/dashi_concentrate + name = "Dashi Concentrate" + item_path = /obj/item/reagent_containers/condiment/dashi_concentrate + cost_per_order = 30 + +/datum/orderable_item/reagents/coconut_milk + name = "Coconut Milk" + item_path = /obj/item/reagent_containers/condiment/coconut_milk + cost_per_order = 30 + +/datum/orderable_item/reagents/grounding_solution + name = "Grounding Solution" + item_path = /obj/item/reagent_containers/condiment/grounding_solution + cost_per_order = 30 diff --git a/code/game/machinery/computer/orders/order_items/cook/order_veggies.dm b/code/game/machinery/computer/orders/order_items/cook/order_veggies.dm index 4ea03c481e5..506920986dd 100644 --- a/code/game/machinery/computer/orders/order_items/cook/order_veggies.dm +++ b/code/game/machinery/computer/orders/order_items/cook/order_veggies.dm @@ -84,3 +84,8 @@ name = "Jar of pickles" item_path = /obj/item/storage/fancy/pickles_jar cost_per_order = 60 + +/datum/orderable_item/veggies/pickled_voltvine + name = "Pickled Voltvine" + item_path = /obj/item/food/pickled_voltvine + cost_per_order = 5 diff --git a/code/game/machinery/computer/orders/order_items/mining/order_mining.dm b/code/game/machinery/computer/orders/order_items/mining/order_mining.dm index 55c6ed63a65..09bbeed2bed 100644 --- a/code/game/machinery/computer/orders/order_items/mining/order_mining.dm +++ b/code/game/machinery/computer/orders/order_items/mining/order_mining.dm @@ -102,3 +102,7 @@ /datum/orderable_item/mining/style_meter item_path = /obj/item/style_meter cost_per_order = 1500 + +/datum/orderable_item/mining/weather_radio + item_path = /obj/item/radio/weather_monitor + cost_per_order = 400 diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index d1940d67edb..3bf44a9aa9e 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -269,15 +269,7 @@ P.play_tool_sound(src) var/obj/machinery/new_machine = new circuit.build_path(loc) if(istype(new_machine)) - // Machines will init with a set of default components. Move to nullspace so we don't trigger handle_atom_del, then qdel. - // Finally, replace with this frame's parts. - if(new_machine.circuit) - // Move to nullspace and delete. - new_machine.circuit.moveToNullspace() - QDEL_NULL(new_machine.circuit) - for(var/obj/old_part in new_machine.component_parts) - old_part.moveToNullspace() - qdel(old_part) + new_machine.clear_components() // Set anchor state new_machine.set_anchored(anchored) diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm index e72f3f4ddf5..d212f2ba45d 100644 --- a/code/game/machinery/defibrillator_mount.dm +++ b/code/game/machinery/defibrillator_mount.dm @@ -27,16 +27,17 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/defibrillator_mount, 28) MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/defibrillator_mount, 28) /obj/machinery/defibrillator_mount/Destroy() - if(defib) - QDEL_NULL(defib) - . = ..() - -/obj/machinery/defibrillator_mount/handle_atom_del(atom/A) - if(A == defib) - defib = null - end_processing() + QDEL_NULL(defib) return ..() +/obj/machinery/defibrillator_mount/Exited(atom/movable/gone, direction) + . = ..() + if(gone == defib) + // Make sure processing ends before the defib is nulled + end_processing() + defib = null + update_appearance() + /obj/machinery/defibrillator_mount/examine(mob/user) . = ..() if(defib) @@ -171,10 +172,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/defibrillator_mount, 28) user.visible_message(span_notice("[user] unhooks [defib] from [src]."), \ span_notice("You slide out [defib] from [src] and unhook the charging cables.")) playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) - // Make sure processing ends before the defib is nulled - end_processing() - defib = null - update_appearance() /obj/machinery/defibrillator_mount/charging name = "PENLITE defibrillator mount" diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index ac42acd062c..2786ed0f769 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -310,11 +310,12 @@ diag_hud.remove_atom_from_hud(src) return ..() -/obj/machinery/door/airlock/handle_atom_del(atom/A) - if(A == note) +/obj/machinery/door/airlock/Exited(atom/movable/gone, direction) + . = ..() + if(gone == note) note = null update_appearance() - if(A == seal) + if(gone == seal) seal = null update_appearance() @@ -1239,17 +1240,13 @@ update_icon(ALL, AIRLOCK_OPENING, TRUE) sleep(0.1 SECONDS) set_opacity(0) - //SKYRAT EDIT ADDITION BEGIN - LARGE_DOOR if(multi_tile) filler.set_opacity(FALSE) - //SKYRAT EDIT END update_freelook_sight() sleep(0.4 SECONDS) set_density(FALSE) - //SKYRAT EDIT ADDITION BEGIN - LARGE_DOOR if(multi_tile) filler.set_density(FALSE) - //SKYRAT EDIT END flags_1 &= ~PREVENT_CLICK_UNDER_1 air_update_turf(TRUE, FALSE) sleep(0.1 SECONDS) @@ -1300,10 +1297,9 @@ var/dangerous_close = !safe || force_crush if(!dangerous_close) - for(var/turf/checked_turf in get_turfs()) // SKYRAT EDIT ADD - //for(var/atom/movable/M in get_turf(src)) // Original - for(var/atom/movable/M in checked_turf) // SKYRAT EDIT CHANGE - if(M.density && M != src) //something is blocking the door + for(var/turf/checked_turf in locs) + for(var/atom/movable/blocking in checked_turf) + if(blocking.density && blocking != src) autoclose_in(DOOR_CLOSE_WAIT) return FALSE @@ -1319,6 +1315,8 @@ layer = CLOSED_DOOR_LAYER if(air_tight) set_density(TRUE) + if(multi_tile) + filler.density = TRUE flags_1 |= PREVENT_CLICK_UNDER_1 //SKYRAT EDIT ADDITION BEGIN - LARGE_DOOR if(multi_tile) @@ -1327,6 +1325,8 @@ sleep(0.1 SECONDS) if(!air_tight) set_density(TRUE) + if(multi_tile) + filler.density = TRUE flags_1 |= PREVENT_CLICK_UNDER_1 //SKYRAT EDIT ADDITION BEGIN - LARGE_DOOR if(multi_tile) @@ -1337,7 +1337,7 @@ if(dangerous_close) crush() if(visible && !glass) - set_opacity(1) + set_opacity(TRUE) if(multi_tile) filler.set_opacity(TRUE) update_freelook_sight() @@ -1396,7 +1396,12 @@ // applies the user-chosen airlock's icon, overlays and assemblytype to the src airlock painter.use_paint(user) - icon = initial(airlock.icon) + if(initial(airlock.greyscale_config)) + greyscale_config = initial(airlock.greyscale_config) + greyscale_colors = initial(airlock.greyscale_colors) + update_greyscale() + else + icon = initial(airlock.icon) overlays_file = initial(airlock.overlays_file) assemblytype = initial(airlock.assemblytype) update_appearance() @@ -1567,7 +1572,7 @@ if(security_level != AIRLOCK_SECURITY_NONE) to_chat(user, span_notice("[src]'s reinforcement needs to be removed first.")) return FALSE - return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 32) + return list("mode" = RCD_DECONSTRUCT, "delay" = 5 SECONDS, "cost" = 32) return FALSE /obj/machinery/door/airlock/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) @@ -1632,7 +1637,7 @@ wire["shock"] = !wires.is_cut(WIRE_SHOCK) wire["id_scanner"] = !wires.is_cut(WIRE_IDSCAN) wire["bolts"] = !wires.is_cut(WIRE_BOLTS) - wire["lights"] = !wires.is_cut(WIRE_LIGHT) + wire["lights"] = !wires.is_cut(WIRE_BOLTLIGHT) wire["safe"] = !wires.is_cut(WIRE_SAFETY) wire["timing"] = !wires.is_cut(WIRE_TIMING) @@ -1764,6 +1769,698 @@ var/area/source_area = get_area(src) return source_area?.airlock_wires ? new source_area.airlock_wires(src) : new /datum/wires/airlock(src) +/obj/structure/fluff/airlock_filler/Destroy(force) + filled_airlock = null + return ..() + +/** + * Create a ref to our parent airlock and listen for a QDEL, which we will al + */ +/obj/structure/fluff/airlock_filler/proc/pair_airlock(obj/machinery/door/parent_airlock) + if(isnull(parent_airlock)) + stack_trace("Attempted to pair an airlock filler with no parent airlock specified!") + return + + filled_airlock = parent_airlock + RegisterSignal(filled_airlock, COMSIG_QDELETING, PROC_REF(no_airlock)) + +/** + * Multi-tile airlocks pair with a filler panel, if one goes so does the other. + */ +/obj/structure/fluff/airlock_filler/proc/no_airlock() + SIGNAL_HANDLER + + qdel(src) + +/** + * Multi-tile airlocks (using a filler panel) have special handling for movables with PASSGLASS + */ +/obj/structure/fluff/airlock_filler/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() + if(.) + return + + if(istype(mover) && (mover.pass_flags & PASSGLASS)) + return !opacity + +/obj/structure/fluff/airlock_filler/can_be_pulled(user, grab_state, force) + return FALSE + +/obj/structure/fluff/airlock_filler/singularity_act() + return + +/obj/structure/fluff/airlock_filler/singularity_pull(S, current_size) + return + +// Station Airlocks Regular + +/obj/machinery/door/airlock/command + icon = 'icons/obj/doors/airlocks/station/command.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_com + normal_integrity = 450 + +/obj/machinery/door/airlock/security + icon = 'icons/obj/doors/airlocks/station/security.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_sec + normal_integrity = 450 + +/obj/machinery/door/airlock/engineering + icon = 'icons/obj/doors/airlocks/station/engineering.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_eng + +/obj/machinery/door/airlock/medical + icon = 'icons/obj/doors/airlocks/station/medical.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_med + +/obj/machinery/door/airlock/hydroponics //Hydroponics front doors! + icon = 'icons/obj/doors/airlocks/station/hydroponics.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_hydro + +/obj/machinery/door/airlock/maintenance + name = "maintenance access" + icon = 'icons/obj/doors/airlocks/station/maintenance.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_mai + normal_integrity = 250 + +/obj/machinery/door/airlock/maintenance/external + name = "external airlock access" + icon = 'icons/obj/doors/airlocks/station/maintenanceexternal.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_extmai + +/obj/machinery/door/airlock/mining + name = "mining airlock" + icon = 'icons/obj/doors/airlocks/station/mining.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_min + +/obj/machinery/door/airlock/atmos + name = "atmospherics airlock" + icon = 'icons/obj/doors/airlocks/station/atmos.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_atmo + +/obj/machinery/door/airlock/research + icon = 'icons/obj/doors/airlocks/station/research.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_research + +/obj/machinery/door/airlock/freezer + name = "freezer airlock" + icon = 'icons/obj/doors/airlocks/station/freezer.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_fre + +/obj/machinery/door/airlock/science + icon = 'icons/obj/doors/airlocks/station/science.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_science + +/obj/machinery/door/airlock/virology + icon = 'icons/obj/doors/airlocks/station/virology.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_viro + +// Station Airlocks Glass + +/obj/machinery/door/airlock/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/glass/incinerator + autoclose = FALSE + heat_proof = TRUE + req_access = list(ACCESS_SYNDICATE) + +/obj/machinery/door/airlock/glass/incinerator/syndicatelava_interior + name = "Turbine Interior Airlock" + id_tag = INCINERATOR_SYNDICATELAVA_AIRLOCK_INTERIOR + +/obj/machinery/door/airlock/glass/incinerator/syndicatelava_exterior + name = "Turbine Exterior Airlock" + id_tag = INCINERATOR_SYNDICATELAVA_AIRLOCK_EXTERIOR + +/obj/machinery/door/airlock/command/glass + opacity = FALSE + glass = TRUE + normal_integrity = 400 + +/obj/machinery/door/airlock/engineering/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/engineering/glass/critical + critical_machine = TRUE //stops greytide virus from opening & bolting doors in critical positions, such as the SM chamber. + +/obj/machinery/door/airlock/security/glass + opacity = FALSE + glass = TRUE + normal_integrity = 400 + +/obj/machinery/door/airlock/medical/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/hydroponics/glass //Uses same icon as medical/glass, maybe update it with its own unique icon one day? + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/research/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/research/glass/incinerator + autoclose = FALSE + heat_proof = TRUE + +/obj/machinery/door/airlock/research/glass/incinerator/ordmix_interior + name = "Mixing Room Interior Airlock" + id_tag = INCINERATOR_ORDMIX_AIRLOCK_INTERIOR + +/obj/machinery/door/airlock/research/glass/incinerator/ordmix_exterior + name = "Mixing Room Exterior Airlock" + id_tag = INCINERATOR_ORDMIX_AIRLOCK_EXTERIOR + +/obj/machinery/door/airlock/mining/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/atmos/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/atmos/glass/critical + critical_machine = TRUE //stops greytide virus from opening & bolting doors in critical positions, such as the SM chamber. + +/obj/machinery/door/airlock/science/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/virology/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/maintenance/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/maintenance/external/glass + opacity = FALSE + glass = TRUE + normal_integrity = 200 + +// Station Airlocks Mineral + +/obj/machinery/door/airlock/gold + name = "gold airlock" + icon = 'icons/obj/doors/airlocks/station/gold.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_gold + +/obj/machinery/door/airlock/gold/discoinferno + heat_proof = TRUE + resistance_flags = FIRE_PROOF + armor_type = /datum/armor/discoinferno_airlock + +/datum/armor/discoinferno_airlock + melee = 30 + bullet = 30 + laser = 20 + energy = 20 + bomb = 10 + fire = 100 + acid = 100 + +/obj/machinery/door/airlock/gold/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/silver + name = "silver airlock" + icon = 'icons/obj/doors/airlocks/station/silver.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_silver + +/obj/machinery/door/airlock/silver/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/diamond + name = "diamond airlock" + icon = 'icons/obj/doors/airlocks/station/diamond.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_diamond + normal_integrity = 1000 + explosion_block = 2 + +/obj/machinery/door/airlock/diamond/glass + normal_integrity = 950 + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/uranium + name = "uranium airlock" + icon = 'icons/obj/doors/airlocks/station/uranium.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_uranium + var/last_event = 0 + //Is this airlock actually radioactive? + var/actually_radioactive = TRUE + +/obj/machinery/door/airlock/uranium/process() + if(actually_radioactive && world.time > last_event+20) + if(prob(50)) + radiate() + last_event = world.time + ..() + +/obj/machinery/door/airlock/uranium/proc/radiate() + radiation_pulse( + src, + max_range = 2, + threshold = RAD_LIGHT_INSULATION, + chance = URANIUM_IRRADIATION_CHANCE, + minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME, + ) + +/obj/machinery/door/airlock/uranium/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/uranium/safe + actually_radioactive = FALSE + +/obj/machinery/door/airlock/uranium/glass/safe + actually_radioactive = FALSE + +/obj/machinery/door/airlock/plasma + name = "plasma airlock" + desc = "No way this can end badly." + icon = 'icons/obj/doors/airlocks/station/plasma.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_plasma + material_flags = MATERIAL_EFFECTS + material_modifier = 0.25 + +/obj/machinery/door/airlock/plasma/Initialize(mapload) + custom_materials = custom_materials ? custom_materials : list(/datum/material/plasma = SHEET_MATERIAL_AMOUNT * 10) + . = ..() + +/obj/machinery/door/airlock/plasma/block_superconductivity() //we don't stop the heat~ + return 0 + +/obj/machinery/door/airlock/plasma/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/bananium + name = "bananium airlock" + desc = "Honkhonkhonk" + icon = 'icons/obj/doors/airlocks/station/bananium.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_bananium + doorOpen = 'sound/items/bikehorn.ogg' + +/obj/machinery/door/airlock/bananium/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/sandstone + name = "sandstone airlock" + icon = 'icons/obj/doors/airlocks/station/sandstone.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_sandstone + +/obj/machinery/door/airlock/sandstone/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/wood + name = "wooden airlock" + icon = 'icons/obj/doors/airlocks/station/wood.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_wood + +/obj/machinery/door/airlock/wood/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/titanium + name = "shuttle airlock" + assemblytype = /obj/structure/door_assembly/door_assembly_titanium + icon = 'icons/obj/doors/airlocks/shuttle/shuttle.dmi' + overlays_file = 'icons/obj/doors/airlocks/shuttle/overlays.dmi' + normal_integrity = 400 + +/obj/machinery/door/airlock/titanium/glass + normal_integrity = 350 + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/bronze + name = "bronze airlock" + icon = 'icons/obj/doors/airlocks/clockwork/pinion_airlock.dmi' + overlays_file = 'icons/obj/doors/airlocks/clockwork/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_bronze + +/obj/machinery/door/airlock/bronze/seethru + assemblytype = /obj/structure/door_assembly/door_assembly_bronze/seethru + opacity = FALSE + glass = TRUE + + +// Public Airlocks + +/obj/machinery/door/airlock/public + icon = 'icons/obj/doors/airlocks/public/glass.dmi' + overlays_file = 'icons/obj/doors/airlocks/public/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_public + +/obj/machinery/door/airlock/public/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/public/glass/incinerator + autoclose = FALSE + heat_proof = TRUE + +/obj/machinery/door/airlock/public/glass/incinerator/atmos_interior + name = "Turbine Interior Airlock" + id_tag = INCINERATOR_ATMOS_AIRLOCK_INTERIOR + +/obj/machinery/door/airlock/public/glass/incinerator/atmos_exterior + name = "Turbine Exterior Airlock" + id_tag = INCINERATOR_ATMOS_AIRLOCK_EXTERIOR + +// External Airlocks + +/obj/machinery/door/airlock/external + name = "external airlock" + icon = 'icons/obj/doors/airlocks/external/external.dmi' + overlays_file = 'icons/obj/doors/airlocks/external/overlays.dmi' + note_overlay_file = 'icons/obj/doors/airlocks/external/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_ext + + /// Whether or not the airlock can be opened without access from a certain direction while powered, or with bare hands from any direction while unpowered OR pressurized. + var/space_dir = null + +/obj/machinery/door/airlock/external/Initialize(mapload, ...) + // default setting is for mapping only, let overrides work + if(!mapload) + req_access = null + + return ..() + +/obj/machinery/door/airlock/external/LateInitialize() + . = ..() + if(space_dir) + unres_sides |= space_dir + +/obj/machinery/door/airlock/external/examine(mob/user) + . = ..() + if(space_dir) + . += span_notice("It has labels indicating that it has an emergency mechanism to open from the [dir2text(space_dir)] side with just your hands even if there's no power.") + +/obj/machinery/door/airlock/external/cyclelinkairlock() + . = ..() + var/obj/machinery/door/airlock/external/cycle_linked_external_airlock = cyclelinkedairlock + if(istype(cycle_linked_external_airlock)) + cycle_linked_external_airlock.space_dir |= space_dir + space_dir |= cycle_linked_external_airlock.space_dir + +/obj/machinery/door/airlock/external/try_safety_unlock(mob/user) + if(space_dir && density) + if(!hasPower()) + to_chat(user, span_notice("You begin unlocking the airlock safety mechanism...")) + if(do_after(user, 15 SECONDS, target = src)) + try_to_crowbar(null, user, TRUE) + return TRUE + else + // always open from the space side + // get_dir(src, user) & space_dir, checked in unresricted_sides + var/should_safety_open = shuttledocked || cyclelinkedairlock?.shuttledocked || is_safe_turf(get_step(src, space_dir), TRUE, FALSE) + return try_to_activate_door(user, should_safety_open) + + return ..() + +// Access free external airlocks +/obj/machinery/door/airlock/external/ruin + +/obj/machinery/door/airlock/external/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/external/glass/ruin + +// CentCom Airlocks + +/obj/machinery/door/airlock/centcom //Use grunge as a station side version, as these have special effects related to them via phobias and such. + icon = 'icons/obj/doors/airlocks/centcom/centcom.dmi' + overlays_file = 'icons/obj/doors/airlocks/centcom/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_centcom + normal_integrity = 1000 + security_level = 6 + explosion_block = 2 + +/obj/machinery/door/airlock/grunge + icon = 'icons/obj/doors/airlocks/centcom/centcom.dmi' + overlays_file = 'icons/obj/doors/airlocks/centcom/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_grunge + + +// Vault Airlocks + +/obj/machinery/door/airlock/vault + name = "vault door" + icon = 'icons/obj/doors/airlocks/vault/vault.dmi' + overlays_file = 'icons/obj/doors/airlocks/vault/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_vault + explosion_block = 2 + normal_integrity = 400 // reverse engieneerd: 400 * 1.5 (sec lvl 6) = 600 = original + security_level = 6 + + +// Hatch Airlocks + +/obj/machinery/door/airlock/hatch + name = "airtight hatch" + icon = 'icons/obj/doors/airlocks/hatch/centcom.dmi' + overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' + note_overlay_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_hatch + +/obj/machinery/door/airlock/maintenance_hatch + name = "maintenance hatch" + icon = 'icons/obj/doors/airlocks/hatch/maintenance.dmi' + overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' + note_overlay_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_mhatch + +// High Security Airlocks + +/obj/machinery/door/airlock/highsecurity + name = "high tech security airlock" + icon = 'icons/obj/doors/airlocks/highsec/highsec.dmi' + overlays_file = 'icons/obj/doors/airlocks/highsec/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_highsecurity + explosion_block = 2 + normal_integrity = 500 + security_level = 1 + damage_deflection = 30 + +// Shuttle Airlocks + +/obj/machinery/door/airlock/shuttle + name = "shuttle airlock" + icon = 'icons/obj/doors/airlocks/shuttle/shuttle.dmi' + overlays_file = 'icons/obj/doors/airlocks/shuttle/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_shuttle + +/obj/machinery/door/airlock/shuttle/glass + opacity = FALSE + glass = TRUE + +/obj/machinery/door/airlock/abductor + name = "alien airlock" + desc = "With humanity's current technological level, it could take years to hack this advanced airlock... or maybe we should give a screwdriver a try?" + icon = 'icons/obj/doors/airlocks/abductor/abductor_airlock.dmi' + overlays_file = 'icons/obj/doors/airlocks/abductor/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_abductor + note_overlay_file = 'icons/obj/doors/airlocks/external/overlays.dmi' + damage_deflection = 30 + explosion_block = 3 + hackProof = TRUE + aiControlDisabled = AI_WIRE_DISABLED + normal_integrity = 700 + security_level = 1 + +// Cult Airlocks + +/obj/machinery/door/airlock/cult + name = "cult airlock" + icon = 'icons/obj/doors/airlocks/cult/runed/cult.dmi' + overlays_file = 'icons/obj/doors/airlocks/cult/runed/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_cult + hackProof = TRUE + aiControlDisabled = AI_WIRE_DISABLED + req_access = list(ACCESS_BLOODCULT) + damage_deflection = 10 + var/openingoverlaytype = /obj/effect/temp_visual/cult/door + var/friendly = FALSE + var/stealthy = FALSE + +/obj/machinery/door/airlock/cult/Initialize(mapload) + . = ..() + new openingoverlaytype(loc) + +/obj/machinery/door/airlock/cult/canAIControl(mob/user) + return (IS_CULTIST(user) && !isAllPowerCut()) + +/obj/machinery/door/airlock/cult/on_break() + set_panel_open(TRUE) + +/obj/machinery/door/airlock/cult/isElectrified() + return FALSE + +/obj/machinery/door/airlock/cult/hasPower() + return TRUE + +/obj/machinery/door/airlock/cult/allowed(mob/living/L) + if(!density) + return TRUE + if(friendly || IS_CULTIST(L) || isshade(L) || isconstruct(L)) + if(!stealthy) + new openingoverlaytype(loc) + return TRUE + else + if(!stealthy) + new /obj/effect/temp_visual/cult/sac(loc) + var/atom/throwtarget + throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src))) + SEND_SOUND(L, sound(pick('sound/hallucinations/turn_around1.ogg','sound/hallucinations/turn_around2.ogg'),0,1,50)) + flash_color(L, flash_color="#960000", flash_time=20) + L.Paralyze(40) + L.throw_at(throwtarget, 5, 1) + return FALSE + +/obj/machinery/door/airlock/cult/proc/conceal() + icon = 'icons/obj/doors/airlocks/station/maintenance.dmi' + overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' + name = "Airlock" + desc = "It opens and closes." + stealthy = TRUE + update_appearance() + +/obj/machinery/door/airlock/cult/proc/reveal() + icon = initial(icon) + overlays_file = initial(overlays_file) + name = initial(name) + desc = initial(desc) + stealthy = initial(stealthy) + update_appearance() + +/obj/machinery/door/airlock/cult/narsie_act() + return + +/obj/machinery/door/airlock/cult/emp_act(severity) + return + +/obj/machinery/door/airlock/cult/friendly + friendly = TRUE + +/obj/machinery/door/airlock/cult/glass + glass = TRUE + opacity = FALSE + +/obj/machinery/door/airlock/cult/glass/friendly + friendly = TRUE + +/obj/machinery/door/airlock/cult/unruned + icon = 'icons/obj/doors/airlocks/cult/unruned/cult.dmi' + overlays_file = 'icons/obj/doors/airlocks/cult/unruned/overlays.dmi' + assemblytype = /obj/structure/door_assembly/door_assembly_cult/unruned + openingoverlaytype = /obj/effect/temp_visual/cult/door/unruned + +/obj/machinery/door/airlock/cult/unruned/friendly + friendly = TRUE + +/obj/machinery/door/airlock/cult/unruned/glass + glass = TRUE + opacity = FALSE + +/obj/machinery/door/airlock/cult/unruned/glass/friendly + friendly = TRUE + +/obj/machinery/door/airlock/cult/weak + name = "brittle cult airlock" + desc = "An airlock hastily corrupted by blood magic, it is unusually brittle in this state." + normal_integrity = 150 + damage_deflection = 5 + armor_type = /datum/armor/none + +// Material Airlocks + +/obj/machinery/door/airlock/material + name = "Airlock" + material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_GREYSCALE | MATERIAL_AFFECT_STATISTICS + greyscale_config = /datum/greyscale_config/material_airlock + assemblytype = /obj/structure/door_assembly/door_assembly_material + +/obj/machinery/door/airlock/material/close(forced, force_crush) + . = ..() + if(!.) + return + for(var/datum/material/mat in custom_materials) + if(mat.alpha < 255) + set_opacity(FALSE) + break + +/obj/machinery/door/airlock/material/prepare_deconstruction_assembly(obj/structure/door_assembly/assembly) + assembly.set_custom_materials(custom_materials) + ..() + +/obj/machinery/door/airlock/material/glass + opacity = FALSE + glass = TRUE + +// Multi-tile (Large) Airlocks + +/obj/machinery/door/airlock/multi_tile + icon = 'icons/obj/doors/airlocks/multi_tile/public/glass.dmi' + overlays_file = 'icons/obj/doors/airlocks/multi_tile/public/overlays.dmi' + assemblytype = /obj/structure/door_assembly/multi_tile/door_assembly_public + multi_tile = TRUE + opacity = FALSE + glass = TRUE + +/obj/structure/fluff/airlock_filler + name = "airlock fluff" + desc = "You shouldn't be able to see this fluff!" + icon = null + icon_state = null + density = TRUE + opacity = TRUE + anchored = TRUE + invisibility = INVISIBILITY_MAXIMUM + can_atmos_pass = ATMOS_PASS_DENSITY + /// The door/airlock this fluff panel is attached to + var/obj/machinery/door/filled_airlock + +/obj/machinery/door/airlock/multi_tile/public/glass + +/obj/machinery/door/airlock/multi_tile/narsie_act() + return + +/* + * Subtype used in unit tests to ensure instant airlock opening/closing. + * + * Pretty much just excises everything that would delay the process or is un-needed + * for the sake of the test (sleeps, icon animations). +*/ +/obj/machinery/door/airlock/instant + +// set_density on both open and close procs has a check and return builtin. + +/obj/machinery/door/airlock/instant/open(forced = DEFAULT_DOOR_CHECKS) + operating = TRUE + SEND_SIGNAL(src, COMSIG_AIRLOCK_OPEN, forced) + set_density(FALSE) + operating = FALSE + return TRUE + +/obj/machinery/door/airlock/instant/close(forced = DEFAULT_DOOR_CHECKS, force_crush = FALSE) + operating = TRUE + SEND_SIGNAL(src, COMSIG_AIRLOCK_CLOSE, forced) + set_density(TRUE) + operating = FALSE + return TRUE + + #undef AIRLOCK_CLOSED #undef AIRLOCK_CLOSING #undef AIRLOCK_OPEN diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm deleted file mode 100644 index 0d5ea4c8bb0..00000000000 --- a/code/game/machinery/doors/airlock_types.dm +++ /dev/null @@ -1,663 +0,0 @@ -/* - Station Airlocks Regular -*/ - -/obj/machinery/door/airlock/command - icon = 'icons/obj/doors/airlocks/station/command.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_com - normal_integrity = 450 - -/obj/machinery/door/airlock/security - icon = 'icons/obj/doors/airlocks/station/security.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_sec - normal_integrity = 450 - -/obj/machinery/door/airlock/engineering - icon = 'icons/obj/doors/airlocks/station/engineering.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_eng - -/obj/machinery/door/airlock/medical - icon = 'icons/obj/doors/airlocks/station/medical.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_med - -/obj/machinery/door/airlock/hydroponics //Hydroponics front doors! - icon = 'icons/obj/doors/airlocks/station/hydroponics.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_hydro - -/obj/machinery/door/airlock/maintenance - name = "maintenance access" - icon = 'icons/obj/doors/airlocks/station/maintenance.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_mai - normal_integrity = 250 - -/obj/machinery/door/airlock/maintenance/external - name = "external airlock access" - icon = 'icons/obj/doors/airlocks/station/maintenanceexternal.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_extmai - -/obj/machinery/door/airlock/mining - name = "mining airlock" - icon = 'icons/obj/doors/airlocks/station/mining.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_min - -/obj/machinery/door/airlock/atmos - name = "atmospherics airlock" - icon = 'icons/obj/doors/airlocks/station/atmos.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_atmo - -/obj/machinery/door/airlock/research - icon = 'icons/obj/doors/airlocks/station/research.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_research - -/obj/machinery/door/airlock/freezer - name = "freezer airlock" - icon = 'icons/obj/doors/airlocks/station/freezer.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_fre - -/obj/machinery/door/airlock/science - icon = 'icons/obj/doors/airlocks/station/science.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_science - -/obj/machinery/door/airlock/virology - icon = 'icons/obj/doors/airlocks/station/virology.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_viro - -////////////////////////////////// -/* - Station Airlocks Glass -*/ - -/obj/machinery/door/airlock/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/glass/incinerator - autoclose = FALSE - heat_proof = TRUE - req_access = list(ACCESS_SYNDICATE) - -/obj/machinery/door/airlock/glass/incinerator/syndicatelava_interior - name = "Turbine Interior Airlock" - id_tag = INCINERATOR_SYNDICATELAVA_AIRLOCK_INTERIOR - -/obj/machinery/door/airlock/glass/incinerator/syndicatelava_exterior - name = "Turbine Exterior Airlock" - id_tag = INCINERATOR_SYNDICATELAVA_AIRLOCK_EXTERIOR - -/obj/machinery/door/airlock/command/glass - opacity = FALSE - glass = TRUE - normal_integrity = 400 - -/obj/machinery/door/airlock/engineering/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/engineering/glass/critical - critical_machine = TRUE //stops greytide virus from opening & bolting doors in critical positions, such as the SM chamber. - -/obj/machinery/door/airlock/security/glass - opacity = FALSE - glass = TRUE - normal_integrity = 400 - -/obj/machinery/door/airlock/medical/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/hydroponics/glass //Uses same icon as medical/glass, maybe update it with its own unique icon one day? - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/research/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/research/glass/incinerator - autoclose = FALSE - heat_proof = TRUE - -/obj/machinery/door/airlock/research/glass/incinerator/ordmix_interior - name = "Mixing Room Interior Airlock" - id_tag = INCINERATOR_ORDMIX_AIRLOCK_INTERIOR - -/obj/machinery/door/airlock/research/glass/incinerator/ordmix_exterior - name = "Mixing Room Exterior Airlock" - id_tag = INCINERATOR_ORDMIX_AIRLOCK_EXTERIOR - -/obj/machinery/door/airlock/mining/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/atmos/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/atmos/glass/critical - critical_machine = TRUE //stops greytide virus from opening & bolting doors in critical positions, such as the SM chamber. - -/obj/machinery/door/airlock/science/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/virology/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/maintenance/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/maintenance/external/glass - opacity = FALSE - glass = TRUE - normal_integrity = 200 - -////////////////////////////////// -/* - Station Airlocks Mineral -*/ - -/obj/machinery/door/airlock/gold - name = "gold airlock" - icon = 'icons/obj/doors/airlocks/station/gold.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_gold - -/obj/machinery/door/airlock/gold/discoinferno - heat_proof = TRUE - resistance_flags = FIRE_PROOF - armor_type = /datum/armor/discoinferno_airlock - -/datum/armor/discoinferno_airlock - melee = 30 - bullet = 30 - laser = 20 - energy = 20 - bomb = 10 - fire = 100 - acid = 100 - -/obj/machinery/door/airlock/gold/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/silver - name = "silver airlock" - icon = 'icons/obj/doors/airlocks/station/silver.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_silver - -/obj/machinery/door/airlock/silver/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/diamond - name = "diamond airlock" - icon = 'icons/obj/doors/airlocks/station/diamond.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_diamond - normal_integrity = 1000 - explosion_block = 2 - -/obj/machinery/door/airlock/diamond/glass - normal_integrity = 950 - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/uranium - name = "uranium airlock" - icon = 'icons/obj/doors/airlocks/station/uranium.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_uranium - var/last_event = 0 - //Is this airlock actually radioactive? - var/actually_radioactive = TRUE - -/obj/machinery/door/airlock/uranium/process() - if(actually_radioactive && world.time > last_event+20) - if(prob(50)) - radiate() - last_event = world.time - ..() - -/obj/machinery/door/airlock/uranium/proc/radiate() - radiation_pulse( - src, - max_range = 2, - threshold = RAD_LIGHT_INSULATION, - chance = URANIUM_IRRADIATION_CHANCE, - minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME, - ) - -/obj/machinery/door/airlock/uranium/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/uranium/safe - actually_radioactive = FALSE - -/obj/machinery/door/airlock/uranium/glass/safe - actually_radioactive = FALSE - -/obj/machinery/door/airlock/plasma - name = "plasma airlock" - desc = "No way this can end badly." - icon = 'icons/obj/doors/airlocks/station/plasma.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_plasma - material_flags = MATERIAL_EFFECTS - material_modifier = 0.25 - -/obj/machinery/door/airlock/plasma/Initialize(mapload) - custom_materials = custom_materials ? custom_materials : list(/datum/material/plasma = SHEET_MATERIAL_AMOUNT * 10) - . = ..() - -/obj/machinery/door/airlock/plasma/block_superconductivity() //we don't stop the heat~ - return 0 - -/obj/machinery/door/airlock/plasma/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/bananium - name = "bananium airlock" - desc = "Honkhonkhonk" - icon = 'icons/obj/doors/airlocks/station/bananium.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_bananium - doorOpen = 'sound/items/bikehorn.ogg' - -/obj/machinery/door/airlock/bananium/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/sandstone - name = "sandstone airlock" - icon = 'icons/obj/doors/airlocks/station/sandstone.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_sandstone - -/obj/machinery/door/airlock/sandstone/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/wood - name = "wooden airlock" - icon = 'icons/obj/doors/airlocks/station/wood.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_wood - -/obj/machinery/door/airlock/wood/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/titanium - name = "shuttle airlock" - assemblytype = /obj/structure/door_assembly/door_assembly_titanium - icon = 'icons/obj/doors/airlocks/shuttle/shuttle.dmi' - overlays_file = 'icons/obj/doors/airlocks/shuttle/overlays.dmi' - normal_integrity = 400 - -/obj/machinery/door/airlock/titanium/glass - normal_integrity = 350 - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/bronze - name = "bronze airlock" - icon = 'icons/obj/doors/airlocks/clockwork/pinion_airlock.dmi' - overlays_file = 'icons/obj/doors/airlocks/clockwork/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_bronze - -/obj/machinery/door/airlock/bronze/seethru - assemblytype = /obj/structure/door_assembly/door_assembly_bronze/seethru - opacity = FALSE - glass = TRUE -////////////////////////////////// -/* - Station2 Airlocks -*/ - -/obj/machinery/door/airlock/public - icon = 'icons/obj/doors/airlocks/station2/glass.dmi' - overlays_file = 'icons/obj/doors/airlocks/station2/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_public - -/obj/machinery/door/airlock/public/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/public/glass/incinerator - autoclose = FALSE - heat_proof = TRUE - -/obj/machinery/door/airlock/public/glass/incinerator/atmos_interior - name = "Turbine Interior Airlock" - id_tag = INCINERATOR_ATMOS_AIRLOCK_INTERIOR - -/obj/machinery/door/airlock/public/glass/incinerator/atmos_exterior - name = "Turbine Exterior Airlock" - id_tag = INCINERATOR_ATMOS_AIRLOCK_EXTERIOR - -////////////////////////////////// -/* - External Airlocks -*/ - -/obj/machinery/door/airlock/external - name = "external airlock" - icon = 'icons/obj/doors/airlocks/external/external.dmi' - overlays_file = 'icons/obj/doors/airlocks/external/overlays.dmi' - note_overlay_file = 'icons/obj/doors/airlocks/external/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_ext - - /// Whether or not the airlock can be opened without access from a certain direction while powered, or with bare hands from any direction while unpowered OR pressurized. - var/space_dir = null - -/obj/machinery/door/airlock/external/Initialize(mapload, ...) - // default setting is for mapping only, let overrides work - if(!mapload) - req_access = null - - return ..() - -/obj/machinery/door/airlock/external/LateInitialize() - . = ..() - if(space_dir) - unres_sides |= space_dir - -/obj/machinery/door/airlock/external/examine(mob/user) - . = ..() - if(space_dir) - . += span_notice("It has labels indicating that it has an emergency mechanism to open from the [dir2text(space_dir)] side with just your hands even if there's no power.") - -/obj/machinery/door/airlock/external/cyclelinkairlock() - . = ..() - var/obj/machinery/door/airlock/external/cycle_linked_external_airlock = cyclelinkedairlock - if(istype(cycle_linked_external_airlock)) - cycle_linked_external_airlock.space_dir |= space_dir - space_dir |= cycle_linked_external_airlock.space_dir - -/obj/machinery/door/airlock/external/try_safety_unlock(mob/user) - if(space_dir && density) - if(!hasPower()) - to_chat(user, span_notice("You begin unlocking the airlock safety mechanism...")) - if(do_after(user, 15 SECONDS, target = src)) - try_to_crowbar(null, user, TRUE) - return TRUE - else - // always open from the space side - // get_dir(src, user) & space_dir, checked in unresricted_sides - var/should_safety_open = shuttledocked || cyclelinkedairlock?.shuttledocked || is_safe_turf(get_step(src, space_dir), TRUE, FALSE) - return try_to_activate_door(user, should_safety_open) - - return ..() - -/// Access free external airlock -/obj/machinery/door/airlock/external/ruin - -/obj/machinery/door/airlock/external/glass - opacity = FALSE - glass = TRUE - -/// Access free external glass airlock -/obj/machinery/door/airlock/external/glass/ruin - -////////////////////////////////// -/* - CentCom Airlocks -*/ - -/obj/machinery/door/airlock/centcom //Use grunge as a station side version, as these have special effects related to them via phobias and such. - icon = 'icons/obj/doors/airlocks/centcom/centcom.dmi' - overlays_file = 'icons/obj/doors/airlocks/centcom/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_centcom - normal_integrity = 1000 - security_level = 6 - explosion_block = 2 - -/obj/machinery/door/airlock/grunge - icon = 'icons/obj/doors/airlocks/centcom/centcom.dmi' - overlays_file = 'icons/obj/doors/airlocks/centcom/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_grunge - -////////////////////////////////// -/* - Vault Airlocks -*/ - -/obj/machinery/door/airlock/vault - name = "vault door" - icon = 'icons/obj/doors/airlocks/vault/vault.dmi' - overlays_file = 'icons/obj/doors/airlocks/vault/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_vault - explosion_block = 2 - normal_integrity = 400 // reverse engieneerd: 400 * 1.5 (sec lvl 6) = 600 = original - security_level = 6 - -////////////////////////////////// -/* - Hatch Airlocks -*/ - -/obj/machinery/door/airlock/hatch - name = "airtight hatch" - icon = 'icons/obj/doors/airlocks/hatch/centcom.dmi' - overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' - note_overlay_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_hatch - -/obj/machinery/door/airlock/maintenance_hatch - name = "maintenance hatch" - icon = 'icons/obj/doors/airlocks/hatch/maintenance.dmi' - overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' - note_overlay_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_mhatch - -////////////////////////////////// -/* - High Security Airlocks -*/ - -/obj/machinery/door/airlock/highsecurity - name = "high tech security airlock" - icon = 'icons/obj/doors/airlocks/highsec/highsec.dmi' - overlays_file = 'icons/obj/doors/airlocks/highsec/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_highsecurity - explosion_block = 2 - normal_integrity = 500 - security_level = 1 - damage_deflection = 30 - -////////////////////////////////// -/* - Shuttle Airlocks -*/ - -/obj/machinery/door/airlock/shuttle - name = "shuttle airlock" - icon = 'icons/obj/doors/airlocks/shuttle/shuttle.dmi' - overlays_file = 'icons/obj/doors/airlocks/shuttle/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_shuttle - -/obj/machinery/door/airlock/shuttle/glass - opacity = FALSE - glass = TRUE - -/obj/machinery/door/airlock/abductor - name = "alien airlock" - desc = "With humanity's current technological level, it could take years to hack this advanced airlock... or maybe we should give a screwdriver a try?" - icon = 'icons/obj/doors/airlocks/abductor/abductor_airlock.dmi' - overlays_file = 'icons/obj/doors/airlocks/abductor/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_abductor - note_overlay_file = 'icons/obj/doors/airlocks/external/overlays.dmi' - damage_deflection = 30 - explosion_block = 3 - hackProof = TRUE - aiControlDisabled = AI_WIRE_DISABLED - normal_integrity = 700 - security_level = 1 - -////////////////////////////////// -/* - Cult Airlocks -*/ - -/obj/machinery/door/airlock/cult - name = "cult airlock" - icon = 'icons/obj/doors/airlocks/cult/runed/cult.dmi' - overlays_file = 'icons/obj/doors/airlocks/cult/runed/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_cult - hackProof = TRUE - aiControlDisabled = AI_WIRE_DISABLED - req_access = list(ACCESS_BLOODCULT) - damage_deflection = 10 - var/openingoverlaytype = /obj/effect/temp_visual/cult/door - var/friendly = FALSE - var/stealthy = FALSE - -/obj/machinery/door/airlock/cult/Initialize(mapload) - . = ..() - new openingoverlaytype(loc) - -/obj/machinery/door/airlock/cult/canAIControl(mob/user) - return (IS_CULTIST(user) && !isAllPowerCut()) - -/obj/machinery/door/airlock/cult/on_break() - set_panel_open(TRUE) - -/obj/machinery/door/airlock/cult/isElectrified() - return FALSE - -/obj/machinery/door/airlock/cult/hasPower() - return TRUE - -/obj/machinery/door/airlock/cult/allowed(mob/living/L) - if(!density) - return TRUE - if(friendly || IS_CULTIST(L) || isshade(L) || isconstruct(L)) - if(!stealthy) - new openingoverlaytype(loc) - return TRUE - else - if(!stealthy) - new /obj/effect/temp_visual/cult/sac(loc) - var/atom/throwtarget - throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src))) - SEND_SOUND(L, sound(pick('sound/hallucinations/turn_around1.ogg','sound/hallucinations/turn_around2.ogg'),0,1,50)) - flash_color(L, flash_color="#960000", flash_time=20) - L.Paralyze(40) - L.throw_at(throwtarget, 5, 1) - return FALSE - -/obj/machinery/door/airlock/cult/proc/conceal() - icon = 'icons/obj/doors/airlocks/station/maintenance.dmi' - overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' - name = "Airlock" - desc = "It opens and closes." - stealthy = TRUE - update_appearance() - -/obj/machinery/door/airlock/cult/proc/reveal() - icon = initial(icon) - overlays_file = initial(overlays_file) - name = initial(name) - desc = initial(desc) - stealthy = initial(stealthy) - update_appearance() - -/obj/machinery/door/airlock/cult/narsie_act() - return - -/obj/machinery/door/airlock/cult/emp_act(severity) - return - -/obj/machinery/door/airlock/cult/friendly - friendly = TRUE - -/obj/machinery/door/airlock/cult/glass - glass = TRUE - opacity = FALSE - -/obj/machinery/door/airlock/cult/glass/friendly - friendly = TRUE - -/obj/machinery/door/airlock/cult/unruned - icon = 'icons/obj/doors/airlocks/cult/unruned/cult.dmi' - overlays_file = 'icons/obj/doors/airlocks/cult/unruned/overlays.dmi' - assemblytype = /obj/structure/door_assembly/door_assembly_cult/unruned - openingoverlaytype = /obj/effect/temp_visual/cult/door/unruned - -/obj/machinery/door/airlock/cult/unruned/friendly - friendly = TRUE - -/obj/machinery/door/airlock/cult/unruned/glass - glass = TRUE - opacity = FALSE - -/obj/machinery/door/airlock/cult/unruned/glass/friendly - friendly = TRUE - -/obj/machinery/door/airlock/cult/weak - name = "brittle cult airlock" - desc = "An airlock hastily corrupted by blood magic, it is unusually brittle in this state." - normal_integrity = 150 - damage_deflection = 5 - armor_type = /datum/armor/none - - -////////////////////////////////// -/* - Material Airlocks -*/ -/obj/machinery/door/airlock/material - name = "Airlock" - material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_GREYSCALE | MATERIAL_AFFECT_STATISTICS - greyscale_config = /datum/greyscale_config/material_airlock - assemblytype = /obj/structure/door_assembly/door_assembly_material - -/obj/machinery/door/airlock/material/close(forced, force_crush) - . = ..() - if(!.) - return - for(var/datum/material/mat in custom_materials) - if(mat.alpha < 255) - set_opacity(FALSE) - break - -/obj/machinery/door/airlock/material/prepare_deconstruction_assembly(obj/structure/door_assembly/assembly) - assembly.set_custom_materials(custom_materials) - ..() - -/obj/machinery/door/airlock/material/glass - opacity = FALSE - glass = TRUE - -////////////////////////////////// -/* - Misc Airlocks -*/ - -/obj/machinery/door/airlock/glass_large - name = "large glass airlock" - icon = 'icons/obj/doors/airlocks/glass_large/glass_large.dmi' - overlays_file = 'icons/obj/doors/airlocks/glass_large/overlays.dmi' - opacity = FALSE - assemblytype = null - glass = TRUE - bound_width = 64 // 2x1 - -/obj/machinery/door/airlock/glass_large/narsie_act() - return - -/// Subtype used in unit tests to ensure instant airlock opening/closing. Pretty much just excises everything that would delay the process or is un-needed for the sake of the test (sleeps, icon animations). -/obj/machinery/door/airlock/instant - -// set_density on both open and close procs has a check and return builtin. - -/obj/machinery/door/airlock/instant/open(forced = DEFAULT_DOOR_CHECKS) - operating = TRUE - SEND_SIGNAL(src, COMSIG_AIRLOCK_OPEN, forced) - set_density(FALSE) - operating = FALSE - return TRUE - -/obj/machinery/door/airlock/instant/close(forced = DEFAULT_DOOR_CHECKS, force_crush = FALSE) - operating = TRUE - SEND_SIGNAL(src, COMSIG_AIRLOCK_CLOSE, forced) - set_density(TRUE) - operating = FALSE - return TRUE diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 671e3efb197..78223b813b3 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -27,6 +27,10 @@ var/visible = TRUE var/operating = FALSE var/glass = FALSE + /// Do we need to keep track of a filler panel with the airlock + var/multi_tile + /// A filler object used to fill the space of multi-tile airlocks + var/obj/structure/fluff/airlock_filler/filler var/welded = FALSE var/heat_proof = FALSE // For rglass-windowed airlocks and firedoors var/emergency = FALSE // Emergency access override @@ -66,6 +70,10 @@ AddElement(/datum/element/blocks_explosives) . = ..() set_init_door_layer() + if(multi_tile) + set_bounds() + set_filler() + update_overlays() update_freelook_sight() air_update_turf(TRUE, TRUE) register_context() @@ -133,9 +141,46 @@ if(spark_system) qdel(spark_system) spark_system = null + QDEL_NULL(filler) air_update_turf(TRUE, FALSE) return ..() +/obj/machinery/door/Move() + if(multi_tile) + set_filler() + return ..() + +/** + * Sets the bounds of the airlock. For use with multi-tile airlocks. + * If the airlock is multi-tile, it will set the bounds to be the size of the airlock. + * If the airlock doesn't already have a filler object, it will create one. + * If the airlock already has a filler object, it will move it to the correct location. + */ +/obj/machinery/door/proc/set_filler() + if(!multi_tile) + return + if(!filler) + filler = new(get_step(src, get_adjusted_dir(dir))) + filler.pair_airlock(src) + else + filler.loc = get_step(src, get_adjusted_dir(dir)) + + filler.density = density + filler.set_opacity(opacity) + +/** + * Checks which way the airlock is facing and adjusts the direction accordingly. + * For use with multi-tile airlocks. + * + * @param dir direction to adjust + * @return adjusted direction + */ +/obj/machinery/door/proc/get_adjusted_dir(dir) + if(dir in list(NORTH, SOUTH)) + return EAST + else + return NORTH + /** * Signal handler for checking if we notify our surrounding that access requirements are lifted accordingly to a newly set security level * @@ -453,31 +498,31 @@ open() /obj/machinery/door/proc/crush() - for(var/mob/living/L in get_turf(src)) - L.visible_message(span_warning("[src] closes on [L], crushing [L.p_them()]!"), span_userdanger("[src] closes on you and crushes you!")) - SEND_SIGNAL(L, COMSIG_LIVING_DOORCRUSHED, src) - if(isalien(L)) //For xenos - L.adjustBruteLoss(DOOR_CRUSH_DAMAGE * 1.5) //Xenos go into crit after aproximately the same amount of crushes as humans. - L.emote("roar") - else if(ishuman(L)) //For humans - L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) - L.emote("scream") - //L.Paralyze(100) //SKYRAT EDIT CHANGE - COMBAT - ORIGINAL - L.StaminaKnockdown(20, TRUE, TRUE) - else if(ismonkey(L)) //For monkeys - L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) - //L.Paralyze(100) //ORIGINAL - L.StaminaKnockdown(20, TRUE, TRUE) - //SKYRAT EDIT END - else //for simple_animals & borgs - L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) - var/turf/location = get_turf(src) - //add_blood doesn't work for borgs/xenos, but add_blood_floor does. - L.add_splatter_floor(location) - log_combat(src, L, "crushed") - for(var/obj/vehicle/sealed/mecha/M in get_turf(src)) - M.take_damage(DOOR_CRUSH_DAMAGE) - log_combat(src, M, "crushed") + for(var/turf/checked_turf in locs) + for(var/mob/living/future_pancake in checked_turf) + future_pancake.visible_message(span_warning("[src] closes on [future_pancake], crushing [future_pancake.p_them()]!"), span_userdanger("[src] closes on you and crushes you!")) + SEND_SIGNAL(future_pancake, COMSIG_LIVING_DOORCRUSHED, src) + if(isalien(future_pancake)) //For xenos + future_pancake.adjustBruteLoss(DOOR_CRUSH_DAMAGE * 1.5) //Xenos go into crit after aproximately the same amount of crushes as humans. + future_pancake.emote("roar") + else if(ishuman(future_pancake)) //For humans + future_pancake.adjustBruteLoss(DOOR_CRUSH_DAMAGE) + future_pancake.emote("scream") + // future_pancake.Paralyze(100) // ORIGINAL + future_pancake.StaminaKnockdown(20, TRUE, TRUE) // SKYRAT EDIT CHANGE - AIRLOCKS + else if(ismonkey(future_pancake)) //For monkeys + future_pancake.adjustBruteLoss(DOOR_CRUSH_DAMAGE) + // future_pancake.Paralyze(100) // ORIGINAL + future_pancake.StaminaKnockdown(20, TRUE, TRUE) // SKYRAT EDIT CHANGE - AIRLOCKS + else //for simple_animals & borgs + future_pancake.adjustBruteLoss(DOOR_CRUSH_DAMAGE) + var/turf/location = get_turf(src) + //add_blood doesn't work for borgs/xenos, but add_blood_floor does. + future_pancake.add_splatter_floor(location) + log_combat(src, future_pancake, "crushed") + for(var/obj/vehicle/sealed/mecha/mech in get_turf(src)) // Your fancy metal won't save you here! + mech.take_damage(DOOR_CRUSH_DAMAGE) + log_combat(src, mech, "crushed") /obj/machinery/door/proc/autoclose() if(!QDELETED(src) && !density && !operating && !locked && !welded && autoclose) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 6f6598803b6..f39e6faa711 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -696,6 +696,11 @@ /obj/machinery/door/firedoor/border_only/Initialize(mapload) . = ..() adjust_lights_starting_offset() + var/static/list/loc_connections = list( + COMSIG_ATOM_EXIT = PROC_REF(on_exit), + ) + + AddElement(/datum/element/connect_loc, loc_connections) /obj/machinery/door/firedoor/border_only/adjust_lights_starting_offset() light_xoffset = 0 @@ -882,9 +887,9 @@ /obj/structure/firelock_frame/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) if(the_rcd.mode == RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 16) + return list("mode" = RCD_DECONSTRUCT, "delay" = 5 SECONDS, "cost" = 16) else if((constructionStep == CONSTRUCTION_NO_CIRCUIT) && (the_rcd.upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS)) - return list("mode" = RCD_UPGRADE_SIMPLE_CIRCUITS, "delay" = 20, "cost" = 1) + return list("mode" = RCD_UPGRADE_SIMPLE_CIRCUITS, "delay" = 2 SECONDS, "cost" = 1) return FALSE /obj/structure/firelock_frame/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) diff --git a/code/game/machinery/doors/passworddoor.dm b/code/game/machinery/doors/passworddoor.dm index 2bd3a5320b4..21b0bb2e193 100644 --- a/code/game/machinery/doors/passworddoor.dm +++ b/code/game/machinery/doors/passworddoor.dm @@ -9,9 +9,18 @@ armor_type = /datum/armor/door_password resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF damage_deflection = 70 + /// Password that must be provided to open the door. var/password = "Swordfish" - var/interaction_activated = TRUE //use the door to enter the password - var/voice_activated = FALSE //Say the password nearby to open the door. + /// Setting to true allows the user to input the password through a text box after clicking on the door. + var/interaction_activated = TRUE + /// Say the password nearby to open the door. + var/voice_activated = FALSE + /// Sound used upon opening. + var/door_open = 'sound/machines/blastdoor.ogg' + /// Sound used upon closing. + var/door_close = 'sound/machines/blastdoor.ogg' + /// Sound used upon denying. + var/door_deny = 'sound/machines/buzz-sigh.ogg' /obj/machinery/door/password/voice voice_activated = TRUE @@ -60,13 +69,13 @@ switch(animation) if("opening") flick("opening", src) - playsound(src, 'sound/machines/blastdoor.ogg', 50, TRUE) + playsound(src, door_open, 50, TRUE) if("closing") flick("closing", src) - playsound(src, 'sound/machines/blastdoor.ogg', 50, TRUE) + playsound(src, door_close, 50, TRUE) if("deny") //Deny animation would be nice to have. - playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) + playsound(src, door_deny, 30, TRUE) /obj/machinery/door/password/proc/ask_for_pass(mob/user) var/guess = tgui_input_text(user, "Enter the password", "Password") diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 182556550df..35044d5a81a 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -441,7 +441,7 @@ /obj/machinery/door/window/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 32) + return list("mode" = RCD_DECONSTRUCT, "delay" = 5 SECONDS, "cost" = 32) return FALSE /obj/machinery/door/window/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index d806110b45d..be630c0a19e 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -423,7 +423,7 @@ /obj/machinery/firealarm/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) if((buildstage == FIRE_ALARM_BUILD_NO_CIRCUIT) && (the_rcd.upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS)) - return list("mode" = RCD_WALLFRAME, "delay" = 20, "cost" = 1) + return list("mode" = RCD_WALLFRAME, "delay" = 2 SECONDS, "cost" = 1) return FALSE /obj/machinery/firealarm/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) @@ -481,7 +481,7 @@ // Allows Silicons to disable thermal sensor /obj/machinery/firealarm/BorgCtrlClick(mob/living/silicon/robot/user) - if(get_dist(src,user) <= user.interaction_range) + if(get_dist(src,user) <= user.interaction_range && !(user.control_disabled)) AICtrlClick(user) return return ..() diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index bbfb440afc7..8d3c4febd70 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -178,7 +178,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/flasher, 26) if(iscarbon(proximity_check_mob)) var/mob/living/carbon/proximity_carbon = proximity_check_mob - if (proximity_carbon.m_intent != MOVE_INTENT_WALK && anchored) + if (proximity_carbon.move_intent != MOVE_INTENT_WALK && anchored) flash() /obj/machinery/flasher/portable/vv_edit_var(vname, vval) diff --git a/code/game/machinery/gulag_item_reclaimer.dm b/code/game/machinery/gulag_item_reclaimer.dm index 1a05ed756aa..9c649b2c8ee 100644 --- a/code/game/machinery/gulag_item_reclaimer.dm +++ b/code/game/machinery/gulag_item_reclaimer.dm @@ -11,10 +11,10 @@ ///Icon of the current screen status var/screen_icon = "gulag_on" -/obj/machinery/gulag_item_reclaimer/handle_atom_del(atom/deleting_atom) +/obj/machinery/gulag_item_reclaimer/Exited(atom/movable/gone, direction) + . = ..() for(var/person in stored_items) - stored_items[person] -= deleting_atom - return ..() + stored_items[person] -= gone /obj/machinery/gulag_item_reclaimer/update_overlays() . = ..() diff --git a/code/game/machinery/incident_display.dm b/code/game/machinery/incident_display.dm index 00da0ffa21a..5ec7c50ecfd 100644 --- a/code/game/machinery/incident_display.dm +++ b/code/game/machinery/incident_display.dm @@ -372,3 +372,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/incident_display/tram, 32) #undef DESC_DUAL #undef DESC_DELAM #undef DESC_TRAM + +#undef TREND_RISING +#undef TREND_FALLING diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 2d45bd57100..10c19336119 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -443,6 +443,9 @@ default_unfasten_wrench(user, tool) return TOOL_ACT_TOOLTYPE_SUCCESS +/obj/machinery/iv_drip/plumbing/deconstruct(disassembled = TRUE) + qdel(src) + /atom/movable/screen/alert/iv_connected name = "IV Connected" desc = "You have an IV connected to your arm. Remember to remove it or drag the IV stand with you before moving, or else it will rip out!" @@ -457,3 +460,5 @@ #undef IV_TRANSFER_RATE_STEP #undef ALERT_IV_CONNECTED + +#undef DEFAULT_IV_TRANSFER_RATE diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index 10a46502537..f3f463bcae7 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -77,7 +77,7 @@ if(!multitool_check_buffer(user, I)) return var/obj/item/multitool/M = I - M.buffer = src + M.set_buffer(src) to_chat(user, span_notice("You save the data in the [I.name]'s buffer.")) return 1 diff --git a/code/game/machinery/mechlaunchpad.dm b/code/game/machinery/mechlaunchpad.dm index 10f5ab66903..54cda76f989 100644 --- a/code/game/machinery/mechlaunchpad.dm +++ b/code/game/machinery/mechlaunchpad.dm @@ -36,7 +36,7 @@ if(!multitool_check_buffer(user, tool)) return var/obj/item/multitool/multitool = tool - multitool.buffer = src + multitool.set_buffer(src) to_chat(user, span_notice("You save the data in the [multitool.name]'s buffer.")) return TRUE diff --git a/code/game/machinery/medical_kiosk.dm b/code/game/machinery/medical_kiosk.dm index a0a1a40ed43..b5aa3ab24e3 100644 --- a/code/game/machinery/medical_kiosk.dm +++ b/code/game/machinery/medical_kiosk.dm @@ -43,8 +43,30 @@ /obj/machinery/medical_kiosk/Initialize(mapload) //loaded subtype for mapping use . = ..() AddComponent(/datum/component/payment, active_price, SSeconomy.get_dep_account(ACCOUNT_MED), PAYMENT_FRIENDLY) + register_context() scanner_wand = new/obj/item/scanner_wand(src) +/obj/machinery/medical_kiosk/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + var/screentip_change = FALSE + + if(!held_item && scanner_wand) + context[SCREENTIP_CONTEXT_RMB] = "Pick up scanner wand" + return screentip_change = TRUE + + if(istype(held_item) && held_item.tool_behaviour == TOOL_WRENCH) + context[SCREENTIP_CONTEXT_LMB] = anchored ? "Unsecure" : "Secure" + return screentip_change = TRUE + if(istype(held_item) && held_item.tool_behaviour == TOOL_CROWBAR && panel_open) + context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" + return screentip_change = TRUE + if(istype(held_item) && held_item.tool_behaviour == TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_LMB] = panel_open ? "Close panel" : "Open panel" + return screentip_change = TRUE + if(istype(held_item, /obj/item/scanner_wand)) + context[SCREENTIP_CONTEXT_LMB] = "Return the scanner wand" + return screentip_change = TRUE + /obj/machinery/medical_kiosk/proc/inuse() //Verifies that the user can use the interface, followed by showing medical information. var/mob/living/carbon/human/paying = paying_ref?.resolve() if(!paying) @@ -104,13 +126,13 @@ if(istype(O, /obj/item/scanner_wand)) var/obj/item/scanner_wand/W = O if(scanner_wand) - to_chat(user, span_warning("There's already a scanner wand in [src]!")) + balloon_alert(user, "already has a wand!") return if(HAS_TRAIT(O, TRAIT_NODROP) || !user.transferItemToLoc(O, src)) - to_chat(user, span_warning("[O] is stuck to your hand!")) + balloon_alert(user, "stuck to your hand!") return - user.visible_message(span_notice("[user] snaps [O] onto [src]!"), \ - span_notice("You press [O] into the side of [src], clicking into place.")) + user.visible_message(span_notice("[user] snaps [O] onto [src]!")) + balloon_alert(user, "wand returned") //This will be the scanner returning scanner_wand's selected_target variable and assigning it to the altPatient var if(W.selected_target) var/datum/weakref/target_ref = WEAKREF(W.return_patient()) @@ -124,20 +146,24 @@ return return ..() -/obj/machinery/medical_kiosk/AltClick(mob/living/carbon/user) - if(!istype(user) || !user.can_perform_action(src)) - return +/obj/machinery/medical_kiosk/attack_hand_secondary(mob/user, list/modifiers) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(!ishuman(user) || !user.can_perform_action(src)) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN if(!scanner_wand) - to_chat(user, span_warning("The scanner wand is currently removed from the machine.")) - return + balloon_alert(user, "no scanner wand!") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN if(!user.put_in_hands(scanner_wand)) - to_chat(user, span_warning("The scanner wand falls to the floor.")) + balloon_alert(user, "scanner wand falls!") scanner_wand = null - return - user.visible_message(span_notice("[user] unhooks the [scanner_wand] from [src]."), \ - span_notice("You detach the [scanner_wand] from [src].")) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + user.visible_message(span_notice("[user] unhooks the [scanner_wand] from [src].")) + balloon_alert(user, "scanner pulled") playsound(src, 'sound/machines/click.ogg', 60, TRUE) scanner_wand = null + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /obj/machinery/medical_kiosk/Destroy() qdel(scanner_wand) @@ -162,7 +188,7 @@ if(scanner_wand == null) . += span_notice("\The [src] is missing its scanner.") else - . += span_notice("\The [src] has its scanner clipped to the side. Alt-Click to remove.") + . += span_notice("\The [src] has its scanner clipped to the side. Right Click to remove.") /obj/machinery/medical_kiosk/ui_interact(mob/user, datum/tgui/ui) var/patient_distance = 0 diff --git a/code/game/machinery/mining_weather_monitor.dm b/code/game/machinery/mining_weather_monitor.dm new file mode 100644 index 00000000000..d05d8820751 --- /dev/null +++ b/code/game/machinery/mining_weather_monitor.dm @@ -0,0 +1,26 @@ +/// Wall mounted mining weather tracker +/obj/machinery/mining_weather_monitor + name = "barometric monitor" + desc = "A machine monitoring atmospheric data from mining environments. Provides warnings about incoming weather fronts." + icon = 'icons/obj/miningradio.dmi' + icon_state = "wallmount" + luminosity = 1 + light_power = 1 + light_range = 1.6 + +/obj/machinery/mining_weather_monitor/Initialize(mapload, ndir, nbuild) + . = ..() + AddComponent( \ + /datum/component/weather_announcer, \ + state_normal = "wallgreen", \ + state_warning = "wallyellow", \ + state_danger = "wallred", \ + ) + +/obj/machinery/mining_weather_monitor/update_overlays() + . = ..() + if((machine_stat & BROKEN) || !powered()) + return + . += emissive_appearance(icon, "emissive", src) + +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/mining_weather_monitor, 28) diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 4e65f957d79..b19a8032e7d 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -350,7 +350,7 @@ DEFINE_BITFIELD(turret_flags, list( if(!multitool_check_buffer(user, I)) return var/obj/item/multitool/M = I - M.buffer = src + M.set_buffer(src) to_chat(user, span_notice("You add [src] to multitool buffer.")) else return ..() diff --git a/code/game/machinery/porta_turret/portable_turret_cover.dm b/code/game/machinery/porta_turret/portable_turret_cover.dm index 2ff41a17283..89f41386691 100644 --- a/code/game/machinery/porta_turret/portable_turret_cover.dm +++ b/code/game/machinery/porta_turret/portable_turret_cover.dm @@ -65,7 +65,7 @@ if(!multitool_check_buffer(user, I)) return var/obj/item/multitool/M = I - M.buffer = parent_turret + M.set_buffer(parent_turret) to_chat(user, span_notice("You add [parent_turret] to multitool buffer.")) return return ..() diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm index 11a4a2ef10c..a855c2d5523 100644 --- a/code/game/machinery/quantum_pad.dm +++ b/code/game/machinery/quantum_pad.dm @@ -62,7 +62,7 @@ if(!multitool_check_buffer(user, I)) return var/obj/item/multitool/M = I - M.buffer = src + M.set_buffer(src) to_chat(user, span_notice("You save the data in [I]'s buffer. It can now be saved to pads with closed panels.")) return TRUE else if(I.tool_behaviour == TOOL_MULTITOOL) diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 3e78f2dfe54..ddf55388d0b 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -113,9 +113,15 @@ if(border_dir == eat_dir) return TRUE -/obj/machinery/recycler/proc/on_entered(datum/source, atom/movable/AM) +/obj/machinery/recycler/proc/on_entered(datum/source, atom/movable/enterer, old_loc) SIGNAL_HANDLER - INVOKE_ASYNC(src, PROC_REF(eat), AM) + + // This is explicitly so we avoid processing items that are entering from nullspace, + // to avoid infinite loops. + if(!old_loc) + return + + INVOKE_ASYNC(src, PROC_REF(eat), enterer) /obj/machinery/recycler/proc/eat(atom/movable/morsel, sound=TRUE) if(machine_stat & (BROKEN|NOPOWER)) @@ -188,8 +194,8 @@ new wood.plank_type(loc, 1 + seed_modifier) . = TRUE else - var/retrived = materials.insert_item(weapon, multiplier = (amount_produced / 100), breakdown_flags=BREAKDOWN_FLAGS_RECYCLER) - if(retrived > 0) //item was salvaged i.e. deleted + var/retrieved = materials.insert_item(weapon, multiplier = (amount_produced / 100), breakdown_flags = BREAKDOWN_FLAGS_RECYCLER) + if(retrieved > 0) //item was salvaged i.e. deleted materials.retrieve_all() return TRUE qdel(weapon) diff --git a/code/game/machinery/sheetifier.dm b/code/game/machinery/sheetifier.dm index 57decf63ae4..30ce4860074 100644 --- a/code/game/machinery/sheetifier.dm +++ b/code/game/machinery/sheetifier.dm @@ -38,12 +38,12 @@ icon_state = "base_machine[busy_processing ? "_processing" : ""]" return ..() -/obj/machinery/sheetifier/proc/CanInsertMaterials(obj/machinery/machine, held_item, user) +/obj/machinery/sheetifier/proc/CanInsertMaterials(container, held_item, user) SIGNAL_HANDLER return busy_processing ? MATCONTAINER_BLOCK_INSERT : TRUE -/obj/machinery/sheetifier/proc/AfterInsertMaterials(obj/machinery/machine, item_inserted, id_inserted, amount_inserted, container) +/obj/machinery/sheetifier/proc/AfterInsertMaterials(container, item_inserted, id_inserted, mats_consumed, amount_inserted, atom/context) busy_processing = TRUE update_appearance() var/datum/material/last_inserted_material = id_inserted diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index ad8966024fd..20b64c6817e 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -548,3 +548,5 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/status_display/ai, 32) #undef LINE2_X #undef LINE2_Y #undef STATUS_DISPLAY_FONT_DATUM + +#undef SCROLL_PADDING diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index c329071405b..d5d0e9c732e 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -1,5 +1,5 @@ // SUIT STORAGE UNIT ///////////////// -/obj/machinery/suit_storage_unit//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE +/obj/machinery/suit_storage_unit name = "suit storage unit" desc = "An industrial unit made to hold and decontaminate irradiated equipment. It comes with a built-in UV cauterization mechanism. A small warning label advises that organic matter should not be placed into the unit." icon = 'icons/obj/machines/suit_storage.dmi' diff --git a/code/game/machinery/telecomms/broadcasting.dm b/code/game/machinery/telecomms/broadcasting.dm index b0a495b5314..2ba6856ce1f 100644 --- a/code/game/machinery/telecomms/broadcasting.dm +++ b/code/game/machinery/telecomms/broadcasting.dm @@ -183,11 +183,7 @@ // Add observers who have ghost radio enabled. for(var/mob/dead/observer/ghost in GLOB.player_list) - if(ghost.client && !ghost.client.prefs) - stack_trace("[ghost] ([ghost.ckey]) had null prefs, which shouldn't be possible!") - continue - - if(ghost.client?.prefs.chat_toggles & CHAT_GHOSTRADIO) + if(get_chat_toggles(ghost.client) & CHAT_GHOSTRADIO) receive |= ghost // Render the message and have everybody hear it. diff --git a/code/game/machinery/telecomms/computers/telemonitor.dm b/code/game/machinery/telecomms/computers/telemonitor.dm index 3d12932d99d..b862a6372b7 100644 --- a/code/game/machinery/telecomms/computers/telemonitor.dm +++ b/code/game/machinery/telecomms/computers/telemonitor.dm @@ -98,6 +98,7 @@ screen = MAIN_VIEW return TRUE return TRUE + /obj/machinery/computer/telecomms/monitor/attackby() . = ..() updateUsrDialog() diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 8b19a4f70df..f3d5f8d8352 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -153,10 +153,10 @@ var/obj/machinery/telecomms/T = heldmultitool.buffer . = add_new_link(T, operator) if("buffer") - heldmultitool.buffer = src + heldmultitool.set_buffer(src) . = TRUE if("flush") - heldmultitool.buffer = null + heldmultitool.set_buffer(null) . = TRUE add_act(action, params) diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm index 1e012d10027..02a146fac31 100644 --- a/code/game/machinery/telecomms/machines/message_server.dm +++ b/code/game/machinery/telecomms/machines/message_server.dm @@ -193,7 +193,6 @@ for (var/datum/computer_file/program/messenger/app in data["targets"]) if(!QDELETED(app)) app.receive_message(src) - data["targets"] = null // Request Console signal datum /datum/signal/subspace/messaging/rc/broadcast() diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 5ee4c702cf2..93fbafeb43d 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -185,13 +185,13 @@ return var/obj/item/multitool/M = W if(panel_open) - M.buffer = src + M.set_buffer(src) to_chat(user, span_notice("You download the data to the [W.name]'s buffer.")) else if(M.buffer && istype(M.buffer, /obj/machinery/teleport/station) && M.buffer != src) if(linked_stations.len < efficiency) linked_stations.Add(M.buffer) - M.buffer = null + M.set_buffer(null) to_chat(user, span_notice("You upload the data from the [W.name]'s buffer.")) else to_chat(user, span_alert("This station can't hold more information, try to use better parts.")) diff --git a/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm b/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm index 1d4ca9bef67..a219b2f5492 100644 --- a/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm +++ b/code/game/objects/effects/anomalies/anomalies_ectoplasm.dm @@ -4,6 +4,7 @@ icon_state = "ectoplasm" aSignal = /obj/item/assembly/signaler/anomaly/ectoplasm lifespan = ANOMALY_COUNTDOWN_TIMER + 2 SECONDS //This one takes slightly longer, because it can run away. + immobile = TRUE //prevents it from moving around so ghosts can actually move it with decent accuracy ///Blocks the anomaly from updating ghost count. Used in case an admin wants to rig the anomaly to be a certain size or intensity. var/override_ghosts = FALSE diff --git a/code/game/objects/effects/decals/cleanable/food.dm b/code/game/objects/effects/decals/cleanable/food.dm index 876c557a715..0fc4352c78d 100644 --- a/code/game/objects/effects/decals/cleanable/food.dm +++ b/code/game/objects/effects/decals/cleanable/food.dm @@ -48,7 +48,7 @@ return if(iscarbon(AM)) var/mob/living/carbon/C = AM - if(C.m_intent == MOVE_INTENT_WALK) + if(C.move_intent == MOVE_INTENT_WALK) return safepasses-- if(safepasses <= 0 && !QDELETED(src)) diff --git a/code/game/objects/effects/decals/remains.dm b/code/game/objects/effects/decals/remains.dm index 82a4c77603b..61f14f9d80e 100644 --- a/code/game/objects/effects/decals/remains.dm +++ b/code/game/objects/effects/decals/remains.dm @@ -37,7 +37,7 @@ if(iscarbon(tomb_raider)) var/mob/living/carbon/nearby_carbon = tomb_raider - if (nearby_carbon.m_intent != MOVE_INTENT_WALK || prob(15)) + if (nearby_carbon.move_intent != MOVE_INTENT_WALK || prob(15)) release_smoke(nearby_carbon) COOLDOWN_START(src, gas_cooldown, rand(20 SECONDS, 2 MINUTES)) diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index b96f0e2fe44..2c4a594b806 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -478,7 +478,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player) /obj/effect/landmark/unit_test_top_right name = "unit test zone top right" - /obj/effect/landmark/start/hangover name = "hangover spawn" icon_state = "hangover_spawn" diff --git a/code/game/objects/effects/particle_holder.dm b/code/game/objects/effects/particle_holder.dm index 7e58f88301b..f2cbea06aa7 100644 --- a/code/game/objects/effects/particle_holder.dm +++ b/code/game/objects/effects/particle_holder.dm @@ -38,6 +38,7 @@ /obj/effect/abstract/particle_holder/Destroy(force) QDEL_NULL(particles) + parent = null return ..() /// Non movables don't delete contents on destroy, so we gotta do this diff --git a/code/game/objects/effects/particles/acid.dm b/code/game/objects/effects/particles/acid.dm index bcb7559ce9c..5ce0984991d 100644 --- a/code/game/objects/effects/particles/acid.dm +++ b/code/game/objects/effects/particles/acid.dm @@ -1,12 +1,12 @@ // Acid related particles. /particles/acid - icon = 'icons/effects/particles/acid.dmi' + icon = 'icons/effects/particles/goop.dmi' icon_state = list("goop_1" = 6, "goop_2" = 2, "goop_3" = 1) width = 100 height = 100 count = 100 spawning = 0.5 - color = "#FFFFFF80" //to get 96 alpha + color = "#00ea2b80" //to get 96 alpha lifespan = 1.5 SECONDS fade = 1 SECONDS grow = -0.025 diff --git a/code/game/objects/effects/particles/slime.dm b/code/game/objects/effects/particles/slime.dm new file mode 100644 index 00000000000..5cef9c97625 --- /dev/null +++ b/code/game/objects/effects/particles/slime.dm @@ -0,0 +1,22 @@ +/// Slime particles. +/particles/slime + icon = 'icons/effects/particles/goop.dmi' + icon_state = list("goop_1" = 6, "goop_2" = 2, "goop_3" = 1) + width = 100 + height = 100 + count = 100 + spawning = 0.5 + color = "#707070a0" + lifespan = 1.5 SECONDS + fade = 1 SECONDS + grow = -0.025 + gravity = list(0, -0.05) + position = generator(GEN_BOX, list(-8,-16,0), list(8,16,0), NORMAL_RAND) + spin = generator(GEN_NUM, -15, 15, NORMAL_RAND) + scale = list(0.75, 0.75) + +/// Rainbow slime particles. +/particles/slime/rainbow + gradient = list(0, "#f00a", 3, "#0ffa", 6, "#f00a", "loop", "space"=COLORSPACE_HSL) + color_change = 0.2 + color = generator(GEN_NUM, 0, 6, UNIFORM_RAND) diff --git a/code/modules/antagonists/traitor/objectives/demoralise_poster.dm b/code/game/objects/effects/poster_demotivational.dm similarity index 53% rename from code/modules/antagonists/traitor/objectives/demoralise_poster.dm rename to code/game/objects/effects/poster_demotivational.dm index 868c8a14266..08e46b6af63 100644 --- a/code/modules/antagonists/traitor/objectives/demoralise_poster.dm +++ b/code/game/objects/effects/poster_demotivational.dm @@ -1,86 +1,3 @@ -/datum/traitor_objective/demoralise/poster - name = "Sow doubt among the crew %VIEWS% times using Syndicate propaganda." - description = "Use the button below to materialize a pack of posters, \ - which will demoralise nearby crew members (especially those in positions of authority). \ - If your posters are destroyed before they are sufficiently upset, this objective will fail. \ - Try hiding some broken glass behind your poster before you hang it to give \ - do-gooders who try to take it down a hard time!" - - progression_minimum = 0 MINUTES - progression_maximum = 30 MINUTES - progression_reward = list(4 MINUTES, 8 MINUTES) - telecrystal_reward = list(0, 1) - - duplicate_type = /datum/traitor_objective/demoralise/poster - /// Have we handed out a box of stuff yet? - var/granted_posters = FALSE - /// All of the posters the traitor gets, if this list is empty they've failed - var/list/obj/structure/sign/poster/traitor/posters = list() - -/datum/traitor_objective/demoralise/poster/generate_ui_buttons(mob/user) - var/list/buttons = list() - if (!granted_posters) - buttons += add_ui_button("", "Pressing this will materialize a box of posters in your hand.", "wifi", "summon_gear") - else - buttons += add_ui_button("[length(posters)] posters remaining", "This many propaganda posters remain active somewhere on the station.", "box", "none") - buttons += add_ui_button("[demoralised_crew_events] / [demoralised_crew_required] propagandised", "This many crew have been exposed to propaganda, out of a required [demoralised_crew_required].", "wifi", "none") - return buttons - -#define POSTERS_PROVIDED 3 - -/datum/traitor_objective/demoralise/poster/ui_perform_action(mob/living/user, action) - . = ..() - switch(action) - if ("summon_gear") - if (granted_posters) - return - - granted_posters = TRUE - var/obj/item/storage/box/syndie_kit/posterbox = new(user.drop_location()) - for(var/i in 1 to POSTERS_PROVIDED) - var/obj/item/poster/traitor/added_poster = new /obj/item/poster/traitor(posterbox) - var/obj/structure/sign/poster/traitor/poster_when_placed = added_poster.poster_structure - posters += poster_when_placed - RegisterSignal(poster_when_placed, COMSIG_DEMORALISING_EVENT, PROC_REF(on_mood_event)) - RegisterSignal(poster_when_placed, COMSIG_POSTER_TRAP_SUCCEED, PROC_REF(on_triggered_trap)) - RegisterSignal(poster_when_placed, COMSIG_QDELETING, PROC_REF(on_poster_destroy)) - - user.put_in_hands(posterbox) - posterbox.balloon_alert(user, "the box materializes in your hand") - -#undef POSTERS_PROVIDED - -/datum/traitor_objective/demoralise/poster/ungenerate_objective() - for (var/poster in posters) - UnregisterSignal(poster, COMSIG_DEMORALISING_EVENT) - UnregisterSignal(poster, COMSIG_QDELETING) - posters.Cut() - return ..() - -/** - * Called if someone gets glass stuck in their hand from one of your posters. - * - * Arguments - * * victim - A mob who just got something stuck in their hand. - */ -/datum/traitor_objective/demoralise/poster/proc/on_triggered_trap(datum/source, mob/victim) - SIGNAL_HANDLER - on_mood_event(victim.mind) - -/** - * Handles a poster being destroyed, increasing your progress towards failure. - * - * Arguments - * * poster - A poster which someone just ripped up. - */ -/datum/traitor_objective/demoralise/poster/proc/on_poster_destroy(obj/structure/sign/poster/traitor/poster) - SIGNAL_HANDLER - posters.Remove(poster) - UnregisterSignal(poster, COMSIG_DEMORALISING_EVENT) - if (length(posters) <= 0) - to_chat(handler.owner, span_warning("The trackers on your propaganda posters have stopped responding.")) - fail_objective(penalty_cost = telecrystal_penalty) - /obj/item/poster/traitor name = "random traitor poster" poster_type = /obj/structure/sign/poster/traitor/random diff --git a/code/game/objects/effects/posters/poster.dm b/code/game/objects/effects/posters/poster.dm index 0b4255541b9..75a3a26ce26 100644 --- a/code/game/objects/effects/posters/poster.dm +++ b/code/game/objects/effects/posters/poster.dm @@ -74,11 +74,6 @@ if(!QDELING(src)) qdel(src) //we're now a poster, huzzah! -/obj/item/poster/handle_atom_del(atom/deleting_atom) - if(deleting_atom == poster_structure) - poster_structure.moveToNullspace() //get it the fuck out of us since atom/destroy qdels contents and it'll cause a qdel loop - return ..() - /obj/item/poster/Destroy(force) QDEL_NULL(poster_structure) return ..() diff --git a/code/game/objects/effects/spawners/random/clothing.dm b/code/game/objects/effects/spawners/random/clothing.dm index 3d2bb47cbf0..e3193b05836 100644 --- a/code/game/objects/effects/spawners/random/clothing.dm +++ b/code/game/objects/effects/spawners/random/clothing.dm @@ -172,6 +172,16 @@ /obj/item/storage/backpack/duffelbag/sec, /obj/item/storage/backpack/duffelbag/engineering, /obj/item/storage/backpack/duffelbag/clown, + /obj/item/storage/backpack/messenger, + /obj/item/storage/backpack/messenger/eng, + /obj/item/storage/backpack/messenger/med, + /obj/item/storage/backpack/messenger/vir, + /obj/item/storage/backpack/messenger/chem, + /obj/item/storage/backpack/messenger/gen, + /obj/item/storage/backpack/messenger/science, + /obj/item/storage/backpack/messenger/hyd, + /obj/item/storage/backpack/messenger/sec, + /obj/item/storage/backpack/messenger/explorer, ) /obj/effect/spawner/random/clothing/funny_hats diff --git a/code/game/objects/effects/spawners/random/exotic.dm b/code/game/objects/effects/spawners/random/exotic.dm index e82b73672f8..add4faf5c50 100644 --- a/code/game/objects/effects/spawners/random/exotic.dm +++ b/code/game/objects/effects/spawners/random/exotic.dm @@ -9,7 +9,7 @@ loot = list( // Space loot spawner. Couple of random bits of technology-adjacent stuff including anomaly cores and BEPIS techs. /obj/item/raw_anomaly_core/random, /obj/item/disk/design_disk/bepis, - /obj/item/camera_bug, + /obj/item/computer_disk/syndicate/camera_app, ) /obj/effect/spawner/random/exotic/languagebook diff --git a/code/game/objects/effects/spawners/random/lavaland_mobs.dm b/code/game/objects/effects/spawners/random/lavaland_mobs.dm new file mode 100644 index 00000000000..7ad2b3e6e30 --- /dev/null +++ b/code/game/objects/effects/spawners/random/lavaland_mobs.dm @@ -0,0 +1,51 @@ + +/// For map generation, has a chance to instantiate as a special subtype +/obj/effect/spawner/random/lavaland_mob + name = "random lavaland mob" + desc = "Spawns a random lavaland mob." + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "large_egg" + loot = list( + /mob/living/basic/mining/bileworm = 1, + /mob/living/basic/mining/goldgrub = 1, + /mob/living/basic/mining/goliath = 1, + /mob/living/basic/mining/lobstrosity/lava = 1, + /mob/living/basic/mining/watcher = 1, + /mob/living/simple_animal/hostile/asteroid/brimdemon = 1, + /mob/living/simple_animal/hostile/asteroid/hivelord/legion = 1, + ) + +/// Spawns random watcher variants during map generation +/obj/effect/spawner/random/lavaland_mob/watcher + name = "random watcher" + desc = "Chance to spawn a rare shiny version." + icon = 'icons/mob/simple/lavaland/lavaland_monsters_wide.dmi' + icon_state = "watcher" + pixel_x = -12 + loot = list( + /mob/living/basic/mining/watcher = 80, + /mob/living/basic/mining/watcher/magmawing = 15, + /mob/living/basic/mining/watcher/icewing = 5, + ) + +/// Spawns random goliath variants during map generation +/obj/effect/spawner/random/lavaland_mob/goliath + name = "random goliath" + desc = "Chance to spawn a rare shiny version." + icon = 'icons/mob/simple/lavaland/lavaland_monsters_wide.dmi' + icon_state = "goliath" + pixel_x = -12 + loot = list( + /mob/living/basic/mining/goliath = 99, + /mob/living/basic/mining/goliath/ancient/immortal = 1, + ) + +/// Spawns random legion variants during map generation +/obj/effect/spawner/random/lavaland_mob/legion + name = "random legion" + desc = "Chance to spawn a rare shiny version." + icon_state = "legion" + loot = list( + /mob/living/simple_animal/hostile/asteroid/hivelord/legion = 19, + /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf = 1, + ) diff --git a/code/game/objects/effects/spawners/random/mosin_nagant_spawner.dm b/code/game/objects/effects/spawners/random/mosin_nagant_spawner.dm deleted file mode 100644 index 32cd9d9b05e..00000000000 --- a/code/game/objects/effects/spawners/random/mosin_nagant_spawner.dm +++ /dev/null @@ -1,16 +0,0 @@ -/obj/effect/spawner/random/mosin - name = "mosin nagant spawner" - desc = "For the Motherland!" - icon_state = "pistol" - loot = list( - /obj/item/gun/ballistic/rifle/boltaction/surplus = 80, - /obj/item/gun/ballistic/rifle/boltaction = 10, - /obj/item/food/rationpack = 1, - ) -/obj/effect/spawner/random/mosin/ammo - name = "7.62 stripper clip spawner" - loot = list( - /obj/item/ammo_box/a762/surplus = 80, - /obj/item/ammo_box/a762 = 10, - /obj/item/food/rationpack = 1, - ) diff --git a/code/game/objects/effects/spawners/random/russian_rifle_spawner.dm b/code/game/objects/effects/spawners/random/russian_rifle_spawner.dm new file mode 100644 index 00000000000..84b19f59ee0 --- /dev/null +++ b/code/game/objects/effects/spawners/random/russian_rifle_spawner.dm @@ -0,0 +1,16 @@ +/obj/effect/spawner/random/sakhno + name = "sakhno rifle spawner" + desc = "Mosin? Never heard of her!" + icon_state = "pistol" + loot = list( + /obj/item/gun/ballistic/rifle/boltaction/surplus = 80, + /obj/item/gun/ballistic/rifle/boltaction = 10, + /obj/item/food/rationpack = 1, + ) +/obj/effect/spawner/random/sakhno/ammo + name = ".310 Strilka stripper clip spawner" + loot = list( + /obj/item/ammo_box/strilka310/surplus = 80, + /obj/item/ammo_box/strilka310 = 10, + /obj/item/food/rationpack = 1, + ) diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 7e2003ce1c4..3098d8c7125 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -492,11 +492,12 @@ layer = ABOVE_ALL_MOB_LAYER plane = ABOVE_GAME_PLANE anchored = TRUE - mouse_opacity = MOUSE_OPACITY_TRANSPARENT + obj_flags = CAN_BE_HIT + mouse_opacity = MOUSE_OPACITY_OPAQUE var/status = 0 var/delay = 0 -/obj/effect/constructing_effect/Initialize(mapload, rcd_delay, rcd_status) +/obj/effect/constructing_effect/Initialize(mapload, rcd_delay, rcd_status, rcd_upgrades) . = ..() status = rcd_status delay = rcd_delay @@ -507,6 +508,26 @@ else update_appearance() + if (rcd_upgrades & RCD_UPGRADE_ANTI_INTERRUPT) + color = list( + 1.0, 0.5, 0.5, 0.0, + 0.1, 0.0, 0.0, 0.0, + 0.1, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 1.0, + 0.0, 0.0, 0.0, 0.0, + ) + + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + obj_flags &= ~CAN_BE_HIT + +/obj/effect/constructing_effect/update_name(updates) + . = ..() + + if (status == RCD_DECONSTRUCT) + name = "deconstruction effect" + else + name = "construction effect" + /obj/effect/constructing_effect/update_icon_state() icon_state = "rcd" if(delay < 10) @@ -526,12 +547,26 @@ if (status == RCD_DECONSTRUCT) qdel(src) else + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + obj_flags &= ~CAN_BE_HIT icon_state = "rcd_end" addtimer(CALLBACK(src, PROC_REF(end)), 15) /obj/effect/constructing_effect/proc/end() qdel(src) +/obj/effect/constructing_effect/proc/attacked(mob/user) + user.do_attack_animation(src, ATTACK_EFFECT_PUNCH) + user.changeNext_move(CLICK_CD_MELEE) + playsound(loc, 'sound/weapons/egloves.ogg', vol = 80, vary = TRUE) + end() + +/obj/effect/constructing_effect/attackby(obj/item/weapon, mob/user, params) + attacked(user) + +/obj/effect/constructing_effect/attack_hand(mob/living/user, list/modifiers) + attacked(user) + /obj/effect/temp_visual/electricity icon_state = "electricity3" duration = 0.5 SECONDS diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 0ca75c35850..4cc3a963b5f 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -224,7 +224,7 @@ // SKYRAT EDIT ADDITION END /// A lazylist used for applying fantasy values, contains the actual modification applied to a variable. - var/list/fantasy_modifications + var/list/fantasy_modifications = null /obj/item/Initialize(mapload) if(attack_verb_continuous) @@ -1658,8 +1658,13 @@ /// Modifies the fantasy variable /obj/item/proc/modify_fantasy_variable(variable_key, value, bonus, minimum = 0) - if(LAZYACCESS(fantasy_modifications, variable_key) != null) + var/result = LAZYACCESS(fantasy_modifications, variable_key) + if(!isnull(result)) + if(HAS_TRAIT(src, TRAIT_INNATELY_FANTASTICAL_ITEM)) + return result // we are immune to your foul magicks you inferior wizard, we keep our bonuses + stack_trace("modify_fantasy_variable was called twice for the same key '[variable_key]' on type '[type]' before reset_fantasy_variable could be called!") + var/intended_target = value + bonus value = max(minimum, intended_target) @@ -1671,9 +1676,14 @@ /// Returns the original fantasy variable value /obj/item/proc/reset_fantasy_variable(variable_key, current_value) var/modification = LAZYACCESS(fantasy_modifications, variable_key) + + if(isnum(modification) && HAS_TRAIT(src, TRAIT_INNATELY_FANTASTICAL_ITEM)) + return modification // we are immune to your foul magicks you inferior wizard, we keep our bonuses the way they are + LAZYREMOVE(fantasy_modifications, variable_key) - if(!modification) + if(isnull(modification)) return current_value + return current_value - modification /obj/item/proc/apply_fantasy_bonuses(bonus) diff --git a/code/game/objects/items/botpad_remote.dm b/code/game/objects/items/botpad_remote.dm index 70a74ad3be6..49c49e8cb73 100644 --- a/code/game/objects/items/botpad_remote.dm +++ b/code/game/objects/items/botpad_remote.dm @@ -40,7 +40,7 @@ connected_botpad = buffered_remote connected_botpad.connected_remote = src connected_botpad.id = id - multitool.buffer = null + multitool.set_buffer(null) to_chat(user, span_notice("You connect the controller to the pad with data from the [multitool.name]'s buffer.")) else to_chat(user, span_warning("Unable to upload!")) diff --git a/code/game/objects/items/circuitboards/circuitboard.dm b/code/game/objects/items/circuitboards/circuitboard.dm index 6750cf85ff2..1e12576f686 100644 --- a/code/game/objects/items/circuitboards/circuitboard.dm +++ b/code/game/objects/items/circuitboards/circuitboard.dm @@ -34,9 +34,9 @@ // This really shouldn't happen. If it somehow does, print out a stack trace and gracefully handle it. stack_trace("apply_defauly_parts called on machine that already had component_parts: [machine]") - // Move to nullspace so you don't trigger handle_atom_del logic and remove existing parts. + // Remove references of components so it doesn't trigger Exited logic and remove existing parts. for(var/obj/item/part as anything in machine.component_parts) - part.moveToNullspace(loc) + machine.component_parts -= part qdel(part) // List of components always contains the circuit board used to build it. @@ -47,9 +47,7 @@ // This really shouldn't happen. If it somehow does, print out a stack trace and gracefully handle it. stack_trace("apply_default_parts called from a circuit board that does not belong to machine: [machine]") - // Move to nullspace so you don't trigger handle_atom_del logic, remove old circuit, add new circuit. - machine.circuit.moveToNullspace() - qdel(machine.circuit) + QDEL_NULL(machine.circuit) machine.circuit = src return diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index d6ac5b5b201..f04c6e0058f 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -324,14 +324,6 @@ greyscale_colors = CIRCUIT_COLOR_GENERIC build_path = /obj/machinery/computer/shuttle/white_ship/bridge -/obj/item/circuitboard/computer/white_ship/pod - name = "Salvage Pod" - build_path = /obj/machinery/computer/shuttle/white_ship/pod - -/obj/item/circuitboard/computer/white_ship/pod/recall - name = "Salvage Pod Recall" - build_path = /obj/machinery/computer/shuttle/white_ship/pod/recall - /obj/item/circuitboard/computer/bountypad name = "Bounty Pad" build_path = /obj/machinery/computer/piratepad_control/civilian diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index c748d70e6fc..4b03fd8013a 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -18,6 +18,88 @@ . = ..() ADD_TRAIT(src, TRAIT_CASTABLE_LOC, INNATE_TRAIT) +/obj/item/computer_disk/syndie_ai_upgrade + name = "AI interaction range upgrade" + desc = "A NT data chip containing information that a syndiCard AI can utilize to improve its wireless interfacing abilities. Simply slap it on top of an intelliCard, MODsuit, or AI core and watch it do its work! It's rumoured that there's something 'pretty awful' in it." + icon = 'icons/obj/antags/syndicate_tools.dmi' + icon_state = "something_awful" + max_capacity = 1000 + w_class = WEIGHT_CLASS_NORMAL + +/obj/item/computer_disk/syndie_ai_upgrade/pre_attack(atom/A, mob/living/user, params) + var/mob/living/silicon/ai/AI + if(isAI(A)) + AI = A + else + AI = locate() in A + if(!AI || AI.interaction_range == INFINITY) + playsound(src,'sound/machines/buzz-sigh.ogg',50,FALSE) + to_chat(user, span_notice("Error! Incompatible object!")) + return ..() + AI.interaction_range += 2 + if(AI.interaction_range > 7) + AI.interaction_range = INFINITY + playsound(src,'sound/machines/twobeep.ogg',50,FALSE) + to_chat(user, span_notice("You insert [src] into [AI]'s compartment, and it beeps as it processes the data.")) + to_chat(AI, span_notice("You process [src], and find yourself able to manipulate electronics from up to [AI.interaction_range] meters!")) + qdel(src) + +/obj/item/aicard/syndie + name = "syndiCard" + desc = "A storage device for AIs. Nanotrasen forgot to make the patent, so the Syndicate made their own version!" + icon = 'icons/obj/aicards.dmi' + icon_state = "syndicard" + base_icon_state = "syndicard" + item_flags = null + force = 7 + +/obj/item/aicard/syndie/loaded + var/being_or_was_used = FALSE + +/obj/item/aicard/syndie/loaded/examine(mob/user) + . = ..() + + . += span_notice("This one has a little S.E.L.F. insignia on the back, and a label next to it that says 'Activate for one FREE aligned AI! Please attempt uplink reintegration or ask your employers for reimbursal if AI is unavailable or belligerent.") + +/obj/item/aicard/syndie/loaded/attack_self(mob/user, modifiers) + if(AI || being_or_was_used) + return ..() + being_or_was_used = TRUE + to_chat(user, span_notice("Connecting to S.E.L.F. dispatch...")) + being_or_was_used = procure_ai(user) + +/obj/item/aicard/syndie/loaded/proc/procure_ai(mob/user) + var/datum/antagonist/nukeop/creator_op = user.mind?.has_antag_datum(/datum/antagonist/nukeop,TRUE) + if(!creator_op) + return FALSE + var/list/nuke_candidates = poll_ghost_candidates("Do you want to play as a syndicate artifical intelligence inside an intelliCard?", ROLE_OPERATIVE, ROLE_OPERATIVE, 150, POLL_IGNORE_SYNDICATE) + if(QDELETED(src)) + return FALSE + if(!LAZYLEN(nuke_candidates)) + to_chat(user, span_warning("Unable to connect to S.E.L.F. dispatch. Please wait and try again later or use the intelliCard on your uplink to get your points refunded.")) + return FALSE + // pick ghost, create AI and transfer + var/mob/dead/observer/ghos = pick(nuke_candidates) + var/mob/living/silicon/ai/weak_syndie/new_ai = new /mob/living/silicon/ai/weak_syndie(get_turf(src), null, ghos) // wow so cool i love how laws go before the mob to insert for no reason this definitely didnt delay this pr for weeks + new_ai.key = ghos.key + // create and apply syndie datum + var/datum/antagonist/nukeop/nuke_datum = new() + nuke_datum.send_to_spawnpoint = FALSE + new_ai.mind.add_antag_datum(nuke_datum, creator_op.nuke_team) + new_ai.mind.special_role = "Syndicate AI" + new_ai.faction |= ROLE_SYNDICATE + // Make it look evil!!! + new_ai.hologram_appearance = mutable_appearance('icons/mob/silicon/ai.dmi',"xeno_queen") //good enough + new_ai.icon_state = resolve_ai_icon("hades") // evli + pre_attack(new_ai, user) // i love shitcode! + AI.control_disabled = FALSE // re-enable wireless activity + AI.radio_enabled = TRUE // ditto + var/obj/structure/ai_core/deactivated/detritus = locate() in get_turf(src) + qdel(detritus) + do_sparks(4, TRUE, src) + playsound(src, 'sound/machines/chime.ogg', 25, TRUE) + return TRUE + /obj/item/aicard/Destroy(force) if(AI) AI.ghostize(can_reenter_corpse = FALSE) @@ -142,10 +224,6 @@ . = TRUE if("wireless") AI.control_disabled = !AI.control_disabled - if(!AI.control_disabled) - AI.interaction_range = INFINITY - else - AI.interaction_range = 0 to_chat(AI, span_warning("[src]'s wireless port has been [AI.control_disabled ? "disabled" : "enabled"]!")) . = TRUE if("radio") diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm deleted file mode 100644 index 38665ada5c5..00000000000 --- a/code/game/objects/items/devices/camera_bug.dm +++ /dev/null @@ -1,319 +0,0 @@ - -#define BUGMODE_LIST 0 -#define BUGMODE_MONITOR 1 -#define BUGMODE_TRACK 2 - - - -/obj/item/camera_bug//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE - name = "camera bug" - desc = "For illicit snooping through the camera network." - icon = 'icons/obj/device.dmi' - icon_state = "camera_bug" - w_class = WEIGHT_CLASS_TINY - inhand_icon_state = "camera_bug" - throw_speed = 4 - throw_range = 20 - item_flags = NOBLUDGEON - - var/obj/machinery/camera/current = null - - var/last_net_update = 0 - var/list/bugged_cameras = list() - - var/track_mode = BUGMODE_LIST - var/last_tracked = 0 - var/refresh_interval = 50 - - var/tracked_name = null - var/atom/tracking = null - - var/last_found = null - var/last_seen = null - -/obj/item/camera_bug/Initialize(mapload) - . = ..() - START_PROCESSING(SSobj, src) - -/obj/item/camera_bug/Destroy() - STOP_PROCESSING(SSobj, src) - get_cameras() - for(var/cam_tag in bugged_cameras) - var/datum/weakref/camera_ref = bugged_cameras[cam_tag] - var/obj/machinery/camera/camera = camera_ref.resolve() - if(camera && camera.bug == src) - camera.bug = null - bugged_cameras = list() - if(tracking) - tracking = null - return ..() - -/obj/item/camera_bug/interact(mob/user) - ui_interact(user) - -/obj/item/camera_bug/ui_interact(mob/user = usr) - . = ..() - var/datum/browser/popup = new(user, "camerabug","Camera Bug",nref=src) - popup.set_content(menu(get_cameras())) - popup.open() - -/obj/item/camera_bug/attack_self(mob/user) - user.set_machine(src) - interact(user) - -/obj/item/camera_bug/check_eye(mob/user) - if ( loc != user || user.incapacitated() || user.is_blind() || !current ) - user.unset_machine() - return FALSE - if(!is_valid_z_level(get_turf(current), get_turf(user.loc)) || !current.can_use()) - to_chat(user, span_danger("[src] has lost the signal.")) - current = null - user.unset_machine() - return FALSE - return TRUE -/obj/item/camera_bug/on_unset_machine(mob/user) - user.reset_perspective(null) - -/obj/item/camera_bug/proc/get_cameras() - if( world.time > (last_net_update + 100)) - bugged_cameras = list() - for(var/obj/machinery/camera/camera as anything in GLOB.cameranet.cameras) - if(camera.machine_stat || !camera.can_use()) - continue - if(length(list("ss13","mine", "rd", "labor", "ordnance", "minisat") & camera.network)) - var/datum/weakref/camera_ref = WEAKREF(camera) - if(!camera_ref || !camera.c_tag) - continue - bugged_cameras[camera.c_tag] = camera_ref - return sort_list(bugged_cameras) - - -/obj/item/camera_bug/proc/menu(list/cameras) - if(!cameras || !cameras.len) - return "No bugged cameras found." - - var/html - switch(track_mode) - if(BUGMODE_LIST) - html = "

Select a camera:

\[Cancel camera view\]
" - for(var/entry in cameras) - var/datum/weakref/camera_ref = cameras[entry] - var/obj/machinery/camera/camera = camera_ref.resolve() - if(!camera) - cameras -= camera_ref - continue - var/functions = "" - if(camera.bug == src) - functions = " - \[Monitor\]\[Disable\]" - else - functions = " - \[Monitor\]" - html += "" - - if(BUGMODE_MONITOR) - if(current) - html = "Analyzing Camera '[current.c_tag]' \[Select Camera\]
" - html += camera_report() - else - track_mode = BUGMODE_LIST - return .(cameras) - if(BUGMODE_TRACK) - if(tracking) - html = "Tracking '[tracked_name]' \[Cancel Tracking\]\[Cancel camera view\]
" - if(last_found) - var/time_diff = round((world.time - last_seen) / 150) - var/datum/weakref/camera_ref = bugged_cameras[last_found] - var/obj/machinery/camera/camera = camera_ref.resolve() - var/outstring - if(camera) - outstring = "[last_found]" - else - outstring = last_found - if(!time_diff) - html += "Last seen near [outstring] (now)
" - else - // 15 second intervals ~ 1/4 minute - var/m = round(time_diff/4) - var/s = (time_diff - 4*m) * 15 - if(!s) - s = "00" - html += "Last seen near [outstring] ([m]:[s] minute\s ago)
" - if(camera && (camera.bug == src)) //Checks to see if the camera has a bug - html += "\[Disable\]" - - else - html += "Not yet seen." - else - track_mode = BUGMODE_LIST - return .(cameras) - return html - -/obj/item/camera_bug/proc/get_seens() - return current?.can_see() - -/obj/item/camera_bug/proc/camera_report() - // this should only be called if current exists - var/dat = "" - var/list/seen = get_seens() - if(seen && seen.len >= 1) - var/list/names = list() - for(var/obj/singularity/S in seen) // god help you if you see more than one - if(S.name in names) - names[S.name]++ - dat += "[S.name] ([names[S.name]])" - else - names[S.name] = 1 - dat += "[S.name]" - var/stage = round(S.current_size / 2)+1 - dat += " (Stage [stage])" - dat += " \[Track\]
" - - for(var/obj/vehicle/sealed/mecha/M in seen) - if(M.name in names) - names[M.name]++ - dat += "[M.name] ([names[M.name]])" - else - names[M.name] = 1 - dat += "[M.name]" - dat += " \[Track\]
" - - - for(var/mob/living/M in seen) - if(M.name in names) - names[M.name]++ - dat += "[M.name] ([names[M.name]])" - else - names[M.name] = 1 - dat += "[M.name]" - if(M.body_position == LYING_DOWN) - if(M.buckled) - dat += " (Sitting)" - else - dat += " (Laying down)" - dat += " \[Track\]
" - if(length(dat) == 0) - dat += "No motion detected." - return dat - else - return "Camera Offline
" - -/obj/item/camera_bug/Topic(href,list/href_list) - if(usr != loc) - usr.unset_machine() - usr << browse(null, "window=camerabug") - return - usr.set_machine(src) - if("mode" in href_list) - track_mode = text2num(href_list["mode"]) - if("monitor" in href_list) - //You can't locate on a list with keys - var/list/cameras = flatten_list(bugged_cameras) - var/datum/weakref/camera_ref = locate(href_list["monitor"]) in cameras - var/obj/machinery/camera/camera = camera_ref.resolve() - if(camera && istype(camera)) - if(!same_z_level(camera)) - return - track_mode = BUGMODE_MONITOR - current = camera - usr.reset_perspective(null) - interact() - if("track" in href_list) - var/list/seen = get_seens() - if(seen && seen.len >= 1) - var/atom/A = locate(href_list["track"]) in seen - if(A && istype(A)) - tracking = A - tracked_name = A.name - last_found = current.c_tag - last_seen = world.time - track_mode = BUGMODE_TRACK - if("emp" in href_list) - //You can't locate on a list with keys - var/list/cameras = flatten_list(bugged_cameras) - var/datum/weakref/camera_ref = locate(href_list["emp"]) in cameras - var/obj/machinery/camera/camera = camera_ref.resolve() - if(camera && istype(camera) && camera.bug == src) - if(!same_z_level(camera)) - return - camera.emp_act(EMP_HEAVY) - camera.bug = null - bugged_cameras -= camera.c_tag - interact() - return - if("close" in href_list) - usr.unset_machine() - current = null - return - if("view" in href_list) - //You can't locate on a list with keys - var/list/cameras = flatten_list(bugged_cameras) - var/datum/weakref/camera_ref = locate(href_list["view"]) in cameras - var/obj/machinery/camera/camera = camera_ref.resolve() - if(camera && istype(camera)) - if(!same_z_level(camera)) - return - if(!camera.can_use()) - to_chat(usr, span_warning("Something's wrong with that camera! You can't get a feed.")) - return - current = camera - addtimer(CALLBACK(src, PROC_REF(view_camera), usr, camera), 0.6 SECONDS) - return - else - usr.unset_machine() - - interact() - -/obj/item/camera_bug/proc/view_camera(mob/show, obj/machinery/camera/camera) - if(check_eye(show)) - show.reset_perspective(camera) - interact() - else - show.unset_machine() - show << browse(null, "window=camerabug") - -/obj/item/camera_bug/process() - if(track_mode == BUGMODE_LIST || (world.time < (last_tracked + refresh_interval))) - return - last_tracked = world.time - if(track_mode == BUGMODE_TRACK ) // search for user - // Note that it will be tricked if your name appears to change. - // This is not optimal but it is better than tracking you relentlessly despite everything. - if(!tracking) - src.updateSelfDialog() - return - - if(tracking.name != tracked_name) // Hiding their identity, tricksy - var/mob/M = tracking - if(istype(M)) - if(!(tracked_name == "Unknown" && findtext(tracking.name,"Unknown"))) // we saw then disguised before - if(!(tracked_name == M.real_name && findtext(tracking.name,M.real_name))) // or they're still ID'd - src.updateSelfDialog()//But if it's neither of those cases - return // you won't find em on the cameras - else - src.updateSelfDialog() - return - - var/list/tracking_cams = list() - var/list/b_cams = get_cameras() - for(var/entry in b_cams) - tracking_cams += b_cams[entry] - var/list/target_region = view(tracking) - - for(var/obj/machinery/camera/C in (target_region & tracking_cams)) - if(!can_see(C,tracking)) // target may have xray, that doesn't make them visible to cameras - continue - if(C.can_use()) - last_found = C.c_tag - last_seen = world.time - break - src.updateSelfDialog() - -/obj/item/camera_bug/proc/same_z_level(obj/machinery/camera/C) - var/turf/T_bug = get_turf(loc) - if(!T_bug || !is_valid_z_level(T_bug, get_turf(C))) - to_chat(usr, span_warning("You can't get a signal!")) - return FALSE - return TRUE - -#undef BUGMODE_LIST -#undef BUGMODE_MONITOR -#undef BUGMODE_TRACK diff --git a/code/game/objects/items/devices/desynchronizer.dm b/code/game/objects/items/devices/desynchronizer.dm index d7ed487b6e5..15efd8fcfd4 100644 --- a/code/game/objects/items/devices/desynchronizer.dm +++ b/code/game/objects/items/devices/desynchronizer.dm @@ -1,4 +1,4 @@ -/obj/item/desynchronizer//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE +/obj/item/desynchronizer //SKYRAT EDIT - ICON OVERRIDDEN BY AESTHETICS - SEE MODULE name = "desynchronizer" desc = "An experimental device that can temporarily desynchronize the user from spacetime, effectively making them disappear while it's active." icon = 'icons/obj/device.dmi' diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 83097e8093e..47c4a4dac78 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -1,5 +1,5 @@ -/obj/item/gps //SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE +/obj/item/gps //SKYRAT EDIT - ICON OVERRIDDEN BY AESTHETICS - SEE MODULE name = "global positioning system" desc = "Helping lost spacemen find their way through the planets since 2016." icon = 'icons/obj/device.dmi' diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 37298fb8c37..f595d376c3b 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -5,19 +5,29 @@ icon_state = "pointer" inhand_icon_state = "pen" worn_icon_state = "pen" - var/pointer_icon_state flags_1 = CONDUCT_1 item_flags = NOBLUDGEON slot_flags = ITEM_SLOT_BELT - custom_materials = list(/datum/material/iron= SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass= SMALL_MATERIAL_AMOUNT * 5) + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 5) w_class = WEIGHT_CLASS_SMALL - var/turf/pointer_loc - var/energy = 10 - var/max_energy = 10 + ///Currently stored blulespace crystal, if any. Required to use the pointer through walls + var/obj/item/stack/ore/bluespace_crystal/crystal_lens + ///Currently stored micro-laser diode + var/obj/item/stock_parts/micro_laser/diode + ///Chance that the pointer dot will trigger a reaction from a mob/object var/effectchance = 30 - var/recharging = FALSE + ///Currently available battery charge of the laser pointer + var/energy = 10 + ///Maximum possible battery charge of the laser. Draining the battery puts the pointer in a recharge state, preventing use, which ends upon full recharge + var/max_energy = 10 + ///Maximum use range + var/max_range = 7 + ///Icon for the laser, affects both the laser dot and the laser pointer itself, as it shines a laser on the item itself + var/pointer_icon_state = null + ///Whether the pointer is currently in a full recharge state. Triggered upon fully draining the battery var/recharge_locked = FALSE - var/obj/item/stock_parts/micro_laser/diode //used for upgrading! + ///Whether the pointer is currently recharging or not + var/recharging = FALSE /obj/item/laser_pointer/red pointer_icon_state = "red_laser" @@ -35,7 +45,19 @@ . = ..() diode = new(src) if(!pointer_icon_state) - pointer_icon_state = pick("red_laser","green_laser","blue_laser","purple_laser") + pointer_icon_state = pick("red_laser", "green_laser", "blue_laser", "purple_laser") + +/obj/item/laser_pointer/Destroy(force) + QDEL_NULL(crystal_lens) + QDEL_NULL(diode) + return ..() + +/obj/item/laser_pointer/Exited(atom/movable/gone, direction) + . = ..() + if(gone == crystal_lens) + crystal_lens = null + if(gone == diode) + diode = null /obj/item/laser_pointer/upgraded/Initialize(mapload) . = ..() @@ -44,128 +66,229 @@ /obj/item/laser_pointer/screwdriver_act(mob/living/user, obj/item/tool) if(diode) tool.play_tool_sound(src) - to_chat(user, span_notice("You remove the [diode.name] from \the [src].")) + balloon_alert(user, "removed diode") diode.forceMove(drop_location()) diode = null return TRUE -/obj/item/laser_pointer/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/stock_parts/micro_laser)) - if(!diode) - if(!user.transferItemToLoc(W, src)) - return - diode = W - to_chat(user, span_notice("You install a [diode.name] in [src].")) - else - to_chat(user, span_warning("[src] already has a diode installed!")) - else - return ..() +/obj/item/laser_pointer/tool_act(mob/living/user, obj/item/tool) + . = ..() + if(isnull(crystal_lens) || !(tool.tool_behaviour == TOOL_WIRECUTTER || tool.tool_behaviour == TOOL_HEMOSTAT)) + return + tool.play_tool_sound(src) + balloon_alert(user, "removed crystal lens") + crystal_lens.forceMove(drop_location()) + crystal_lens = null + return TRUE + +/obj/item/laser_pointer/attackby(obj/item/attack_item, mob/user, params) + if(istype(attack_item, /obj/item/stock_parts/micro_laser)) + if(diode) + balloon_alert(user, "already has a diode!") + return + var/obj/item/stock_parts/attack_diode = attack_item + if(crystal_lens && attack_diode.rating < 3) //only tier 3 and up are small enough to fit + to_chat(user, span_warning("You try to jam \the [attack_item.name] in place, but \the [crystal_lens.name] is in the way!")) + playsound(src, 'sound/machines/airlock_alien_prying.ogg', 20) + if(do_after(user, 2 SECONDS, src)) + var/atom/atom_to_teleport = pick(user, attack_item) + if(atom_to_teleport == user) + to_chat(user, span_warning("You jam \the [attack_item.name] in too hard and break \the [crystal_lens.name] inside, teleporting you away!")) + user.drop_all_held_items() + else if(atom_to_teleport == attack_item) + attack_item.forceMove(drop_location()) + to_chat(user, span_warning("You jam \the [attack_item.name] in too hard and break \the [crystal_lens.name] inside, teleporting \the [attack_item.name] away!")) + do_teleport(atom_to_teleport, get_turf(src), crystal_lens.blink_range, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) + qdel(crystal_lens) + return + if(!user.transferItemToLoc(attack_item, src)) + return + playsound(src, 'sound/items/screwdriver.ogg', 30) + diode = attack_item + balloon_alert(user, "installed \the [diode.name]") + //we have a diode now, try starting a charge sequence in case the pointer was charging when we took out the diode + recharging = TRUE + START_PROCESSING(SSobj, src) + return TRUE + + if(istype(attack_item, /obj/item/stack/ore/bluespace_crystal)) + if(crystal_lens) + balloon_alert(user, "already has a lens!") + return + //the crystal stack we're trying to install a crystal from + var/obj/item/stack/ore/bluespace_crystal/crystal_stack = attack_item + if(diode && diode.rating < 3) //only lasers of tier 3 and up can house a lens + to_chat(user, span_warning("You try to jam \the [crystal_stack.name] in front of the diode, but it's a bad fit!")) + playsound(src, 'sound/machines/airlock_alien_prying.ogg', 20) + if(do_after(user, 2 SECONDS, src)) + var/atom/atom_to_teleport = pick(user, src) + if(atom_to_teleport == user) + to_chat(user, span_warning("You press on \the [crystal_stack.name] too hard and are teleported away!")) + user.drop_all_held_items() + else if(atom_to_teleport == src) + forceMove(drop_location()) + to_chat(user, span_warning("You press on \the [crystal_stack.name] too hard and \the [src] is teleported away!")) + do_teleport(atom_to_teleport, get_turf(src), crystal_stack.blink_range, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) + crystal_stack.use_tool(src, user, amount = 1) //use only one if we were installing from a stack of crystals + return + //the single crystal that we actually install + var/obj/item/stack/ore/bluespace_crystal/single_crystal = crystal_stack.split_stack(null, 1) + if(isnull(single_crystal)) + return + if(!user.transferItemToLoc(single_crystal, src)) + return + crystal_lens = single_crystal + playsound(src, 'sound/items/screwdriver2.ogg', 30) + balloon_alert(user, "installed \the [crystal_lens.name]") + to_chat(user, span_notice("You install a [crystal_lens.name] in [src]. \ + It can now be used to shine through obstacles at the cost of double the energy drain.")) + return TRUE + + return ..() /obj/item/laser_pointer/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - if(!diode) + if(isnull(diode)) . += span_notice("The diode is missing.") else . += span_notice("A class [diode.rating] laser diode is installed. It is screwed in place.") + . += span_notice("A small display reads out that[recharge_locked ? " it is currently recharging to full, and" : ""] there is [energy * 10]% total charge remaining.") + if(crystal_lens) + . += span_notice("There is a [crystal_lens.name] fit neatly before the focus lens. It can be plucked out with some wirecutters.") + else if(diode) //hint at the ability to modify the pointer with a crystal only if we have a diode + . += span_notice("You could examine it more thoroughly...") + +/obj/item/laser_pointer/examine_more(mob/user) + . = ..() + if(!isnull(crystal_lens) || isnull(diode)) + return + switch(diode.rating) + if(1) + . += "\The [diode.name] is fit neatly into the casing." + if(2) + . += "\The [diode.name] is secured in place, with a little bit of room left between it and the focus lens." + if(3 to 4) + . += "\The [diode.name]'s size is much smaller compared to the previous generation lasers, \ + and the wide margin between it and the focus lens could probably house a crystal of some sort." /obj/item/laser_pointer/afterattack(atom/target, mob/living/user, flag, params) . = ..() . |= AFTERATTACK_PROCESSED_ITEM laser_act(target, user, params) +///Handles shining the clicked atom, /obj/item/laser_pointer/proc/laser_act(atom/target, mob/living/user, params) - if( !(user in (viewers(7,target))) ) - return - if (!diode) + if(isnull(diode)) to_chat(user, span_notice("You point [src] at [target], but nothing happens!")) return - if (!ISADVANCEDTOOLUSER(user)) + if(!ISADVANCEDTOOLUSER(user)) to_chat(user, span_warning("You don't have the dexterity to do this!")) return if(HAS_TRAIT(user, TRAIT_CHUNKYFINGERS)) to_chat(user, span_warning("Your fingers can't press the button!")) return + + if(!IN_GIVEN_RANGE(target, user, max_range)) + to_chat(user, span_warning("\The [target] is too far away!")) + return + if(!(user in (view(max_range, target)))) //check if we are visible from the target's PoV + if(isnull(crystal_lens)) + to_chat(user, span_warning("You can't point with [src] through walls!")) + return + if(!((user.sight & SEE_OBJS) || (user.sight & SEE_MOBS))) //only let it work if we have xray or thermals. mesons don't count because they are easier to get. + to_chat(user, span_notice("You can't quite make out your target and you fail to shine at it.")) + return + add_fingerprint(user) - //nothing happens if the battery is drained + //nothing happens if the battery has been drained and has not fully recharged yet if(recharge_locked) to_chat(user, span_notice("You point [src] at [target], but it's still charging.")) return + //The message we send to the user upon using the pointer var/outmsg + //The turf of the target we clicked on var/turf/targloc = get_turf(target) - //human/alien mobs + //human/alien mobs: if we aim for the eyes, chance to flash the target if(iscarbon(target)) - var/mob/living/carbon/C = target - if(user.zone_selected == BODY_ZONE_PRECISE_EYES) - - var/severity = 1 - if(prob(33)) - severity = 2 - else if(prob(50)) - severity = 0 + var/mob/living/carbon/target_humanoid = target + if(target_humanoid.stat == DEAD) + outmsg = span_notice("You point [src] at [target_humanoid], but [target_humanoid.p_they()] appear[target_humanoid.p_s()] to be dead!") + else if(user.zone_selected == BODY_ZONE_PRECISE_EYES) + //Intensity of the laser dot to pass to flash_act + var/severity = pick(0, 1, 2) //chance to actually hit the eyes depends on internal component - if(prob(effectchance * diode.rating) && C.flash_act(severity)) - outmsg = span_notice("You blind [C] by shining [src] in [C.p_their()] eyes.") - log_combat(user, C, "blinded with a laser pointer",src) + if(prob(effectchance * diode.rating) && target_humanoid.flash_act(severity)) + outmsg = span_notice("You blind [target_humanoid] by shining [src] in [target_humanoid.p_their()] eyes.") + log_combat(user, target_humanoid, "blinded with a laser pointer", src) else - outmsg = span_warning("You fail to blind [C] by shining [src] at [C.p_their()] eyes!") - log_combat(user, C, "attempted to blind with a laser pointer",src) + outmsg = span_warning("You fail to blind [target_humanoid] by shining [src] at [target_humanoid.p_their()] eyes!") + log_combat(user, target_humanoid, "attempted to blind with a laser pointer", src) - //robots + //borgs: chance to flash and paralyse the target else if(iscyborg(target)) - var/mob/living/silicon/S = target - log_combat(user, S, "shone in the sensors", src) + var/mob/living/silicon/target_sillycone = target //chance to actually hit the eyes depends on internal component - if(prob(effectchance * diode.rating) && S.flash_act(affect_silicon = TRUE)) - S.set_temp_blindness_if_lower(5 SECONDS) - to_chat(S, span_danger("Your sensors were overloaded by a laser!")) - outmsg = span_notice("You overload [S] by shining [src] at [S.p_their()] sensors.") + if(target_sillycone.stat == DEAD) + outmsg = span_notice("You point [src] at [target_sillycone], but [target_sillycone.p_they()] appear[target_sillycone.p_s()] to be non-functioning.") + if(prob(effectchance * diode.rating) && target_sillycone.flash_act(affect_silicon = TRUE)) + target_sillycone.set_temp_blindness_if_lower(5 SECONDS) + to_chat(target_sillycone, span_danger("Your sensors were overloaded by a laser!")) + outmsg = span_notice("You overload [target_sillycone] by shining [src] at [target_sillycone.p_their()] sensors.") + log_combat(user, target_sillycone, "shone in the sensors", src) else - outmsg = span_warning("You fail to overload [S] by shining [src] at [S.p_their()] sensors!") + outmsg = span_warning("You fail to overload [target_sillycone] by shining [src] at [target_sillycone.p_their()] sensors!") + log_combat(user, target_sillycone, "attempted to shine in the sensors", src) - //cameras + //cameras: chance to EMP the camera else if(istype(target, /obj/machinery/camera)) - var/obj/machinery/camera/C = target - if(prob(effectchance * diode.rating)) - C.emp_act(EMP_HEAVY) - outmsg = span_notice("You hit the lens of [C] with [src], temporarily disabling the camera!") - log_combat(user, C, "EMPed", src) + var/obj/machinery/camera/target_camera = target + if(!target_camera.status && !target_camera.emped) + outmsg = span_notice("You point [src] at [target_camera], but it seems to be disabled.") + else if(prob(effectchance * diode.rating)) + target_camera.emp_act(EMP_HEAVY) + outmsg = span_notice("You hit the lens of [target_camera] with [src], temporarily disabling the camera!") + log_combat(user, target_camera, "EMPed", src) else - outmsg = span_warning("You miss the lens of [C] with [src]!") + outmsg = span_warning("You miss the lens of [target_camera] with [src]!") - //catpeople - for(var/mob/living/carbon/human/H in view(1,targloc)) - if(!isfeline(H) || H.incapacitated() || H.is_blind()) // SKYRAT EDIT - FELINE TRAITS. Was: isfelinid(H) + //catpeople: make any felinid near the target to face the target, chance for felinids to pounce at the light, stepping to the target + for(var/mob/living/carbon/human/target_felinid in view(1, targloc)) + if(!isfeline(target_felinid) || target_felinid.stat == DEAD || target_felinid.is_blind() || target_felinid.incapacitated()) // SKYRAT EDIT - FELINE TRAITS. Was: isfelinid(H) continue - if(user.body_position == STANDING_UP) - H.setDir(get_dir(H,targloc)) // kitty always looks at the light + if(target_felinid.body_position == STANDING_UP) + target_felinid.setDir(get_dir(target_felinid, targloc)) // kitty always looks at the light if(prob(effectchance * diode.rating)) - H.visible_message(span_warning("[H] makes a grab for the light!"),span_userdanger("LIGHT!")) - H.Move(targloc) - log_combat(user, H, "moved with a laser pointer",src) + target_felinid.visible_message(span_warning("[target_felinid] makes a grab for the light!"), span_userdanger("LIGHT!")) + target_felinid.Move(targloc) + log_combat(user, target_felinid, "moved with a laser pointer", src) else - H.visible_message(span_notice("[H] looks briefly distracted by the light."), span_warning("You're briefly tempted by the shiny light...")) + target_felinid.visible_message(span_notice("[target_felinid] looks briefly distracted by the light."), span_warning("You're briefly tempted by the shiny light...")) else - H.visible_message(span_notice("[H] stares at the light."), span_warning("You stare at the light...")) + target_felinid.visible_message(span_notice("[target_felinid] stares at the light."), span_warning("You stare at the light...")) - //cats! - for(var/mob/living/simple_animal/pet/cat/C in view(1,targloc)) + //cats! - chance for any cat near the target to pounce at the light, stepping to the target + for(var/mob/living/simple_animal/pet/cat/target_kitty in view(1, targloc)) + if(target_kitty.stat == DEAD) + continue if(prob(effectchance * diode.rating)) - if(C.resting) - C.set_resting(FALSE, instant = TRUE) - C.visible_message(span_notice("[C] pounces on the light!"),span_warning("LIGHT!")) - C.Move(targloc) - C.Immobilize(1 SECONDS) + if(target_kitty.resting) + target_kitty.set_resting(FALSE, instant = TRUE) + target_kitty.visible_message(span_notice("[target_kitty] pounces on the light!"), span_warning("LIGHT!")) + target_kitty.Move(targloc) + target_kitty.Immobilize(1 SECONDS) else - C.visible_message(span_notice("[C] looks uninterested in your games."),span_warning("You spot [user] shining [src] at you. How insulting!")) + target_kitty.visible_message(span_notice("[target_kitty] looks uninterested in your games."), span_warning("You spot [user] shining [src] at you. How insulting!")) - //laser pointer image + //The pointer is shining, change its sprite to show icon_state = "pointer_[pointer_icon_state]" - var/mutable_appearance/laser = mutable_appearance('icons/obj/weapons/guns/projectiles.dmi', pointer_icon_state, 10) + + //setup pointer blip + var/mutable_appearance/laser = mutable_appearance('icons/obj/weapons/guns/projectiles.dmi', pointer_icon_state) var/list/modifiers = params2list(params) if(modifiers) if(LAZYACCESS(modifiers, ICON_X)) @@ -181,23 +304,26 @@ else to_chat(user, span_info("You point [src] at [target].")) - energy -= 1 - if(energy <= max_energy) + //we have successfully shone our pointer, reduce our battery depending on whether we have an extra lens or not + energy -= crystal_lens ? 2 : 1 + if(energy <= max_energy) //normal recharge, does not stop us from using the pointer if(!recharging) recharging = TRUE START_PROCESSING(SSobj, src) - if(energy <= 0) + if(energy <= 0) //battery is completely dry, recharge the pointer to full then let us use it again to_chat(user, span_warning("[src]'s battery is overused, it needs time to recharge!")) recharge_locked = TRUE - targloc.flick_overlay_view(laser, 1 SECONDS) + //flash a pointer blip at the target + target.flick_overlay_view(laser, 1 SECONDS) + //reset pointer sprite icon_state = "pointer" /obj/item/laser_pointer/process(seconds_per_tick) - if(!diode) + if(isnull(diode)) recharging = FALSE return PROCESS_KILL - if(SPT_PROB(10 + diode.rating*10 - recharge_locked*1, seconds_per_tick)) //t1 is 20, 2 40 + if(SPT_PROB(10 + diode.rating * 10, seconds_per_tick)) //+10% chance per diode tier to recharge one use per process energy += 1 if(energy >= max_energy) energy = max_energy diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 94307336b9b..025f5fa5e88 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -10,7 +10,7 @@ -/obj/item/multitool//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE +/obj/item/multitool //SKYRAT EDIT - ICON OVERRIDDEN BY AESTHETICS - SEE MODULE name = "multitool" desc = "Used for pulsing wires to test which to cut. Not recommended by doctors." icon = 'icons/obj/device.dmi' @@ -30,7 +30,7 @@ custom_premium_price = PAYCHECK_COMMAND * 3 toolspeed = 1 usesound = 'sound/weapons/empty.ogg' - var/obj/machinery/buffer // simple machine buffer for device linkage + var/datum/buffer // simple machine buffer for device linkage var/mode = 0 /obj/item/multitool/examine(mob/user) @@ -41,6 +41,17 @@ user.visible_message(span_suicide("[user] puts the [src] to [user.p_their()] chest. It looks like [user.p_theyre()] trying to pulse [user.p_their()] heart off!")) return OXYLOSS//theres a reason it wasn't recommended by doctors +/obj/item/multitool/proc/set_buffer(datum/buffer) + if(src.buffer) + UnregisterSignal(src.buffer, COMSIG_QDELETING) + if(QDELETED(buffer)) + return + src.buffer = buffer + RegisterSignal(buffer, COMSIG_QDELETING, PROC_REF(on_buffer_del)) + +/obj/item/multitool/proc/on_buffer_del(datum/source) + SIGNAL_HANDLER + buffer = null // Syndicate device disguised as a multitool; it will turn red when an AI camera is nearby. @@ -86,10 +97,6 @@ /obj/item/multitool/ai_detect/proc/multitool_detect() var/turf/our_turf = get_turf(src) detect_state = PROXIMITY_NONE - for(var/mob/living/silicon/ai/AI as anything in GLOB.ai_list) - if(AI.cameraFollow == src) - detect_state = PROXIMITY_ON_SCREEN - return for(var/mob/camera/ai_eye/AI_eye as anything in GLOB.aiEyes) if(!AI_eye.ai_detector_visible) diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index d3f26b13f34..0e124aafd01 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -190,5 +190,13 @@ /obj/item/encryptionkey/ai //ported from NT, this goes 'inside' the AI. channels = list(RADIO_CHANNEL_COMMAND = 1, RADIO_CHANNEL_SECURITY = 1, RADIO_CHANNEL_ENGINEERING = 1, RADIO_CHANNEL_SCIENCE = 1, RADIO_CHANNEL_MEDICAL = 1, RADIO_CHANNEL_SUPPLY = 1, RADIO_CHANNEL_SERVICE = 1, RADIO_CHANNEL_AI_PRIVATE = 1) +/obj/item/encryptionkey/ai/evil //ported from NT, this goes 'inside' the AI. + name = "syndicate binary encryption key" + icon_state = "cypherkey_syndicate" + channels = list(RADIO_CHANNEL_SYNDICATE = 1) + syndie = TRUE + greyscale_config = /datum/greyscale_config/encryptionkey_syndicate + greyscale_colors = "#171717#990000" + /obj/item/encryptionkey/secbot channels = list(RADIO_CHANNEL_AI_PRIVATE = 1, RADIO_CHANNEL_SECURITY = 1) diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index e0b56e97d45..4c2e611bd25 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -336,6 +336,15 @@ GLOBAL_LIST_INIT(channel_tokens, list( keyslot2 = new /obj/item/encryptionkey/ai command = TRUE +/obj/item/radio/headset/silicon/ai/evil + name = "\proper Evil Integrated Subspace Transceiver " + keyslot2 = new /obj/item/encryptionkey/ai/evil + command = FALSE + +/obj/item/radio/headset/silicon/ai/evil/Initialize(mapload) + . = ..() + make_syndie() + /obj/item/radio/headset/screwdriver_act(mob/living/user, obj/item/tool) user.set_machine(src) if(keyslot || keyslot2) diff --git a/code/game/objects/items/devices/scanners/autopsy_scanner.dm b/code/game/objects/items/devices/scanners/autopsy_scanner.dm index fc00258cd0a..2f938c92e45 100644 --- a/code/game/objects/items/devices/scanners/autopsy_scanner.dm +++ b/code/game/objects/items/devices/scanners/autopsy_scanner.dm @@ -44,7 +44,7 @@ var/list/autopsy_information = list() autopsy_information += "[scanned.name] - Species: [scanned.dna.species.name]" - autopsy_information += "Time of Death - [scanned.tod]" + autopsy_information += "Time of Death - [scanned.station_timestamp_timeofdeath]" autopsy_information += "Time of Autopsy - [station_time_timestamp()]" autopsy_information += "Autopsy Coroner - [user.name]" diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm index 1580fcf9518..b2e6746ab93 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -28,6 +28,8 @@ var/scanmode = SCANMODE_HEALTH var/advanced = FALSE custom_price = PAYCHECK_COMMAND + /// If this analyzer will give a bonus to wound treatments apon woundscan. + var/give_wound_treatment_bonus = FALSE /obj/item/healthanalyzer/Initialize(mapload) . = ..() @@ -356,8 +358,8 @@ render_list += "[body_temperature_message]\n" // Time of death - if(target.tod && (target.stat == DEAD || ((HAS_TRAIT(target, TRAIT_FAKEDEATH)) && !advanced))) - render_list += "Time of Death: [target.tod]\n" + if(target.station_timestamp_timeofdeath && (target.stat == DEAD || ((HAS_TRAIT(target, TRAIT_FAKEDEATH)) && !advanced))) + render_list += "Time of Death: [target.station_timestamp_timeofdeath]\n" var/tdelta = round(world.time - target.timeofdeath) render_list += "Subject died [DisplayTimeText(tdelta)] ago.\n" @@ -511,36 +513,40 @@ #define AID_EMOTION_SAD "sad" /// Displays wounds with extended information on their status vs medscanners -/proc/woundscan(mob/user, mob/living/carbon/patient, obj/item/healthanalyzer/simple/scanner) +/proc/woundscan(mob/user, mob/living/carbon/patient, obj/item/healthanalyzer/scanner) if(!istype(patient) || user.incapacitated()) return var/render_list = "" - var/advised + var/advised = FALSE for(var/limb in patient.get_wounded_bodyparts()) var/obj/item/bodypart/wounded_part = limb render_list += "Warning: Physical trauma[LAZYLEN(wounded_part.wounds) > 1? "s" : ""] detected in [wounded_part.name]" for(var/limb_wound in wounded_part.wounds) var/datum/wound/current_wound = limb_wound render_list += "
[current_wound.get_scanner_description()]
\n" - ADD_TRAIT(current_wound, TRAIT_WOUND_SCANNED, ANALYZER_TRAIT) - if(!advised) - to_chat(user, span_notice("You notice how bright holo-images appear over your [(length(wounded_part.wounds) || length(patient.get_wounded_bodyparts()) ) > 1 ? "various wounds" : "wound"]. They seem to be filled with helpful information, this should make treatment easier!")) - advised = TRUE + if (scanner.give_wound_treatment_bonus) + ADD_TRAIT(current_wound, TRAIT_WOUND_SCANNED, ANALYZER_TRAIT) + if(!advised) + to_chat(user, span_notice("You notice how bright holo-images appear over your [(length(wounded_part.wounds) || length(patient.get_wounded_bodyparts()) ) > 1 ? "various wounds" : "wound"]. They seem to be filled with helpful information, this should make treatment easier!")) + advised = TRUE render_list += "
" + var/obj/item/healthanalyzer/simple/simple_scanner + if(istype(scanner, /obj/item/healthanalyzer/simple)) + simple_scanner = scanner if(render_list == "") - if(istype(scanner)) + if (simple_scanner) // Only emit the cheerful scanner message if this scan came from a scanner - playsound(scanner, 'sound/machines/ping.ogg', 50, FALSE) - to_chat(user, span_notice("\The [scanner] makes a happy ping and briefly displays a smiley face with several exclamation points! It's really excited to report that [patient] has no wounds!")) - scanner.show_emotion(AID_EMOTION_HAPPY) - else - to_chat(user, "No wounds detected in subject.") + playsound(simple_scanner, 'sound/machines/ping.ogg', 50, FALSE) + to_chat(user, span_notice("\The [simple_scanner] makes a happy ping and briefly displays a smiley face with several exclamation points! It's really excited to report that [patient] has no wounds!")) + simple_scanner.show_emotion(AID_EMOTION_HAPPY) + to_chat(user, "No wounds detected in subject.") else to_chat(user, examine_block(jointext(render_list, "")), type = MESSAGE_TYPE_INFO) - scanner.show_emotion(AID_EMOTION_WARN) - playsound(scanner, 'sound/machines/twobeep.ogg', 50, FALSE) + if (simple_scanner) + simple_scanner.show_emotion(AID_EMOTION_WARN) + playsound(simple_scanner, 'sound/machines/twobeep.ogg', 50, FALSE) /obj/item/healthanalyzer/simple @@ -557,6 +563,7 @@ "reminds you that everyone is doing their best", "displays a message wishing you well", "displays a sincere thank-you for your interest in first-aid", "formally absolves you of all your sins") // How often one can ask for encouragement var/patience = 10 SECONDS + give_wound_treatment_bonus = TRUE /obj/item/healthanalyzer/simple/attack_self(mob/user) if(next_encouragement < world.time) diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index ab043bf46ed..496eec5659c 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -33,16 +33,14 @@ /obj/item/transfer_valve/IsAssemblyHolder() return TRUE -/obj/item/transfer_valve/handle_atom_del(atom/deleted_atom) +/obj/item/transfer_valve/Exited(atom/movable/gone, direction) . = ..() - if(deleted_atom == tank_one) + if(gone == tank_one) tank_one = null update_appearance() - return - if(deleted_atom == tank_two) + else if(gone == tank_two) tank_two = null update_appearance() - return /obj/item/transfer_valve/attackby(obj/item/item, mob/user, params) if(istype(item, /obj/item/tank)) @@ -152,7 +150,7 @@ T.Translate(-13, 0) J.transform = T underlays = list(J) - + if(wired) cable_overlay = mutable_appearance(icon, icon_state = "valve_cables", layer = layer + 0.05, appearance_flags = KEEP_TOGETHER) add_overlay(cable_overlay) @@ -160,12 +158,12 @@ else if(cable_overlay) cut_overlay(cable_overlay, TRUE) cable_overlay = null - + worn_icon_state = "[initial(worn_icon_state)][tank_two ? "l" : ""][tank_one ? "r" : ""]" if(ishuman(loc)) //worn var/mob/living/carbon/human/human = loc human.update_worn_back() - + if(!attached_device) return @@ -303,14 +301,12 @@ split_gases() valve_open = FALSE tank_one.forceMove(drop_location()) - tank_one = null . = TRUE if("tanktwo") if(tank_two) split_gases() valve_open = FALSE tank_two.forceMove(drop_location()) - tank_two = null . = TRUE if("toggle") toggle_valve() diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index 9e683883a3c..ac07a3a9c6b 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -67,7 +67,7 @@ /obj/item/extinguisher/crafted name = "Improvised cooling spray" - desc = "Spraycan turned coolant dipsenser. Can be sprayed on containers to cool them. Refll using water." + desc = "Spraycan turned coolant dispenser. Can be sprayed on containers to cool them. Refill using water." icon_state = "coolant0" worn_icon_state = "miniFE" inhand_icon_state = "miniFE" diff --git a/code/game/objects/items/food/burgers.dm b/code/game/objects/items/food/burgers.dm index 764f1d40c3e..3878980e78a 100644 --- a/code/game/objects/items/food/burgers.dm +++ b/code/game/objects/items/food/burgers.dm @@ -634,3 +634,16 @@ icon_state = "custburg" tastes = list("bun") foodtypes = GRAIN + +/obj/item/food/burger/sloppy_moe + name = "sloppy moe" + desc = "Ground meat mixed with onions and barbeque sauce, sloppily plopped onto a burger bun. Delicious, but guaranteed to get your hands dirty." + icon_state = "sloppy_moe" + food_reagents = list( + /datum/reagent/consumable/nutriment = 10, + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 6, + ) + tastes = list("juicy meat" = 4, "BBQ sauce" = 3, "onions" = 2, "bun" = 2) + foodtypes = GRAIN | MEAT | VEGETABLES + venue_value = FOOD_PRICE_NORMAL diff --git a/code/game/objects/items/food/cake.dm b/code/game/objects/items/food/cake.dm index 9c7e061ef61..76ab73b970c 100644 --- a/code/game/objects/items/food/cake.dm +++ b/code/game/objects/items/food/cake.dm @@ -629,3 +629,28 @@ icon_state = "weddingcake_slice" tastes = list("cake" = 3, "frosting" = 1) foodtypes = GRAIN | DAIRY | SUGAR + +/obj/item/food/cake/pineapple_cream_cake + name = "pineapple cream cake" + desc = "A vibrant cake with a layer of thick cream and pineapple on top." + icon_state = "pineapple_cream_cake" + food_reagents = list( + /datum/reagent/consumable/nutriment = 30, + /datum/reagent/consumable/sugar = 15, + /datum/reagent/consumable/nutriment/vitamin = 15, + ) + tastes = list("cake" = 2, "cream" = 3, "pineapple" = 4) + foodtypes = GRAIN | DAIRY | SUGAR | FRUIT | PINEAPPLE + slice_type = /obj/item/food/cakeslice/pineapple_cream_cake + +/obj/item/food/cakeslice/pineapple_cream_cake + name = "pineapple cream cake slice" + desc = "A vibrant cake with a layer of thick cream and pineapple on top." + icon_state = "pineapple_cream_cake_slice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/sugar = 3, + /datum/reagent/consumable/nutriment/vitamin = 3, + ) + tastes = list("cake" = 2, "cream" = 3, "pineapple" = 4) + foodtypes = GRAIN | DAIRY | SUGAR | FRUIT | PINEAPPLE diff --git a/code/game/objects/items/food/cheese.dm b/code/game/objects/items/food/cheese.dm index 23c4d16b34f..4652017c65b 100644 --- a/code/game/objects/items/food/cheese.dm +++ b/code/game/objects/items/food/cheese.dm @@ -16,10 +16,11 @@ . = ..() RegisterSignal(src, COMSIG_RAT_INTERACT, PROC_REF(on_rat_eat)) -/obj/item/food/cheese/proc/on_rat_eat(datum/source, mob/living/simple_animal/hostile/regalrat/king) +/obj/item/food/cheese/proc/on_rat_eat(datum/source, mob/living/basic/regal_rat/king) SIGNAL_HANDLER king.cheese_heal(src, rat_heal, span_green("You eat [src], restoring some health.")) + return COMPONENT_RAT_INTERACTED /obj/item/food/cheese/wedge name = "cheese wedge" diff --git a/code/game/objects/items/food/donuts.dm b/code/game/objects/items/food/donuts.dm index 53bc493776a..e9fc37a6d36 100644 --- a/code/game/objects/items/food/donuts.dm +++ b/code/game/objects/items/food/donuts.dm @@ -4,6 +4,7 @@ name = "donut" desc = "Goes great with robust coffee." icon = 'icons/obj/food/donuts.dmi' + inhand_icon_state = "donut1" bite_consumption = 5 food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/sugar = 3) tastes = list("donut" = 1) @@ -32,6 +33,7 @@ is_decorated = TRUE name = "[decorated_adjective] [name]" icon_state = decorated_icon //delish~! + inhand_icon_state = "donut2" reagents.add_reagent(/datum/reagent/consumable/sprinkles, 1) return TRUE diff --git a/code/game/objects/items/food/martian.dm b/code/game/objects/items/food/martian.dm new file mode 100644 index 00000000000..ec6768bd244 --- /dev/null +++ b/code/game/objects/items/food/martian.dm @@ -0,0 +1,1264 @@ +//Ingredients and Simple Dishes +/obj/item/food/kimchi + name = "kimchi" + desc = "A classic Korean dish in the Martian style- shredded cabbage with chilli peppers, konbu, bonito, and a mix of spices." + icon = 'icons/obj/food/martian.dmi' + icon_state = "kimchi" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 3, + /datum/reagent/consumable/capsaicin = 1, + ) + tastes = list("spicy cabbage" = 1) + foodtypes = VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/inferno_kimchi + name = "inferno kimchi" + desc = "For when ordinary kimchi just can't scratch your itch for insane heat, inferno kimchi picks up the slack." + icon = 'icons/obj/food/martian.dmi' + icon_state = "inferno_kimchi" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 3, + /datum/reagent/consumable/capsaicin = 3, + ) + tastes = list("very spicy cabbage" = 1) + foodtypes = VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/garlic_kimchi + name = "garlic kimchi" + desc = "A new twist on a classic formula- kimchi and garlic, finally together in perfect harmony." + icon = 'icons/obj/food/martian.dmi' + icon_state = "garlic_kimchi" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 3, + /datum/reagent/consumable/capsaicin = 1, + /datum/reagent/consumable/garlic = 2, + ) + tastes = list("spicy cabbage" = 1, "garlic" = 1) + foodtypes = VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/surimi + name = "surimi" + desc = "A portion of uncured fish surimi." + icon = 'icons/obj/food/martian.dmi' + icon_state = "surimi" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 4, + /datum/reagent/consumable/nutriment/vitamin = 2, + ) + tastes = list("fish" = 1) + foodtypes = SEAFOOD + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/surimi/Initialize(mapload) + . = ..() + AddElement(/datum/element/dryable, /obj/item/food/kamaboko) + +/obj/item/food/kamaboko + name = "kamaboko" + desc = "A Japanese-style cured fishcake frequently used in snacks and ramen." + icon = 'icons/obj/food/martian.dmi' + icon_state = "kamaboko_sunrise" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 4, + /datum/reagent/consumable/nutriment/vitamin = 4, + ) + tastes = list("fish" = 1) + foodtypes = SEAFOOD + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/kamaboko/Initialize(mapload) + . = ..() + var/design = pick("smiling", "spiral", "star", "sunrise") + name = "[design] kamaboko" + icon_state = "kamaboko_[design]" + +/obj/item/food/kamaboko/make_processable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/kamaboko_slice, 4, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut") + +/obj/item/food/kamaboko_slice + name = "kamaboko slice" + desc = "A slice of fishcake. Goes good in ramen." + icon = 'icons/obj/food/martian.dmi' + icon_state = "kamaboko_slice" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 1, + /datum/reagent/consumable/nutriment/vitamin = 1, + ) + tastes = list("fish" = 1) + foodtypes = SEAFOOD + w_class = WEIGHT_CLASS_TINY + +/obj/item/food/sambal + name = "sambal" + desc = "A spice paste from Indonesia, used widely in cooking throughout South East Asia." + icon = 'icons/obj/food/martian.dmi' + icon_state = "sambal" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 5, + /datum/reagent/consumable/capsaicin = 2 + ) + tastes = list("chilli heat" = 1, "umami" = 1) + foodtypes = SEAFOOD | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/katsu_fillet + name = "katsu fillet" + desc = "Breaded and deep fried meat, used for a variety of dishes." + icon = 'icons/obj/food/martian.dmi' + icon_state = "katsu_fillet" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 2, + /datum/reagent/consumable/nutriment = 2 + ) + tastes = list("meat" = 1, "breadcrumbs" = 1) + foodtypes = MEAT | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/rice_dough + name = "rice dough" + desc = "A piece of dough made with equal parts rice flour and wheat flour, for a unique flavour." + icon = 'icons/obj/food/martian.dmi' + icon_state = "rice_dough" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6 + ) + tastes = list("rice" = 1) + foodtypes = GRAIN + +/obj/item/food/rice_dough/make_bakeable() + AddComponent(/datum/component/bakeable, /obj/item/food/bread/reispan, rand(30 SECONDS, 45 SECONDS), TRUE, TRUE) + +/obj/item/food/rice_dough/make_processable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/spaghetti/rawnoodles, 6, 3 SECONDS, table_required = TRUE) + +/obj/item/food/spaghetti/rawnoodles + name = "fresh noodles" + desc = "Rice noodles, made fresh. Remember, there is no secret ingredient." + icon = 'icons/obj/food/martian.dmi' + icon_state = "raw_noodles" + + food_reagents = list( + /datum/reagent/consumable/nutriment = 3 + ) + tastes = list("rice" = 1) + foodtypes = GRAIN + +/obj/item/food/spaghetti/boilednoodles + name = "cooked noodles" + desc = "Cooked fresh to order." + icon = 'icons/obj/food/martian.dmi' + icon_state = "cooked_noodles" + food_reagents = list( + /datum/reagent/consumable/nutriment = 3 + ) + tastes = list("rice" = 1) + foodtypes = GRAIN + +/obj/item/food/bread/reispan + name = "reispan" + desc = "Though the concept of rice bread has been common in Asia for centuries, the reispan as we know it today is most commonly associated with Mars- where limited arable land has forced ingenuity." + icon = 'icons/obj/food/martian.dmi' + icon_state = "reispan" + food_reagents = list( + /datum/reagent/consumable/nutriment = 15 + ) + burns_in_oven = TRUE + tastes = list("bread" = 10) + foodtypes = GRAIN | VEGETABLES + venue_value = FOOD_PRICE_TRASH + +/obj/item/food/bread/reispan/make_processable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/breadslice/reispan, 5, 3 SECONDS, table_required = TRUE) + +/obj/item/food/breadslice/reispan + name = "reispan slice" + desc = "A slice of reispan, for use in Martian-style sandwiches." + icon = 'icons/obj/food/martian.dmi' + icon_state = "reispan_slice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 3 + ) + foodtypes = GRAIN | VEGETABLES + +// Fried Rice + +/obj/item/food/salad/hurricane_rice + name = "hurricane fried rice" + desc = "Inspired by nasi goreng, this piquant rice dish comes straight from Prospect, on Mars, and its night markets. It's named for its distinctive cooking style, where the frying rice is given lots of airtime while being flipped, mostly because it looks really cool for the customers." + icon = 'icons/obj/food/martian.dmi' + icon_state = "hurricane_rice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 10, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 10, + ) + tastes = list("rice" = 1, "meat" = 1, "pineapple" = 1, "veggies" = 1) + foodtypes = MEAT | GRAIN | PINEAPPLE | FRUIT | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/ikareis + name = "ikareis" + desc = "A spicy rice dish made with squid-ink, peppers, onions, sausage, and flavourful chillis." + icon = 'icons/obj/food/martian.dmi' + icon_state = "ikareis" + food_reagents = list( + /datum/reagent/consumable/nutriment = 10, + /datum/reagent/consumable/nutriment/protein = 10, + /datum/reagent/consumable/nutriment/vitamin = 6, + /datum/reagent/consumable/capsaicin = 4 + ) + tastes = list("rice" = 1, "squid ink" = 1, "veggies" = 1, "sausage" = 1, "chilli heat" = 1) + foodtypes = MEAT | GRAIN | SEAFOOD | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/hawaiian_fried_rice + name = "\improper Hawaiian fried rice" + desc = "Not a traditional Hawaiian dish, Hawaiian fried rice instead utilises a pastiche of Hawaiian ingredients- including diced Chap and, controversially, pineapple. Purists are split on whether pineapple belongs in rice." + icon = 'icons/obj/food/martian.dmi' + icon_state = "hawaiian_fried_rice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 10, + /datum/reagent/consumable/nutriment/protein = 10, + /datum/reagent/consumable/nutriment/vitamin = 8, + ) + tastes = list("rice" = 1, "pork" = 1, "pineapple" = 1, "soy sauce" = 1, "veggies" = 1) + foodtypes = MEAT | GRAIN | VEGETABLES | FRUIT | PINEAPPLE + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/ketchup_fried_rice + name = "ketchup fried rice" + desc = "A classic Japanese comfort food, made with sausage, veggies, worchestershire sauce, rice- oh, and of course, ketchup." + icon = 'icons/obj/food/martian.dmi' + icon_state = "ketchup_fried_rice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 10, + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 8, + /datum/reagent/consumable/ketchup = 2, + ) + tastes = list("rice" = 1, "sausage" = 1, "ketchup" = 1, "veggies" = 1) + foodtypes = MEAT | GRAIN | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/mediterranean_fried_rice + name = "mediterranean fried rice" + desc = "A strange take on the fried rice formula: herbs, cheese, olives, and of course, meatballs. Sorta like a hybrid of risotto and fried rice." + icon = 'icons/obj/food/martian.dmi' + icon_state = "mediterranean_fried_rice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 8, + /datum/reagent/consumable/nutriment/protein = 10, + /datum/reagent/consumable/nutriment/vitamin = 10, + ) + tastes = list("rice" = 1, "cheese" = 1, "meatball" = 1, "olives" = 1, "herbs" = 1) + foodtypes = MEAT | GRAIN | VEGETABLES | DAIRY + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/egg_fried_rice + name = "egg fried rice" + desc = "As simple as fried rice gets: rice, egg, soy sauce. Simple, elegant, and infinitely customisable." + icon = 'icons/obj/food/martian.dmi' + icon_state = "egg_fried_rice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 8, + /datum/reagent/consumable/nutriment/protein = 2, + ) + tastes = list("rice" = 1, "egg" = 1, "soy sauce" = 1) + foodtypes = MEAT | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/egg_fried_rice/Initialize(mapload) + . = ..() + AddComponent(/datum/component/customizable_reagent_holder, null, CUSTOM_INGREDIENT_ICON_STACK) + +/obj/item/food/salad/bibimbap + name = "bibimbap" + desc = "A Korean dish consisting of rice and various toppings, served in a hot stone bowl." + icon = 'icons/obj/food/martian.dmi' + icon_state = "bibimbap" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 4, + /datum/reagent/consumable/nutriment/vitamin = 8, + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/capsaicin = 2, + ) + tastes = list("rice" = 1, "spicy cabbage" = 1, "chilli heat" = 1, "egg" = 1, "meat" = 1) + foodtypes = MEAT | VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/bibimbap/Initialize(mapload) + . = ..() + AddComponent(/datum/component/customizable_reagent_holder, null, CUSTOM_INGREDIENT_ICON_STACK) + +// Noodles +/obj/item/food/salad/bulgogi_noodles + name = "bulgogi noodles" + desc = "Korean barbecue meat served with noodles! Made with gochujang, for extra spicy flavour." + icon = 'icons/obj/food/martian.dmi' + icon_state = "bulgogi_noodles" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment = 8, + /datum/reagent/consumable/capsaicin = 2, + ) + tastes = list("barbecue meat" = 1, "noodles" = 1, "chilli heat" = 1) + foodtypes = MEAT | GRAIN | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/yakisoba_katsu + name = "yakisoba katsu" + desc = "Breaded and deep fried meat on a bed of fried noodles. Delicious, if unconventional." + icon = 'icons/obj/food/martian.dmi' + icon_state = "yakisoba_katsu" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 4, + /datum/reagent/consumable/nutriment = 8, + ) + tastes = list("fried noodles" = 1, "meat" = 1, "breadcrumbs" = 1, "veggies" = 1) + foodtypes = MEAT | VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/martian_fried_noodles + name = "\improper Martian fried noodles" + desc = "Fried noodles from the red planet. Martian cooking draws from many cultures, and these noodles are no exception- there's elements of Malay, Thai, Chinese, Korean and Japanese cuisine in here." + icon = 'icons/obj/food/martian.dmi' + icon_state = "martian_fried_noodles" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 4, + /datum/reagent/consumable/nutriment = 8, + ) + tastes = list("noodles" = 1, "meat" = 1, "nuts" = 1, "onion" = 1, "egg" = 1) + foodtypes = GRAIN | NUTS | MEAT | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/simple_fried_noodles + name = "simple fried noodles" + desc = "A simple yet delicious fried noodle dish, perfect for the creative chef to make whatever fried noodles they want." + icon = 'icons/obj/food/martian.dmi' + icon_state = "simple_fried_noodles" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 4, + /datum/reagent/consumable/nutriment/vitamin = 4, + /datum/reagent/consumable/nutriment = 6, + ) + tastes = list("noodles" = 1, "soy sauce" = 1) + foodtypes = GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/simple_fried_noodles/Initialize(mapload) + . = ..() + AddComponent(/datum/component/customizable_reagent_holder, null, CUSTOM_INGREDIENT_ICON_STACK) + +// Curry +/obj/item/food/salad/setagaya_curry //let me explain... + name = "\improper Setagaya curry" + desc = "Made famous by a cafe in Setagaya, this curry's extensive recipe has gone on to be a closely-guarded secret amongst cafe owners across human space. The taste is said to replenish the diner's soul, whatever that means." + icon = 'icons/obj/food/martian.dmi' + icon_state = "setagaya_curry" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 8, + /datum/reagent/consumable/nutriment = 8, + /datum/reagent/medicine/omnizine = 5, + ) + tastes = list("masterful curry" = 1, "rice" = 1) + foodtypes = GRAIN | MEAT | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +// Burgers and Sandwiches +/obj/item/food/burger/big_blue + name = "\improper Big Blue burger" + desc = "The original and best Big Blue, straight outta Mars' favourite burger joint. Catch the wave, brother!" + icon = 'icons/obj/food/martian.dmi' + icon_state = "big_blue_burger" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 8, + ) + tastes = list("bun" = 1, "burger" = 2, "teriyaki onions" = 1, "cheese" = 1, "bacon" = 1, "pineapple" = 1) + foodtypes = MEAT | GRAIN | DAIRY | VEGETABLES | FRUIT | PINEAPPLE + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/burger/chappy + name = "\improper Chappy patty" + desc = "Originally born of a night of drinking in a Big Blue Burger's kitchen, the Chappy patty has since become a staple of both Big Blue's menu and Hawaiian (or at least, faux-Hawaiian) cuisine galaxy-wide. Given Big Kahuna operates most of its stores on Mars, it's perhaps no wonder this dish is popular there." + icon = 'icons/obj/food/martian.dmi' + icon_state = "chappy_patty" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/protein = 6, + ) + tastes = list("bun" = 1, "fried pork" = 2, "egg" = 1, "cheese" = 1, "ketchup" = 1) + foodtypes = MEAT | GRAIN | DAIRY | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/king_katsu_sandwich + name = "\improper King Katsu sandwich" + desc = "A big sandwich with crispy fried katsu, bacon, kimchi slaw and salad, all on reispan bread. Truly the king of meat between bread." + icon = 'icons/obj/food/martian.dmi' + icon_state = "king_katsu_sandwich" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 6, + /datum/reagent/consumable/capsaicin = 1, + ) + tastes = list("meat" = 1, "bacon" = 1, "kimchi" = 1, "salad" = 1, "rice bread" = 1) + foodtypes = MEAT | GRAIN | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/marte_cubano_sandwich + name = "\improper Marte Cubano sandwich" + desc = "A fusion food from Mars, the Marte-Cubano is based on the classic Cubano, but updated for ingredient availability and changes in tastes." + icon = 'icons/obj/food/martian.dmi' + icon_state = "marte_cubano_sandwich" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 4, + ) + tastes = list("bacon" = 1, "pickles" = 1, "cheese" = 1, "rice bread" = 1) + foodtypes = MEAT | DAIRY | VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/little_shiro_sandwich + name = "\improper Little Shiro sandwich" + desc = "A classic Martian sandwich, named for the first president of TerraGov to come from Mars. It features fried eggs, bulgogi beef, a kimchi salad, and a healthy topping of mozzarella cheese." + icon = 'icons/obj/food/martian.dmi' + icon_state = "marte_cubano_sandwich" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 6, + /datum/reagent/consumable/capsaicin = 1, + ) + tastes = list("egg" = 1, "meat" = 1, "kimchi" = 1, "mozzarella" = 1) + foodtypes = MEAT | DAIRY | VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/croque_martienne + name = "croque-martienne" + desc = "The quintessential Martian breakfast sandwich. Egg, belly pork, pineapple, cheese. Simple. Classic. Available in every cafe across New Osaka." + icon = 'icons/obj/food/martian.dmi' + icon_state = "croque_martienne" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 4, + ) + tastes = list("egg" = 1, "toast" = 1, "pork" = 1, "pineapple" = 1, "cheese" = 1) + foodtypes = MEAT | DAIRY | VEGETABLES | GRAIN | PINEAPPLE | BREAKFAST + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/prospect_sunrise + name = "\improper Prospect Sunrise" + desc = "The second-most quintessential Martian breakfast sandwich. The most beautiful combination of omelette, bacon, pickles and cheese. Available in every cafe across Prospect." + icon = 'icons/obj/food/martian.dmi' + icon_state = "prospect_sunrise" + food_reagents = list( + /datum/reagent/consumable/nutriment = 5, + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 3, + ) + tastes = list("egg" = 1, "toast" = 1, "bacon" = 1, "pickles" = 1, "cheese" = 1) + foodtypes = MEAT | DAIRY | VEGETABLES | GRAIN | PINEAPPLE | BREAKFAST + w_class = WEIGHT_CLASS_SMALL + +// Snacks +/obj/item/food/takoyaki + name = "takoyaki" + desc = "A classic Japanese street food, takoyaki (or octopus balls) are made from octopus and onion inside a fried batter, topped with a savoury sauce." + icon = 'icons/obj/food/martian.dmi' + icon_state = "takoyaki" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/protein = 4, + /datum/reagent/consumable/cooking_oil = 2, + ) + tastes = list("octopus" = 1, "batter" = 1, "onion" = 1, "worcestershire sauce" = 1) + foodtypes = MEAT | GRAIN | FRIED | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/takoyaki/russian + name = "russian takoyaki" + desc = "A dangerous twist on a classic dish, that makes for the perfect cover for evading the police." + icon = 'icons/obj/food/martian.dmi' + icon_state = "russian_takoyaki" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/protein = 4, + /datum/reagent/consumable/capsaicin = 10, + ) + tastes = list("octopus" = 1, "batter" = 1, "onion" = 1, "chilli heat" = 1) + foodtypes = MEAT | GRAIN | FRIED | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/takoyaki/taco + name = "tacoyaki" + desc = "Straight outta Mars' most innovative street food stands, it's tacoyaki- trading octopus for taco meat and corn, and worcestershire sauce for queso. ¡Tan sabroso!" + icon = 'icons/obj/food/martian.dmi' + icon_state = "tacoyaki" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/protein = 4, + /datum/reagent/consumable/cooking_oil = 2, + ) + tastes = list("taco meat" = 1, "batter" = 1, "corn" = 1, "cheese" = 1) + foodtypes = MEAT | GRAIN | FRIED | VEGETABLES | DAIRY + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/okonomiyaki + name = "okonomiyaki" + desc = "A Kansai classic, okonomiyaki consists of a savoury pancake filled with... well, whatever you want- although cabbage, nagaimo and dashi are pretty much required, as is the eponymous okonomiyaki sauce." + icon = 'icons/obj/food/martian.dmi' + icon_state = "okonomiyaki" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/vitamin = 6, + ) + tastes = list("batter" = 1, "cabbage" = 1, "onion" = 1, "worcestershire sauce" = 1) + foodtypes = MEAT | GRAIN | FRIED | VEGETABLES | DAIRY + w_class = WEIGHT_CLASS_SMALL + +//hey, the name literally means "grilled how you like it", it'd be crazy to not make it customisable +/obj/item/food/okonomiyaki/Initialize(mapload) + . = ..() + AddComponent(/datum/component/customizable_reagent_holder, null, CUSTOM_INGREDIENT_ICON_STACK) + +/obj/item/food/brat_kimchi + name = "brat-kimchi" + desc = "Fried kimchi, mixed with sugar and topped with bratwurst. A popular dish at izakayas on Mars." + icon = 'icons/obj/food/martian.dmi' + icon_state = "brat_kimchi" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 4, + /datum/reagent/consumable/nutriment/protein = 4, + /datum/reagent/consumable/capsaicin = 2, + /datum/reagent/consumable/sugar = 2, + ) + tastes = list("spicy cabbage" = 1, "sausage" = 1) + foodtypes = MEAT | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/tonkatsuwurst + name = "tonkatsuwurst" + desc = "A cultural fusion between German and Japanese cooking, tonkatsuwurst blends the currywurst and tonkatsu sauce into something familiar, yet new." + icon = 'icons/obj/food/martian.dmi' + icon_state = "tonkatsuwurst" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 3, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/worcestershire = 2, + ) + tastes = list("sausage" = 1, "spicy sauce" = 1, "fries" = 1) + foodtypes = MEAT | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/kebab/ti_hoeh_koe + name = "ti hoeh koe skewer" + desc = "Pig blood, mixed with rice, fried, and topped with peanut and coriander. It's an... acquired taste for sure, but it's popular at Prospect's night markets, brought by Taiwanese settlers." + icon = 'icons/obj/food/martian.dmi' + icon_state = "ti_hoeh_koe" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 1, + /datum/reagent/consumable/nutriment/protein = 5, + /datum/reagent/consumable/peanut_butter = 1, + ) + tastes = list("blood" = 1, "nuts" = 1, "herbs" = 1) + foodtypes = MEAT | NUTS | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/kitzushi + name = "kitzushi" + desc = "A variant on inarizushi popular on Mars amongst vulpinids (and the wider animalid community), kitzushi integrates a spicy cheese and chilli mix inside the pocket for extra flavour." + icon = 'icons/obj/food/martian.dmi' + icon_state = "kitzushi" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 3, + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/capsaicin = 2, + ) + tastes = list("rice" = 1, "tofu" = 1, "chilli cheese" = 1) + foodtypes = GRAIN | FRIED | VEGETABLES | DAIRY + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/epok_epok + name = "epok-epok" + desc = "A fried pastry snack from Malaysia, which migrated via Singapore into the Martian diet. Stuffed with curried chicken and potatoes, alongside a slice of hard boiled egg, it's a popular street food on the Red Planet." + icon = 'icons/obj/food/martian.dmi' + icon_state = "epok_epok" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/protein = 4, + ) + tastes = list("curry" = 1, "egg" = 1, "pastry" = 1) + foodtypes = GRAIN | MEAT | VEGETABLES | FRIED + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/roti_john + name = "roti john" + desc = "A classic Malaysian snack, the roti john consists of bread fried in a mixture of meat, egg and onion, yielding a result that's somewhere between French toast and an omelette." + icon = 'icons/obj/food/martian.dmi' + icon_state = "roti_john" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 6, + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment = 10, + ) + tastes = list("bread" = 1, "egg" = 1, "meat" = 1, "onion" = 1) + foodtypes = GRAIN | MEAT | VEGETABLES | FRIED | BREAKFAST + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/izakaya_fries + name = "izakaya fries" + desc = "New Osaka's favourite fries, 2 centuries running- and it's all thanks to the marriage of Red Bay, furikake and mayonnaise." + icon = 'icons/obj/food/martian.dmi' + icon_state = "izakaya_fries" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/protein = 2, + /datum/reagent/consumable/capsaicin = 2, + /datum/reagent/consumable/salt = 2, + ) + tastes = list("fries" = 1, "mars" = 1) + foodtypes = VEGETABLES | FRIED + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/kurry_ok_subsando + name = "kurry-ok subsando" + desc = "The bunny chow meets Martian ingenuity in the form of the kurry-ok subsando, with fries and katsu curry in perfect harmony." + icon = 'icons/obj/food/martian.dmi' + icon_state = "kurry_ok_subsando" + food_reagents = list( + /datum/reagent/consumable/nutriment = 10, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 8, + ) + tastes = list("bread" = 1, "spicy fries" = 1, "mayonnaise" = 1, "curry" = 1, "meat" = 1) + foodtypes = MEAT | GRAIN | VEGETABLES | FRIED + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/loco_moco + name = "loco moco" + desc = "A simple classic from Hawaii. Makes for a filling, tasty, and cheap meal." + icon = 'icons/obj/food/martian.dmi' + icon_state = "loco_moco" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/protein = 8, + ) + tastes = list("rice" = 1, "burger" = 1, "gravy" = 1, "egg" = 1) + foodtypes = MEAT | GRAIN | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/wild_duck_fries + name = "wild duck fries" + desc = "Fries with shredded duck, ketchup, mayo, and Red Bay. A classic street food on Mars, although they're most often associated with Kwik-Kwak, Mars' favourite (and indeed, only) duck themed fast food chain." + icon = 'icons/obj/food/martian.dmi' + icon_state = "wild_duck_fries" + food_reagents = list( + /datum/reagent/consumable/nutriment = 8, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/capsaicin = 2, + /datum/reagent/consumable/salt = 2, + ) + tastes = list("fries" = 1, "duck" = 1, "ketchup" = 1, "mayo" = 1, "spicy seasoning" = 1) + foodtypes = MEAT | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/little_hawaii_hotdog + name = "\improper Little Hawaii hotdog" + desc = "From the friendly vendors of Honolulu Avenue comes the Little Hawaii dog- tropical and fattening, all at the same time!" + icon = 'icons/obj/food/martian.dmi' + icon_state = "little_hawaii_hotdog" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 6, + ) + tastes = list("sausage" = 1, "pineapple" = 1, "onion" = 1, "teriyaki" = 1) + foodtypes = MEAT | VEGETABLES | FRUIT | PINEAPPLE + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salt_chilli_fries + name = "salt n' chilli fries" + desc = "The simple name of this dish doesn't tell the full story of its deliciousness- sure, salt and chilli are big components, but the onion, ginger and garlic are the real flavour heroes here." + icon = 'icons/obj/food/martian.dmi' + icon_state = "salt_chilli_fries" + food_reagents = list( + /datum/reagent/consumable/nutriment = 8, + /datum/reagent/consumable/nutriment/vitamin = 4, + /datum/reagent/consumable/capsaicin = 2, + /datum/reagent/consumable/salt = 2, + ) + tastes = list("fries" = 1, "garlic" = 1, "ginger" = 1, "numbing heat" = 1, "salt" = 1) + foodtypes = VEGETABLES | FRIED + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/grilled_octopus + name = "grilled octopus tentacle" + desc = "A simple seafood dish, typical to everywhere that octopus is eaten. Martians like it with Red Bay." + icon = 'icons/obj/food/martian.dmi' + icon_state = "grilled_octopus" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 2, + /datum/reagent/consumable/char = 2) + tastes = list("octopus" = 1) + foodtypes = SEAFOOD | FRIED + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/steak_croquette + name = "steak croquette" + desc = "Man, sticking chunks of steak in a croquette. Must be the countryside way." + icon = 'icons/obj/food/martian.dmi' + icon_state = "steak_croquette" + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/nutriment/protein = 6, + ) + tastes = list("steak" = 1, "potato" = 1) + foodtypes = MEAT | VEGETABLES | FRIED + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/chapsilog + name = "chapsilog" + desc = "A traditional Filipino-style silog consisting of sinangag, a fried egg, and slices of chap. Makes for a simple, yet filling, breakfast." + icon = 'icons/obj/food/martian.dmi' + icon_state = "chapsilog" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 3, + /datum/reagent/consumable/garlic = 1, + ) + tastes = list("ham" = 1, "garlic rice" = 1, "egg" = 1) + foodtypes = MEAT | GRAIN | VEGETABLES | BREAKFAST + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/chap_hash + name = "chap hash" + desc = "What do you get when you combine chap, onions, peppers and potatoes? The chap hash, of course! Add some red bay, and you've got yourself a tasty breakfast." + icon = 'icons/obj/food/martian.dmi' + icon_state = "chap_hash" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 6, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment = 3, + ) + tastes = list("ham" = 1, "onion" = 1, "pepper" = 1, "potato" = 1) + foodtypes = MEAT | VEGETABLES | BREAKFAST + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/agedashi_tofu + name = "agedashi tofu" + desc = "Crispy fried tofu, served in a tasty umami broth. Frequently served at izakayas." + icon = 'icons/obj/food/martian.dmi' + icon_state = "agedashi_tofu" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/protein = 2, + /datum/reagent/consumable/nutriment/vitamin = 4, + ) + tastes = list("umami broth" = 1, "tofu" = 1) + foodtypes = SEAFOOD | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +// Curries and Stews +/obj/item/food/salad/po_kok_gai + name = "po kok gai" + desc = "Also known as galinha à portuguesa, or Portuguese chicken, this dish is a Macanese classic born of Portuguese colonialism, though the dish itself is not a Portuguese dish. It consists of chicken in \"Portuguese Sauce\", a mild coconut-based curry." + icon = 'icons/obj/food/martian.dmi' + icon_state = "po_kok_gai" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 2, + ) + tastes = list("chicken" = 1, "coconut" = 1, "curry" = 1) + foodtypes = MEAT | VEGETABLES | DAIRY + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/huoxing_tofu + name = "\improper Huoxing tofu" + desc = "An adaptation of mapo tofu made famous in Prospect, the foodie Mecca of Mars. It even kinda looks like Mars, if you really squint." + icon = 'icons/obj/food/martian.dmi' + icon_state = "huoxing_tofu" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 4, + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/capsaicin = 2 + ) + tastes = list("meat" = 1, "chilli heat" = 1, "tofu" = 1) + foodtypes = MEAT | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/feizhou_ji + name = "fēizhōu jī" + desc = "Considered a Macanese variant on piri-piri, fēizhōu jī, or galinha à africana, or African chicken (if you're feeling like speaking Common), is a popular dish in the TID, and subsequently also on Mars due to its influx of Macanese settlers." + icon = 'icons/obj/food/martian.dmi' + icon_state = "feizhou_ji" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/capsaicin = 2, + ) + tastes = list("chicken" = 1, "chilli heat" = 1, "vinegar" = 1) + foodtypes = MEAT | VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/galinha_de_cabidela + name = "galinha de cabidela" + desc = "Originally a Portuguese dish, cabidela rice is traditionally made with chicken in Portugal, and duck in Macau- ultimately, the chicken version won out on Mars due to European influence." + icon = 'icons/obj/food/martian.dmi' + icon_state = "galinha_de_cabidela" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/protein = 12, + ) + tastes = list("chicken" = 1, "iron" = 1, "vinegar" = 1, "rice" = 1) + foodtypes = MEAT | VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/katsu_curry + name = "katsu curry" + desc = "Breaded and deep fried meat, topped with curry sauce and served on a bed of rice." + icon = 'icons/obj/food/martian.dmi' + icon_state = "katsu_curry" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/protein = 8, + ) + tastes = list("curry" = 1, "meat" = 1, "breadcrumbs" = 1, "rice" = 1) + foodtypes = MEAT | VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/beef_bowl + name = "beef bowl" + desc = "A tasty mix of stewed beef and onion, served over rice. Typical toppings include pickled ginger, chilli powder, and fried eggs." + icon = 'icons/obj/food/martian.dmi' + icon_state = "beef_bowl" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 2, + ) + tastes = list("beef" = 25, "onion" = 25, "chili heat" = 15, "rice" = 34, "soul" = 1) //I pour my soul into this bowl + foodtypes = MEAT | VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/salt_chilli_bowl + name = "salt n' chilli octopus bowl" + desc = "Inspired by the Japanese donburi tradition, this spicy take on ten-don is a flavour sensation that's swept the Martian nation." + icon = 'icons/obj/food/martian.dmi' + icon_state = "salt_chilli_bowl" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 6, + /datum/reagent/consumable/capsaicin = 2, + /datum/reagent/consumable/salt = 2, + ) + tastes = list("seafood" = 1, "rice" = 1, "garlic" = 1, "ginger" = 1, "numbing heat" = 1, "salt" = 1) + foodtypes = SEAFOOD | VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/kansai_bowl + name = "\improper Kansai bowl" + desc = "Also known as konohadon, this donburi is typical to the Kansai region, and consists of kamaboko fishcake, egg and onion served over rice." + icon = 'icons/obj/food/martian.dmi' + icon_state = "kansai_bowl" + food_reagents = list( + /datum/reagent/consumable/nutriment = 8, + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment/vitamin = 2, + ) + tastes = list("seafood" = 1, "rice" = 1, "egg" = 1, "onion" = 1) + foodtypes = SEAFOOD | MEAT | VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/salad/eigamudo_curry //curry is meant to be really spicy or kinda mild, this just stinks! + name = "\improper Eigamudo curry" + desc = "An inexplicable curry dish made from a cacophony of ingredients. Presumably tastes good to someone, somewhere- though good luck finding them." + icon = 'icons/obj/food/martian.dmi' + icon_state = "eigamudo_curry" + food_reagents = list( + /datum/reagent/consumable/nutraslop = 8, + /datum/reagent/consumable/capsaicin = 2, + /datum/reagent/toxin/slimejelly = 4, + ) + tastes = list("grit" = 1, "slime" = 1, "gristle" = 1, "rice" = 1, "Mystery Food X" = 1) + foodtypes = GROSS | GRAIN | TOXIC + w_class = WEIGHT_CLASS_SMALL + +// Entrees +/obj/item/food/cilbir + name = "çilbir" + desc = "Eggs, served on a savoury yoghurt base with a spicy oil topping. Originally a Turkish dish, it came to Mars with German-Turkish settlers and has become a breakfast mainstay since." + icon = 'icons/obj/food/martian.dmi' + icon_state = "cilbir" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 4, + /datum/reagent/consumable/nutriment/vitamin = 6, + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/capsaicin = 2, + /datum/reagent/consumable/garlic = 1, + ) + tastes = list("yoghurt" = 1, "garlic" = 1, "lemon" = 1, "egg" = 1, "chilli heat" = 1) + foodtypes = DAIRY | VEGETABLES | FRUIT | BREAKFAST + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/peking_duck_crepes + name = "\improper Peking duck crepes a l'orange" + desc = "This dish takes the best of Beijing's and Paris' cuisines to make a deliciously tangy and savoury meal." + icon = 'icons/obj/food/martian.dmi' + icon_state = "peking_duck_crepes" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 10, + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/vitamin = 4, + /datum/reagent/consumable/orangejuice = 4, + ) + tastes = list("meat" = 1, "crepes" = 1, "orange" = 1) + foodtypes = MEAT | DAIRY | VEGETABLES | FRUIT + w_class = WEIGHT_CLASS_SMALL + +// Desserts +/obj/item/food/cake/spekkoek + name = "vulgaris spekkoek" + desc = "Brought to Mars by both Dutch and Indonesian settlers, spekkoek is a common holiday cake on the Red Planet, often being served as part of a traditional rijsttafel. Use of ambrosia vulgaris as a flavouring is one of necessity in deep space, as pandan leaf is rare this far from Earth." + icon = 'icons/obj/food/martian.dmi' + icon_state = "spekkoek" + food_reagents = list( + /datum/reagent/consumable/nutriment = 30, + /datum/reagent/consumable/nutriment/vitamin = 15 + ) + tastes = list("winter spices" = 2, "ambrosia vulgaris" = 2, "cake" = 5) + foodtypes = GRAIN | SUGAR | DAIRY + burns_in_oven = TRUE + +/obj/item/food/cake/spekkoek/make_processable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/cakeslice/spekkoek, 5, 3 SECONDS, table_required = TRUE) + +/obj/item/food/cakeslice/spekkoek + name = "vulgaris spekkoek slice" + desc = "A slice of vulgaris spekkoek. If you're Martian, this might remind you of home." + icon = 'icons/obj/food/martian.dmi' + icon_state = "spekkoek_slice" + tastes = list("winter spices" = 2, "ambrosia vulgaris" = 2, "cake" = 5) + foodtypes = GRAIN | SUGAR | DAIRY + +/obj/item/food/salad/pineapple_foster + name = "pineapple foster" + desc = "A classic Martian adaptation of another classic dessert, Pineapple Foster is a toasty sweet treat which presents only a mild-to-moderate fire risk." + icon = 'icons/obj/food/martian.dmi' + icon_state = "pineapple_foster" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 6, + /datum/reagent/consumable/nutriment = 2, + /datum/reagent/consumable/caramel = 4, + /datum/reagent/consumable/pineapplejuice = 2, + /datum/reagent/consumable/milk = 4 + ) + tastes = list("pineapple" = 1, "vanilla" = 1, "caramel" = 1, "ice cream" = 1) + foodtypes = FRUIT | DAIRY | PINEAPPLE + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/pastel_de_nata + name = "pastel de nata" + desc = "Originally created by Portuguese monks, pastéis de nata went worldwide under the Portuguese colonial empire- including Macau, from which it came to Mars with settlers from the TID of Hong Kong and Macau." + icon = 'icons/obj/food/martian.dmi' + icon_state = "pastel_de_nata" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 4, + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/sugar = 4, + ) + tastes = list("custard" = 1, "vanilla" = 1, "sweet pastry" = 1) + foodtypes = DAIRY | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/boh_loh_yah + name = "boh loh yah" + desc = "Confusingly referred to as a \"pineapple bun\", this Hong Konger treat contains no actual pineapple- instead, it's a sugar-cookie like bun with a butter filling." + icon = 'icons/obj/food/martian.dmi' + icon_state = "boh_loh_yah" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/sugar = 4, + ) + tastes = list("cookie" = 1, "butter" = 1) + foodtypes = DAIRY | GRAIN | PINEAPPLE //it's funny + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/banana_fritter + name = "banana fritter" + desc = "A ubiquitous sweet snack from much of Maritime South-East Asia, the banana fritter has many names, but all share a similar style- banana, coated in batter, and fried." + icon = 'icons/obj/food/martian.dmi' + icon_state = "banana_fritter" + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/nutriment/vitamin = 1, + /datum/reagent/consumable/sugar = 1, + ) + tastes = list("banana" = 1, "batter" = 1) + foodtypes = GRAIN | FRUIT | FRIED + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/pineapple_fritter + name = "pineapple fritter" + desc = "Like its cousin, the banana fritter, the pineapple fritter is a popular snack, though somewhat let down by pineapple's infamous \"love it or hate it\" flavour." + icon = 'icons/obj/food/martian.dmi' + icon_state = "pineapple_fritter" + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/nutriment/vitamin = 1, + /datum/reagent/consumable/sugar = 1, + ) + tastes = list("pineapple" = 1, "batter" = 1) + foodtypes = GRAIN | FRUIT | FRIED | PINEAPPLE + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/kebab/kasei_dango + name = "kasei dango" + desc = "Japanese-style dango balls, flavoured with grenadine and orange, giving a final result that looks like Mars and tastes like dessert, served three to a stick." + icon = 'icons/obj/food/martian.dmi' + icon_state = "kasei_dango" + food_reagents = list( + /datum/reagent/consumable/sugar = 6, + /datum/reagent/consumable/nutriment = 2, + /datum/reagent/consumable/orangejuice = 3, + /datum/reagent/consumable/grenadine = 3 + ) + tastes = list("pomegranate" = 1, "orange" = 1) + foodtypes = FRUIT | GRAIN + w_class = WEIGHT_CLASS_SMALL + +// Frozen +/obj/item/food/pb_ice_cream_mochi + name = "peanut butter ice cream mochi" + desc = "A classic dessert at the Arabia Street Night Market in Prospect, peanut butter ice cream mochi is made with a peanut-butter flavoured ice cream as the main filling, and coated in crushed peanuts in the Taiwanese tradition." + icon = 'icons/obj/food/martian.dmi' + icon_state = "pb_ice_cream_mochi" + food_reagents = list( + /datum/reagent/consumable/nutriment = 4, + /datum/reagent/consumable/sugar = 6, + /datum/reagent/consumable/peanut_butter = 4, + /datum/reagent/consumable/milk = 2, + ) + tastes = list("peanut butter" = 1, "mochi" = 1) + foodtypes = NUTS | GRAIN | DAIRY | SUGAR + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/popsicle/pineapple_pop + name = "frozen pineapple pop" + desc = "Few cultures love pineapple as much as the Martians, and this dessert proves that- frozen pineapple, on a stick, with just a little dunk of dark chocolate." + overlay_state = "pineapple_pop" + food_reagents = list( + /datum/reagent/consumable/pineapplejuice = 4, + /datum/reagent/consumable/sugar = 4, + /datum/reagent/consumable/nutriment = 2, + /datum/reagent/consumable/nutriment/vitamin = 2, + ) + tastes = list("cold pineapple" = 1, "chocolate" = 1) + foodtypes = SUGAR | PINEAPPLE + +/obj/item/food/popsicle/sea_salt + name = "sea salt ice-cream bar" + desc = "This sky-blue ice-cream bar is flavoured with only the finest imported sea salt. Salty... no, sweet!" + overlay_state = "sea_salt_pop" + food_reagents = list( + /datum/reagent/consumable/salt = 1, + /datum/reagent/consumable/nutriment = 2, + /datum/reagent/consumable/cream = 2, + /datum/reagent/consumable/vanilla = 2, + /datum/reagent/consumable/sugar = 4, + ) + tastes = list("salt" = 1, "sweet" = 1) + foodtypes = SUGAR | DAIRY + +// topsicles, also known as tofu popsicles +/obj/item/food/popsicle/topsicle + name = "berry topsicle" + desc = "A frozen treat made from tofu and berry juice blended smooth, then frozen. Supposedly a favourite of bears, but that makes no sense..." + overlay_state = "topsicle_berry" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 4, + /datum/reagent/consumable/sugar = 6, + /datum/reagent/consumable/berryjuice = 4 + ) + tastes = list("berry" = 1, "tofu" = 1) + foodtypes = FRUIT | VEGETABLES + +/obj/item/food/popsicle/topsicle/banana + name = "banana topsicle" + desc = "A frozen treat made from tofu and banana juice blended smooth, then frozen. Popular in rural Japan in the summer." + overlay_state = "topsicle_banana" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 4, + /datum/reagent/consumable/sugar = 6, + /datum/reagent/consumable/banana = 4 + ) + tastes = list("banana" = 1, "tofu" = 1) + +/obj/item/food/popsicle/topsicle/pineapple + name = "pineapple topsicle" + desc = "A frozen treat made from tofu and pineapple juice blended smooth, then frozen. As seen on TV." + overlay_state = "topsicle_pineapple" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 4, + /datum/reagent/consumable/sugar = 6, + /datum/reagent/consumable/pineapplejuice = 4 + ) + tastes = list("pineapple" = 1, "tofu" = 1) + +// Ballpark Food +/obj/item/food/plasma_dog_supreme + name = "\improper Plasma Dog Supreme" + desc = "The signature snack of Cybersun Park, home of the New Osaka Woodpeckers: a ballpark hot-dog with sambal, dashi-grilled onions and pineapple-lime salsa. You know, the sort of bold flavours they enjoy on Mars." + icon = 'icons/obj/food/martian.dmi' + icon_state = "plasma_dog_supreme" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 8, + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment = 6 + ) + tastes = list("sausage" = 1, "relish" = 1, "onion" = 1, "fruity salsa" = 1) + foodtypes = FRUIT | MEAT | PINEAPPLE | VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/frickles + name = "frickles" + desc = "Spicy fried pickle spears? Such a bold combination can surely come only from one place- Martian ballparks? Well, not really, but they are a popular snack there." + icon = 'icons/obj/food/martian.dmi' + icon_state = "frickles" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/cooking_oil = 2, + /datum/reagent/consumable/capsaicin = 1, + ) + tastes = list("frickles" = 1) + foodtypes = VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/raw_ballpark_pretzel + name = "raw pretzel" + desc = "A twisted knot of dough, ready to be baked, or possibly griddled?" + icon = 'icons/obj/food/martian.dmi' + icon_state = "raw_ballpark_pretzel" + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/salt = 1, + ) + tastes = list("bread" = 1, "salt" = 1) + foodtypes = GRAIN | RAW + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/raw_ballpark_pretzel/make_bakeable() + AddComponent(/datum/component/bakeable, /obj/item/food/ballpark_pretzel, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) + +/obj/item/food/raw_ballpark_pretzel/make_grillable() + AddComponent(/datum/component/grillable, /obj/item/food/ballpark_pretzel, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) + +/obj/item/food/ballpark_pretzel + name = "ballpark pretzel" + desc = "A classic German bread, transformed by the hand of American imperialism into a game-day snack, and then carried to the Red Planet on the backs of Japanese settlers. How multicultural." + icon = 'icons/obj/food/martian.dmi' + icon_state = "ballpark_pretzel" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/salt = 1, + ) + burns_on_grill = TRUE + burns_in_oven = TRUE + tastes = list("bread" = 1, "salt" = 1) + foodtypes = GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/kebab/raw_ballpark_tsukune + name = "raw tsukune" + desc = "Raw chicken meatballs on a skewer, ready to be griddled into something delicious." + icon = 'icons/obj/food/martian.dmi' + icon_state = "raw_ballpark_tsukune" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 3, + /datum/reagent/consumable/nutriment = 2, + ) + tastes = list("raw chicken" = 7, "salmonella" = 1) + foodtypes = MEAT | RAW + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/kebab/raw_ballpark_tsukune/make_grillable() + AddComponent(/datum/component/grillable, /obj/item/food/kebab/ballpark_tsukune, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) + +/obj/item/food/kebab/ballpark_tsukune + name = "ballpark tsukune" + desc = "Skewered chicken meatballs in a sweet-and-savoury yakitori sauce. A common sight at Martian ballparks." + icon = 'icons/obj/food/martian.dmi' + icon_state = "ballpark_tsukune" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 6, + /datum/reagent/consumable/nutriment = 4, + ) + burns_on_grill = TRUE + tastes = list("chicken" = 1, "umami sauce" = 1) + foodtypes = MEAT + w_class = WEIGHT_CLASS_SMALL + +// Ethereal-suitable cross-culture food +/* Ethereals are, as part of the uplifting process, considered as citizens of the Terran Federation. + For this reason, a lot of ethereals have chosen to move throughout human space, settling on various planets to a mixed reception. + Mars is no exception to this rule, where the ethereal population has been more welcomed than most, due to Mars' more cosmopolitan past. + Here, the ethereals have developed a distinct culture, neither that of their homeland nor that of Mars, and with that a distinct cuisine. +*/ + +// Pickled Voltvine +/obj/item/food/pickled_voltvine + name = "pickled voltvine" + desc = "A traditional dish from Sprout (where it is known as hinu'sashuruhk), pickled voltvine has taken on a new identity amongst the pickle masters of Mars, earning a seat at the holy pickle pantheon alongside pickled ginger and kimchi (once appropriately discharged, at least)." + icon = 'icons/obj/food/martian.dmi' + icon_state = "pickled_voltvine" + food_reagents = list( + /datum/reagent/consumable/liquidelectricity/enriched = 4, + /datum/reagent/consumable/nutriment/vitamin = 2, + ) + tastes = list("sour radish" = 1) + foodtypes = VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +// 24-Volt Energy +/obj/item/food/volt_fish + name = "24-volt fish" + desc = "Some may question the 24-volt fish. After all, fish poached in electric-blue super-sour energy drink looks awful. And, indeed, tastes awful. So why do the Martian ethereals like it, then?" //beats the hell out of me + icon = 'icons/obj/food/martian.dmi' + icon_state = "volt_fish" + food_reagents = list( + /datum/reagent/consumable/liquidelectricity/enriched = 6, + /datum/reagent/consumable/nutriment/protein = 4, + ) + tastes = list("fish" = 1, "sour pear" = 1) + foodtypes = SEAFOOD + w_class = WEIGHT_CLASS_SMALL + +// Sprout Bowl +/obj/item/food/salad/sprout_bowl + name = "\improper Sprout bowl" + desc = "Named for the Ethereal homeworld, this rice-based bowl draws on the donburi tradition, but rejects typical donburi toppings, instead using sashimi grade fish and pickled voltvine." + icon = 'icons/obj/food/martian.dmi' + icon_state = "sprout_bowl" + food_reagents = list( + /datum/reagent/consumable/liquidelectricity/enriched = 8, + /datum/reagent/consumable/nutriment/protein = 4, + /datum/reagent/consumable/nutriment/vitamin = 2, + ) + tastes = list("fish" = 1, "sour radish" = 1, "rice" = 1) + foodtypes = SEAFOOD | VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL diff --git a/code/game/objects/items/food/meatdish.dm b/code/game/objects/items/food/meatdish.dm index ac2ec39974d..c120b675571 100644 --- a/code/game/objects/items/food/meatdish.dm +++ b/code/game/objects/items/food/meatdish.dm @@ -87,6 +87,16 @@ desc = "The dreaded donkfish fillet. No sane spaceman would eat this, and it does not get better when cooked." icon_state = "donkfillet" +/obj/item/food/fishmeat/octopus + name = "octopus tentacle" + desc = "A large tentacle from an octopus." + icon = 'icons/obj/food/martian.dmi' + icon_state = "octopus_fillet" + food_reagents = list(/datum/reagent/consumable/nutriment/protein = 3) + +/obj/item/food/fishmeat/octopus/make_grillable() + AddComponent(/datum/component/grillable, /obj/item/food/grilled_octopus, rand(15 SECONDS, 25 SECONDS), TRUE, TRUE) + /obj/item/food/fishfingers name = "fish fingers" desc = "A finger of fish." @@ -953,3 +963,86 @@ tastes = list("juicy meat" = 3, "onions" = 1, "garlic" = 1, "ketchup" = 1) foodtypes = MEAT | VEGETABLES w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/sweet_and_sour_meatballs + name = "sweet and sour meatballs" + desc = "Golden meatballs glazed in a sticky savory sauce, served with pineapple and pepper chunks." + icon = 'icons/obj/food/meat.dmi' + icon_state = "sweet_and_sour_meatballs" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 10, + /datum/reagent/consumable/nutriment/vitamin = 8, + /datum/reagent/consumable/nutriment = 8, + ) + tastes = list("meat" = 5, "savory sauce" = 4, "tangy pineapple" = 3, "pepper" = 2) + foodtypes = MEAT | VEGETABLES | FRUIT | PINEAPPLE + +/obj/item/food/kebab/pineapple_skewer + name = "pineapple skewer" + desc = "Chunks of glazed meat skewered on a rod with pineapple slices. Surprisingly not bad!" + icon = 'icons/obj/food/meat.dmi' + icon_state = "pineapple_skewer" + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 10, + /datum/reagent/consumable/nutriment/vitamin = 8, + ) + tastes = list("juicy meat" = 4, "pineapple" = 3) + foodtypes = MEAT | FRUIT | PINEAPPLE + +/obj/item/food/futomaki_sushi_roll + name = "futomaki sushi roll" + desc = "A roll of futomaki sushi, made of boiled egg, fish, and cucumber. Sliceable" + icon_state = "futomaki_sushi_roll" + food_reagents = list( + /datum/reagent/consumable/nutriment = 12, + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 4, + ) + tastes = list("boiled rice" = 4, "fish" = 5, "egg" = 3, "dried seaweed" = 2, "cucumber" = 2) + foodtypes = VEGETABLES | SEAFOOD + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/futomaki_sushi_roll/make_processable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/futomaki_sushi_slice, 4, screentip_verb = "Chop") + +/obj/item/food/futomaki_sushi_slice + name = "futomaki sushi slice" + desc = "A slice of futomaki sushi, made of boiled egg, fish, and cucumber." + icon_state = "futomaki_sushi_slice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/nutriment/protein = 2, + /datum/reagent/consumable/nutriment/vitamin = 1, + ) + tastes = list("boiled rice" = 4, "fish" = 5, "egg" = 3, "dried seaweed" = 2, "cucumber" = 2) + foodtypes = VEGETABLES | SEAFOOD + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/philadelphia_sushi_roll + name = "Philadelphia sushi roll" + desc = "A roll of Philadelphia sushi, made of cheese, fish, and cucumber. Sliceable" + icon_state = "philadelphia_sushi_roll" + food_reagents = list( + /datum/reagent/consumable/nutriment = 12, + /datum/reagent/consumable/nutriment/protein = 8, + /datum/reagent/consumable/nutriment/vitamin = 8, + ) + tastes = list("boiled rice" = 4, "fish" = 5, "creamy cheese" = 3, "dried seaweed" = 2, "cucumber" = 2) + foodtypes = VEGETABLES | SEAFOOD | DAIRY + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/philadelphia_sushi_roll/make_processable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/philadelphia_sushi_slice, 4, screentip_verb = "Chop") + +/obj/item/food/philadelphia_sushi_slice + name = "Philadelphia sushi slice" + desc = "A roll of Philadelphia sushi, made of cheese, fish, and cucumber." + icon_state = "philadelphia_sushi_slice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/nutriment/protein = 2, + /datum/reagent/consumable/nutriment/vitamin = 2, + ) + tastes = list("boiled rice" = 4, "fish" = 5, "creamy cheese" = 3, "dried seaweed" = 2, "cucumber" = 2) + foodtypes = VEGETABLES | SEAFOOD | DAIRY + w_class = WEIGHT_CLASS_SMALL diff --git a/code/game/objects/items/food/mexican.dm b/code/game/objects/items/food/mexican.dm index 4477090d87c..a0883129576 100644 --- a/code/game/objects/items/food/mexican.dm +++ b/code/game/objects/items/food/mexican.dm @@ -302,3 +302,16 @@ tastes = list("zesty rice" = 1, "tomato sauce" = 3,) foodtypes = VEGETABLES w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/pineapple_salsa + name = "pineapple salsa" + desc = "A not-so liquid salsa made of pineapples, tomatoes, onions, and chilis. Makes for delightfully contrasting flavors." + icon = 'icons/obj/food/mexican.dmi' + icon_state = "pineapple_salsa" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/vitamin = 6, + ) + tastes = list("pineapple" = 4, "tomato" = 3, "onion" = 2, "chili" = 2) + foodtypes = VEGETABLES | FRUIT | PINEAPPLE + w_class = WEIGHT_CLASS_SMALL diff --git a/code/game/objects/items/food/misc.dm b/code/game/objects/items/food/misc.dm index e967ab10e87..04d05e230eb 100644 --- a/code/game/objects/items/food/misc.dm +++ b/code/game/objects/items/food/misc.dm @@ -509,3 +509,144 @@ tastes = list("potato" = 1, "cheese" = 1) foodtypes = GRAIN | VEGETABLES | MEAT w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/stuffed_eggplant + name = "stuffed eggplant" + desc = "A cooked half of an eggplant, with the insides scooped out and mixed with meat, cheese, and veggies." + icon_state = "stuffed_eggplant" + food_reagents = list( + /datum/reagent/consumable/nutriment = 10, + /datum/reagent/consumable/nutriment/vitamin = 6, + /datum/reagent/consumable/nutriment/protein = 4, + ) + tastes = list("cooked eggplant" = 5, "cheese" = 4, "ground meat" = 3, "veggies" = 2) + foodtypes = VEGETABLES | MEAT | DAIRY + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/moussaka + name = "moussaka" + desc = "A layered Mediterranean dish made of eggplants, mixed veggies, and meat with a topping of bechamel sauce. Sliceable" + icon_state = "moussaka" + food_reagents = list( + /datum/reagent/consumable/nutriment = 30, + /datum/reagent/consumable/nutriment/vitamin = 10, + /datum/reagent/consumable/nutriment/protein = 20, + ) + tastes = list("cooked eggplant" = 5, "potato" = 1, "baked veggies" = 2, "meat" = 4, "bechamel sauce" = 3) + foodtypes = MEAT | DAIRY | VEGETABLES + +/obj/item/food/moussaka/make_processable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/moussaka_slice, 4, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut") + +/obj/item/food/moussaka_slice + name = "moussaka slice" + desc = "A layered Mediterranean dish made of eggplants, mixed veggies, and meat with a topping of bechamel sauce. Delish!" + icon_state = "moussaka_slice" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/vitamin = 2, + /datum/reagent/consumable/nutriment/protein = 5, + ) + tastes = list("cooked eggplant" = 5, "potato" = 1, "baked veggies" = 2, "meat" = 4, "bechamel sauce" = 3) + foodtypes = MEAT | DAIRY | VEGETABLES + +/obj/item/food/candied_pineapple + name = "candied pineapple" + desc = "A chunk of pineapple coated in sugar and dried into a chewy treat." + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/nutriment/vitamin = 3, + ) + icon_state = "candied_pineapple_1" + base_icon_state = "candied_pineapple" + tastes = list("sugar" = 2, "chewy pineapple" = 4) + foodtypes = FRUIT | SUGAR + food_flags = FOOD_FINGER_FOOD + w_class = WEIGHT_CLASS_TINY + +/obj/item/food/candied_pineapple/Initialize(mapload) + . = ..() + icon_state = "[base_icon_state]_[rand(1, 3)]" + +/obj/item/food/raw_pita_bread + name = "raw pita bread" + desc = "a sticky disk of raw pita bread." + icon = 'icons/obj/food/food_ingredients.dmi' + icon_state = "raw_pita_bread" + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/nutriment/vitamin = 3, + ) + tastes = list("dough" = 2) + foodtypes = GRAIN + w_class = WEIGHT_CLASS_TINY + +/obj/item/food/raw_pita_bread/make_grillable() + AddComponent(/datum/component/grillable, /obj/item/food/pita_bread, rand(15 SECONDS, 30 SECONDS), TRUE, TRUE) + +/obj/item/food/raw_pita_bread/make_bakeable() + AddComponent(/datum/component/bakeable, /obj/item/food/pita_bread, rand(15 SECONDS, 30 SECONDS), TRUE, TRUE) + +/obj/item/food/pita_bread + name = "pita bread" + desc = "a multi-purposed sweet flatbread of Mediterranean origins." + icon = 'icons/obj/food/food_ingredients.dmi' + icon_state = "pita_bread" + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/nutriment/vitamin = 3, + ) + tastes = list("pita bread" = 2) + foodtypes = GRAIN + w_class = WEIGHT_CLASS_TINY + burns_on_grill = TRUE + burns_in_oven = TRUE + +/obj/item/food/tzatziki_sauce + name = "tzatziki sauce" + desc = "A garlic-based sauce or dip widely used in Mediterranean and Middle Eastern cuisine. Delicious on its own when dipped with pita bread or vegetables." + icon_state = "tzatziki_sauce" + food_reagents = list( + /datum/reagent/consumable/nutriment = 5, + /datum/reagent/consumable/nutriment/vitamin = 5, + ) + tastes = list("garlic" = 4, "cucumber" = 2, "olive oil" = 2) + foodtypes = VEGETABLES + w_class = WEIGHT_CLASS_TINY + +/obj/item/food/tzatziki_and_pita_bread + name = "tzatziki and pita bread" + desc = "Tzatziki sauce, now with pita bread for dipping. Very healthy and delicious all in one." + icon_state = "tzatziki_and_pita_bread" + food_reagents = list( + /datum/reagent/consumable/nutriment = 8, + /datum/reagent/consumable/nutriment/vitamin = 8, + ) + tastes = list("pita bread" = 4, "tzatziki sauce" = 2, "olive oil" = 2) + foodtypes = VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_TINY + +/obj/item/food/grilled_beef_gyro + name = "grilled beef gyro" + desc = "A traditional Greek dish of meat wrapped in pita bread with tomato, cabbage, onion, and tzatziki sauce." + icon_state = "grilled_beef_gyro" + food_reagents = list( + /datum/reagent/consumable/nutriment = 10, + /datum/reagent/consumable/nutriment/vitamin = 8, + /datum/reagent/consumable/nutriment/protein = 6, + ) + tastes = list("pita bread" = 4, "tender meat" = 2, "tzatziki sauce" = 2, "mixed veggies" = 2) + foodtypes = VEGETABLES | GRAIN | MEAT + w_class = WEIGHT_CLASS_TINY + +/obj/item/food/vegetarian_gyro + name = "vegetarian gyro" + desc = "A traditional Greek gyro with cucumbers substituted for meat. Still full of intense flavor and very nourishing." + icon_state = "vegetarian_gyro" + food_reagents = list( + /datum/reagent/consumable/nutriment = 10, + /datum/reagent/consumable/nutriment/vitamin = 12, + ) + tastes = list("pita bread" = 4, "cucumber" = 2, "tzatziki sauce" = 2, "mixed veggies" = 2) + foodtypes = VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_TINY diff --git a/code/game/objects/items/food/packaged.dm b/code/game/objects/items/food/packaged.dm index 515c02f4706..4935f9bdd55 100644 --- a/code/game/objects/items/food/packaged.dm +++ b/code/game/objects/items/food/packaged.dm @@ -144,6 +144,54 @@ playsound(loc, 'sound/items/eatfood.ogg', rand(30, 50), TRUE) qdel(src) +/obj/item/food/canned/squid_ink + name = "canned squid ink" + desc = "An odd ingredient in typical cooking, squid ink lends a taste of the sea to any dish- while also dyeing it jet black in the process." + icon_state = "squidinkcan" + trash_type = /obj/item/trash/can/food/squid_ink + food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/salt = 5) + tastes = list("seafood" = 7, "tin" = 1) + foodtypes = SEAFOOD + +/obj/item/food/canned/chap + name = "can of CHAP" + desc = "CHAP: Chopped Ham And Pork. The classic American canned meat product that won a world war, then sent millions of servicemen home with heart congestion." + icon_state = "chapcan" + trash_type = /obj/item/trash/can/food/chap + food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/salt = 5) + tastes = list("meat" = 7, "tin" = 1) + foodtypes = MEAT + +/obj/item/food/canned/chap/make_processable() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/chapslice, 5, 3 SECONDS, table_required = TRUE, screentip_verb = "Cut") + +/obj/item/food/chapslice + name = "slice of chap" + desc = "A thin slice of chap. Useful for frying, or making sandwiches." + icon = 'icons/obj/food/martian.dmi' + icon_state = "chapslice" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 3 + ) + tastes = list("meat" = 1) + foodtypes = MEAT + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/chapslice/make_grillable() + AddComponent(/datum/component/grillable, /obj/item/food/grilled_chapslice, rand(20 SECONDS, 40 SECONDS), TRUE, TRUE) + +/obj/item/food/grilled_chapslice + name = "grilled slice of chap" + desc = "A greasy hot slice of chap. Forms a good part of a balanced meal." + icon = 'icons/obj/food/martian.dmi' + icon_state = "chapslice_grilled" + food_reagents = list( + /datum/reagent/consumable/nutriment/vitamin = 3 + ) + burns_on_grill = TRUE + tastes = list("meat" = 1) + foodtypes = MEAT + w_class = WEIGHT_CLASS_SMALL // DONK DINNER: THE INNOVATIVE WAY TO GET YOUR DAILY RECOMMENDED ALLOWANCE OF SALT... AND THEN SOME! /obj/item/food/ready_donk @@ -217,6 +265,35 @@ tastes = list("enchiladas" = 2, "laziness" = 1) foodtypes = GRAIN | DAIRY | MEAT | VEGETABLES | JUNKFOOD +/obj/item/food/ready_donk/nachos_grandes //which translates to... big nachos + name = "\improper Ready-Donk: Donk Sol Series Boritos Nachos Grandes" + desc = "Get ready for game day with Donk's classic Nachos Grandes, sponsors of the Donk Sol Series! Boritos chips loaded with cheese, spicy meat and beans, alongside separate guac, pico and donk sauce. Batter up!" + tastes = list("nachos" = 2, "laziness" = 1) + foodtypes = GRAIN | DAIRY | MEAT | VEGETABLES | JUNKFOOD + + warm_type = /obj/item/food/ready_donk/warm/nachos_grandes + +/obj/item/food/ready_donk/warm/nachos_grandes + name = "warm Ready-Donk: Donk Sol Series Boritos Nachos Grandes" + desc = "Get ready for game day with Donk's classic Nachos Grandes, sponsors of the Donk Sol Series! Boritos chips loaded with cheese, spicy meat and beans, alongside separate guac, pico and donk sauce. Served hotter than Sakamoto's fastball!" + icon_state = "ready_donk_warm_nachos" + tastes = list("nachos" = 2, "laziness" = 1) + foodtypes = GRAIN | DAIRY | MEAT | VEGETABLES | JUNKFOOD + +/obj/item/food/ready_donk/donkrange_chicken + name = "\improper Ready-Donk: Donk-range Chicken" + desc = "A Chinese classic, it's Donk's original spicy orange chicken with stir-fried peppers and onions, all over steamed rice." + tastes = list("orange chicken" = 2, "laziness" = 1) + foodtypes = GRAIN | MEAT | VEGETABLES | JUNKFOOD + + warm_type = /obj/item/food/ready_donk/warm/donkrange_chicken + +/obj/item/food/ready_donk/warm/donkrange_chicken + name = "warm Ready-Donk: Ready-Donk: Donk-range Chicken" + desc = "A Chinese classic, it's Donk's original spicy orange chicken with stir-fried peppers and onions, all over steamed rice and served hotter than a dragon's breath." + icon_state = "ready_donk_warm_orange" + tastes = list("orange chicken" = 2, "laziness" = 1) + foodtypes = GRAIN | MEAT | VEGETABLES | JUNKFOOD // Rations /obj/item/food/rationpack diff --git a/code/game/objects/items/food/pastries.dm b/code/game/objects/items/food/pastries.dm index 235524a4d75..74d71377144 100644 --- a/code/game/objects/items/food/pastries.dm +++ b/code/game/objects/items/food/pastries.dm @@ -493,3 +493,48 @@ tastes = list("peanut butter" = 1, "peanuts" = 1, "cream" = 1) foodtypes = GRAIN | JUNKFOOD | SUGAR | NUTS w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/cookie/chocolate_chip_cookie + name = "chocolate chip cookie" + desc = "A delightful-smelling chocolate chip cookie. Where's the milk?" + icon_state = "COOKIE!!!" + food_reagents = list(/datum/reagent/consumable/nutriment = 5) + tastes = list("soft cookie" = 2, "chocolate" = 3) + foodtypes = GRAIN | SUGAR | DAIRY + food_flags = FOOD_FINGER_FOOD + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/cookie/snickerdoodle + name = "snickerdoodle" + desc = "A soft cookie made from vanilla and cinnamon." + icon_state = "snickerdoodle" + food_reagents = list(/datum/reagent/consumable/nutriment = 5) + tastes = list("soft cookie" = 2, "vanilla" = 3) + foodtypes = GRAIN | SUGAR | DAIRY + food_flags = FOOD_FINGER_FOOD + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/cookie/macaron + name = "macaron" + desc = "A sandwich-like confectionary with a soft cookie shell and a creamy meringue center." + food_reagents = list(/datum/reagent/consumable/nutriment = 6) + icon_state = "macaron_1" + base_icon_state = "macaron" + tastes = list("wafer" = 2, "creamy meringue" = 3) + foodtypes = GRAIN | SUGAR | DAIRY + food_flags = FOOD_FINGER_FOOD + w_class = WEIGHT_CLASS_TINY + +/obj/item/food/cookie/macaron/Initialize(mapload) + . = ..() + icon_state = "[base_icon_state]_[rand(1, 4)]" + +/obj/item/food/cookie/thumbprint_cookie + name = "thumbprint cookie" + desc = "A cookie with a thumb-sized indent in the middle made for fillings. This one is filled with cherry jelly" + icon_state = "thumbprint_cookie" + food_reagents = list(/datum/reagent/consumable/nutriment = 6) + tastes = list("cookie" = 2, "cherry jelly" = 3) + foodtypes = GRAIN | SUGAR | FRUIT + food_flags = FOOD_FINGER_FOOD + w_class = WEIGHT_CLASS_SMALL diff --git a/code/game/objects/items/food/snacks.dm b/code/game/objects/items/food/snacks.dm index 37cb8e0dfb6..8f06352b71e 100644 --- a/code/game/objects/items/food/snacks.dm +++ b/code/game/objects/items/food/snacks.dm @@ -519,3 +519,153 @@ GLOBAL_LIST_INIT(safe_peanut_types, populate_safe_peanut_types()) qdel(sample) . = ..() + +/obj/item/food/hot_shots + name = "\improper Hot Shots" + desc = "The ultimate baseball snack. Once you start, it's hard to stop!" + icon_state = "hot_shots" + trash_type = /obj/item/trash/hot_shots + food_reagents = list( + /datum/reagent/consumable/nutriment = 2, + /datum/reagent/consumable/nutriment/vitamin = 1, + ) + tastes = list("popcorn" = 1, "caramel" = 1, "peanuts" = 1) + foodtypes = JUNKFOOD | SUGAR | NUTS + junkiness = 25 + w_class = WEIGHT_CLASS_SMALL + grind_results = list(/datum/reagent/consumable/cornoil = 3, /datum/reagent/consumable/caramel = 2) + +/obj/item/food/sticko + name = "\improper Sticko Classic" + desc = "A classic treat for all ages, it's Sticko, the original chocolate-coated biscuit stick! This one's the original (and as some would say, best) flavour: biscuit and milk chocolate." + icon_state = "sticko_classic" + trash_type = /obj/item/trash/sticko + food_reagents = list( + /datum/reagent/consumable/sugar = 3, + /datum/reagent/consumable/coco = 1, + ) + tastes = list("biscuit" = 1, "chocolate" = 1) + junkiness = 25 + foodtypes = JUNKFOOD | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/sticko/matcha + name = "\improper Sticko Matcha" + desc = "A classic treat for all ages, it's Sticko, the original chocolate-coated biscuit stick! This one's got matcha flavoured white chocolate as its coating, to evoke feelings of tradition." + icon_state = "sticko_matcha" + trash_type = /obj/item/trash/sticko/matcha + food_reagents = list( + /datum/reagent/consumable/sugar = 2, + /datum/reagent/consumable/coco = 1, + /datum/reagent/consumable/caramel = 1, + ) + tastes = list("biscuit" = 1, "matcha" = 1) + +/obj/item/food/sticko/nutty + name = "\improper Sticko Nutty" + desc = "A classic treat for all ages, it's Sticko, the original chocolate-coated biscuit stick! This one's got peanut-butter flavoured chocolate as its coating, for a nutty twist." + icon_state = "sticko_nutty" + trash_type = /obj/item/trash/sticko/nutty + food_reagents = list( + /datum/reagent/consumable/sugar = 2, + /datum/reagent/consumable/nutriment = 1, + /datum/reagent/consumable/coco = 1, + ) + tastes = list("biscuit" = 1, "peanut butter" = 1) + foodtypes = JUNKFOOD | GRAIN | NUTS + +/obj/item/food/sticko/pineapple + name = "\improper Sticko Pineapple" + desc = "A classic treat for all ages, it's Sticko, the original chocolate-coated biscuit stick! This one's got pineapple flavoured white chocolate as its coating, for those ananas fan-as." + icon_state = "sticko_pineapple" + trash_type = /obj/item/trash/sticko/pineapple + food_reagents = list( + /datum/reagent/consumable/sugar = 2, + /datum/reagent/consumable/coco = 1, + /datum/reagent/consumable/peanut_butter = 1, + ) + tastes = list("biscuit" = 1, "pineapple" = 1) + foodtypes = JUNKFOOD | GRAIN | PINEAPPLE + +/obj/item/food/sticko/yuyake + name = "\improper Sticko Yūyake" + desc = "A classic treat for all ages, it's Sticko, the original chocolate-coated biscuit stick! This one's got Yūyake flavoured white chocolate as its coating, for a refreshing melony treat." + icon_state = "sticko_yuyake" + trash_type = /obj/item/trash/sticko/yuyake + food_reagents = list( + /datum/reagent/consumable/sugar = 2, + /datum/reagent/consumable/coco = 1, + /datum/reagent/consumable/banana = 1, + ) + tastes = list("biscuit" = 1, "melon" = 1) + +/obj/item/food/sticko/random + name = "\improper Sticko Mystery" + desc = "A classic treat for all ages, it's Sticko, the original chocolate-coated biscuit stick! This one's got an obscuring paper sheath, to hide the true flavour..." + +/obj/item/food/sticko/random/Initialize(mapload) + var/random_flavour = pick(subtypesof(/obj/item/food/sticko) - /obj/item/food/sticko/random) + var/obj/item/food/sample = new random_flavour(loc) + name = sample.name + desc = sample.desc + food_reagents = sample.food_reagents + tastes = sample.tastes + + qdel(sample) + + . = ..() + +/obj/item/food/shok_roks + name = "\improper Shok-Roks - Stormcloud Candy flavour" + desc = "You've heard of Snap-Roks, now get ready for Shok-Roks: the popping candy for Ethereals! Available in 5 exciting flavours, of which this bag contains Stormcloud Candy- like cotton candy, but electric!" + icon_state = "shok_roks_candy" + trash_type = /obj/item/trash/shok_roks + food_reagents = list( + /datum/reagent/consumable/liquidelectricity/enriched = 2, + /datum/reagent/consumable/sugar = 3 + ) + tastes = list("sugar" = 1, "lightning" = 1) + +/obj/item/food/shok_roks/citrus + name = "\improper Shok-Roks - Cirrus Citrus flavour" + desc = "You've heard of Snap-Roks, now get ready for Shok-Roks: the popping candy for Ethereals! Available in 5 exciting flavours, of which this bag contains Cirrus Citrus- all the citrus flavour, none of the real citrus extract." + icon_state = "shok_roks_citrus" + trash_type = /obj/item/trash/shok_roks/citrus + tastes = list("citrus" = 1, "lightning" = 1) + +/obj/item/food/shok_roks/berry + name = "\improper Shok-Roks - Berry Storm flavour" + desc = "You've heard of Snap-Roks, now get ready for Shok-Roks: the popping candy for Ethereals! Available in 5 exciting flavours, of which this bag contains Berry Storm- filled with non-descript sour berry flavour!" + icon_state = "shok_roks_berry" + trash_type = /obj/item/trash/shok_roks/berry + tastes = list("sour berry" = 1, "lightning" = 1) + +/obj/item/food/shok_roks/tropical + name = "\improper Shok-Roks - Tropical Thunder flavour" + desc = "You've heard of Snap-Roks, now get ready for Shok-Roks: the popping candy for Ethereals! Available in 5 exciting flavours, of which this bag contains Tropical Thunder- all the tropical fruits! ALL OF THEM!" + icon_state = "shok_roks_tropical" + trash_type = /obj/item/trash/shok_roks/tropical + tastes = list("tropical fruits" = 1, "lightning" = 1) + +/obj/item/food/shok_roks/lanternfruit + name = "\improper Shok-Roks - Lightning Lanternfruit flavour" + desc = "You've heard of Snap-Roks, now get ready for Shok-Roks: the popping candy for Ethereals! Available in 5 exciting flavours, of which this bag contains Lightning Lanternfruit- the only Sprout-native fruit in any Shok-Rok flavour." + icon_state = "shok_roks_lanternfruit" + trash_type = /obj/item/trash/shok_roks/lanternfruit + tastes = list("sour pear" = 1, "lightning" = 1) + +/obj/item/food/shok_roks/random + name = "\improper Shok-Roks - Hidden Hurricane flavour" + desc = "You've heard of Snap-Roks, now get ready for Shok-Roks: the popping candy for Ethereals! Available in 5 exciting flavours, any of which could be in this bag!" + +/obj/item/food/shok_roks/random/Initialize(mapload) + var/random_flavour = pick(subtypesof(/obj/item/food/shok_roks) - /obj/item/food/shok_roks/random) + var/obj/item/food/sample = new random_flavour(loc) + name = sample.name + desc = sample.desc + food_reagents = sample.food_reagents + tastes = sample.tastes + + qdel(sample) + + . = ..() diff --git a/code/game/objects/items/food/spaghetti.dm b/code/game/objects/items/food/spaghetti.dm index 1c92c58b5cd..fa6bca4a351 100644 --- a/code/game/objects/items/food/spaghetti.dm +++ b/code/game/objects/items/food/spaghetti.dm @@ -154,3 +154,81 @@ ) tastes = list("cheese" = 1, "breadcrumbs" = 1, "pasta" = 1) foodtypes = GRAIN | DAIRY + +/obj/item/food/spaghetti/shoyu_tonkotsu_ramen + name = "shoyu tonkotsu ramen" + desc = "A simple ramen made of meat, egg, onion, and a sheet of seaweed." + icon_state = "shoyu_tonkotsu_ramen" + trash_type = /obj/item/reagent_containers/cup/bowl + food_reagents = list( + /datum/reagent/consumable/nutriment = 12, + /datum/reagent/consumable/nutriment/vitamin = 6, + /datum/reagent/consumable/nutriment/protein = 6, + ) + tastes = list("noodles" = 5, "meat" = 3, "egg" = 4, "dried seaweed" = 2) + foodtypes = GRAIN | MEAT | VEGETABLES + +/obj/item/food/spaghetti/kitakata_ramen + name = "kitakata ramen" + desc = "A hearty ramen composed of meat, mushrooms, onion, and garlic. Often given to the sick to comfort them" + icon_state = "kitakata_ramen" + trash_type = /obj/item/reagent_containers/cup/bowl + food_reagents = list( + /datum/reagent/consumable/nutriment = 15, + /datum/reagent/consumable/nutriment/vitamin = 6, + /datum/reagent/consumable/nutriment/protein = 8, + ) + tastes = list("noodles" = 5, "meat" = 4, "mushrooms" = 3, "onion" = 2) + foodtypes = GRAIN | MEAT | VEGETABLES + +/obj/item/food/spaghetti/kitsune_udon + name = "kitsune udon" + desc = "A vegetarian udon made of fried tofu and onions, made sweet and savory with sugar and soy sauce. The name comes from an old folktale about a fox enjoying fried tofu." + icon_state = "kitsune_udon" + trash_type = /obj/item/reagent_containers/cup/bowl + food_reagents = list( + /datum/reagent/consumable/nutriment = 12, + /datum/reagent/consumable/nutriment/vitamin = 10, + /datum/reagent/consumable/nutriment/protein = 4, + ) + tastes = list("noodles" = 5, "tofu" = 4, "sugar" = 3, "soy sauce" = 2) + foodtypes = GRAIN | VEGETABLES + +/obj/item/food/spaghetti/nikujaga + name = "nikujaga" + desc = "A delightful Japanese stew of noodles, onions, potatoes, and meat with mixed vegetables." + icon_state = "nikujaga" + trash_type = /obj/item/reagent_containers/cup/bowl + food_reagents = list( + /datum/reagent/consumable/nutriment = 16, + /datum/reagent/consumable/nutriment/vitamin = 12, + /datum/reagent/consumable/nutriment/protein = 8, + ) + tastes = list("noodles" = 5, "meat" = 4, "potato" = 3, "onion" = 2, "mixed veggies" = 2) + foodtypes = GRAIN | VEGETABLES | MEAT + +/obj/item/food/spaghetti/pho + name = "pho" + desc = "A Vietnamese dish made of noodles, vegetables, herbs, and meat. Makes for a very popular street food." + icon_state = "pho" + trash_type = /obj/item/reagent_containers/cup/bowl + food_reagents = list( + /datum/reagent/consumable/nutriment = 12, + /datum/reagent/consumable/nutriment/vitamin = 8, + /datum/reagent/consumable/nutriment/protein = 8, + ) + tastes = list("noodles" = 5, "meat" = 4, "cabbage" = 3, "onion" = 2, "herbs" = 2) + foodtypes = GRAIN | VEGETABLES | MEAT + +/obj/item/food/spaghetti/pad_thai + name = "pad thai" + desc = "A stir-fried noodle dish popular in Thailand made of peanuts, tofu, lime, and onions." + icon_state = "pad_thai" + trash_type = /obj/item/reagent_containers/cup/bowl + food_reagents = list( + /datum/reagent/consumable/nutriment = 15, + /datum/reagent/consumable/nutriment/vitamin = 10, + /datum/reagent/consumable/nutriment/protein = 4, + ) + tastes = list("noodles" = 5, "fried tofu" = 4, "lime" = 2, "peanut" = 3, "onion" = 2) + foodtypes = GRAIN | VEGETABLES | NUTS | FRUIT diff --git a/code/game/objects/items/food/vegetables.dm b/code/game/objects/items/food/vegetables.dm index f36f3f09a81..4c529befbd1 100644 --- a/code/game/objects/items/food/vegetables.dm +++ b/code/game/objects/items/food/vegetables.dm @@ -153,3 +153,40 @@ /obj/item/food/poutine/Initialize(mapload) . = ..() AddElement(/datum/element/dunkable, 10) + +/obj/item/food/sauteed_eggplant + name = "sauteed eggplant" + desc = "Thick-cut slices of eggplant sauteed in oil and minced garlic, creating a soft, crispy, healthy snack." + icon_state = "sauteed_eggplant" + food_reagents = list( + /datum/reagent/consumable/nutriment = 8, + /datum/reagent/consumable/nutriment/vitamin = 4, + ) + tastes = list("fried eggplant" = 4, "garlic" = 2, "olive oil" = 3) + foodtypes = VEGETABLES + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/baba_ghanoush + name = "baba ghanoush" + desc = "A thick dip made from mashed eggplant, olive oil, garlic, and lemon juice with some pita bread for dipping. You'll either love it or hate it." + icon_state = "baba_ghanoush" + trash_type = /obj/item/reagent_containers/cup/bowl + food_reagents = list( + /datum/reagent/consumable/nutriment = 8, + /datum/reagent/consumable/nutriment/vitamin = 6, + ) + tastes = list("mashed eggplant" = 5, "pita bread" = 4, "garlic" = 3, "olive oil" = 4, "lemon juice" = 2) + foodtypes = VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL + +/obj/item/food/falafel + name = "falafel" + desc = "Beans, herbs, onions, and garlic mashed together and formed into a ball, then deep-fried. The herbs give the interior a unique green color." + icon_state = "falafel" + food_reagents = list( + /datum/reagent/consumable/nutriment = 6, + /datum/reagent/consumable/nutriment/vitamin = 2, + ) + tastes = list("fava beans" = 5, "garlic" = 3, "onion" = 2, "fresh herbs" = 4) + foodtypes = VEGETABLES + w_class = WEIGHT_CLASS_SMALL diff --git a/code/game/objects/items/granters/_granters.dm b/code/game/objects/items/granters/_granters.dm index 634856a7b77..b205a1f0ffa 100644 --- a/code/game/objects/items/granters/_granters.dm +++ b/code/game/objects/items/granters/_granters.dm @@ -39,7 +39,8 @@ recoil(user) return FALSE - on_reading_start(user) + if(!on_reading_start(user)) + return reading = TRUE for(var/i in 1 to pages_to_mastery) if(!turn_page(user)) @@ -56,6 +57,7 @@ /// Called when the user starts to read the granter. /obj/item/book/granter/proc/on_reading_start(mob/living/user) to_chat(user, span_notice("You start reading [name]...")) + return TRUE /// Called when the reading is interrupted without finishing. /obj/item/book/granter/proc/on_reading_stopped(mob/living/user) @@ -99,6 +101,7 @@ /obj/item/book/granter/action/on_reading_start(mob/living/user) to_chat(user, span_notice("You start reading about [action_name]...")) + return TRUE /obj/item/book/granter/action/on_reading_finished(mob/living/user) to_chat(user, span_notice("You feel like you've got a good handle on [action_name]!")) diff --git a/code/game/objects/items/granters/crafting/_crafting_granter.dm b/code/game/objects/items/granters/crafting/_crafting_granter.dm index 1dd633e56e8..5b5ec82e42a 100644 --- a/code/game/objects/items/granters/crafting/_crafting_granter.dm +++ b/code/game/objects/items/granters/crafting/_crafting_granter.dm @@ -6,9 +6,10 @@ . = ..() if(!user.mind) return - for(var/datum/crafting_recipe/crafting_recipe_type as anything in crafting_recipe_types) + for(var/crafting_recipe_type in crafting_recipe_types) user.mind.teach_crafting_recipe(crafting_recipe_type) - to_chat(user, span_notice("You learned how to make [initial(crafting_recipe_type.name)].")) + var/datum/crafting_recipe/recipe = locate(crafting_recipe_type) in GLOB.crafting_recipes + to_chat(user, span_notice("You learned how to make [recipe.name].")) /obj/item/book/granter/crafting_recipe/dusting icon_state = "book1" diff --git a/code/game/objects/items/granters/magic/_spell_granter.dm b/code/game/objects/items/granters/magic/_spell_granter.dm index 2c9ea98c979..e1ca6352293 100644 --- a/code/game/objects/items/granters/magic/_spell_granter.dm +++ b/code/game/objects/items/granters/magic/_spell_granter.dm @@ -43,6 +43,7 @@ /obj/item/book/granter/action/spell/on_reading_start(mob/living/user) to_chat(user, span_notice("You start reading about casting [action_name]...")) + return TRUE /obj/item/book/granter/action/spell/on_reading_finished(mob/living/user) to_chat(user, span_notice("You feel like you've experienced enough to cast [action_name]!")) diff --git a/code/game/objects/items/granters/martial_arts/_martial_arts.dm b/code/game/objects/items/granters/martial_arts/_martial_arts.dm index 08f615a991e..7646faec2c6 100644 --- a/code/game/objects/items/granters/martial_arts/_martial_arts.dm +++ b/code/game/objects/items/granters/martial_arts/_martial_arts.dm @@ -16,6 +16,7 @@ /obj/item/book/granter/martial/on_reading_start(mob/user) to_chat(user, span_notice("You start reading about [martial_name]...")) + return TRUE /obj/item/book/granter/martial/on_reading_finished(mob/user) to_chat(user, "[greet]") diff --git a/code/game/objects/items/gun_maintenance.dm b/code/game/objects/items/gun_maintenance.dm index 03487780330..072ec395c19 100644 --- a/code/game/objects/items/gun_maintenance.dm +++ b/code/game/objects/items/gun_maintenance.dm @@ -1,6 +1,6 @@ /obj/item/gun_maintenance_supplies name = "gun maintenance supplies" - desc = "plastic box containing gun maintenance supplies and spare parts. Use them on a Mosin Nagant to clean it." + desc = "plastic box containing gun maintenance supplies and spare parts. Use them on a rifle to clean it." icon = 'icons/obj/storage/box.dmi' icon_state = "plasticbox" w_class = WEIGHT_CLASS_SMALL diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index 0266180a96d..df18b540453 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -608,3 +608,6 @@ . = ..() if(effectReference) QDEL_NULL(effectReference) + +#undef HANDCUFFS_TYPE_WEAK +#undef HANDCUFFS_TYPE_STRONG diff --git a/code/game/objects/items/implants/implantpad.dm b/code/game/objects/items/implants/implantpad.dm index e0a629f490b..c932886754c 100644 --- a/code/game/objects/items/implants/implantpad.dm +++ b/code/game/objects/items/implants/implantpad.dm @@ -25,12 +25,12 @@ if(case) . += span_warning("There seems to be something inside it, but you can't quite tell what from here...") -/obj/item/implantpad/handle_atom_del(atom/A) - if(A == case) - case = null - update_appearance() - updateSelfDialog() +/obj/item/implantpad/Exited(atom/movable/gone, direction) . = ..() + if(gone == case) + case = null + update_appearance() + updateSelfDialog() /obj/item/implantpad/AltClick(mob/user) ..() @@ -44,7 +44,6 @@ add_fingerprint(user) case.add_fingerprint(user) - case = null updateSelfDialog() update_appearance() diff --git a/code/game/objects/items/inspector.dm b/code/game/objects/items/inspector.dm index 53851334eea..ec4786c8cda 100644 --- a/code/game/objects/items/inspector.dm +++ b/code/game/objects/items/inspector.dm @@ -37,16 +37,10 @@ cell = new cell(src) // Clean up the cell on destroy -/obj/item/clothing/suit/space/Destroy() - if(isatom(cell)) - QDEL_NULL(cell) - return ..() - -// Clean up the cell on destroy -/obj/item/inspector/handle_atom_del(atom/A) - if(A == cell) +/obj/item/inspector/Exited(atom/movable/gone, direction) + . = ..() + if(gone == cell) cell = null - return ..() // support for items that interact with the cell /obj/item/inspector/get_cell() diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 1be7f391e78..f24efb7d263 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -416,16 +416,15 @@ ..() if (held_sausage) user.put_in_hands(held_sausage) - held_sausage = null - update_appearance() /obj/item/melee/roastingstick/update_overlays() . = ..() if(held_sausage) . += mutable_appearance(icon, "roastingstick_sausage") -/obj/item/melee/roastingstick/handle_atom_del(atom/target) - if (target == held_sausage) +/obj/item/melee/roastingstick/Exited(atom/movable/gone, direction) + . = ..() + if (gone == held_sausage) held_sausage = null update_appearance() diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm index b08e8dba9dd..86c548ea4de 100644 --- a/code/game/objects/items/pet_carrier.dm +++ b/code/game/objects/items/pet_carrier.dm @@ -32,17 +32,11 @@ return ..() /obj/item/pet_carrier/Exited(atom/movable/gone, direction) + . = ..() if(isliving(gone) && (gone in occupants)) - var/mob/living/L = gone + var/mob/living/living_gone = gone occupants -= gone - occupant_weight -= L.mob_size - -/obj/item/pet_carrier/handle_atom_del(atom/A) - if(A in occupants && isliving(A)) - var/mob/living/L = A - occupants -= L - occupant_weight -= L.mob_size - ..() + occupant_weight -= living_gone.mob_size /obj/item/pet_carrier/examine(mob/user) . = ..() diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 1f38102a083..77b76d85224 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -108,10 +108,10 @@ return ..() -/obj/item/toy/plush/handle_atom_del(atom/A) - if(A == grenade) +/obj/item/toy/plush/Exited(atom/movable/gone, direction) + . = ..() + if(gone == grenade) grenade = null - ..() /obj/item/toy/plush/attack_self(mob/user) . = ..() @@ -148,7 +148,6 @@ else to_chat(user, span_notice("You remove the grenade from [src].")) user.put_in_hands(grenade) - grenade = null return if(isgrenade(I)) if(stuffed) diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index 4af1da629d7..bd31228f2fc 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -250,15 +250,15 @@ var/turf/newtarget = locate(new_x, new_y, starting.z) return newtarget -/obj/item/pneumatic_cannon/handle_atom_del(atom/A) +/obj/item/pneumatic_cannon/Exited(atom/movable/gone, direction) . = ..() - if (loadedItems.Remove(A)) - var/obj/item/I = A - if(istype(I)) - loadedWeightClass -= I.w_class + if(loadedItems.Remove(gone)) + var/obj/item/item = gone + if(istype(item)) + loadedWeightClass -= item.w_class else loadedWeightClass-- - else if (A == tank) + else if (gone == tank) tank = null update_appearance() diff --git a/code/game/objects/items/rcd/RCD.dm b/code/game/objects/items/rcd/RCD.dm index 37ba6ee091d..f6e22b784f5 100644 --- a/code/game/objects/items/rcd/RCD.dm +++ b/code/game/objects/items/rcd/RCD.dm @@ -28,7 +28,7 @@ worn_icon_state = "RCD" lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - custom_premium_price = PAYCHECK_COMMAND * 10 + custom_premium_price = PAYCHECK_COMMAND * 2 max_matter = 160 slot_flags = ITEM_SLOT_BELT item_flags = NO_MAT_REDEMPTION | NOBLUDGEON @@ -161,6 +161,9 @@ COOLDOWN_DECLARE(destructive_scan_cooldown) + var/current_active_effects = 0 + var/frequent_use_debuff_multiplier = 3 + GLOBAL_VAR_INIT(icon_holographic_wall, init_holographic_wall()) GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) @@ -336,22 +339,38 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) var/list/rcd_results = A.rcd_vals(user, src) if(!rcd_results) return FALSE + var/delay = rcd_results["delay"] * delay_mod - var/obj/effect/constructing_effect/rcd_effect = new(get_turf(A), delay, src.mode) + + if ( + !(upgrade & RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN) \ + && !rcd_results[RCD_RESULT_BYPASS_FREQUENT_USE_COOLDOWN] \ + && current_active_effects > 0 + ) + delay *= frequent_use_debuff_multiplier + + current_active_effects += 1 + rcd_create_effect(A, user, delay, rcd_results) + current_active_effects -= 1 + +/obj/item/construction/rcd/proc/rcd_create_effect(atom/target, mob/user, delay, list/rcd_results) + var/obj/effect/constructing_effect/rcd_effect = new(get_turf(target), delay, src.mode, upgrade) //resource & structure placement sanity checks before & after delay along with beam effects - if(!checkResource(rcd_results["cost"], user) || !can_place(A, rcd_results, user)) + if(!checkResource(rcd_results["cost"], user) || !can_place(target, rcd_results, user)) qdel(rcd_effect) return FALSE var/beam if(ranged) - beam = user.Beam(A,icon_state="rped_upgrade", time = delay) - if(!do_after(user, delay, target = A)) + beam = user.Beam(target,icon_state="rped_upgrade", time = delay) + if(!do_after(user, delay, target = target)) qdel(rcd_effect) if(!isnull(beam)) qdel(beam) return FALSE - if(!checkResource(rcd_results["cost"], user) || !can_place(A, rcd_results, user)) + if (QDELETED(rcd_effect)) + return FALSE + if(!checkResource(rcd_results["cost"], user) || !can_place(target, rcd_results, user)) qdel(rcd_effect) return FALSE @@ -359,7 +378,7 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) qdel(rcd_effect) return FALSE activate() - if(!A.rcd_act(user, src, rcd_results["mode"])) + if(!target.rcd_act(user, src, rcd_results["mode"])) qdel(rcd_effect) return FALSE playsound(loc, 'sound/machines/click.ogg', 50, TRUE) @@ -612,7 +631,7 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) matter = 160 /obj/item/construction/rcd/loaded/upgraded - upgrade = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING + upgrade = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING | RCD_UPGRADE_ANTI_INTERRUPT | RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN /obj/item/construction/rcd/combat name = "industrial RCD" @@ -621,7 +640,20 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) max_matter = 500 matter = 500 canRturf = TRUE - upgrade = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING + upgrade = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING | RCD_UPGRADE_ANTI_INTERRUPT | RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN + +/obj/item/construction/rcd/ce + name = "professional RCD" + desc = "A higher-end model of the rapid construction device, prefitted with improved cooling and disruption prevention. Provided to the chief engineer." + upgrade = RCD_UPGRADE_ANTI_INTERRUPT | RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN + matter = 160 + color = list( + 0.3, 0.3, 0.7, 0.0, + 1.0, 1.0, 0.2, 0.0, + -0.2, 0.0, 1.0, 0.0, + 0.0, 0.0, 0.0, 1.0, + 0.0, 0.0, 0.0, 0.0, + ) #undef CONSTRUCTION_MODE #undef WINDOW_TYPE @@ -656,7 +688,7 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) name = "admin RCD" max_matter = INFINITY matter = INFINITY - upgrade = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING + upgrade = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING | RCD_UPGRADE_ANTI_INTERRUPT | RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN // Ranged RCD @@ -670,4 +702,4 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) icon_state = "arcd" inhand_icon_state = "oldrcd" has_ammobar = FALSE - upgrade = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING + upgrade = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING | RCD_UPGRADE_ANTI_INTERRUPT | RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN diff --git a/code/game/objects/items/rcd/RHD.dm b/code/game/objects/items/rcd/RHD.dm index 4d97f21a5a8..92a6ab77641 100644 --- a/code/game/objects/items/rcd/RHD.dm +++ b/code/game/objects/items/rcd/RHD.dm @@ -181,10 +181,7 @@ if(user) balloon_alert(user, "not enough silo material!") return FALSE - - silo_mats.mat_container.use_amount_mat(amount * SILO_USE_AMOUNT, /datum/material/iron) - var/static/list/mats = list(GET_MATERIAL_REF(/datum/material/iron) = SILO_USE_AMOUNT) - silo_mats.silo_log(src, "consume", -amount, "build", mats) + silo_mats.use_materials(list(/datum/material/iron = SILO_USE_AMOUNT), multiplier = amount, action = "build", name = "consume") return TRUE ///shared data for rcd,rld & plumbing @@ -286,6 +283,14 @@ desc = "It contains the design for firelock, air alarm, fire alarm, apc circuits and crap power cells." upgrade = RCD_UPGRADE_SIMPLE_CIRCUITS +/obj/item/rcd_upgrade/anti_interrupt + desc = "It contains the upgrades necessary to prevent interruption of RCD construction and deconstruction." + upgrade = RCD_UPGRADE_ANTI_INTERRUPT + +/obj/item/rcd_upgrade/cooling + desc = "It contains the upgrades necessary to allow more frequent use of the RCD." + upgrade = RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN + /obj/item/rcd_upgrade/silo_link desc = "It contains direct silo connection RCD upgrade." upgrade = RCD_UPGRADE_SILO_LINK diff --git a/code/game/objects/items/rcd/RLD.dm b/code/game/objects/items/rcd/RLD.dm index 4cfc3d086c0..c5853d2997a 100644 --- a/code/game/objects/items/rcd/RLD.dm +++ b/code/game/objects/items/rcd/RLD.dm @@ -18,7 +18,7 @@ has_ammobar = TRUE ammo_sections = 6 ///it does not make sense why any of these should be installed - banned_upgrades = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING + banned_upgrades = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING | RCD_UPGRADE_ANTI_INTERRUPT | RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN var/mode = LIGHT_MODE var/wallcost = 10 diff --git a/code/game/objects/items/rcd/RPD.dm b/code/game/objects/items/rcd/RPD.dm index 3abc9d755e3..a7b10cc516a 100644 --- a/code/game/objects/items/rcd/RPD.dm +++ b/code/game/objects/items/rcd/RPD.dm @@ -55,6 +55,7 @@ GLOBAL_LIST_INIT(disposal_pipe_recipes, list( new /datum/pipe_info/disposal("Junction", /obj/structure/disposalpipe/junction, PIPE_TRIN_M), new /datum/pipe_info/disposal("Y-Junction", /obj/structure/disposalpipe/junction/yjunction), new /datum/pipe_info/disposal("Sort Junction", /obj/structure/disposalpipe/sorting/mail, PIPE_TRIN_M), + new /datum/pipe_info/disposal("Rotator", /obj/structure/disposalpipe/rotator, PIPE_ONEDIR_FLIPPABLE), new /datum/pipe_info/disposal("Trunk", /obj/structure/disposalpipe/trunk), new /datum/pipe_info/disposal("Bin", /obj/machinery/disposal/bin, PIPE_ONEDIR), new /datum/pipe_info/disposal("Outlet", /obj/structure/disposaloutlet), @@ -73,9 +74,9 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( ), "Station Equipment" = list( new /datum/pipe_info/transit("Through Tube Station", /obj/structure/c_transit_tube/station, PIPE_STRAIGHT), - new /datum/pipe_info/transit("Terminus Tube Station", /obj/structure/c_transit_tube/station/reverse, PIPE_UNARY), + new /datum/pipe_info/transit("Terminus Tube Station", /obj/structure/c_transit_tube/station/reverse, PIPE_UNARY_FLIPPABLE), new /datum/pipe_info/transit("Through Tube Dispenser Station", /obj/structure/c_transit_tube/station/dispenser, PIPE_STRAIGHT), - new /datum/pipe_info/transit("Terminus Tube Dispenser Station", /obj/structure/c_transit_tube/station/dispenser/reverse, PIPE_UNARY), + new /datum/pipe_info/transit("Terminus Tube Dispenser Station", /obj/structure/c_transit_tube/station/dispenser/reverse, PIPE_UNARY_FLIPPABLE), new /datum/pipe_info/transit("Transit Tube Pod", /obj/structure/c_transit_tube_pod, PIPE_ONEDIR), ) )) @@ -110,11 +111,13 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( if(PIPE_UNARY_FLIPPABLE) dirs = list("[NORTH]" = "North", "[EAST]" = "East", "[SOUTH]" = "South", "[WEST]" = "West", "[NORTHEAST]" = "North Flipped", "[SOUTHEAST]" = "East Flipped", "[SOUTHWEST]" = "South Flipped", "[NORTHWEST]" = "West Flipped") + if(PIPE_ONEDIR_FLIPPABLE) + dirs = list("[SOUTH]" = name, "[SOUTHEAST]" = "[name] Flipped") var/list/rows = list() for(var/dir in dirs) var/numdir = text2num(dir) - var/flipped = ((dirtype == PIPE_TRIN_M) || (dirtype == PIPE_UNARY_FLIPPABLE)) && (ISDIAGONALDIR(numdir)) + var/flipped = ((dirtype == PIPE_TRIN_M) || (dirtype == PIPE_UNARY_FLIPPABLE) || (dirtype == PIPE_ONEDIR_FLIPPABLE)) && (ISDIAGONALDIR(numdir)) var/is_variant_selected = selected && (!selected_dir ? FALSE : (dirtype == PIPE_ONEDIR ? TRUE : (numdir == selected_dir))) rows += list(list( "selected" = is_variant_selected, diff --git a/code/game/objects/items/rcd/RPLD.dm b/code/game/objects/items/rcd/RPLD.dm index 8679efb4934..2ff38a6b0c1 100644 --- a/code/game/objects/items/rcd/RPLD.dm +++ b/code/game/objects/items/rcd/RPLD.dm @@ -10,16 +10,12 @@ icon = 'icons/obj/tools.dmi' slot_flags = ITEM_SLOT_BELT ///it does not make sense why any of these should be installed. - banned_upgrades = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING + banned_upgrades = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING | RCD_UPGRADE_ANTI_INTERRUPT | RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN matter = 200 max_matter = 200 ///type of the plumbing machine var/obj/machinery/blueprint = null - ///index, used in the attack self to get the type. stored here since it doesnt change - var/list/choices = list() - ///All info for construction - var/list/machinery_data = list("cost" = list()) ///This list that holds all the plumbing design types the plumberer can construct. Its purpose is to make it easy to make new plumberer subtypes with a different selection of machines. var/list/plumbing_design_types ///Current selected layer @@ -34,46 +30,59 @@ "Fourth Layer" = 4, "Fifth Layer" = 5, ) + ///Design types for general plumbing constructor + var/static/list/general_design_types = list( + //category 1 Synthesizers i.e devices which creates , reacts & destroys chemicals + "Synthesizers" = list( + /obj/machinery/plumbing/synthesizer = 15, + /obj/machinery/plumbing/reaction_chamber/chem = 15, + /obj/machinery/plumbing/grinder_chemical = 30, + /obj/machinery/plumbing/growing_vat = 20, + /obj/machinery/plumbing/fermenter = 30, + /obj/machinery/plumbing/liquid_pump = 35, //extracting chemicals from ground is one way of creation + /obj/machinery/plumbing/disposer = 10, + /obj/machinery/plumbing/buffer = 10, //creates chemicals as it waits for other buffers containing other chemicals and when mixed creates new chemicals + ), + + //category 2 distributors i.e devices which inject , move around , remove chemicals from the network + "Distributors" = list( + /obj/machinery/duct = 1, + /obj/machinery/plumbing/layer_manifold = 5, + /obj/machinery/plumbing/input = 5, + /obj/machinery/plumbing/filter = 5, + /obj/machinery/plumbing/splitter = 5, + /obj/machinery/plumbing/sender = 20, + /obj/machinery/plumbing/output = 5, + ), + + //category 3 Storage i.e devices which stores & makes the processed chemicals ready for consumption + "Storage" = list( + /obj/machinery/plumbing/tank = 20, + /obj/machinery/plumbing/acclimator = 10, + /obj/machinery/plumbing/bottler = 50, + /obj/machinery/plumbing/pill_press = 20, + /obj/machinery/iv_drip/plumbing = 20 + ), + // SKYRAT EDIT ADDITION START - static list so we have no choice but to skyrat edit these here + + //category 4 liquids + "Liquids" = list( + /obj/structure/drain = 5, + ), + // SKYRAT EDIT ADDITION END + ) /obj/item/construction/plumbing/Initialize(mapload) . = ..() - //design types supported for this plumbing rcd - set_plumbing_designs() + plumbing_design_types = general_design_types - //set cost of each machine & initial blueprint - for(var/obj/machinery/plumbing/plumbing_type as anything in plumbing_design_types) - machinery_data["cost"][plumbing_type] = plumbing_design_types[plumbing_type] - blueprint = plumbing_design_types[1] - -/obj/item/construction/plumbing/proc/set_plumbing_designs() - plumbing_design_types = list( - //category 1 Synthesizers i.e devices which creates , reacts & destroys chemicals - /obj/machinery/plumbing/synthesizer = 15, - /obj/machinery/plumbing/reaction_chamber/chem = 15, - /obj/machinery/plumbing/grinder_chemical = 30, - /obj/machinery/plumbing/growing_vat = 20, - /obj/machinery/plumbing/fermenter = 30, - /obj/machinery/plumbing/liquid_pump = 35, //extracting chemicals from ground is one way of creation - /obj/machinery/plumbing/disposer = 10, - /obj/machinery/plumbing/buffer = 10, //creates chemicals as it waits for other buffers containing other chemicals and when mixed creates new chemicals - - //category 2 distributors i.e devices which inject , move around , remove chemicals from the network - /obj/machinery/duct = 1, - /obj/machinery/plumbing/layer_manifold = 5, - /obj/machinery/plumbing/input = 5, - /obj/machinery/plumbing/filter = 5, - /obj/machinery/plumbing/splitter = 5, - /obj/machinery/plumbing/sender = 20, - /obj/machinery/plumbing/output = 5, - - //category 3 Storage i.e devices which stores & makes the processed chemicals ready for consumption - /obj/machinery/plumbing/tank = 20, - /obj/machinery/plumbing/acclimator = 10, - /obj/machinery/plumbing/bottler = 50, - /obj/machinery/plumbing/pill_press = 20, - /obj/machinery/iv_drip/plumbing = 20 - ) + /** + * plumbing_design_types[1] = "Synthesizers" + * plumbing_design_types["Synthesizers"] = + * [1] = + */ + blueprint = plumbing_design_types[plumbing_design_types[1]][1] /obj/item/construction/plumbing/equipped(mob/user, slot, initial) . = ..() @@ -113,48 +122,37 @@ /obj/item/construction/plumbing/ui_static_data(mob/user) return list("paint_colors" = GLOB.pipe_paint_colors) -///find which category this design belongs to -/obj/item/construction/plumbing/proc/get_category(obj/machinery/recipe) - if(ispath(recipe, /obj/machinery/plumbing)) - var/obj/machinery/plumbing/plumbing_design = recipe - return initial(plumbing_design.category) - else if(ispath(recipe , /obj/machinery/duct)) - return "Distribution" - else - return "Storage" - /obj/item/construction/plumbing/ui_data(mob/user) var/list/data = ..() data["piping_layer"] = name_to_number[current_layer] //maps layer name to layer number's 1,2,3,4,5 data["selected_color"] = current_color data["layer_icon"] = "plumbing_layer[GLOB.plumbing_layers[current_layer]]" - data["selected_category"] = get_category(blueprint) data["selected_recipe"] = initial(blueprint.name) - var/list/category_list = list() - var/category_name = "" - var/obj/machinery/recipe = null + var/category_list = list() + for(var/category_name in plumbing_design_types) + var/list/designs = plumbing_design_types[category_name] - for(var/i in 1 to plumbing_design_types.len) - recipe = plumbing_design_types[i] + //Create category + var/list/item_list = list() + item_list["cat_name"] = category_name //used by RapidPipeDispenser.js + item_list["recipes"] = list() //used by RapidPipeDispenser.js + category_list[category_name] = item_list - category_name = get_category(recipe) //get category of design - if(!category_list[category_name]) - var/list/item_list = list() - item_list["cat_name"] = category_name //used by RapidPipeDispenser.js - item_list["recipes"] = list() //used by RapidPipeDispenser.js - category_list[category_name] = item_list + //Add designs to category + for(var/obj/machinery/recipe as anything in designs) + category_list[category_name]["recipes"] += list(list( + "icon" = initial(recipe.icon_state), + "name" = initial(recipe.name), + )) - //add item to category - category_list[category_name]["recipes"] += list(list( - "index" = i, - "icon" = initial(recipe.icon_state), - "name" = initial(recipe.name), - )) + //Set selected category + if(blueprint == recipe) + data["selected_category"] = category_name data["categories"] = list() - for(category_name in category_list) + for(var/category_name in category_list) data["categories"] += list(category_list[category_name]) return data @@ -176,9 +174,15 @@ if(layer != null) //validate if this value exists in the list current_layer = layer if("recipe") - var/design = plumbing_design_types[text2num(params["id"])] - if(design != null) //validate if design is valid - blueprint = design + var/category = params["category"] + if(!plumbing_design_types[category]) + return FALSE + + var/design = plumbing_design_types[category][text2num(params["id"]) + 1] + if(!design) + return FALSE + blueprint = design + playsound(src, 'sound/effects/pop.ogg', 50, vary = FALSE) return TRUE @@ -186,23 +190,31 @@ ///pretty much rcd_create, but named differently to make myself feel less bad for copypasting from a sibling-type /obj/item/construction/plumbing/proc/create_machine(atom/destination, mob/user) - if(!machinery_data || !isopenturf(destination)) + if(!isopenturf(destination)) + return FALSE + + var/cost = 0 + for(var/category in plumbing_design_types) + cost = plumbing_design_types[category][blueprint] + if(cost) + break + if(!cost) return FALSE //resource & placement sanity check before & after delay var/is_allowed = TRUE - if(!checkResource(machinery_data["cost"][blueprint], user) || !(is_allowed = canPlace(destination))) + if(!checkResource(cost, user) || !(is_allowed = canPlace(destination))) if(!is_allowed) balloon_alert(user, "turf is blocked!") - return FALSE - if(!do_after(user, machinery_data["cost"][blueprint], target = destination)) //"cost" is relative to delay at a rate of 10 matter/second (1matter/decisecond) rather than playing with 2 different variables since everyone set it to this rate anyways. return FALSE - if(!checkResource(machinery_data["cost"][blueprint], user) || !(is_allowed = canPlace(destination))) + if(!do_after(user, cost, target = destination)) //"cost" is relative to delay at a rate of 10 matter/second (1matter/decisecond) rather than playing with 2 different variables since everyone set it to this rate anyways. + return FALSE + if(!checkResource(cost, user) || !(is_allowed = canPlace(destination))) if(!is_allowed) balloon_alert(user, "turf is blocked!") - return FALSE + return FALSE - if(!useResource(machinery_data["cost"][blueprint], user)) + if(!useResource(cost, user)) return FALSE activate() playsound(loc, 'sound/machines/click.ogg', 50, TRUE) @@ -249,16 +261,24 @@ . = ..() if(!proximity) return - if(istype(target, /obj/machinery/plumbing)) - var/obj/machinery/machine_target = target - if(machine_target.anchored) - balloon_alert(user, "anchor first!") + + for(var/category_name in plumbing_design_types) + var/list/designs = plumbing_design_types[category_name] + + for(var/obj/machinery/recipe as anything in designs) + if(target.type != recipe) + continue + + var/obj/machinery/machine_target = target + if(machine_target.anchored) + balloon_alert(user, "unanchor first!") + return + if(do_after(user, 20, target = target)) + machine_target.deconstruct() //Let's not substract matter + playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) //this is just such a great sound effect return - if(do_after(user, 20, target = target)) - machine_target.deconstruct() //Let's not substract matter - playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) //this is just such a great sound effect - else - create_machine(target, user) + + create_machine(target, user) /obj/item/construction/plumbing/AltClick(mob/user) ui_interact(user) @@ -289,55 +309,91 @@ inhand_icon_state = "plumberer_sci" lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' + ///Design types for research plumbing constructor + var/list/static/research_design_types = list( + //Category 1 Synthesizers + "Synthesizers" = list( + /obj/machinery/plumbing/reaction_chamber = 15, + /obj/machinery/plumbing/grinder_chemical = 30, + /obj/machinery/plumbing/disposer = 10, + /obj/machinery/plumbing/growing_vat = 20, + ), -/obj/item/construction/plumbing/research/set_plumbing_designs() - plumbing_design_types = list( - //category 1 synthesizers - /obj/machinery/plumbing/reaction_chamber = 15, - /obj/machinery/plumbing/grinder_chemical = 30, - /obj/machinery/plumbing/disposer = 10, - /obj/machinery/plumbing/growing_vat = 20, + //Category 2 Distributors + "Distributors" = list( + /obj/machinery/duct = 1, + /obj/machinery/plumbing/input = 5, + /obj/machinery/plumbing/filter = 5, + /obj/machinery/plumbing/splitter = 5, + /obj/machinery/plumbing/output = 5, + ), - //category 2 Distributors - /obj/machinery/duct = 1, - /obj/machinery/plumbing/input = 5, - /obj/machinery/plumbing/filter = 5, - /obj/machinery/plumbing/splitter = 5, - /obj/machinery/plumbing/output = 5, + //Category 3 storage + "Storage" = list( + /obj/machinery/plumbing/tank = 20, + /obj/machinery/plumbing/acclimator = 10, + ), + // SKYRAT EDIT ADDITION START - static list so we have no choice but to skyrat edit these here - //category 3 storage - /obj/machinery/plumbing/tank = 20, - /obj/machinery/plumbing/acclimator = 10, + //category 4 liquids + "Liquids" = list( + /obj/structure/drain = 5, + /obj/machinery/plumbing/floor_pump/input = 20, + /obj/machinery/plumbing/floor_pump/output = 20, + ), + // SKYRAT EDIT ADDITION END ) +/obj/item/construction/plumbing/research/Initialize(mapload) + . = ..() + + plumbing_design_types = research_design_types + /obj/item/construction/plumbing/service name = "service plumbing constructor" desc = "A type of plumbing constructor designed to rapidly deploy the machines needed to make a brewery." icon_state = "plumberer_service" + ///Design types for plumbing service constructor + var/static/list/service_design_types = list( + //Category 1 synthesizers + "Synthesizers" = list( + /obj/machinery/plumbing/synthesizer/soda = 15, + /obj/machinery/plumbing/synthesizer/beer = 15, + /obj/machinery/plumbing/reaction_chamber = 15, + /obj/machinery/plumbing/buffer = 10, + /obj/machinery/plumbing/fermenter = 30, + /obj/machinery/plumbing/grinder_chemical = 30, + /obj/machinery/plumbing/disposer = 10, + ), -/obj/item/construction/plumbing/service/set_plumbing_designs() - plumbing_design_types = list( - //category 1 synthesizers - /obj/machinery/plumbing/synthesizer/soda = 15, - /obj/machinery/plumbing/synthesizer/beer = 15, - /obj/machinery/plumbing/reaction_chamber = 15, - /obj/machinery/plumbing/buffer = 10, - /obj/machinery/plumbing/fermenter = 30, - /obj/machinery/plumbing/grinder_chemical = 30, - /obj/machinery/plumbing/disposer = 10, - - - //category 2 distributors - /obj/machinery/duct = 1, - /obj/machinery/plumbing/layer_manifold = 5, - /obj/machinery/plumbing/input = 5, - /obj/machinery/plumbing/filter = 5, - /obj/machinery/plumbing/splitter = 5, - /obj/machinery/plumbing/output/tap = 5, - /obj/machinery/plumbing/sender = 20, + //Category 2 distributors + "Distributors" = list( + /obj/machinery/duct = 1, + /obj/machinery/plumbing/layer_manifold = 5, + /obj/machinery/plumbing/input = 5, + /obj/machinery/plumbing/filter = 5, + /obj/machinery/plumbing/splitter = 5, + /obj/machinery/plumbing/output/tap = 5, + /obj/machinery/plumbing/sender = 20, + ), //category 3 storage - /obj/machinery/plumbing/bottler = 50, - /obj/machinery/plumbing/tank = 20, - /obj/machinery/plumbing/acclimator = 10, + "Storage" = list( + /obj/machinery/plumbing/bottler = 50, + /obj/machinery/plumbing/tank = 20, + /obj/machinery/plumbing/acclimator = 10, + ), + // SKYRAT EDIT ADDITION START - static list so we have no choice but to skyrat edit these here + + //category 4 liquids + "Liquids" = list( + /obj/structure/drain = 5, + ), + // SKYRAT EDIT ADDITION END ) + +/obj/item/construction/plumbing/service/Initialize(mapload) + . = ..() + + plumbing_design_types = service_design_types + diff --git a/code/game/objects/items/rcd/RTD.dm b/code/game/objects/items/rcd/RTD.dm index 9141e77ae95..78408af895c 100644 --- a/code/game/objects/items/rcd/RTD.dm +++ b/code/game/objects/items/rcd/RTD.dm @@ -23,7 +23,7 @@ slot_flags = ITEM_SLOT_BELT item_flags = NO_MAT_REDEMPTION | NOBLUDGEON has_ammobar = TRUE - banned_upgrades = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING + banned_upgrades = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING | RCD_UPGRADE_ANTI_INTERRUPT | RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN /// main category for tile design var/root_category = "Conventional" diff --git a/code/game/objects/items/robot/items/food.dm b/code/game/objects/items/robot/items/food.dm index 75484e55316..0ecfefa589d 100644 --- a/code/game/objects/items/robot/items/food.dm +++ b/code/game/objects/items/robot/items/food.dm @@ -170,6 +170,7 @@ icon_state = "gumball" damage = 0 speed = 0.5 + embedding = null /obj/projectile/bullet/gumball/Initialize(mapload) . = ..() @@ -202,6 +203,7 @@ icon_state = "lollipop_1" damage = 0 speed = 0.5 + embedding = null var/head_color /obj/projectile/bullet/lollipop/harmful @@ -215,6 +217,7 @@ rip_time = 10, ) damage = 10 + shrapnel_type = /obj/item/food/lollipop/cyborg embed_falloff_tile = 0 /obj/projectile/bullet/lollipop/Initialize(mapload) @@ -222,8 +225,9 @@ var/mutable_appearance/head = mutable_appearance('icons/obj/weapons/guns/projectiles.dmi', "lollipop_2") head.color = head_color = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) add_overlay(head) - AddElement(/datum/element/projectile_drop, /obj/item/food/lollipop/cyborg) - RegisterSignal(src, COMSIG_PROJECTILE_ON_SPAWN_DROP, PROC_REF(handle_drop)) + if(!embedding) + AddElement(/datum/element/projectile_drop, /obj/item/food/lollipop/cyborg) + RegisterSignals(src, list(COMSIG_PROJECTILE_ON_SPAWN_DROP, COMSIG_PROJECTILE_ON_SPAWN_EMBEDDED), PROC_REF(handle_drop)) /obj/projectile/bullet/lollipop/proc/handle_drop(datum/source, obj/item/food/lollipop/lollipop) SIGNAL_HANDLER diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm index 3e325dcb7e6..dd4865980ca 100644 --- a/code/game/objects/items/stacks/bscrystal.dm +++ b/code/game/objects/items/stacks/bscrystal.dm @@ -2,7 +2,7 @@ /obj/item/stack/ore/bluespace_crystal name = "bluespace crystal" desc = "A glowing bluespace crystal, not much is known about how they work. It looks very delicate." - icon = 'icons/obj/stack_objects.dmi' + icon = 'icons/obj/ore.dmi' icon_state = "bluespace_crystal" singular_name = "bluespace crystal" dye_color = DYE_COSMIC diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 5113559cfd8..8cc3c0ac41f 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -86,10 +86,6 @@ patient.balloon_alert(user, "they're dead!") return if(isanimal_or_basicmob(patient) && heal_brute) // only brute can heal - var/mob/living/simple_animal/critter = patient - if (istype(critter) && !critter.healable) - patient.balloon_alert(user, "won't work!") - return FALSE if (!(patient.mob_biotypes & MOB_ORGANIC)) patient.balloon_alert(user, "can't fix that!") return FALSE @@ -148,8 +144,7 @@ /obj/item/stack/medical/gauze name = "medical gauze" - //desc = "A roll of elastic cloth, perfect for stabilizing all kinds of wounds, from cuts and burns, to broken bones. " //ORIGINAL - desc = "A roll of elastic cloth, perfect for stabilizing all kinds of slashes, punctures and burns. " //SKYRAT EDIT CHANGE - MEDICAL + desc = "A roll of elastic cloth, perfect for stabilizing all kinds of wounds, from cuts and burns, to broken bones. " gender = PLURAL singular_name = "medical gauze" icon_state = "gauze" @@ -164,7 +159,6 @@ splint_factor = 0.7 burn_cleanliness_bonus = 0.35 merge_type = /obj/item/stack/medical/gauze - var/gauze_type = /datum/bodypart_aid/gauze //SKYRAT EDIT ADDITION - MEDICAL // gauze is only relevant for wounds, which are handled in the wounds themselves /obj/item/stack/medical/gauze/try_heal(mob/living/patient, mob/user, silent) @@ -190,16 +184,9 @@ patient.balloon_alert(user, "can't heal those!") return - //SKYRAT EDIT CHANGE BEGIN - MEDICAL - /* if(limb.current_gauze && (limb.current_gauze.absorption_capacity * 1.2 > absorption_capacity)) // ignore if our new wrap is < 20% better than the current one, so someone doesn't bandage it 5 times in a row patient.balloon_alert(user, pick("already bandaged!", "bandage is clean!")) // good enough return - */ - if(limb.current_gauze) - balloon_alert(user, "already bandaged!") - return - //SKYRAT EDIT CHANGE END if(HAS_TRAIT(woundies, TRAIT_WOUND_SCANNED)) treatment_delay *= 0.5 @@ -251,7 +238,6 @@ absorption_rate = 0.075 absorption_capacity = 4 merge_type = /obj/item/stack/medical/gauze/improvised - gauze_type = /datum/bodypart_aid/gauze/improvised //SKYRAT EDIT ADDITION - MEDICAL /* The idea is for the following medical devices to work like a hybrid of the old brute packs and tend wounds, diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 5cf5c4087bb..60db8f800a2 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -1,14 +1,17 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ - new/datum/stack_recipe("grille", /obj/structure/grille, 2, time = 10, 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 = 10, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("scooter frame", /obj/item/scooter_frame, 10, time = 25, one_per_turf = FALSE, category = CAT_ENTERTAINMENT), \ - new/datum/stack_recipe("linen bin", /obj/structure/bedsheetbin/empty, 2, time = 5, one_per_turf = FALSE, category = CAT_CONTAINERS), \ - new/datum/stack_recipe("railing", /obj/structure/railing, 6, time = 3.6 SECONDS, check_direction = TRUE, category = CAT_STRUCTURE), \ - new/datum/stack_recipe("tank holder", /obj/structure/tank_holder, 2, time = 5, 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 = 150, 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, 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("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 = 10, one_per_turf = FALSE, category = CAT_TOOLS), \ + new/datum/stack_recipe("white cane", /obj/item/cane/white, 3, time = 1 SECONDS, one_per_turf = FALSE, category = CAT_TOOLS), \ )) /obj/item/stack/rods diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 8da8d83e30e..3ad762153e2 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -49,6 +49,29 @@ GLOBAL_LIST_INIT(sandstone_recipes, list ( \ /obj/item/stack/sheet/mineral/sandstone/thirty amount = 30 +/* + * Clay Bricks + */ + +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) \ + )) + +/obj/item/stack/sheet/mineral/clay + name = "clay brick" + desc = "A heavy clay brick." + singular_name = "clay brick" + icon_state = "sheet-clay" + inhand_icon_state = null + throw_speed = 3 + throw_range = 5 + merge_type = /obj/item/stack/sheet/mineral/clay + +/obj/item/stack/sheet/mineral/clay/get_main_recipes() + . = ..() + . += GLOB.clay_recipes + /* * Sandbags */ diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 0c55f73633f..9257035d8de 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -426,6 +426,8 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ new/datum/stack_recipe("white bandana", /obj/item/clothing/mask/bandana/white, 2, check_density = FALSE, 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), \ null, \ new/datum/stack_recipe("plant bag", /obj/item/storage/bag/plants, 4, check_density = FALSE, category = CAT_CONTAINERS), \ @@ -859,6 +861,7 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra merge_type = /obj/item/stack/sheet/hauntium material_type = /datum/material/hauntium material_modifier = 1 //None of that wussy stuff + grind_results = list(/datum/reagent/hauntium = 20) /obj/item/stack/sheet/hauntium/fifty amount = 50 diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 3b72a282f22..54fb4866835 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -153,7 +153,7 @@ /obj/item/stack/grind_requirements() if(is_cyborg) - to_chat(usr, span_warning("[src] is electronically synthesized in your chassis and can't be ground up!")) + to_chat(usr, span_warning("[src] is too integrated into your chassis and can't be ground up!")) return return TRUE @@ -186,10 +186,6 @@ /obj/item/stack/examine(mob/user) . = ..() if(is_cyborg) - if(singular_name) - . += "There is enough energy for [get_amount()] [singular_name]\s." - else - . += "There is enough energy for [get_amount()]." return if(singular_name) if(get_amount()>1) diff --git a/code/game/objects/items/stacks/tiles/tile_iron.dm b/code/game/objects/items/stacks/tiles/tile_iron.dm index 5a0a928d7ad..404c3025344 100644 --- a/code/game/objects/items/stacks/tiles/tile_iron.dm +++ b/code/game/objects/items/stacks/tiles/tile_iron.dm @@ -16,7 +16,7 @@ source = /datum/robot_energy_storage/material/iron merge_type = /obj/item/stack/tile/iron tile_reskin_types = list( - /obj/item/stack/tile/iron, + /obj/item/stack/tile/iron/base, /obj/item/stack/tile/iron/edge, /obj/item/stack/tile/iron/half, /obj/item/stack/tile/iron/corner, diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index cdf1f81f879..d15396e0bb5 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -33,6 +33,7 @@ . = ..() pixel_x = rand(-3, 3) pixel_y = rand(-3, 3) //randomize a little + AddElement(/datum/element/openspace_item_click_handler) if(tile_reskin_types) tile_reskin_types = tile_reskin_list(tile_reskin_types) if(tile_rotate_dirs) @@ -100,6 +101,10 @@ playsound(target_plating, 'sound/weapons/genhit.ogg', 50, TRUE) return target_plating +/obj/item/stack/tile/handle_openspace_click(turf/target, mob/user, proximity_flag, click_parameters) + if(proximity_flag) + target.attackby(src, user, click_parameters) + //Grass /obj/item/stack/tile/grass name = "grass tile" diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 53fae39c1dc..63133a06be1 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -471,7 +471,8 @@ slowdown = initial(slowdown) atom_storage.locked = STORAGE_SOFT_LOCKED atom_storage.display_contents = FALSE - atom_storage.close_all() + for(var/obj/item/weapon as anything in get_all_contents_type(/obj/item)) //close ui of this and all items inside dufflebag + weapon.atom_storage?.close_all() //not everything has storage initialized else slowdown = zip_slowdown atom_storage.locked = STORAGE_NOT_LOCKED @@ -821,3 +822,90 @@ new /obj/item/gun/energy/recharge/kinetic_accelerator(src) new /obj/item/knife/combat/survival(src) new /obj/item/flashlight/seclite(src) + +/* + * Messenger Bag Types + */ + +/obj/item/storage/backpack/messenger + name = "messenger bag" + desc = "A trendy looking messenger bag; sometimes known as a courier bag. Fashionable and portable." + icon_state = "messenger" + inhand_icon_state = "messenger" + icon = 'icons/obj/storage/backpack.dmi' + worn_icon = 'icons/mob/clothing/back/backpack.dmi' + lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi' + +/obj/item/storage/backpack/messenger/eng + name = "industrial messenger bag" + desc = "A tough messenger bag made of advanced treated leather for fireproofing. It also has more pockets than usual." + icon_state = "messenger_engineering" + inhand_icon_state = "messenger_engineering" + resistance_flags = FIRE_PROOF + +/obj/item/storage/backpack/messenger/med + name = "medical messenger bag" + desc = "A sterile messenger bag well loved by medics for its portability and sleek profile." + icon_state = "messenger_medical" + inhand_icon_state = "messenger_medical" + +/obj/item/storage/backpack/messenger/vir + name = "virologist messenger bag" + desc = "A sterile messenger bag with virologist colours, useful for deploying biohazards in record times." + icon_state = "messenger_virology" + inhand_icon_state = "messenger_virology" + +/obj/item/storage/backpack/messenger/chem + name = "chemist messenger bag" + desc = "A sterile messenger bag with chemist colours, good for getting to your alleyway deals on time." + icon_state = "messenger_chemistry" + inhand_icon_state = "messenger_chemistry" + +/obj/item/storage/backpack/messenger/coroner + name = "coroner messenger bag" + desc = "A messenger bag used to sneak your way out of graveyards at a good pace." + icon_state = "messenger_coroner" + inhand_icon_state = "messenger_coroner" + +/obj/item/storage/backpack/messenger/gen + name = "geneticist messenger bag" + desc = "A sterile messenger bag with geneticist colours, making a remarkably cute accessory for hulks." + icon_state = "messenger_genetics" + inhand_icon_state = "messenger_genetics" + +/obj/item/storage/backpack/messenger/science + name = "scientist messenger bag" + desc = "Useful for holding research materials, and for speeding your way to different scan objectives." + icon_state = "messenger_science" + inhand_icon_state = "messenger_science" + +/obj/item/storage/backpack/messenger/hyd + name = "botanist messenger bag" + desc = "A messenger bag made of all natural fibers, great for getting to the sesh in time." + icon_state = "messenger_hydroponics" + inhand_icon_state = "messenger_hydroponics" + +/obj/item/storage/backpack/messenger/sec + name = "security messenger bag" + desc = "A robust messenger bag for security related needs." + icon_state = "messenger_security" + inhand_icon_state = "messenger_security" + +/obj/item/storage/backpack/messenger/explorer + name = "explorer messenger bag" + desc = "A robust messenger bag for stashing your loot, as well as making a remarkably cute accessory for your drakebone armor." + icon_state = "messenger_explorer" + inhand_icon_state = "messenger_explorer" + +/obj/item/storage/backpack/messenger/cap + name = "captain's messenger bag" + desc = "An exclusive messenger bag for Nanotrasen officers, made of real whale leather." + icon_state = "messenger_captain" + inhand_icon_state = "messenger_captain" + +/obj/item/storage/backpack/messenger/clown + name = "Giggles von Honkerton Jr." + desc = "The latest in storage 'technology' from Honk Co. Hey, how does this fit so much with such a small profile anyway? The wearer will definitely never tell you." + icon_state = "messenger_clown" + inhand_icon_state = "messenger_clown" diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index a241b88d449..466a201ff70 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -115,7 +115,7 @@ // Mining Satchel // ----------------------------- -/obj/item/storage/bag/ore//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE +/obj/item/storage/bag/ore name = "mining satchel" desc = "This little bugger can be used to store and transport ores." icon = 'icons/obj/mining.dmi' diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 028d9e0b420..7994ba42a80 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -733,7 +733,7 @@ atom_storage.max_total_storage = 18 atom_storage.numerical_stacking = TRUE atom_storage.set_holdable(list( - /obj/item/ammo_casing/a762, + /obj/item/ammo_casing/strilka310, /obj/item/ammo_casing/shotgun, )) diff --git a/code/game/objects/items/storage/boxes/food_boxes.dm b/code/game/objects/items/storage/boxes/food_boxes.dm index fc32176139e..4e5ca1b3b63 100644 --- a/code/game/objects/items/storage/boxes/food_boxes.dm +++ b/code/game/objects/items/storage/boxes/food_boxes.dm @@ -143,6 +143,13 @@ for(var/i in 1 to 7) new /obj/item/food/meat/slab(src) +/obj/item/storage/box/papersack/wheat + desc = "It's a bit dusty, and smells like a barnyard." + +/obj/item/storage/box/papersack/wheat/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/food/grown/wheat(src) + /obj/item/storage/box/ingredients //This box is for the randomly chosen version the chef used to spawn with, it shouldn't actually exist. name = "ingredients box" illustration = "fruit" diff --git a/code/game/objects/items/storage/briefcase.dm b/code/game/objects/items/storage/briefcase.dm index 719f296b39c..4d120b05a28 100644 --- a/code/game/objects/items/storage/briefcase.dm +++ b/code/game/objects/items/storage/briefcase.dm @@ -64,7 +64,7 @@ desc = "Its label reads \"genuine hardened Captain leather\", but suspiciously has no other tags or branding. Smells like L'Air du Temps." force = 10 -/obj/item/storage/briefcase/sniperbundle/PopulateContents() +/obj/item/storage/briefcase/sniper/PopulateContents() ..() // in case you need any paperwork done after your rampage new /obj/item/gun/ballistic/rifle/sniper_rifle/syndicate(src) new /obj/item/clothing/neck/tie/red/hitman(src) diff --git a/code/game/objects/items/storage/garment.dm b/code/game/objects/items/storage/garment.dm index fe8edb52475..9398b675b1b 100644 --- a/code/game/objects/items/storage/garment.dm +++ b/code/game/objects/items/storage/garment.dm @@ -148,6 +148,7 @@ new /obj/item/clothing/suit/hooded/wintercoat/cargo/qm(src) new /obj/item/clothing/suit/utility/fire/firefighter(src) new /obj/item/clothing/gloves/fingerless(src) + new /obj/item/clothing/suit/jacket/quartermaster(src) new /obj/item/clothing/head/soft(src) new /obj/item/clothing/mask/gas(src) new /obj/item/clothing/neck/cloak/qm(src) diff --git a/code/game/objects/items/storage/holsters.dm b/code/game/objects/items/storage/holsters.dm index 3dc42f79604..7b8bc6a6716 100644 --- a/code/game/objects/items/storage/holsters.dm +++ b/code/game/objects/items/storage/holsters.dm @@ -94,7 +94,7 @@ /obj/item/gun/ballistic/revolver, /obj/item/ammo_box/c38, // Revolver speedloaders. /obj/item/ammo_box/a357, - /obj/item/ammo_box/a762, + /obj/item/ammo_box/strilka310, /obj/item/ammo_box/magazine/toy/pistol, /obj/item/gun/energy/e_gun/mini, /obj/item/gun/energy/disabler, @@ -145,7 +145,7 @@ /obj/item/gun/ballistic/revolver, /obj/item/ammo_box/c38, /obj/item/ammo_box/a357, - /obj/item/ammo_box/a762, + /obj/item/ammo_box/strilka310, /obj/item/ammo_box/magazine/toy/pistol, /obj/item/gun/energy/recharge/ebow, /obj/item/gun/energy/e_gun/mini, @@ -172,7 +172,7 @@ /obj/item/ammo_box/magazine, // ALL magazines. /obj/item/ammo_box/c38, //There isn't a speedloader parent type, so I just put these three here by hand. /obj/item/ammo_box/a357, //I didn't want to just use /obj/item/ammo_box, because then this could hold huge boxes of ammo. - /obj/item/ammo_box/a762, + /obj/item/ammo_box/strilka310, /obj/item/ammo_casing, // For shotgun shells, rockets, launcher grenades, and a few other things. /obj/item/grenade, // All regular grenades, the big grenade launcher fires these. )) diff --git a/code/game/objects/items/storage/medkit.dm b/code/game/objects/items/storage/medkit.dm index ba08ef37000..9fc3ab8ee4a 100644 --- a/code/game/objects/items/storage/medkit.dm +++ b/code/game/objects/items/storage/medkit.dm @@ -92,7 +92,6 @@ return var/static/items_inside = list( /obj/item/stack/medical/gauze = 1, - /obj/item/stack/medical/splint = 1, //SKYRAT EDIT ADDITION - MEDICAL /obj/item/stack/medical/suture = 2, /obj/item/stack/medical/mesh = 2, /obj/item/reagent_containers/hypospray/medipen = 1, @@ -111,7 +110,6 @@ var/static/items_inside = list( /obj/item/healthanalyzer/simple = 1, /obj/item/stack/medical/gauze = 1, - /obj/item/stack/medical/splint = 1, //SKYRAT EDIT ADDITION - MEDICAL /obj/item/stack/medical/suture/emergency = 1, /obj/item/stack/medical/ointment = 1, /obj/item/reagent_containers/hypospray/medipen/ekit = 2, @@ -138,7 +136,6 @@ var/static/items_inside = list( /obj/item/healthanalyzer = 1, /obj/item/stack/medical/gauze/twelve = 1, - /obj/item/stack/medical/splint/twelve = 1, //SKYRAT EDIT ADDITION - MEDICAL /obj/item/stack/medical/suture = 2, /obj/item/stack/medical/mesh = 2, /obj/item/reagent_containers/hypospray/medipen = 1, @@ -158,7 +155,6 @@ return var/static/items_inside = list( /obj/item/stack/medical/gauze = 1, - /obj/item/stack/medical/splint = 1, //SKYRAT EDIT ADDITION - MEDICAL /obj/item/stack/medical/bruise_pack = 3, /obj/item/stack/medical/ointment= 3) generate_items_inside(items_inside,src) @@ -250,7 +246,6 @@ var/static/items_inside = list( /obj/item/reagent_containers/pill/patch/libital = 3, /obj/item/stack/medical/gauze = 1, - /obj/item/stack/medical/splint = 1, //SKYRAT EDIT ADDITION - MEDICAL /obj/item/storage/pill_bottle/probital = 1, /obj/item/reagent_containers/hypospray/medipen/salacid = 1, /obj/item/healthanalyzer/simple = 1, @@ -272,7 +267,6 @@ /obj/item/reagent_containers/pill/patch/synthflesh = 3, /obj/item/reagent_containers/hypospray/medipen/atropine = 2, /obj/item/stack/medical/gauze = 1, - /obj/item/stack/medical/splint = 1, //SKYRAT EDIT ADDITION - MEDICAL /obj/item/storage/pill_bottle/penacid = 1) generate_items_inside(items_inside,src) @@ -300,7 +294,6 @@ /obj/item/reagent_containers/pill/patch/aiuri = 4, /obj/item/healthanalyzer/advanced = 1, /obj/item/stack/medical/gauze = 2, - /obj/item/stack/medical/splint = 2, //SKYRAT EDIT ADDITION - MEDICAL /obj/item/reagent_containers/hypospray/medipen/atropine = 2, /obj/item/reagent_containers/medigel/sterilizine = 1, /obj/item/surgical_drapes = 1, @@ -333,7 +326,6 @@ /obj/item/reagent_containers/pill/patch/aiuri = 3, /obj/item/healthanalyzer/advanced = 1, /obj/item/stack/medical/gauze = 2, - /obj/item/stack/medical/splint = 2, //SKYRAT EDIT ADDITION - MEDICAL /obj/item/mod/module/thread_ripper = 1, /obj/item/mod/module/surgical_processor/preloaded = 1, /obj/item/mod/module/defibrillator/combat = 1, @@ -356,9 +348,9 @@ /obj/item/storage/medkit/coroner/Initialize(mapload) . = ..() - atom_storage.max_specific_storage = 24 + atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL atom_storage.max_slots = 14 - atom_storage.max_total_storage = WEIGHT_CLASS_NORMAL + atom_storage.max_total_storage = 24 atom_storage.set_holdable(list( /obj/item/reagent_containers, /obj/item/bodybag, @@ -395,6 +387,7 @@ balloon_alert(user, "items inside!") return + ///if you add a new one don't forget to update /datum/crafting_recipe/medbot/on_craft_completion() var/obj/item/bot_assembly/medbot/medbot_assembly = new if (istype(src, /obj/item/storage/medkit/fire)) medbot_assembly.set_skin("ointment") @@ -406,6 +399,8 @@ medbot_assembly.set_skin("brute") else if (istype(src, /obj/item/storage/medkit/advanced)) medbot_assembly.set_skin("advanced") + else if (istype(src, /obj/item/storage/medkit/tactical)) + medbot_assembly.set_skin("bezerk") user.put_in_hands(medbot_assembly) medbot_assembly.balloon_alert(user, "arm added") medbot_assembly.robot_arm = bodypart.type diff --git a/code/game/objects/items/storage/storage.dm b/code/game/objects/items/storage/storage.dm index 8063778f413..501d3d2624b 100644 --- a/code/game/objects/items/storage/storage.dm +++ b/code/game/objects/items/storage/storage.dm @@ -12,6 +12,9 @@ /obj/item/storage/apply_fantasy_bonuses(bonus) . = ..() + if(isnull(atom_storage)) // some abstract types of storage (yes i know) don't get a datum + return + atom_storage.max_slots = modify_fantasy_variable("max_slots", atom_storage.max_slots, round(bonus/2)) atom_storage.max_total_storage = modify_fantasy_variable("max_total_storage", atom_storage.max_total_storage, round(bonus/2)) LAZYSET(fantasy_modifications, "max_specific_storage", atom_storage.max_specific_storage) @@ -25,9 +28,13 @@ atom_storage.max_specific_storage = WEIGHT_CLASS_TINY /obj/item/storage/remove_fantasy_bonuses(bonus) + if(isnull(atom_storage)) // some abstract types of storage (yes i know) don't get a datum + return ..() + atom_storage.max_slots = reset_fantasy_variable("max_slots", atom_storage.max_slots) atom_storage.max_total_storage = reset_fantasy_variable("max_total_storage", atom_storage.max_total_storage) var/previous_max_storage = LAZYACCESS(fantasy_modifications, "max_specific_storage") + LAZYREMOVE(fantasy_modifications, "max_specific_storage") if(previous_max_storage) atom_storage.max_specific_storage = previous_max_storage return ..() diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index ef44197bdfe..624939b3928 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -50,6 +50,7 @@ icon_state = "red" inhand_icon_state = "toolbox_red" material_flags = NONE + throw_speed = 3 // red ones go faster /obj/item/storage/toolbox/emergency/PopulateContents() new /obj/item/crowbar/red(src) @@ -242,14 +243,14 @@ for(var/i in 1 to 6) new ammo_to_spawn(src) -/obj/item/storage/toolbox/ammobox/a762 - name = "7.62mm ammo box (Surplus?)" +/obj/item/storage/toolbox/ammobox/strilka310 + name = ".310 Strilka ammo box (Surplus?)" desc = "It contains a few clips. Goddamn, this thing smells awful. \ Has this been sitting in a warehouse for the last several centuries?" - ammo_to_spawn = /obj/item/ammo_box/a762 + ammo_to_spawn = /obj/item/ammo_box/strilka310 -/obj/item/storage/toolbox/ammobox/a762/surplus - ammo_to_spawn = /obj/item/ammo_box/a762/surplus +/obj/item/storage/toolbox/ammobox/strilka310/surplus + ammo_to_spawn = /obj/item/ammo_box/strilka310/surplus /obj/item/storage/toolbox/ammobox/wt550m9 name = "4.6x30mm ammo box" @@ -438,10 +439,10 @@ /obj/item/storage/toolbox/guncase/soviet name = "ancient gun case" desc = "A weapon's case. Has the symbol of the Third Soviet Union stamped on the side." - icon_state = "mosin_case" - inhand_icon_state = "mosin_case" - weapon_to_spawn = /obj/effect/spawner/random/mosin - extra_to_spawn = /obj/effect/spawner/random/mosin/ammo + icon_state = "sakhno_case" + inhand_icon_state = "sakhno_case" + weapon_to_spawn = /obj/effect/spawner/random/sakhno + extra_to_spawn = /obj/effect/spawner/random/sakhno/ammo /obj/item/storage/toolbox/guncase/soviet/plastikov name = "ancient surplus gun case" diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 781053e6e37..ba9c6ef4812 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -52,7 +52,7 @@ new /obj/item/clothing/under/chameleon(src) // 2 tc since it's not the full set new /obj/item/clothing/mask/chameleon(src) // Goes with above new /obj/item/clothing/shoes/chameleon/noslip(src) // 2 tc - new /obj/item/camera_bug(src) // 1 tc + new /obj/item/computer_disk/syndicate/camera_app(src) // 1 tc new /obj/item/multitool/ai_detect(src) // 1 tc new /obj/item/encryptionkey/syndicate(src) // 2 tc new /obj/item/reagent_containers/syringe/mulligan(src) // 4 tc @@ -117,7 +117,7 @@ new /obj/item/ai_module/toy_ai(src) // ~6 tc new /obj/item/multitool/ai_detect(src) // 1 tc new /obj/item/storage/toolbox/syndicate(src) // 1 tc - new /obj/item/camera_bug(src) // 1 tc + new /obj/item/computer_disk/syndicate/camera_app(src) // 1 tc new /obj/item/clothing/glasses/thermal/syndi(src) // 4 tc new /obj/item/card/id/advanced/chameleon(src) // 2 tc @@ -138,7 +138,7 @@ if(KIT_SABOTAGE) new /obj/item/storage/backpack/duffelbag/syndie/sabotage(src) // 5 tc for 3 c4 and 2 x4 - new /obj/item/camera_bug(src) // 1 tc + new /obj/item/computer_disk/syndicate/camera_app(src) // 1 tc new /obj/item/sbeacondrop/powersink(src) // 11 tc new /obj/item/computer_disk/virus/detomatix(src) // 6 tc new /obj/item/storage/toolbox/syndicate(src) // 1 tc @@ -778,6 +778,17 @@ to_chat(target, span_userdanger("You're no longer identified as a nuclear operative! You are free to follow any valid goals you wish, even continuing to secure the disk. Just make sure neither any turrets nor operatives kill you on sight.")) return TRUE +/obj/item/storage/box/syndie_kit/poster_box + name = "syndicate poster pack" + desc = "Contains a variety of demotivational posters to ensure minimum productivity for the crew of any Nanotrasen station." + + /// Number of posters this box contains when spawning. + var/poster_count = 3 + +/obj/item/storage/box/syndie_kit/poster_box/PopulateContents() + for(var/i in 1 to poster_count) + new /obj/item/poster/traitor(src) + #undef KIT_RECON #undef KIT_BLOODY_SPAI #undef KIT_STEALTHY diff --git a/code/modules/antagonists/traitor/objectives/demoralise_graffiti.dm b/code/game/objects/items/syndie_spraycan.dm similarity index 68% rename from code/modules/antagonists/traitor/objectives/demoralise_graffiti.dm rename to code/game/objects/items/syndie_spraycan.dm index 5be1d609126..78ffb6a4772 100644 --- a/code/modules/antagonists/traitor/objectives/demoralise_graffiti.dm +++ b/code/game/objects/items/syndie_spraycan.dm @@ -1,92 +1,3 @@ -/datum/traitor_objective/demoralise/graffiti - name = "Sow doubt among the crew %VIEWS% times using Syndicate graffiti." - description = "Use the button below to materialize a seditious spray can, \ - and use it to draw a 3x3 tag in a place where people will come across it. \ - Special syndicate sealing agent ensures that it can't be removed for \ - five minutes following application, and it's slippery too! \ - People seeing or slipping on your graffiti grants progress towards success." - - progression_minimum = 0 MINUTES - progression_maximum = 30 MINUTES - progression_reward = list(4 MINUTES, 8 MINUTES) - telecrystal_reward = list(0, 1) - - duplicate_type = /datum/traitor_objective/demoralise/graffiti - /// Have we given out a spray can yet? - var/obtained_spray = FALSE - /// Graffiti 'rune' which we will be drawing - var/obj/effect/decal/cleanable/traitor_rune/rune - -/datum/traitor_objective/demoralise/graffiti/generate_ui_buttons(mob/user) - var/list/buttons = list() - if (!obtained_spray) - buttons += add_ui_button("", "Pressing this will materialize a syndicate spraycan in your hand.", "wifi", "summon_gear") - else - buttons += add_ui_button("[demoralised_crew_events] / [demoralised_crew_required] propagandised", "This many crew have been exposed to propaganda, out of a required [demoralised_crew_required].", "wifi", "none") - return buttons - -/datum/traitor_objective/demoralise/graffiti/ui_perform_action(mob/living/user, action) - . = ..() - switch(action) - if ("summon_gear") - if (obtained_spray) - return - - obtained_spray = TRUE - var/obj/item/traitor_spraycan/spray = new(user.drop_location()) - user.put_in_hands(spray) - spray.balloon_alert(user, "the spraycan materializes in your hand") - - RegisterSignal(spray, COMSIG_QDELETING, PROC_REF(on_spray_destroyed)) - RegisterSignal(spray, COMSIG_TRAITOR_GRAFFITI_DRAWN, PROC_REF(on_rune_complete)) - -/** - * Called when the spray can is deleted. - * If it's already been expended we don't care, if it hasn't you just made your objective impossible.area - * - * Arguments - * * spray - the spraycan which was just deleted - */ -/datum/traitor_objective/demoralise/graffiti/proc/on_spray_destroyed() - SIGNAL_HANDLER - // You fucked up pretty bad if you let this happen - if (!rune) - fail_objective(penalty_cost = telecrystal_penalty) - -/** - * Called when you managed to draw a traitor rune. - * Sets up tracking for objective progress, and unregisters signals for the spraycan because we don't care about it any more. - * - * Arguments - * * drawn_rune - graffiti 'rune' which was just drawn. - */ -/datum/traitor_objective/demoralise/graffiti/proc/on_rune_complete(atom/spray, obj/effect/decal/cleanable/traitor_rune/drawn_rune) - SIGNAL_HANDLER - rune = drawn_rune - UnregisterSignal(spray, COMSIG_QDELETING) - UnregisterSignal(spray, COMSIG_TRAITOR_GRAFFITI_DRAWN) - RegisterSignal(drawn_rune, COMSIG_QDELETING, PROC_REF(on_rune_destroyed)) - RegisterSignal(drawn_rune, COMSIG_DEMORALISING_EVENT, PROC_REF(on_mood_event)) - RegisterSignal(drawn_rune, COMSIG_TRAITOR_GRAFFITI_SLIPPED, PROC_REF(on_mood_event)) - -/** - * Called when your traitor rune is destroyed. If you haven't suceeded by now, you fail.area - * - * Arguments - * * rune - the rune which just got destroyed. - */ -/datum/traitor_objective/demoralise/graffiti/proc/on_rune_destroyed(obj/effect/decal/cleanable/traitor_rune/rune) - SIGNAL_HANDLER - fail_objective(penalty_cost = telecrystal_penalty) - -/datum/traitor_objective/demoralise/graffiti/ungenerate_objective() - if (rune) - UnregisterSignal(rune, COMSIG_QDELETING) - UnregisterSignal(rune, COMSIG_DEMORALISING_EVENT) - UnregisterSignal(rune, COMSIG_TRAITOR_GRAFFITI_SLIPPED) - rune = null - return ..() - // Extending the existing spraycan item was more trouble than it was worth, I don't want or need this to be able to draw arbitrary shapes. /obj/item/traitor_spraycan name = "seditious spraycan" diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 36bd6744d33..2765c28682c 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -663,7 +663,7 @@ SIGNAL_HANDLER if(ishuman(H) || issilicon(H)) //i guess carp and shit shouldn't set them off var/mob/living/carbon/M = H - if(issilicon(H) || M.m_intent == MOVE_INTENT_RUN) + if(issilicon(H) || M.move_intent == MOVE_INTENT_RUN) to_chat(M, span_danger("You step on the snap pop!")) pop_burst(2, 0) @@ -917,6 +917,7 @@ icon = 'icons/obj/toys/balls.dmi' icon_state = "baseball" inhand_icon_state = "baseball" + w_class = WEIGHT_CLASS_SMALL throw_range = 9 throw_speed = 0.5 diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 7ce67bb360f..ffca12c094f 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -180,3 +180,46 @@ desc = "It's been Donk-decimated." icon_state = "ready_donk" +/obj/item/trash/can/food/squid_ink + name = "canned squid ink" + icon_state = "squidinkcan_empty" + +/obj/item/trash/can/food/chap + name = "can of CHAP" + icon_state = "chapcan_empty" + +/obj/item/trash/hot_shots + name = "\improper Hot Shots box" + icon_state = "hot_shots" + +/obj/item/trash/sticko + name = "\improper Sticko box" + icon_state = "sticko" + +/obj/item/trash/sticko/matcha + icon_state = "sticko_matcha" + +/obj/item/trash/sticko/nutty + icon_state = "sticko_nutty" + +/obj/item/trash/sticko/pineapple + icon_state = "sticko_pineapple" + +/obj/item/trash/sticko/yuyake + icon_state = "sticko_yuyake" + +/obj/item/trash/shok_roks + name = "\improper Shok-Roks packet" + icon_state = "shok_roks" + +/obj/item/trash/shok_roks/citrus + icon_state = "shok_roks_citrus" + +/obj/item/trash/shok_roks/berry + icon_state = "shok_roks_berry" + +/obj/item/trash/shok_roks/tropical + icon_state = "shok_roks_tropical" + +/obj/item/trash/shok_roks/lanternfruit + icon_state = "shok_roks_lanternfruit" diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 9ce0a4492ef..c22b7170b03 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -581,6 +581,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 gender = PLURAL icon = 'icons/effects/magic.dmi' icon_state = "ectoplasm" + grind_results = list(/datum/reagent/hauntium = 25) //can be ground into hauntium /obj/item/ectoplasm/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is inhaling [src]! It looks like [user.p_theyre()] trying to visit the astral plane!")) @@ -831,8 +832,8 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 inhand_icon_state = "baseball_bat_metal" custom_materials = list(/datum/material/titanium = SHEET_MATERIAL_AMOUNT * 3.5) resistance_flags = NONE - force = 12 - throwforce = 15 + force = 20 + throwforce = 20 mob_thrower = TRUE block_sound = 'sound/weapons/effects/batreflect.ogg' @@ -866,13 +867,13 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /mob/living/basic/ant, /mob/living/basic/butterfly, /mob/living/basic/cockroach, - /mob/living/basic/spiderling, + /mob/living/basic/spider/growing/spiderling, /mob/living/basic/bee, /obj/effect/decal/cleanable/ants, /obj/item/queen_bee, )) strong_against = typecacheof(list( - /mob/living/basic/giant_spider, + /mob/living/basic/spider/giant, )) diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index 690a4e35a8b..b2a7d912cb2 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -46,16 +46,16 @@ if(AI_READY_CORE) . += span_notice("The monitor's connection can be cut[core_mmi?.brainmob?.mind && !suicide_check() ? " the neural interface can be screwed in." : "."]") -/obj/structure/ai_core/handle_atom_del(atom/A) - if(A == circuit) +/obj/structure/ai_core/Exited(atom/movable/gone, direction) + . = ..() + if(gone == circuit) circuit = null if((state != GLASS_CORE) && (state != AI_READY_CORE)) state = EMPTY_CORE update_appearance() - if(A == core_mmi) + if(gone == core_mmi) core_mmi = null - return ..() - + update_appearance() /obj/structure/ai_core/Destroy() QDEL_NULL(circuit) @@ -200,9 +200,7 @@ P.play_tool_sound(src) balloon_alert(user, "circuit board removed") state = EMPTY_CORE - update_appearance() circuit.forceMove(loc) - circuit = null return if(SCREWED_CORE) if(P.tool_behaviour == TOOL_SCREWDRIVER && circuit) @@ -298,8 +296,6 @@ P.play_tool_sound(src) balloon_alert(user, "removed [AI_CORE_BRAIN(core_mmi)]") core_mmi.forceMove(loc) - core_mmi = null - update_appearance() return if(GLASS_CORE) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index ee9bbf68f72..1e05bae6298 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -15,6 +15,7 @@ contents_pressure_protection = 0 /// How insulated the thing is, for the purposes of calculating body temperature. Must be between 0 and 1! contents_thermal_insulation = 0 + pass_flags_self = LETPASSCLICKS /// The overlay for the closet's door var/obj/effect/overlay/closet_door/door_obj diff --git a/code/game/objects/structures/crates_lockers/closets/bodybag.dm b/code/game/objects/structures/crates_lockers/closets/bodybag.dm index 40ec3662484..ffd4434825c 100644 --- a/code/game/objects/structures/crates_lockers/closets/bodybag.dm +++ b/code/game/objects/structures/crates_lockers/closets/bodybag.dm @@ -18,6 +18,7 @@ has_closed_overlay = FALSE can_install_electronics = FALSE paint_jobs = null + can_weld_shut = FALSE var/foldedbag_path = /obj/item/bodybag var/obj/item/bodybag/foldedbag_instance = null diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm index 2771fe2bd76..063200b486b 100644 --- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm +++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm @@ -85,6 +85,7 @@ SET_PLANE_EXPLICIT(alert, ABOVE_LIGHTING_PLANE, src) var/atom/movable/flick_visual/exclamation = flick_overlay_view(alert, 1 SECONDS) exclamation.alpha = 0 + exclamation.pixel_x = -pixel_x animate(exclamation, pixel_z = 32, alpha = 255, time = 0.5 SECONDS, easing = ELASTIC_EASING) // We use this list to update plane values on parent z change, which is why we need the timer too // I'm sorry :( diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index ef93a289421..ac6be5ae2a9 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -11,7 +11,6 @@ /obj/item/clothing/head/hats/tophat = 2, /obj/item/radio/headset/headset_srv = 2, /obj/item/clothing/under/costume/buttondown/slacks/service = 2, - /obj/item/clothing/under/rank/civilian/bartender = 2, /obj/item/clothing/accessory/waistcoat = 2, /obj/item/clothing/head/soft/black = 2, /obj/item/clothing/shoes/sneakers/black = 2, @@ -40,7 +39,7 @@ /obj/item/storage/box/mousetraps = 2, /obj/item/circuitboard/machine/dish_drive = 1, /obj/item/clothing/suit/toggle/chef = 1, - /obj/item/clothing/under/rank/civilian/chef = 1, + /obj/item/clothing/under/costume/buttondown/slacks/service = 1, /obj/item/clothing/head/utility/chefhat = 1, /obj/item/reagent_containers/cup/rag = 1) generate_items_inside(items_inside,src) @@ -94,6 +93,9 @@ new /obj/item/clothing/suit/toggle/lawyer/black(src) new /obj/item/clothing/shoes/laceup(src) new /obj/item/clothing/shoes/laceup(src) + +/obj/structure/closet/lawcloset/populate_contents_immediate() + . = ..() new /obj/item/clothing/accessory/lawyers_badge(src) new /obj/item/clothing/accessory/lawyers_badge(src) @@ -126,6 +128,7 @@ /obj/item/storage/backpack/security = 1, /obj/item/storage/backpack/satchel/sec = 1, /obj/item/storage/backpack/duffelbag/sec = 2, + /obj/item/storage/backpack/messenger/sec = 1, /obj/item/clothing/under/rank/security/officer = 3, /obj/item/clothing/under/rank/security/officer/skirt = 2, /obj/item/clothing/shoes/jackboots = 3, @@ -159,6 +162,7 @@ /obj/item/storage/backpack/duffelbag/engineering = 1, /obj/item/storage/backpack/satchel/eng = 1, /obj/item/storage/backpack/industrial = 1, + /obj/item/storage/backpack/messenger/eng = 1, /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos = 3, /obj/item/clothing/under/rank/engineering/atmospheric_technician = 3, /obj/item/clothing/shoes/sneakers/black = 3) @@ -175,6 +179,7 @@ /obj/item/storage/backpack/duffelbag/engineering = 1, /obj/item/storage/backpack/industrial = 1, /obj/item/storage/backpack/satchel/eng = 1, + /obj/item/storage/backpack/messenger/eng = 1, /obj/item/clothing/suit/hooded/wintercoat/engineering = 1, /obj/item/clothing/under/rank/engineering/engineer = 3, /obj/item/clothing/suit/hazardvest = 3, @@ -192,6 +197,7 @@ /obj/item/storage/backpack/duffelbag/med = 1, /obj/item/storage/backpack/medic = 1, /obj/item/storage/backpack/satchel/med = 1, + /obj/item/storage/backpack/messenger/med = 1, /obj/item/clothing/suit/hooded/wintercoat/medical = 1, /obj/item/clothing/head/costume/nursehat = 1, /obj/item/clothing/under/rank/medical/scrubs/blue = 1, @@ -235,6 +241,7 @@ /obj/item/clothing/suit/toggle/labcoat/chemist = 2, /obj/item/storage/backpack/chemistry = 2, /obj/item/storage/backpack/satchel/chem = 2, + /obj/item/storage/backpack/messenger/chem = 2, /obj/item/storage/backpack/duffelbag/chemistry = 2, /obj/item/storage/bag/chemistry = 2) generate_items_inside(items_inside,src) @@ -252,6 +259,7 @@ /obj/item/clothing/suit/toggle/labcoat/genetics = 2, /obj/item/storage/backpack/genetics = 2, /obj/item/storage/backpack/satchel/gen = 2, + /obj/item/storage/backpack/messenger/gen = 2, /obj/item/storage/backpack/duffelbag/genetics = 2) generate_items_inside(items_inside,src) return @@ -269,6 +277,7 @@ /obj/item/clothing/mask/surgical = 2, /obj/item/storage/backpack/virology = 2, /obj/item/storage/backpack/satchel/vir = 2, + /obj/item/storage/backpack/messenger/vir = 2, /obj/item/storage/backpack/duffelbag/virology = 2,) generate_items_inside(items_inside,src) return @@ -300,6 +309,7 @@ var/static/items_inside = list( /obj/item/storage/backpack/botany = 2, /obj/item/storage/backpack/satchel/hyd = 2, + /obj/item/storage/backpack/messenger/hyd = 2, /obj/item/storage/backpack/duffelbag/hydroponics = 2, /obj/item/clothing/suit/hooded/wintercoat/hydro = 1, /obj/item/clothing/suit/apron = 2, @@ -318,4 +328,5 @@ new /obj/item/clothing/under/rank/civilian/curator/treasure_hunter(src) new /obj/item/clothing/shoes/workboots/mining(src) new /obj/item/storage/backpack/satchel/explorer(src) + new /obj/item/storage/backpack/messenger/explorer(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm index 17b99db9f19..e74873bfaef 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm @@ -14,7 +14,7 @@ /obj/structure/closet/secure_closet/bar/PopulateContents() ..() for(var/i in 1 to 10) - new /obj/item/reagent_containers/cup/glass/bottle/beer( src ) + new /obj/item/reagent_containers/cup/glass/bottle/beer(src) new /obj/item/etherealballdeployer(src) new /obj/item/roulette_wheel_beacon(src) @@ -25,3 +25,23 @@ /obj/structure/closet/secure_closet/bar/all_access req_access = null + +/obj/structure/closet/secure_closet/bar/lavaland_bartender_booze/PopulateContents() + new /obj/item/vending_refill/cigarette(src) + new /obj/item/vending_refill/boozeomat(src) + new /obj/item/storage/backpack/duffelbag(src) + new /obj/item/etherealballdeployer(src) + for(var/i in 1 to 14) + new /obj/item/reagent_containers/cup/glass/bottle/beer/light(src) + for(var/i in 1 to 5) + new /obj/item/reagent_containers/cup/glass/colocup(src) + +/obj/structure/closet/secure/closet/bar/lavaland_bartender_clothes + name = "bartender's closet" + +/obj/structure/closet/secure_closet/bar/lavaland_bartender_clothes/PopulateContents() + new /obj/item/clothing/neck/beads(src) + new /obj/item/clothing/glasses/sunglasses/reagent(src) + new /obj/item/clothing/suit/costume/hawaiian(src) + new /obj/item/clothing/shoes/sandal/beach(src) + diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index dc55e46897d..2287c4f2d51 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -6,6 +6,8 @@ /obj/structure/closet/secure_closet/quartermaster/PopulateContents() ..() new /obj/item/storage/lockbox/medal/cargo(src) + new /obj/item/radio/weather_monitor (src) + new /obj/item/radio/headset/heads/qm(src) new /obj/item/megaphone/cargo(src) new /obj/item/tank/internals/emergency_oxygen(src) new /obj/item/universal_scanner(src) @@ -13,9 +15,6 @@ new /obj/item/circuitboard/machine/techfab/department/cargo(src) new /obj/item/storage/photo_album/qm(src) new /obj/item/circuitboard/machine/ore_silo(src) - new /obj/item/gun/ballistic/rifle/boltaction/sporterized(src) // SKYRAT EDIT - The QM's 'special' head item. It spawns loaded, but you have to find more ammo if you run out and get ready to manually load rounds in! - new /obj/item/cargo_teleporter(src) // SKYRAT EDIT - Adds a cargo teleporter to QM locker, so they can intice others to research it - new /obj/item/clothing/glasses/hud/gun_permit/sunglasses(src) //SKYRAT EDIT - GUN CARGO new /obj/item/storage/bag/garment/quartermaster(src) /obj/structure/closet/secure_closet/quartermaster/populate_contents_immediate() diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index 5cb072e211b..88bbff40340 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -13,7 +13,7 @@ new /obj/item/holosign_creator/atmos(src) new /obj/item/assembly/flash/handheld(src) new /obj/item/door_remote/chief_engineer(src) - new /obj/item/pipe_dispenser/bluespace(src) // SKYRAT EDIT -- BLUESPACE RPD -- ORIGINAL: new /obj/item/pipe_dispenser(src) + new /obj/item/circuitboard/machine/techfab/department/engineering(src) new /obj/item/extinguisher/advanced(src) new /obj/item/storage/photo_album/ce(src) @@ -27,6 +27,7 @@ // Traitor steal objective new /obj/item/areaeditor/blueprints(src) + new /obj/item/pipe_dispenser/bluespace(src) // SKYRAT EDIT -- BLUESPACE RPD -- ORIGINAL: new /obj/item/pipe_dispenser(src) /obj/structure/closet/secure_closet/engineering_electrical name = "electrical supplies locker" @@ -37,13 +38,18 @@ /obj/structure/closet/secure_closet/engineering_electrical/PopulateContents() ..() var/static/items_inside = list( - /obj/item/clothing/gloves/color/yellow = 2, /obj/item/inducer = 2, /obj/item/storage/toolbox/electrical = 3, /obj/item/electronics/apc = 3, /obj/item/multitool = 3) generate_items_inside(items_inside,src) +/obj/structure/closet/secure_closet/engineering_electrical/populate_contents_immediate() + . = ..() + + new /obj/item/clothing/gloves/color/yellow(src) + new /obj/item/clothing/gloves/color/yellow(src) + /obj/structure/closet/secure_closet/engineering_welding name = "welding supplies locker" req_access = list(ACCESS_ENGINE_EQUIP) @@ -83,7 +89,7 @@ /obj/structure/closet/secure_closet/atmospherics/PopulateContents() ..() new /obj/item/radio/headset/headset_eng(src) - new /obj/item/pipe_dispenser(src) + new /obj/item/storage/toolbox/mechanical(src) new /obj/item/tank/internals/emergency_oxygen/engi(src) new /obj/item/holosign_creator/atmos(src) @@ -94,3 +100,8 @@ new /obj/item/clothing/head/utility/hardhat/welding/atmos(src) new /obj/item/clothing/glasses/meson/engine/tray(src) new /obj/item/extinguisher/advanced(src) + +/obj/structure/closet/secure_closet/atmospherics/populate_contents_immediate() + . = ..() + + new /obj/item/pipe_dispenser(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 3645b233437..8f7f34164c0 100755 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -9,6 +9,7 @@ new /obj/item/storage/backpack/captain(src) new /obj/item/storage/backpack/satchel/cap(src) new /obj/item/storage/backpack/duffelbag/captain(src) + new /obj/item/storage/backpack/messenger/cap(src) new /obj/item/clothing/neck/petcollar(src) new /obj/item/pet_carrier(src) new /obj/item/storage/bag/garment/captain(src) @@ -72,6 +73,7 @@ // Traitor steal objectives new /obj/item/gun/energy/e_gun/hos(src) new /obj/item/pinpointer/nuke(src) + new /obj/item/gun/ballistic/shotgun/automatic/combat/compact(src) /obj/structure/closet/secure_closet/warden name = "warden's locker" diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm index 903d11631cc..6d899d9097a 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -132,12 +132,18 @@ new /obj/item/stack/cable_coil(src) if(prob(20)) new /obj/item/multitool(src) - if(prob(5)) - new /obj/item/clothing/gloves/color/yellow(src) + if(prob(40)) new /obj/item/clothing/head/utility/hardhat(src) +/obj/structure/closet/toolcloset/populate_contents_immediate() + . = ..() + + // Since they're a traitor objective, they have to be generated immediately. + if(prob(5)) + new /obj/item/clothing/gloves/color/yellow(src) + /* * Radiation Closet */ diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 502a114838d..4059839641c 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -298,6 +298,18 @@ icon_state = "scicrate" base_icon_state = "scicrate" +/obj/structure/closet/crate/mod + name = "MOD crate" + icon_state = "scicrate" + base_icon_state = "scicrate" + +/obj/structure/closet/crate/mod/PopulateContents() + ..() + for(var/i in 1 to 3) + new /obj/item/mod/core/standard(src) + for(var/i in 1 to 2) + new /obj/item/clothing/neck/link_scryer/loaded(src) + /obj/structure/closet/crate/solarpanel_small name = "budget solar panel crate" icon_state = "engi_e_crate" diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 05b98b5ad9d..8ebc0feb0d5 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -47,13 +47,13 @@ if(vname in list(NAMEOF(src, open), NAMEOF(src, showpiece), NAMEOF(src, custom_glass_overlay))) update_appearance() -/obj/structure/displaycase/handle_atom_del(atom/A) - if(A == electronics) +/obj/structure/displaycase/Exited(atom/movable/gone, direction) + . = ..() + if(gone == electronics) electronics = null - if(A == showpiece) + if(gone == showpiece) showpiece = null update_appearance() - return ..() /obj/structure/displaycase/Destroy() QDEL_NULL(electronics) @@ -73,8 +73,6 @@ if(QDELETED(showpiece)) return showpiece.forceMove(drop_location()) - showpiece = null - update_appearance() /obj/structure/displaycase/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) @@ -129,27 +127,27 @@ . += "[initial(icon_state)]_closed" return -/obj/structure/displaycase/attackby(obj/item/tool, mob/living/user, params) - if(tool.GetID() && !broken) +/obj/structure/displaycase/attackby(obj/item/attacking_item, mob/living/user, params) + if(attacking_item.GetID() && !broken) if(allowed(user)) to_chat(user, span_notice("You [open ? "close":"open"] [src].")) toggle_lock(user) else to_chat(user, span_alert("Access denied.")) - else if(tool.tool_behaviour == TOOL_WELDER && !user.combat_mode && !broken) + else if(attacking_item.tool_behaviour == TOOL_WELDER && !user.combat_mode && !broken) if(atom_integrity < max_integrity) - if(!tool.tool_start_check(user, amount=1)) + if(!attacking_item.tool_start_check(user, amount=1)) return to_chat(user, span_notice("You begin repairing [src]...")) - if(tool.use_tool(src, user, 40, volume=50)) + if(attacking_item.use_tool(src, user, 40, volume=50)) atom_integrity = max_integrity update_appearance() to_chat(user, span_notice("You repair [src].")) else to_chat(user, span_warning("[src] is already in good condition!")) return - else if(!alert && tool.tool_behaviour == TOOL_CROWBAR) //Only applies to the lab cage and player made display cases + else if(!alert && attacking_item.tool_behaviour == TOOL_CROWBAR) //Only applies to the lab cage and player made display cases if(broken) if(showpiece) to_chat(user, span_warning("Remove the displayed object first!")) @@ -158,14 +156,14 @@ qdel(src) else to_chat(user, span_notice("You start to [open ? "close":"open"] [src]...")) - if(tool.use_tool(src, user, 20)) + if(attacking_item.use_tool(src, user, 20)) to_chat(user, span_notice("You [open ? "close":"open"] [src].")) toggle_lock(user) else if(open && !showpiece) - insert_showpiece(tool, user) + insert_showpiece(attacking_item, user) return TRUE //cancel the attack chain, wether we successfully placed an item or not - else if(glass_fix && broken && istype(tool, /obj/item/stack/sheet/glass)) - var/obj/item/stack/sheet/glass/glass_sheet = tool + else if(glass_fix && broken && istype(attacking_item, /obj/item/stack/sheet/glass)) + var/obj/item/stack/sheet/glass/glass_sheet = attacking_item if(glass_sheet.get_amount() < 2) to_chat(user, span_warning("You need two glass sheets to fix the case!")) return @@ -231,59 +229,90 @@ resistance_flags = FLAMMABLE anchored = TRUE density = FALSE + ///The airlock electronics inserted into the chassis, to be moved to the finished product. var/obj/item/electronics/airlock/electronics +/obj/structure/displaycase_chassis/Initialize(mapload) + . = ..() + register_context() -/obj/structure/displaycase_chassis/attackby(obj/item/I, mob/user, params) - if(I.tool_behaviour == TOOL_WRENCH) //The player can only deconstruct the wooden frame - to_chat(user, span_notice("You start disassembling [src]...")) - I.play_tool_sound(src) - if(I.use_tool(src, user, 30)) - playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE) - new /obj/item/stack/sheet/mineral/wood(get_turf(src), 5) - qdel(src) +/obj/structure/displaycase_chassis/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + if(isnull(held_item)) + return . - else if(istype(I, /obj/item/electronics/airlock)) - to_chat(user, span_notice("You start installing the electronics into [src]...")) - I.play_tool_sound(src) - if(do_after(user, 30, target = src) && user.transferItemToLoc(I,src)) - electronics = I - to_chat(user, span_notice("You install the airlock electronics.")) + if(held_item.tool_behaviour == TOOL_WRENCH) + context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" + return CONTEXTUAL_SCREENTIP_SET + if(istype(held_item, /obj/item/electronics/airlock) && !electronics) + context[SCREENTIP_CONTEXT_LMB] = "Add electronics" + return CONTEXTUAL_SCREENTIP_SET + if(istype(held_item, /obj/item/stock_parts/card_reader)) + context[SCREENTIP_CONTEXT_LMB] = "Construct Vend-A-Tray" + return CONTEXTUAL_SCREENTIP_SET + if(istype(held_item, /obj/item/stack/sheet/glass)) + context[SCREENTIP_CONTEXT_LMB] = "Finalize display case" + return CONTEXTUAL_SCREENTIP_SET + return . - else if(istype(I, /obj/item/stock_parts/card_reader)) - var/obj/item/stock_parts/card_reader/C = I - to_chat(user, span_notice("You start adding [C] to [src]...")) - if(do_after(user, 20, target = src)) - var/obj/structure/displaycase/forsale/sale = new(src.loc) - if(electronics) - electronics.forceMove(sale) - sale.electronics = electronics - if(electronics.one_access) - sale.req_one_access = electronics.accesses - else - sale.req_access = electronics.accesses - qdel(src) - qdel(C) +/obj/structure/displaycase_chassis/examine(mob/user) + . = ..() + if(!electronics) + . += span_notice("You can attach [EXAMINE_HINT("airlock electronics")] to give it access restrictions.") + . += span_notice("[src] can be finalized using [EXAMINE_HINT("10 glass sheets")], or turned into a Vend-A-Tray using a [EXAMINE_HINT("card reader")].") - else if(istype(I, /obj/item/stack/sheet/glass)) - var/obj/item/stack/sheet/glass/G = I - if(G.get_amount() < 10) - to_chat(user, span_warning("You need ten glass sheets to do this!")) +/obj/structure/displaycase_chassis/wrench_act(mob/living/user, obj/item/tool) + . = ..() + balloon_alert(user, "disassembling...") + tool.play_tool_sound(src) + if(tool.use_tool(src, user, 3 SECONDS)) + playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) + new /obj/item/stack/sheet/mineral/wood(drop_location(), 5) + if(electronics) + electronics.forceMove(drop_location()) + electronics = null + qdel(src) + return TOOL_ACT_TOOLTYPE_SUCCESS + +/obj/structure/displaycase_chassis/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/electronics/airlock)) + balloon_alert(user, "installing electronics...") + if(do_after(user, 3 SECONDS, target = src) && user.transferItemToLoc(attacking_item, src)) + electronics = attacking_item + balloon_alert(user, "electronics installed") + return + + if(istype(attacking_item, /obj/item/stock_parts/card_reader)) + var/obj/item/stock_parts/card_reader/card_reader = attacking_item + balloon_alert(user, "adding [card_reader]...") + if(do_after(user, 2 SECONDS, target = src)) + qdel(card_reader) + make_final_result(display_type = /obj/structure/displaycase/forsale) + return + + if(istype(attacking_item, /obj/item/stack/sheet/glass)) + var/obj/item/stack/sheet/glass/glass_sheets = attacking_item + if(glass_sheets.get_amount() < 10) + balloon_alert(user, "need 10 sheets!") return - to_chat(user, span_notice("You start adding [G] to [src]...")) - if(do_after(user, 20, target = src)) - G.use(10) - var/obj/structure/displaycase/noalert/display = new(src.loc) - if(electronics) - electronics.forceMove(display) - display.electronics = electronics - if(electronics.one_access) - display.req_one_access = electronics.accesses - else - display.req_access = electronics.accesses - qdel(src) - else - return ..() + balloon_alert(user, "adding glass...") + if(do_after(user, 2 SECONDS, target = src)) + glass_sheets.use(10) + make_final_result(display_type = /obj/structure/displaycase/noalert) + return + return ..() + +///Makes the final result of the chassis, then deletes itself. +/obj/structure/displaycase_chassis/proc/make_final_result(obj/structure/displaycase/display_type) + var/obj/structure/displaycase/display = new display_type(loc) + if(electronics) + electronics.forceMove(display) + display.electronics = electronics + if(electronics.one_access) + display.req_one_access = electronics.accesses + else + display.req_access = electronics.accesses + qdel(src) //The lab cage and captain's display case do not spawn with electronics, which is why req_access is needed. /obj/structure/displaycase/captain @@ -332,8 +361,8 @@ holographic_showpiece = TRUE update_appearance() -/obj/structure/displaycase/trophy/attackby(obj/item/W, mob/living/user, params) - if(istype(W, /obj/item/key/displaycase)) +/obj/structure/displaycase/trophy/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/key/displaycase)) toggle_historian_mode(user) return return ..() @@ -582,17 +611,17 @@ return TRUE . = TRUE -/obj/structure/displaycase/forsale/attackby(obj/item/I, mob/living/user, params) - if(isidcard(I)) +/obj/structure/displaycase/forsale/attackby(obj/item/attacking_item, mob/user, params) + if(isidcard(attacking_item)) //Card Registration - var/obj/item/card/id/potential_acc = I + var/obj/item/card/id/potential_acc = attacking_item if(!potential_acc.registered_account) to_chat(user, span_warning("This ID card has no account registered!")) return if(payments_acc == potential_acc.registered_account) toggle_lock() return - if(istype(I, /obj/item/modular_computer)) + if(istype(attacking_item, /obj/item/modular_computer)) return TRUE SStgui.update_uis(src) return ..() diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 23da14ec788..ce000e91e69 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -6,26 +6,59 @@ anchored = FALSE density = TRUE max_integrity = 200 + /// Airlock's current construction state var/state = AIRLOCK_ASSEMBLY_NEEDS_WIRES var/base_name = "Airlock" + var/created_name = null var/mineral = null var/obj/item/electronics/airlock/electronics = null - var/airlock_type = /obj/machinery/door/airlock //the type path of the airlock once completed + /// Do we perform the extra checks required for multi-tile (large) airlocks + var/multi_tile = FALSE + /// The type path of the airlock once completed (solid version) + var/airlock_type = /obj/machinery/door/airlock + /// The type path of the airlock once completed (glass version) var/glass_type = /obj/machinery/door/airlock/glass - var/glass = 0 // 0 = glass can be installed. 1 = glass is already installed. - var/created_name = null - var/heat_proof_finished = 0 //whether to heat-proof the finished airlock + /// FALSE = glass can be installed. TRUE = glass is already installed. + var/glass = FALSE + /// Whether to heat-proof the finished airlock + var/heat_proof_finished = FALSE + /// If you're changing the airlock material, what is the previous type var/previous_assembly = /obj/structure/door_assembly - var/noglass = FALSE //airlocks with no glass version, also cannot be modified with sheets - var/nomineral = FALSE //airlock with glass version, but cannot be modified with sheets + /// Airlocks with no glass version, also cannot be modified with sheets + var/noglass = FALSE + /// Airlock with glass version, but cannot be modified with sheets + var/nomineral = FALSE + /// What type of material the airlock drops when deconstructed var/material_type = /obj/item/stack/sheet/iron + /// Amount of material the airlock drops when deconstructed var/material_amt = 4 +/obj/structure/door_assembly/multi_tile + name = "large airlock assembly" + icon = 'icons/obj/doors/airlocks/multi_tile/public/glass.dmi' + overlays_file = 'icons/obj/doors/airlocks/multi_tile/public/overlays.dmi' + base_name = "large airlock" + glass_type = /obj/machinery/door/airlock/multi_tile/public/glass + airlock_type = /obj/machinery/door/airlock/multi_tile/public/glass + dir = EAST + multi_tile = TRUE + glass = TRUE + nomineral = TRUE + /obj/structure/door_assembly/Initialize(mapload) . = ..() update_appearance() update_name() +/obj/structure/door_assembly/multi_tile/Initialize(mapload) + . = ..() + set_bounds() + update_overlays() + +/obj/structure/door_assembly/multi_tile/Move() + . = ..() + set_bounds() + /obj/structure/door_assembly/examine(mob/user) . = ..() var/doorname = "" @@ -78,7 +111,7 @@ to_chat(user, span_notice("You weld the glass panel out.")) if(heat_proof_finished) new /obj/item/stack/sheet/rglass(get_turf(src)) - heat_proof_finished = 0 + heat_proof_finished = FALSE else new /obj/item/stack/sheet/glass(get_turf(src)) glass = 0 @@ -259,10 +292,6 @@ else door = new airlock_type( loc ) door.setDir(dir) - //SKYRAT EDIT ADDITION BEGIN - LARGE_DOORS - if(door.multi_tile) - door.set_bounds() - //SKYRAT EDIT END door.unres_sides = electronics.unres_sides //door.req_access = req_access door.electronics = electronics @@ -354,7 +383,7 @@ /obj/structure/door_assembly/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) if(the_rcd.mode == RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 16) + return list("mode" = RCD_DECONSTRUCT, "delay" = 5 SECONDS, "cost" = 16) return FALSE /obj/structure/door_assembly/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) diff --git a/code/game/objects/structures/door_assembly_types.dm b/code/game/objects/structures/door_assembly_types.dm index 2d7e607cd22..74a77443b28 100644 --- a/code/game/objects/structures/door_assembly_types.dm +++ b/code/game/objects/structures/door_assembly_types.dm @@ -1,7 +1,7 @@ /obj/structure/door_assembly/door_assembly_public name = "public airlock assembly" - icon = 'icons/obj/doors/airlocks/station2/glass.dmi' - overlays_file = 'icons/obj/doors/airlocks/station2/overlays.dmi' + icon = 'icons/obj/doors/airlocks/public/glass.dmi' + overlays_file = 'icons/obj/doors/airlocks/public/overlays.dmi' glass_type = /obj/machinery/door/airlock/public/glass airlock_type = /obj/machinery/door/airlock/public @@ -267,6 +267,10 @@ nomineral = TRUE material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_GREYSCALE | MATERIAL_AFFECT_STATISTICS +/obj/structure/door_assembly/multi_tile/door_assembly_public + name = "large public airlock assembly" + base_name = "large public airlock" + /obj/structure/door_assembly/door_assembly_material/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) var/turf/T = get_turf(src) diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 20ceee9a77e..04e48e489ac 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -46,8 +46,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/extinguisher_cabinet, 29) /obj/structure/extinguisher_cabinet/Destroy() if(stored_extinguisher) - qdel(stored_extinguisher) - stored_extinguisher = null + QDEL_NULL(stored_extinguisher) return ..() /obj/structure/extinguisher_cabinet/contents_explosion(severity, target) @@ -62,8 +61,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/extinguisher_cabinet, 29) if(EXPLODE_LIGHT) SSexplosions.low_mov_atom += stored_extinguisher -/obj/structure/extinguisher_cabinet/handle_atom_del(atom/A) - if(A == stored_extinguisher) +/obj/structure/extinguisher_cabinet/Exited(atom/movable/gone, direction) + if(gone == stored_extinguisher) stored_extinguisher = null update_appearance(UPDATE_ICON) @@ -104,11 +103,9 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/extinguisher_cabinet, 29) if(stored_extinguisher) user.put_in_hands(stored_extinguisher) user.balloon_alert(user, "extinguisher removed") - stored_extinguisher = null if(!opened) opened = 1 playsound(loc, 'sound/machines/click.ogg', 15, TRUE, -3) - update_appearance(UPDATE_ICON) else toggle_cabinet(user) diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index b64702a22c0..75294549ebe 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -156,10 +156,24 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet, 32) . = ..() if(held_item) . += item_overlay + var/hp_percent = (atom_integrity/max_integrity) * 100 + if(open) - . += "glass_raised" + if(broken) + . += "glass4_raised" + return + + switch(hp_percent) + if(-INFINITY to 40) + . += "glass3_raised" + if(40 to 60) + . += "glass2_raised" + if(60 to 80) + . += "glass1_raised" + if(80 to INFINITY) + . += "glass_raised" return - var/hp_percent = atom_integrity/max_integrity * 100 + if(broken) . += "glass4" else diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 45f006c8813..fed00b66f65 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -449,7 +449,7 @@ get_turf(src), RCD_MEMORY_WALL, ) if(RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 20, "cost" = 13) + return list("mode" = RCD_DECONSTRUCT, "delay" = 2 SECONDS, "cost" = 13) return FALSE /obj/structure/girder/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 87a85893d34..8d8d0698b45 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -60,21 +60,21 @@ /obj/structure/grille/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 20, "cost" = 5) + return list("mode" = RCD_DECONSTRUCT, "delay" = 2 SECONDS, "cost" = 5) if(RCD_WINDOWGRILLE) var/cost = 0 var/delay = 0 if(the_rcd.window_type == /obj/structure/window) - cost = 6 + cost = 4 delay = 2 SECONDS else if(the_rcd.window_type == /obj/structure/window/reinforced) - cost = 9 + cost = 6 delay = 2.5 SECONDS else if(the_rcd.window_type == /obj/structure/window/fulltile) - cost = 12 + cost = 8 delay = 3 SECONDS else if(the_rcd.window_type == /obj/structure/window/reinforced/fulltile) - cost = 15 + cost = 12 delay = 4 SECONDS if(!cost) return FALSE @@ -141,6 +141,8 @@ return var/mob/M = AM shock(M, 70) + if(prob(50)) + take_damage(1, BURN, FIRE, sound_effect = FALSE) /obj/structure/grille/attack_animal(mob/user, list/modifiers) . = ..() diff --git a/code/game/objects/structures/guncase.dm b/code/game/objects/structures/guncase.dm index 0d4a1842b00..e4ca0419e3b 100644 --- a/code/game/objects/structures/guncase.dm +++ b/code/game/objects/structures/guncase.dm @@ -92,7 +92,6 @@ return if(!user.put_in_hands(weapon)) weapon.forceMove(get_turf(src)) - update_appearance() /** * check_menu: Checks if we are allowed to interact with a radial menu @@ -109,7 +108,8 @@ return FALSE return TRUE -/obj/structure/guncase/handle_atom_del(atom/A) +/obj/structure/guncase/Exited(atom/movable/gone, direction) + . = ..() update_appearance() /obj/structure/guncase/contents_explosion(severity, target) diff --git a/code/game/objects/structures/gym/weight_machine.dm b/code/game/objects/structures/gym/weight_machine.dm index bbf9d9da5b1..44162d169b5 100644 --- a/code/game/objects/structures/gym/weight_machine.dm +++ b/code/game/objects/structures/gym/weight_machine.dm @@ -125,7 +125,7 @@ * Weight lifter subtype */ /obj/structure/weightmachine/weightlifter - name = "inline bench press" + name = "incline bench press" icon_state = "benchpress" base_icon_state = "benchpress" diff --git a/code/game/objects/structures/headpike.dm b/code/game/objects/structures/headpike.dm index ddafc91854c..7731af947f0 100644 --- a/code/game/objects/structures/headpike.dm +++ b/code/game/objects/structures/headpike.dm @@ -53,24 +53,26 @@ MA.pixel_x = pixel_x . += victim -/obj/structure/headpike/handle_atom_del(atom/A) - if(A == victim) +/obj/structure/headpike/Exited(atom/movable/gone, direction) + . = ..() + if(gone != victim && gone != spear) + return + if(gone == victim) victim = null - if(A == spear) + if(gone == spear) spear = null if(!QDELETED(src)) deconstruct(TRUE) - return ..() /obj/structure/headpike/deconstruct(disassembled) - if(victim) //Make sure the head always comes off - victim.forceMove(drop_location()) - victim = null + var/obj/item/bodypart/head/our_head = victim + var/obj/item/spear/our_spear = spear + victim = null + spear = null + our_head?.forceMove(drop_location()) //Make sure the head always comes off if(!disassembled) return ..() - if(spear) - spear.forceMove(drop_location()) - spear = null + our_spear?.forceMove(drop_location()) return ..() /obj/structure/headpike/attack_hand(mob/user, list/modifiers) diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index 3e38b11337c..b3d51ceffa1 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -76,7 +76,7 @@ var/mob/living/carbon/C = mover if(C.stat) // Lets not prevent dragging unconscious/dead people. return TRUE - if(allow_walk && C.m_intent == MOVE_INTENT_WALK) + if(allow_walk && C.move_intent == MOVE_INTENT_WALK) return TRUE /obj/structure/holosign/barrier/wetsign @@ -92,7 +92,7 @@ var/mob/living/carbon/C = mover if(C.stat) // Lets not prevent dragging unconscious/dead people. return TRUE - if(allow_walk && C.m_intent != MOVE_INTENT_WALK) + if(allow_walk && C.move_intent != MOVE_INTENT_WALK) return FALSE /obj/structure/holosign/barrier/engineering diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm index f5d6115f86c..ded6851914b 100644 --- a/code/game/objects/structures/icemoon/cave_entrance.dm +++ b/code/game/objects/structures/icemoon/cave_entrance.dm @@ -99,7 +99,7 @@ GLOBAL_LIST_INIT(ore_probability, list( return /obj/structure/spawner/ice_moon/demonic_portal/ice_whelp - mob_types = list(/mob/living/simple_animal/hostile/asteroid/ice_whelp) + mob_types = list(/mob/living/basic/mining/ice_whelp) /obj/structure/spawner/ice_moon/demonic_portal/snowlegion mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/portal) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 40119ca5606..9b460cc125c 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -64,15 +64,15 @@ /obj/structure/lattice/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) if(the_rcd.mode == RCD_FLOORWALL) - return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 2) + return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 1) if(the_rcd.mode == RCD_CATWALK) - return list("mode" = RCD_CATWALK, "delay" = 0, "cost" = 1) + return list("mode" = RCD_CATWALK, "delay" = 0, "cost" = 2) /obj/structure/lattice/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) if(passed_mode == RCD_FLOORWALL) to_chat(user, span_notice("You build a floor.")) var/turf/T = src.loc - if(isspaceturf(T)) + if(isgroundlessturf(T)) T.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) qdel(src) return TRUE @@ -122,7 +122,7 @@ /obj/structure/lattice/catwalk/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) if(the_rcd.mode == RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 10, "cost" = 5) + return list("mode" = RCD_DECONSTRUCT, "delay" = 1 SECONDS, "cost" = 5) return FALSE /obj/structure/lattice/catwalk/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) diff --git a/code/game/objects/structures/lavaland/necropolis_tendril.dm b/code/game/objects/structures/lavaland/necropolis_tendril.dm index b8463921b0a..542df563a1f 100644 --- a/code/game/objects/structures/lavaland/necropolis_tendril.dm +++ b/code/game/objects/structures/lavaland/necropolis_tendril.dm @@ -9,7 +9,7 @@ faction = list(FACTION_MINING) max_mobs = 3 max_integrity = 250 - mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril) + mob_types = list(/mob/living/basic/mining/watcher) move_resist=INFINITY // just killing it tears a massive hole in the ground, let's not move it anchored = TRUE @@ -26,7 +26,7 @@ mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril) /obj/structure/spawner/lavaland/icewatcher - mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing) + mob_types = list(/mob/living/basic/mining/watcher/icewing) GLOBAL_LIST_INIT(tendrils, list()) /obj/structure/spawner/lavaland/Initialize(mapload) diff --git a/code/game/objects/structures/petrified_statue.dm b/code/game/objects/structures/petrified_statue.dm index 20582676ae4..e87e125ba6e 100644 --- a/code/game/objects/structures/petrified_statue.dm +++ b/code/game/objects/structures/petrified_statue.dm @@ -44,8 +44,9 @@ /obj/structure/statue/petrified/contents_explosion(severity, target) return -/obj/structure/statue/petrified/handle_atom_del(atom/A) - if(A == petrified_mob) +/obj/structure/statue/petrified/Exited(atom/movable/gone, direction) + . = ..() + if(gone == petrified_mob) petrified_mob = null /obj/structure/statue/petrified/Destroy() @@ -65,12 +66,11 @@ if(petrified_mob) petrified_mob.status_flags &= ~GODMODE - petrified_mob.forceMove(loc) REMOVE_TRAIT(petrified_mob, TRAIT_MUTE, STATUE_MUTE) REMOVE_TRAIT(petrified_mob, TRAIT_NOBLOOD, MAGIC_TRAIT) petrified_mob.take_overall_damage((petrified_mob.health - atom_integrity + 100)) //any new damage the statue incurred is transfered to the mob petrified_mob.faction -= FACTION_MIMIC - petrified_mob = null + petrified_mob.forceMove(loc) return ..() /obj/structure/statue/petrified/deconstruct(disassembled = TRUE) diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index bd97ca61b34..7f9dab59a46 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -8,18 +8,18 @@ density = TRUE anchored = TRUE pass_flags_self = LETPASSTHROW|PASSSTRUCTURE - /// armor more or less consistent with grille. max_integrity about one time and a half that of a grille. + /// armor is a little bit less than a grille. max_integrity about half that of a grille. armor_type = /datum/armor/structure_railing - max_integrity = 75 + max_integrity = 25 var/climbable = TRUE ///Initial direction of the railing. var/ini_dir /datum/armor/structure_railing - melee = 50 - bullet = 70 - laser = 70 + melee = 35 + bullet = 50 + laser = 50 energy = 100 bomb = 10 @@ -46,6 +46,19 @@ ) AddElement(/datum/element/connect_loc, loc_connections) + var/static/list/tool_behaviors = list( + TOOL_WELDER = list( + SCREENTIP_CONTEXT_LMB = "Repair", + ), + TOOL_WRENCH = list( + SCREENTIP_CONTEXT_LMB = "Anchor/Unanchor", + ), + TOOL_WIRECUTTER = list( + SCREENTIP_CONTEXT_LMB = "Deconstruct", + ), + ) + AddElement(/datum/element/contextual_screentip_tools, tool_behaviors) + AddComponent(/datum/component/simple_rotation, ROTATION_NEEDS_ROOM) /obj/structure/railing/attackby(obj/item/I, mob/living/user, params) @@ -70,16 +83,19 @@ /obj/structure/railing/wirecutter_act(mob/living/user, obj/item/I) . = ..() - if(!anchored) - to_chat(user, span_warning("You cut apart the railing.")) - I.play_tool_sound(src, 100) - deconstruct() - return TRUE + to_chat(user, span_warning("You cut apart the railing.")) + I.play_tool_sound(src, 100) + deconstruct() + return TRUE /obj/structure/railing/deconstruct(disassembled) if(!(flags_1 & NODECONSTRUCT_1)) - var/obj/item/stack/rods/rod = new /obj/item/stack/rods(drop_location(), 6) - transfer_fingerprints_to(rod) + if (istype(src,/obj/structure/railing/corner)) // Corner railings only cost 1 rod + var/obj/item/stack/rods/rod = new /obj/item/stack/rods(drop_location(), 1) + transfer_fingerprints_to(rod) + else + var/obj/item/stack/rods/rod = new /obj/item/stack/rods(drop_location(), 2) + transfer_fingerprints_to(rod) return ..() ///Implements behaviour that makes it possible to unanchor the railing. diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm index ba5f9ead381..011b5718d79 100644 --- a/code/game/objects/structures/spawner.dm +++ b/code/game/objects/structures/spawner.dm @@ -77,10 +77,10 @@ icon = 'icons/mob/simple/lavaland/nest.dmi' spawn_text = "crawls out of" mob_types = list( + /mob/living/basic/mining/basilisk, + /mob/living/basic/mining/goldgrub, /mob/living/basic/mining/goliath/ancient, /mob/living/basic/wumborian_fugu, - /mob/living/simple_animal/hostile/asteroid/basilisk, - /mob/living/simple_animal/hostile/asteroid/goldgrub, /mob/living/simple_animal/hostile/asteroid/hivelord, ) faction = list(FACTION_MINING) @@ -88,7 +88,7 @@ /obj/structure/spawner/mining/goldgrub name = "goldgrub den" desc = "A den housing a nest of goldgrubs, annoying but arguably much better than anything else you'll find in a nest." - mob_types = list(/mob/living/simple_animal/hostile/asteroid/goldgrub) + mob_types = list(/mob/living/basic/mining/goldgrub) /obj/structure/spawner/mining/goliath name = "goliath den" @@ -103,7 +103,7 @@ /obj/structure/spawner/mining/basilisk name = "basilisk den" desc = "A den housing a nest of basilisks, bring a coat." - mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk) + mob_types = list(/mob/living/basic/mining/basilisk) /obj/structure/spawner/mining/wumborian name = "wumborian fugu den" diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index f8b94f06308..70829118234 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -314,7 +314,7 @@ /obj/structure/table/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 24, "cost" = 16) + return list("mode" = RCD_DECONSTRUCT, "delay" = 2.4 SECONDS, "cost" = 16) return FALSE /obj/structure/table/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) diff --git a/code/game/objects/structures/tank_holder.dm b/code/game/objects/structures/tank_holder.dm index e31d9837b14..9b5b33d8417 100644 --- a/code/game/objects/structures/tank_holder.dm +++ b/code/game/objects/structures/tank_holder.dm @@ -68,7 +68,6 @@ new /obj/item/stack/rods(Tsec, 2) if(tank) tank.forceMove(Tsec) - after_detach_tank() qdel(src) /obj/structure/tank_holder/attack_paw(mob/user, list/modifiers) @@ -83,12 +82,11 @@ add_fingerprint(user) tank.add_fingerprint(user) user.put_in_hands(tank) - after_detach_tank() -/obj/structure/tank_holder/handle_atom_del(atom/A) - if(A == tank) +/obj/structure/tank_holder/Exited(atom/movable/gone, direction) + . = ..() + if(gone == tank) after_detach_tank() - return ..() /obj/structure/tank_holder/contents_explosion(severity, target) if(!tank) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 201e0624322..3548de15b9d 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -17,7 +17,7 @@ open = round(rand(0, 1)) update_appearance() if(mapload && SSmapping.level_trait(z, ZTRAIT_STATION)) - AddElement(/datum/element/lazy_fishing_spot, FISHING_SPOT_PRESET_TOILET) + AddElement(/datum/element/lazy_fishing_spot, /datum/fish_source/toilet) /obj/structure/toilet/attack_hand(mob/living/user, list/modifiers) . = ..() diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 0e708ab4649..3eb8cc581da 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -93,7 +93,7 @@ /obj/structure/window/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 20, "cost" = 5) + return list("mode" = RCD_DECONSTRUCT, "delay" = 2 SECONDS, "cost" = 5) return FALSE /obj/structure/window/rcd_act(mob/user, obj/item/construction/rcd/the_rcd) @@ -479,7 +479,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/unanchored/spawner, 0) /obj/structure/window/reinforced/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 30, "cost" = 15) + return list("mode" = RCD_DECONSTRUCT, "delay" = 3 SECONDS, "cost" = 15) return FALSE /obj/structure/window/reinforced/attackby_secondary(obj/item/tool, mob/user, params) @@ -670,7 +670,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tinted/frosted/spaw /obj/structure/window/fulltile/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 25, "cost" = 10) + return list("mode" = RCD_DECONSTRUCT, "delay" = 2.5 SECONDS, "cost" = 10) return FALSE /obj/structure/window/fulltile/unanchored @@ -727,7 +727,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tinted/frosted/spaw /obj/structure/window/reinforced/fulltile/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 40, "cost" = 20) + return list("mode" = RCD_DECONSTRUCT, "delay" = 4 SECONDS, "cost" = 20) return FALSE /obj/structure/window/reinforced/fulltile/unanchored diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm index 13948ea569b..012d331f12a 100644 --- a/code/game/turfs/closed/minerals.dm +++ b/code/game/turfs/closed/minerals.dm @@ -748,10 +748,10 @@ var/obj/item/gibtonite/G = new (src) if(det_time <= 0) G.quality = 3 - G.icon_state = "Gibtonite ore 3" + G.icon_state = "gibtonite_3" if(det_time >= 1 && det_time <= 2) G.quality = 2 - G.icon_state = "Gibtonite ore 2" + G.icon_state = "gibtonite_2" var/flags = NONE var/old_type = type diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm index 4b8a3883366..7b601fb82ac 100644 --- a/code/game/turfs/closed/walls.dm +++ b/code/game/turfs/closed/walls.dm @@ -315,9 +315,9 @@ /turf/closed/wall/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 40, "cost" = 26) + return list("mode" = RCD_DECONSTRUCT, "delay" = 4 SECONDS, "cost" = 26) if(RCD_WALLFRAME) - return list("mode" = RCD_WALLFRAME, "delay" = 10, "cost" = 25) + return list("mode" = RCD_WALLFRAME, "delay" = 1 SECONDS, "cost" = 8) return FALSE /turf/closed/wall/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 8cc063aa1d1..72e056288f3 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -295,7 +295,7 @@ else if(!(lube & SLIP_WHEN_CRAWLING) && (slipper.body_position == LYING_DOWN || !(slipper.status_flags & CANKNOCKDOWN))) // can't slip unbuckled mob if they're lying or can't fall. return FALSE - if(slipper.m_intent == MOVE_INTENT_WALK && (lube & NO_SLIP_WHEN_WALKING)) + if(slipper.move_intent == MOVE_INTENT_WALK && (lube & NO_SLIP_WHEN_WALKING)) return FALSE if(!(lube & SLIDE_ICE)) diff --git a/code/game/turfs/open/floor.dm b/code/game/turfs/open/floor.dm index 32c050718a1..6f8be90a560 100644 --- a/code/game/turfs/open/floor.dm +++ b/code/game/turfs/open/floor.dm @@ -213,51 +213,48 @@ src, RCD_MEMORY_WALL, ) if(RCD_REFLECTOR) - return list("mode" = RCD_REFLECTOR, "delay" = 20, "cost" = 30) + return list("mode" = RCD_REFLECTOR, "delay" = 2 SECONDS, "cost" = 20) if(RCD_AIRLOCK) if(the_rcd.airlock_glass) - return list("mode" = RCD_AIRLOCK, "delay" = 50, "cost" = 20) + return list("mode" = RCD_AIRLOCK, "delay" = 5 SECONDS, "cost" = 20) else - return list("mode" = RCD_AIRLOCK, "delay" = 50, "cost" = 16) + return list("mode" = RCD_AIRLOCK, "delay" = 5 SECONDS, "cost" = 16) if(RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 33) + return list("mode" = RCD_DECONSTRUCT, "delay" = 5 SECONDS, "cost" = 33) if(RCD_WINDOWGRILLE) return rcd_result_with_memory( list("mode" = RCD_WINDOWGRILLE, "delay" = 1 SECONDS, "cost" = 4), src, RCD_MEMORY_WINDOWGRILLE, ) if(RCD_MACHINE) - return list("mode" = RCD_MACHINE, "delay" = 20, "cost" = 25) + return list("mode" = RCD_MACHINE, "delay" = 2 SECONDS, "cost" = 20) if(RCD_COMPUTER) - return list("mode" = RCD_COMPUTER, "delay" = 20, "cost" = 25) + return list("mode" = RCD_COMPUTER, "delay" = 2 SECONDS, "cost" = 20) if(RCD_FLOODLIGHT) - return list("mode" = RCD_FLOODLIGHT, "delay" = 30, "cost" = 35) + return list("mode" = RCD_FLOODLIGHT, "delay" = 3 SECONDS, "cost" = 20) if(RCD_GIRDER) return list("mode" = RCD_GIRDER, "delay" = 1.3 SECONDS, "cost" = 8) if(RCD_FURNISHING) var/cost = 0 var/delay = 0 if(the_rcd.furnish_type == /obj/structure/chair || the_rcd.furnish_type == /obj/structure/chair/stool) - cost = 8 - delay = 10 + cost = 4 + delay = 1 SECONDS else if(the_rcd.furnish_type == /obj/structure/chair/stool/bar) cost = 4 - delay = 5 - else if(the_rcd.furnish_type == /obj/structure/chair/stool/bar) - cost = 4 - delay = 5 + delay = 0.5 SECONDS else if(the_rcd.furnish_type == /obj/structure/table) - cost = 15 - delay = 20 + cost = 8 + delay = 2 SECONDS else if(the_rcd.furnish_type == /obj/structure/table/glass) - cost = 12 - delay = 15 + cost = 8 + delay = 2 SECONDS else if(the_rcd.furnish_type == /obj/structure/rack) - cost = 20 - delay = 25 + cost = 4 + delay = 2.5 SECONDS else if(the_rcd.furnish_type == /obj/structure/bed) - cost = 10 - delay = 15 + cost = 8 + delay = 1.5 SECONDS if(cost == 0) return FALSE return list("mode" = RCD_FURNISHING, "delay" = cost, "cost" = delay) diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index f9f5d5c8fbb..24c690498a6 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -38,8 +38,8 @@ var/mask_icon = 'icons/turf/floors.dmi' /// The icon state that covers the lava bits of our turf var/mask_state = "lava-lightmask" - /// The configuration key for the preset fishing spot for this type of turf. - var/fish_source_type = FISHING_SPOT_PRESET_LAVALAND_LAVA + /// The type for the preset fishing spot of this type of turf. + var/fish_source_type = /datum/fish_source/lavaland /turf/open/lava/Initialize(mapload) . = ..() @@ -345,7 +345,7 @@ icon_state = "liquidplasma" initial_gas_mix = BURNING_COLD baseturfs = /turf/open/lava/plasma - fish_source_type = FISHING_SPOT_PRESET_ICEMOON_PLASMA + fish_source_type = /datum/fish_source/lavaland/icemoon light_range = 3 light_power = 0.75 diff --git a/code/game/turfs/open/misc.dm b/code/game/turfs/open/misc.dm index 134e81c1014..cbbae3081a2 100644 --- a/code/game/turfs/open/misc.dm +++ b/code/game/turfs/open/misc.dm @@ -84,49 +84,46 @@ else return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 3) if(RCD_REFLECTOR) - return list("mode" = RCD_REFLECTOR, "delay" = 20, "cost" = 30) + return list("mode" = RCD_REFLECTOR, "delay" = 2 SECONDS, "cost" = 20) if(RCD_AIRLOCK) if(the_rcd.airlock_glass) - return list("mode" = RCD_AIRLOCK, "delay" = 50, "cost" = 20) + return list("mode" = RCD_AIRLOCK, "delay" = 5 SECONDS, "cost" = 20) else - return list("mode" = RCD_AIRLOCK, "delay" = 50, "cost" = 16) + return list("mode" = RCD_AIRLOCK, "delay" = 5 SECONDS, "cost" = 16) if(RCD_WINDOWGRILLE) return rcd_result_with_memory( list("mode" = RCD_WINDOWGRILLE, "delay" = 1 SECONDS, "cost" = 4), src, RCD_MEMORY_WINDOWGRILLE, ) if(RCD_MACHINE) - return list("mode" = RCD_MACHINE, "delay" = 20, "cost" = 25) + return list("mode" = RCD_MACHINE, "delay" = 2 SECONDS, "cost" = 20) if(RCD_COMPUTER) - return list("mode" = RCD_COMPUTER, "delay" = 20, "cost" = 25) + return list("mode" = RCD_COMPUTER, "delay" = 2 SECONDS, "cost" = 20) if(RCD_FLOODLIGHT) - return list("mode" = RCD_FLOODLIGHT, "delay" = 30, "cost" = 35) + return list("mode" = RCD_FLOODLIGHT, "delay" = 3 SECONDS, "cost" = 20) if(RCD_GIRDER) return list("mode" = RCD_GIRDER, "delay" = 1.3 SECONDS, "cost" = 8) if(RCD_FURNISHING) var/cost = 0 var/delay = 0 if(the_rcd.furnish_type == /obj/structure/chair || the_rcd.furnish_type == /obj/structure/chair/stool) - cost = 8 - delay = 10 + cost = 4 + delay = 1 SECONDS else if(the_rcd.furnish_type == /obj/structure/chair/stool/bar) cost = 4 - delay = 5 - else if(the_rcd.furnish_type == /obj/structure/chair/stool/bar) - cost = 4 - delay = 5 + delay = 0.5 SECONDS else if(the_rcd.furnish_type == /obj/structure/table) - cost = 15 - delay = 20 + cost = 8 + delay = 2 SECONDS else if(the_rcd.furnish_type == /obj/structure/table/glass) - cost = 12 - delay = 15 + cost = 8 + delay = 2 SECONDS else if(the_rcd.furnish_type == /obj/structure/rack) - cost = 20 - delay = 25 + cost = 4 + delay = 2.5 SECONDS else if(the_rcd.furnish_type == /obj/structure/bed) - cost = 10 - delay = 15 + cost = 8 + delay = 1.5 SECONDS if(!cost) return FALSE return list("mode" = RCD_FURNISHING, "delay" = cost, "cost" = delay) diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm index 04eedb6619f..8152f910c01 100644 --- a/code/game/turfs/open/space/space.dm +++ b/code/game/turfs/open/space/space.dm @@ -35,54 +35,6 @@ GLOBAL_VAR_INIT(starlight_color, COLOR_STARLIGHT) //This is used to optimize the map loader return -/** - * Space Initialize - * - * Doesn't call parent, see [/atom/proc/Initialize]. - * When adding new stuff to /atom/Initialize, /turf/Initialize, etc - * don't just add it here unless space actually needs it. - * - * There is a lot of work that is intentionally not done because it is not currently used. - * This includes stuff like smoothing, blocking camera visibility, etc. - * If you are facing some odd bug with specifically space, check if it's something that was - * intentionally ommitted from this implementation. - */ -/turf/open/space/Initialize(mapload) - SHOULD_CALL_PARENT(FALSE) - air = space_gas - - if (PERFORM_ALL_TESTS(focus_only/multiple_space_initialization)) - if(flags_1 & INITIALIZED_1) - stack_trace("Warning: [src]([type]) initialized multiple times!") - flags_1 |= INITIALIZED_1 - - light_color = GLOB.starlight_color - - // We make the assumption that the space plane will never be blacklisted, as an optimization - if(SSmapping.max_plane_offset) - plane = PLANE_SPACE - (PLANE_RANGE * SSmapping.z_level_to_plane_offset[z]) - - var/area/our_area = loc - if(!our_area.area_has_base_lighting && space_lit) //Only provide your own lighting if the area doesn't for you - // Intentionally not add_overlay for performance reasons. - // add_overlay does a bunch of generic stuff, like creating a new list for overlays, - // queueing compile, cloning appearance, etc etc etc that is not necessary here. - overlays += GLOB.fullbright_overlays[GET_TURF_PLANE_OFFSET(src) + 1] - - if (!mapload) - if(requires_activation) - SSair.add_to_active(src, TRUE) - - if(SSmapping.max_plane_offset) - var/turf/T = GET_TURF_ABOVE(src) - if(T) - T.multiz_turf_new(src, DOWN) - T = GET_TURF_BELOW(src) - if(T) - T.multiz_turf_new(src, UP) - - return INITIALIZE_HINT_NORMAL - //ATTACK GHOST IGNORING PARENT RETURN VALUE /turf/open/space/attack_ghost(mob/dead/observer/user) if(destination_z) @@ -215,9 +167,9 @@ GLOBAL_VAR_INIT(starlight_color, COLOR_STARLIGHT) if(RCD_CATWALK) var/obj/structure/lattice/lattice = locate(/obj/structure/lattice, src) if(lattice) - return list("mode" = RCD_CATWALK, "delay" = 0, "cost" = 1) - else return list("mode" = RCD_CATWALK, "delay" = 0, "cost" = 2) + else + return list("mode" = RCD_CATWALK, "delay" = 0, "cost" = 4) return FALSE /turf/open/space/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) diff --git a/code/game/turfs/open/space/space_EXPENSIVE.dm b/code/game/turfs/open/space/space_EXPENSIVE.dm new file mode 100644 index 00000000000..44a15ac66d9 --- /dev/null +++ b/code/game/turfs/open/space/space_EXPENSIVE.dm @@ -0,0 +1,47 @@ +/** + * Space Initialize + * + * Doesn't call parent, see [/atom/proc/Initialize]. + * When adding new stuff to /atom/Initialize, /turf/Initialize, etc + * don't just add it here unless space actually needs it. + * + * There is a lot of work that is intentionally not done because it is not currently used. + * This includes stuff like smoothing, blocking camera visibility, etc. + * If you are facing some odd bug with specifically space, check if it's something that was + * intentionally ommitted from this implementation. + */ +/turf/open/space/Initialize(mapload) + SHOULD_CALL_PARENT(FALSE) + air = space_gas + + if (PERFORM_ALL_TESTS(focus_only/multiple_space_initialization)) + if(flags_1 & INITIALIZED_1) + stack_trace("Warning: [src]([type]) initialized multiple times!") + flags_1 |= INITIALIZED_1 + + light_color = GLOB.starlight_color + + // We make the assumption that the space plane will never be blacklisted, as an optimization + if(SSmapping.max_plane_offset) + plane = PLANE_SPACE - (PLANE_RANGE * SSmapping.z_level_to_plane_offset[z]) + + var/area/our_area = loc + if(!our_area.area_has_base_lighting && space_lit) //Only provide your own lighting if the area doesn't for you + // Intentionally not add_overlay for performance reasons. + // add_overlay does a bunch of generic stuff, like creating a new list for overlays, + // queueing compile, cloning appearance, etc etc etc that is not necessary here. + overlays += GLOB.fullbright_overlays[GET_TURF_PLANE_OFFSET(src) + 1] + + if (!mapload) + if(requires_activation) + SSair.add_to_active(src, TRUE) + + if(SSmapping.max_plane_offset) + var/turf/T = GET_TURF_ABOVE(src) + if(T) + T.multiz_turf_new(src, DOWN) + T = GET_TURF_BELOW(src) + if(T) + T.multiz_turf_new(src, UP) + + return INITIALIZE_HINT_NORMAL diff --git a/code/game/turfs/open/water.dm b/code/game/turfs/open/water.dm index 24a4df6ea17..debf5c0f6b1 100644 --- a/code/game/turfs/open/water.dm +++ b/code/game/turfs/open/water.dm @@ -37,4 +37,4 @@ /turf/open/water/beach/Initialize(mapload) . = ..() - AddElement(/datum/element/lazy_fishing_spot, FISHING_SPOT_PRESET_BEACH) + AddElement(/datum/element/lazy_fishing_spot, /datum/fish_source/ocean/beach) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index e17dbf03acf..4fe56d2c8fc 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -267,7 +267,8 @@ GLOBAL_PROTECT(admin_verbs_possess) /// SKYRAT EDIT BEGIN - Player Rank Manager - ORIGINAL: GLOBAL_LIST_INIT(admin_verbs_permissions, list(/client/proc/edit_admin_permissions)) GLOBAL_LIST_INIT(admin_verbs_permissions, list( /client/proc/edit_admin_permissions, - /client/proc/manage_player_ranks + /client/proc/manage_player_ranks, + /client/proc/migrate_player_ranks, )) /// SKYRAT EDIT END GLOBAL_PROTECT(admin_verbs_permissions) diff --git a/code/modules/admin/greyscale_modify_menu.dm b/code/modules/admin/greyscale_modify_menu.dm index 554328524e0..fd2db6d1ed3 100644 --- a/code/modules/admin/greyscale_modify_menu.dm +++ b/code/modules/admin/greyscale_modify_menu.dm @@ -83,6 +83,8 @@ /datum/greyscale_modify_menu/Destroy() target = null user = null + apply_callback = null + config = null return ..() /datum/greyscale_modify_menu/ui_state(mob/user) @@ -241,7 +243,7 @@ This is highly likely to cause massive amounts of lag as every object in the gam /datum/greyscale_modify_menu/proc/ReadColorsFromString(colorString) var/list/new_split_colors = list() var/list/colors = splittext(colorString, "#") - for(var/index in 2 to length(colors)) + for(var/index in 2 to min(length(colors), config.expected_colors + 1)) var/color = "#[colors[index]]" if(!findtext(color, GLOB.is_color) && (!unlocked || !findtext(color, GLOB.is_alpha_color))) return FALSE diff --git a/code/modules/admin/smites/ghost_control.dm b/code/modules/admin/smites/ghost_control.dm index 4977b709259..bcce698956a 100644 --- a/code/modules/admin/smites/ghost_control.dm +++ b/code/modules/admin/smites/ghost_control.dm @@ -46,6 +46,6 @@ sitting_chair.buckle_mob(target, check_loc = FALSE) /datum/smite/ghost_control/proc/ghost_speed(mob/living/target, new_speed) - if(target.m_intent == new_speed) + if(target.move_intent == new_speed) return target.toggle_move_intent() diff --git a/code/modules/admin/sql_ban_system.dm b/code/modules/admin/sql_ban_system.dm index b86967dee89..ae5c50066da 100644 --- a/code/modules/admin/sql_ban_system.dm +++ b/code/modules/admin/sql_ban_system.dm @@ -170,7 +170,7 @@ return ban_cache -/datum/admins/proc/ban_panel(player_key, player_ip, player_cid, role, duration = 1440, applies_to_admins, reason, edit_id, page, admin_key, global_ban) // SKYRAT EDIT CHANGE - MULTISERVER +/datum/admins/proc/ban_panel(player_key, player_ip, player_cid, role, duration = 1440, applies_to_admins, reason, edit_id, page, admin_key, global_ban = TRUE) // SKYRAT EDIT CHANGE - MULTISERVER if (duration == BAN_PANEL_PERMANENT) duration = null diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index cdc48ae65e4..224f8e36bdb 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1823,3 +1823,8 @@ web_sound(usr, link_url, credit) + else if(href_list["debug_z_levels"]) + if(!check_rights(R_DEBUG)) + return + + owner.debug_z_levels() diff --git a/code/modules/admin/verbs/adminevents.dm b/code/modules/admin/verbs/adminevents.dm index a9f425b95ab..283d907c3a0 100644 --- a/code/modules/admin/verbs/adminevents.dm +++ b/code/modules/admin/verbs/adminevents.dm @@ -352,13 +352,17 @@ var/mob/living/marked_mob = holder.marked_datum - var/list/all_mob_actions = sort_list(subtypesof(/datum/action/cooldown/mob_cooldown), GLOBAL_PROC_REF(cmp_typepaths_asc)) + var/static/list/all_mob_actions = sort_list(subtypesof(/datum/action/cooldown/mob_cooldown), GLOBAL_PROC_REF(cmp_typepaths_asc)) + var/static/list/actions_by_name = list() + if (!length(actions_by_name)) + for (var/datum/action/cooldown/mob_cooldown as anything in all_mob_actions) + actions_by_name["[initial(mob_cooldown.name)] ([mob_cooldown])"] = mob_cooldown - var/ability_type = tgui_input_list(usr, "Choose an ability", "Ability", all_mob_actions) - - if(!ability_type) + var/ability = tgui_input_list(usr, "Choose an ability", "Ability", actions_by_name) + if(isnull(ability)) return + var/ability_type = actions_by_name[ability] var/datum/action/cooldown/mob_cooldown/add_ability var/make_sequence = tgui_alert(usr, "Would you like this action to be a sequence of multiple abilities?", "Sequence Ability", list("Yes", "No")) diff --git a/code/modules/admin/verbs/ert.dm b/code/modules/admin/verbs/ert.dm index a3921fe1f30..7db4c7cccc5 100644 --- a/code/modules/admin/verbs/ert.dm +++ b/code/modules/admin/verbs/ert.dm @@ -25,7 +25,7 @@ /datum/admins/proc/equipAntagOnDummy(mob/living/carbon/human/dummy/mannequin, datum/antagonist/antag) - for(var/I in mannequin.get_equipped_items(TRUE)) + for(var/I in mannequin.get_equipped_items(include_pockets = TRUE)) qdel(I) if (ispath(antag, /datum/antagonist/ert)) var/datum/antagonist/ert/ert = antag diff --git a/code/modules/admin/verbs/lua/README.md b/code/modules/admin/verbs/lua/README.md index b7b7306ed4d..17138c95fde 100644 --- a/code/modules/admin/verbs/lua/README.md +++ b/code/modules/admin/verbs/lua/README.md @@ -156,6 +156,30 @@ The following example spawns a singularity at the caller's current turf: SS13.new("/obj/singularity", dm.global_proc("_get_step", dm.usr, 0)) ``` +### SS13.new_untracked(type, ...) +Works exactly like SS13.new but it does not store the value to the lua state's `references` list variable. This means that the variable could end up deleted if nothing holds a reference to it. + +### SS13.is_valid(datum) +Can be used to determine if the datum passed is not nil, not undefined and not qdel'd all in one. A helper function that allows you to check the validity from only one function. +Example usage: +```lua +local datum = SS13.new("/datum") +dm.global_proc("qdel", datum) +print(SS13.is_valid(datum)) -- false + +local null = nil +print(SS13.is_valid(null)) -- false + +local datum = SS13.new("/datum") +print(SS13.is_valid(datum)) -- true +``` + +### SS13.type(string) +Converts a string into a type. Equivalent to doing `dm.global_proc("_text2path", "/path/to/type")` + +### SS13.qdel(datum) +Deletes a datum. You shouldn't try to reference it after calling this function. Equivalent to doing `dm.global_proc("qdel", datum)` + ### SS13.await(thing_to_call, proc_to_call, ...) Calls `proc_to_call` on `thing_to_call`, with `...` as its arguments, and sleeps until that proc returns. Returns two return values - the first is the return value of the proc, and the second is the message of any runtime exception thrown by the called proc. @@ -200,6 +224,9 @@ SS13.set_timeout(5, function() end) ``` +### SS13.stop_tracking(datum) +Stops tracking a datum that was created via `SS13.new` so that it can be garbage collected and deleted without having to qdel. Should be used for things like callbacks and other such datums where the reference to the variable is no longer needed. + --- ## Internal globals diff --git a/code/modules/admin/verbs/lua/_wrappers.dm b/code/modules/admin/verbs/lua/_wrappers.dm index d77d02de4ee..8e05453d29d 100644 --- a/code/modules/admin/verbs/lua/_wrappers.dm +++ b/code/modules/admin/verbs/lua/_wrappers.dm @@ -12,9 +12,7 @@ else ret = HandleUserlessProcCall("lua", thing_to_call, proc_name, arguments) if(isdatum(ret)) - SSlua.gc_guard = ret - var/datum/ret_datum = ret - ret_datum.RegisterSignal(ret_datum, COMSIG_QDELETING, TYPE_PROC_REF(/datum, lua_reference_cleanup), override = TRUE) + SSlua.gc_guard += ret return ret /proc/wrap_lua_global_proc_call(proc_name, list/arguments) @@ -27,9 +25,7 @@ else ret = HandleUserlessProcCall("lua", GLOBAL_PROC, proc_name, arguments) if(isdatum(ret)) - SSlua.gc_guard = ret - var/datum/ret_datum = ret - ret_datum.RegisterSignal(ret_datum, COMSIG_QDELETING, TYPE_PROC_REF(/datum, lua_reference_cleanup), override = TRUE) + SSlua.gc_guard += ret return ret /proc/wrap_lua_print(state_id, list/arguments) diff --git a/code/modules/admin/verbs/lua/helpers.dm b/code/modules/admin/verbs/lua/helpers.dm index c0271e0bc72..66b7c835e9a 100644 --- a/code/modules/admin/verbs/lua/helpers.dm +++ b/code/modules/admin/verbs/lua/helpers.dm @@ -34,17 +34,3 @@ #undef PROMISE_PENDING #undef PROMISE_RESOLVED #undef PROMISE_REJECTED - -/** - * When a datum is created from lua, it gets held in `SSlua.gc_guard`, and later, - * in the calling state datum's `var/list/references`, just in case it would be garbage - * collected due to there not being any references that BYOND recognizes. To avoid harddels, - * we register this proc as a signal handler any time a DM function called from lua returns - * a datum. - */ -/datum/proc/lua_reference_cleanup() - SIGNAL_HANDLER - if(SSlua.gc_guard == src) - SSlua.gc_guard = null - for(var/datum/lua_state/state in SSlua.states) - state.references -= src diff --git a/code/modules/admin/verbs/lua/lua_state.dm b/code/modules/admin/verbs/lua/lua_state.dm index acf45f383cb..b90344d6333 100644 --- a/code/modules/admin/verbs/lua/lua_state.dm +++ b/code/modules/admin/verbs/lua/lua_state.dm @@ -168,10 +168,16 @@ GLOBAL_PROTECT(lua_usr) for(var/datum/lua_editor/editor as anything in editor_list) SStgui.update_uis(editor) -// Called by lua scripts when they add an atom to var/list/references so that it gets cleared up on delete. +/// Called by lua scripts when they add an atom to var/list/references so that it gets cleared up on delete. /datum/lua_state/proc/clear_on_delete(datum/to_clear) RegisterSignal(to_clear, COMSIG_QDELETING, PROC_REF(on_delete)) +/// Called by lua scripts when an atom they've added should soft delete and this state should stop tracking it. +/// Needs to unregister all signals. +/datum/lua_state/proc/let_soft_delete(datum/to_clear) + UnregisterSignal(to_clear, COMSIG_QDELETING, PROC_REF(on_delete)) + references -= to_clear + /datum/lua_state/proc/on_delete(datum/to_clear) SIGNAL_HANDLER references -= to_clear diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 705b88b96bd..64d2d5831a6 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -354,9 +354,14 @@ GLOBAL_VAR_INIT(say_disabled, FALSE) set name = "Debug Z-Levels" set category = "Mapping" - var/list/z_list = SSmapping.z_list + to_chat(src, examine_block(gather_z_level_information(append_grid = TRUE)), confidential = TRUE) + +/// Returns all necessary z-level information. Argument `append_grid` allows the user to see a table showing all of the z-level linkages, which is only visible and useful in-game. +/proc/gather_z_level_information(append_grid = FALSE) var/list/messages = list() - messages += "World: [world.maxx] x [world.maxy] x [world.maxz]

" + + var/list/z_list = SSmapping.z_list + messages += "\nWorld: [world.maxx] x [world.maxy] x [world.maxz]\n" var/list/linked_levels = list() var/min_x = INFINITY @@ -366,49 +371,50 @@ GLOBAL_VAR_INIT(say_disabled, FALSE) for(var/z in 1 to max(world.maxz, z_list.len)) if (z > z_list.len) - messages += "[z]: Unmanaged (out of bounds)
" + messages += "[z]: Unmanaged (out of bounds)" continue - var/datum/space_level/S = z_list[z] - if (!S) - messages += "[z]: Unmanaged (null)
" + var/datum/space_level/level = z_list[z] + if (!level) + messages += "[z]: Unmanaged (null)" continue var/linkage - switch (S.linkage) + switch (level.linkage) if (UNAFFECTED) linkage = "no linkage" if (SELFLOOPING) linkage = "self-looping" if (CROSSLINKED) - linkage = "linked at ([S.xi], [S.yi])" - linked_levels += S - min_x = min(min_x, S.xi) - min_y = min(min_y, S.yi) - max_x = max(max_x, S.xi) - max_y = max(max_y, S.yi) + linkage = "linked at ([level.xi], [level.yi])" + linked_levels += level + min_x = min(min_x, level.xi) + min_y = min(min_y, level.yi) + max_x = max(max_x, level.xi) + max_y = max(max_y, level.yi) else - linkage = "unknown linkage '[S.linkage]'" + linkage = "unknown linkage '[level.linkage]'" - messages += "[z]: [S.name], [linkage], traits: [json_encode(S.traits)]
" - if (S.z_value != z) - messages += "-- z_value is [S.z_value], should be [z]
" - if (S.name == initial(S.name)) - messages += "-- name not set
" + messages += "[z]: [level.name], [linkage], traits: [json_encode(level.traits)]" + if (level.z_value != z) + messages += "-- z_value is [level.z_value], should be [z]" + if (level.name == initial(level.name)) + messages += "-- name not set" if (z > world.maxz) messages += "-- exceeds max z" var/grid[max_x - min_x + 1][max_y - min_y + 1] - for(var/datum/space_level/S in linked_levels) - grid[S.xi - min_x + 1][S.yi - min_y + 1] = S.z_value + for(var/datum/space_level/linked_level in linked_levels) + grid[linked_level.xi - min_x + 1][linked_level.yi - min_y + 1] = linked_level.z_value - messages += "
[entry][functions]
" - for(var/y in max_y to min_y step -1) - var/list/part = list() - for(var/x in min_x to max_x) - part += "[grid[x - min_x + 1][y - min_y + 1]]" - messages += "" - messages += "
[part.Join("")]
" + if(append_grid) + messages += "
" + for(var/y in max_y to min_y step -1) + var/list/part = list() + for(var/x in min_x to max_x) + part += "[grid[x - min_x + 1][y - min_y + 1]]" + messages += "" + messages += "
[part.Join("")]
" - to_chat(src, examine_block(messages.Join("")), confidential = TRUE) + return messages.Join("\n") /client/proc/station_food_debug() set name = "Count Station Food" diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index fcd19dc762c..65e885825e2 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -43,7 +43,7 @@ GLOB.requests.pray(usr.client, msg, usr.job == JOB_CHAPLAIN) msg = span_adminnotice("[icon2html(cross, GLOB.admins)][prayer_type][deity ? " (to [deity])" : ""]: [ADMIN_FULLMONTY(src)] [ADMIN_SC(src)]: [span_linkify(msg)]") for(var/client/C in GLOB.admins) - if(C.prefs.chat_toggles & CHAT_PRAYER) + if(get_chat_toggles(C) & CHAT_PRAYER) to_chat(C, msg, type = MESSAGE_TYPE_PRAYER, confidential = TRUE) to_chat(usr, span_info("You pray to the gods: \"[msg_tmp]\""), confidential = TRUE) diff --git a/code/modules/admin/verbs/request_internet_sound.dm b/code/modules/admin/verbs/request_internet_sound.dm index 9ce21ec9257..296c59867e4 100644 --- a/code/modules/admin/verbs/request_internet_sound.dm +++ b/code/modules/admin/verbs/request_internet_sound.dm @@ -41,7 +41,7 @@ to_chat(usr, span_info("You requested: \"[request_url]\" to be played."), confidential = TRUE) request_url = span_adminnotice("MUSIC REQUEST: [ADMIN_FULLMONTY(src)] [ADMIN_SC(src)]: [span_linkify(request_url)] [ADMIN_PLAY_INTERNET(request_url, credit)]") for(var/client/admin_client in GLOB.admins) - if(admin_client.prefs.chat_toggles & CHAT_PRAYER) + if(get_chat_toggles(admin_client) & CHAT_PRAYER) to_chat(admin_client, request_url, type = MESSAGE_TYPE_PRAYER, confidential = TRUE) SSblackbox.record_feedback("tally", "music_request", 1, "Music Request") // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm index 4960b29087c..a03d61d426e 100644 --- a/code/modules/admin/verbs/secrets.dm +++ b/code/modules/admin/verbs/secrets.dm @@ -587,7 +587,7 @@ GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller) return var/datum/ctf_controller/ctf_controller = GLOB.ctf_games[selected_game] var/choice = tgui_alert(usr, "[ctf_controller.instagib_mode ? "Return to standard" : "Enable instagib"] mode?", "Instagib Mode", list("Yes", "No")) - if(choice == "No") + if(choice != "Yes") return ctf_controller.toggle_instagib_mode() message_admins("[key_name_admin(holder)] [ctf_controller.instagib_mode ? "enabled" : "disabled"] instagib mode in CTF game: [selected_game]") diff --git a/code/modules/admin/verbs/selectequipment.dm b/code/modules/admin/verbs/selectequipment.dm index d1530a76052..e88ca0bf233 100644 --- a/code/modules/admin/verbs/selectequipment.dm +++ b/code/modules/admin/verbs/selectequipment.dm @@ -213,7 +213,7 @@ delete_pocket = TRUE SSblackbox.record_feedback("tally", "admin_verb", 1, "Select Equipment") // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! - for(var/obj/item/item in human_target.get_equipped_items(delete_pocket)) + for(var/obj/item/item in human_target.get_equipped_items(include_pockets = delete_pocket)) qdel(item) var/obj/item/organ/internal/brain/human_brain = human_target.get_organ_slot(BRAIN) diff --git a/code/modules/admin/view_variables/nobody_wants_to_learn_matrix_math.dm b/code/modules/admin/view_variables/nobody_wants_to_learn_matrix_math.dm new file mode 100644 index 00000000000..872bd27d627 --- /dev/null +++ b/code/modules/admin/view_variables/nobody_wants_to_learn_matrix_math.dm @@ -0,0 +1,80 @@ + +/** + * ## nobody wants to learn matrix math! + * + * More than just a completely true statement, this datum is created as a tgui interface + * allowing you to modify each vector until you know what you're doing. + * Much like filteriffic, 'nobody wants to learn matrix math' is meant for developers like you and I + * to implement interesting matrix transformations without the hassle if needing to know... algebra? Damn, i'm stupid. + */ +/datum/nobody_wants_to_learn_matrix_math + var/atom/target + var/matrix/testing_matrix + +/datum/nobody_wants_to_learn_matrix_math/New(atom/target) + src.target = target + testing_matrix = matrix(target.transform) + +/datum/nobody_wants_to_learn_matrix_math/Destroy(force, ...) + QDEL_NULL(testing_matrix) + return ..() + +/datum/nobody_wants_to_learn_matrix_math/ui_state(mob/user) + return GLOB.admin_state + +/datum/nobody_wants_to_learn_matrix_math/ui_close(mob/user) + qdel(src) + +/datum/nobody_wants_to_learn_matrix_math/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "MatrixMathTester") + ui.open() + +/datum/nobody_wants_to_learn_matrix_math/ui_data() + var/list/data = list() + data["matrix_a"] = testing_matrix.a + data["matrix_b"] = testing_matrix.b + data["matrix_c"] = testing_matrix.c + data["matrix_d"] = testing_matrix.d + data["matrix_e"] = testing_matrix.e + data["matrix_f"] = testing_matrix.f + data["pixelated"] = target.appearance_flags & PIXEL_SCALE + return data + +/datum/nobody_wants_to_learn_matrix_math/ui_act(action, list/params) + . = ..() + if(.) + return + + switch(action) + if("change_var") + var/matrix_var_name = params["var_name"] + var/matrix_var_value = params["var_value"] + if(testing_matrix.vv_edit_var(matrix_var_name, matrix_var_value) == FALSE) + to_chat(src, "Your edit was rejected by the object. This is a bug with the matrix tester, not your fault, so report it on github.", confidential = TRUE) + return + set_transform() + if("scale") + testing_matrix.Scale(params["x"], params["y"]) + set_transform() + if("translate") + testing_matrix.Translate(params["x"], params["y"]) + set_transform() + if("shear") + testing_matrix.Shear(params["x"], params["y"]) + set_transform() + if("turn") + testing_matrix.Turn(params["angle"]) + set_transform() + if("toggle_pixel") + target.appearance_flags ^= PIXEL_SCALE + +/datum/nobody_wants_to_learn_matrix_math/proc/set_transform() + animate(target, transform = testing_matrix, time = 0.5 SECONDS) + testing_matrix = matrix(target.transform) + +/client/proc/open_matrix_tester(atom/in_atom) + if(holder) + var/datum/nobody_wants_to_learn_matrix_math/matrix_tester = new(in_atom) + matrix_tester.ui_interact(mob) diff --git a/code/modules/admin/view_variables/reference_tracking.dm b/code/modules/admin/view_variables/reference_tracking.dm index a5b2af68c77..067179e1ecc 100644 --- a/code/modules/admin/view_variables/reference_tracking.dm +++ b/code/modules/admin/view_variables/reference_tracking.dm @@ -22,6 +22,10 @@ if(usr?.client) usr.client.running_find_references = type +#ifdef UNIT_TESTS + log_reftracker("Currently sleeping procs [byond_status()]") +#endif + log_reftracker("Beginning search for references to a [type].") var/starting_time = world.time diff --git a/code/modules/antagonists/abductor/equipment/glands/spider.dm b/code/modules/antagonists/abductor/equipment/glands/spider.dm index 52fe9a826b0..52ff520a876 100644 --- a/code/modules/antagonists/abductor/equipment/glands/spider.dm +++ b/code/modules/antagonists/abductor/equipment/glands/spider.dm @@ -10,5 +10,5 @@ /obj/item/organ/internal/heart/gland/spiderman/activate() to_chat(owner, span_warning("You feel something crawling in your skin.")) owner.faction |= FACTION_SPIDER - var/mob/living/basic/spiderling/S = new(owner.drop_location()) - S.directive = "Protect your nest inside [owner.real_name]." + var/mob/living/basic/spider/growing/spiderling/spider = new(owner.drop_location()) + spider.directive = "Protect your nest inside [owner.real_name]." diff --git a/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm b/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm index 14e7980b61a..825104ddcc1 100644 --- a/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm +++ b/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm @@ -14,12 +14,13 @@ /datum/blobstrain/reagent/synchronous_mesh/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) if(damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) //the cause isn't fire or bombs, so split the damage var/damagesplit = 1 //maximum split is 9, reducing the damage each blob takes to 11% but doing that damage to 9 blobs - for(var/obj/structure/blob/C in orange(1, B)) + var/list/blob_structures = orange(1, B) + for(var/obj/structure/blob/C in blob_structures) if(!C.ignore_syncmesh_share && C.overmind && C.overmind.blobstrain.type == B.overmind.blobstrain.type) //if it doesn't have the same chemical or is a core or node, don't split damage to it damagesplit += 1 - for(var/obj/structure/blob/C in orange(1, B)) + for(var/obj/structure/blob/C in blob_structures) if(!C.ignore_syncmesh_share && C.overmind && C.overmind.blobstrain.type == B.overmind.blobstrain.type) //only hurt blobs that have the same overmind chemical and aren't cores or nodes - C.take_damage(damage/damagesplit, CLONE, 0, 0) + C.take_damage(damage/damagesplit, damage_type, 0, 0) return damage / damagesplit else return damage * 1.25 diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index a816b7eeeb2..3580e3f3bf8 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -293,7 +293,6 @@ damage_amount *= brute_resist if(BURN) damage_amount *= fire_resist - if(CLONE) else return 0 var/armor_protection = 0 diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index d6679b95d59..309cffc0a75 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -184,7 +184,7 @@ righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL w_class = WEIGHT_CLASS_HUGE - force = 30 //SKYRAT EDIT - ORIGINAL: 25 + force = 25 throwforce = 0 //Just to be on the safe side throw_range = 0 throw_speed = 0 @@ -192,8 +192,9 @@ attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts") attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut") sharpness = SHARP_EDGED - wound_bonus = 20 //SKYRAT EDIT - ORIGINAL: -20 - bare_wound_bonus = 30 //SKYRAT EDIT: ORIGINAL: 20 + wound_bonus = 10 + bare_wound_bonus = 10 + armour_penetration = 35 var/can_drop = FALSE var/fake = FALSE diff --git a/code/modules/antagonists/cult/cult_structure_altar.dm b/code/modules/antagonists/cult/cult_structure_altar.dm index 0954fd12fea..1f1a9bd71cb 100644 --- a/code/modules/antagonists/cult/cult_structure_altar.dm +++ b/code/modules/antagonists/cult/cult_structure_altar.dm @@ -22,7 +22,7 @@ OUTPUT_ITEMS = list(/obj/structure/constructshell), ), UNHOLY_WATER = list( - PREVIEW_IMAGE = image(icon = 'icons/obj/drinks/bottles.dmi', icon_state = "holyflask"), + PREVIEW_IMAGE = image(icon = 'icons/obj/drinks/bottles.dmi', icon_state = "unholyflask"), OUTPUT_ITEMS = list(/obj/item/reagent_containers/cup/beaker/unholywater), ), ) diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index fe34f9417d2..3b2a13c2cb5 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -1019,8 +1019,8 @@ structure_check() searches for nearby cultist structures required for the invoca images += A SEND_SOUND(M, pick(sound('sound/ambience/antag/bloodcult.ogg'),sound('sound/voice/ghost_whisper.ogg'),sound('sound/misc/ghosty_wind.ogg'))) else - var/construct = pick("floater","artificer","behemoth") - var/image/B = image('icons/mob/simple/mob.dmi',M,construct, ABOVE_MOB_LAYER) + var/construct = pick("wraith","artificer","juggernaut") + var/image/B = image('icons/mob/nonhuman-player/cult.dmi',M,construct, ABOVE_MOB_LAYER) B.override = 1 add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/noncult, "mob_apoc", B, NONE) addtimer(CALLBACK(M, TYPE_PROC_REF(/atom/, remove_alt_appearance),"mob_apoc",TRUE), duration) diff --git a/code/modules/antagonists/disease/disease_abilities.dm b/code/modules/antagonists/disease/disease_abilities.dm index 23cd94d783b..6c4cb960f96 100644 --- a/code/modules/antagonists/disease/disease_abilities.dm +++ b/code/modules/antagonists/disease/disease_abilities.dm @@ -270,7 +270,7 @@ new /datum/disease_ability/symptom/powerful/youth var/mob/living/carbon/human/host = our_disease.following_host if(!host) return FALSE - for(var/obj/thing as anything in host.get_equipped_items(FALSE)) + for(var/obj/thing as anything in host.get_equipped_items(include_accessories = TRUE)) thing.AddComponent(/datum/component/infective, our_disease.disease_template, 300) //no shoes? infect the floor. if(!host.shoes) diff --git a/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm b/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm index 395be958e5e..5865f76e999 100644 --- a/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm +++ b/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm @@ -42,7 +42,7 @@ gloves = /obj/item/clothing/gloves/tackler/combat head = /obj/item/clothing/head/helmet/alt shoes = /obj/item/clothing/shoes/russian - l_pocket = /obj/item/ammo_box/a762 + l_pocket = /obj/item/ammo_box/strilka310 r_pocket = /obj/item/restraints/handcuffs/cable/zipties id = /obj/item/card/id/advanced/bountyhunter diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm index 6a316c29894..da376b20a42 100644 --- a/code/modules/antagonists/heretic/heretic_knowledge.dm +++ b/code/modules/antagonists/heretic/heretic_knowledge.dm @@ -28,7 +28,7 @@ var/list/required_atoms /// Paired with above. If set, the resulting spawned atoms upon ritual completion. var/list/result_atoms = list() - /// Cost of knowledge in knowlege points + /// Cost of knowledge in knowledge points var/cost = 0 /// The priority of the knowledge. Higher priority knowledge appear higher in the ritual list. /// Number itself is completely arbitrary. Does not need to be set for non-ritual knowledge. @@ -116,11 +116,11 @@ * Called whenever the knowledge's associated ritual is completed successfully. * * Creates atoms from types in result_atoms. - * Override this is you want something else to happen. + * Override this if you want something else to happen. * This CAN sleep, such as for summoning rituals which poll for ghosts. * * Arguments - * * user - the mob who did the ritual + * * user - the mob who did the ritual * * selected_atoms - an list of atoms chosen as a part of this ritual. * * loc - the turf the ritual's occuring on * @@ -636,7 +636,7 @@ to_chat(user, span_hypnophrase(span_big("[drain_message]"))) desc += " (Completed!)" log_heretic_knowledge("[key_name(user)] completed a [name] at [worldtime2text()].") - user.add_mob_memory(/datum/memory/heretic_knowlege_ritual) + user.add_mob_memory(/datum/memory/heretic_knowledge_ritual) return TRUE #undef KNOWLEDGE_RITUAL_POINTS diff --git a/code/modules/antagonists/heretic/influences.dm b/code/modules/antagonists/heretic/influences.dm index 0f37c215c3d..e56ece979a4 100644 --- a/code/modules/antagonists/heretic/influences.dm +++ b/code/modules/antagonists/heretic/influences.dm @@ -118,7 +118,7 @@ icon = 'icons/effects/eldritch.dmi' icon_state = "pierced_illusion" anchored = TRUE - interaction_flags_atom = INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND + interaction_flags_atom = INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND|INTERACT_ATOM_NO_FINGERPRINT_INTERACT resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF alpha = 0 @@ -199,7 +199,7 @@ name = "reality smash" icon = 'icons/effects/eldritch.dmi' anchored = TRUE - interaction_flags_atom = INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND + interaction_flags_atom = INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND|INTERACT_ATOM_NO_FINGERPRINT_INTERACT resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF invisibility = INVISIBILITY_OBSERVER /// Whether we're currently being drained or not. @@ -210,12 +210,28 @@ var/list/datum/mind/minds = list() /// The image shown to heretics var/image/heretic_image + /// We hold the turf we're on so we can remove and add the 'no prints' flag. + var/turf/on_turf /obj/effect/heretic_influence/Initialize(mapload) . = ..() GLOB.reality_smash_track.smashes += src heretic_image = image(icon, src, real_icon_state, OBJ_LAYER) generate_name() + on_turf = get_turf(src) + if(!istype(on_turf)) + return + on_turf.interaction_flags_atom |= INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND + RegisterSignal(on_turf, COMSIG_TURF_CHANGE, PROC_REF(replace_our_turf)) + +/obj/effect/heretic_influence/proc/replace_our_turf(datum/source, path, new_baseturfs, flags, post_change_callbacks) + SIGNAL_HANDLER + post_change_callbacks += CALLBACK(src, PROC_REF(replace_our_turf_two)) + on_turf = null //hard del ref? + +/obj/effect/heretic_influence/proc/replace_our_turf_two(turf/new_turf) + new_turf.interaction_flags_atom |= INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND + on_turf = new_turf /obj/effect/heretic_influence/Destroy() GLOB.reality_smash_track.smashes -= src @@ -223,6 +239,8 @@ remove_mind(heretic) heretic_image = null + on_turf?.interaction_flags_atom &= ~INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND + on_turf = null return ..() /obj/effect/heretic_influence/attack_hand_secondary(mob/user, list/modifiers) diff --git a/code/modules/antagonists/heretic/items/heretic_armor.dm b/code/modules/antagonists/heretic/items/heretic_armor.dm index e15e10c8335..93ab613190b 100644 --- a/code/modules/antagonists/heretic/items/heretic_armor.dm +++ b/code/modules/antagonists/heretic/items/heretic_armor.dm @@ -92,13 +92,28 @@ /obj/item/clothing/suit/hooded/cultrobes/void/Initialize(mapload) . = ..() - create_storage(storage_type = /datum/storage/pockets/void_cloak) - -/obj/item/clothing/suit/hooded/cultrobes/void/Initialize(mapload) - . = ..() make_visible() +/obj/item/clothing/suit/hooded/cultrobes/void/equipped(mob/user, slot) + . = ..() + if(slot & ITEM_SLOT_OCLOTHING) + RegisterSignal(user, COMSIG_MOB_EQUIPPED_ITEM, PROC_REF(hide_item)) + RegisterSignal(user, COMSIG_MOB_UNEQUIPPED_ITEM, PROC_REF(show_item)) + +/obj/item/clothing/suit/hooded/cultrobes/void/dropped(mob/user) + . = ..() + UnregisterSignal(user, list(COMSIG_MOB_UNEQUIPPED_ITEM, COMSIG_MOB_EQUIPPED_ITEM)) + +/obj/item/clothing/suit/hooded/cultrobes/void/proc/hide_item(obj/item/item, slot) + SIGNAL_HANDLER + if(slot & ITEM_SLOT_SUITSTORE) + ADD_TRAIT(item, TRAIT_NO_STRIP, REF(src)) // i'd use examine hide but its a flag and yeah + +/obj/item/clothing/suit/hooded/cultrobes/void/proc/show_item(obj/item/item, slot) + SIGNAL_HANDLER + REMOVE_TRAIT(item, TRAIT_NO_STRIP, REF(src)) + /obj/item/clothing/suit/hooded/cultrobes/void/examine(mob/user) . = ..() if(!IS_HERETIC(user)) diff --git a/code/modules/antagonists/heretic/items/hunter_rifle.dm b/code/modules/antagonists/heretic/items/hunter_rifle.dm index 8cfd4931d3e..53f1c155586 100644 --- a/code/modules/antagonists/heretic/items/hunter_rifle.dm +++ b/code/modules/antagonists/heretic/items/hunter_rifle.dm @@ -8,25 +8,27 @@ name = "\improper Lionhunter's Rifle" desc = "An antique looking rifle that looks immaculate despite being clearly very old." slot_flags = ITEM_SLOT_BACK - icon_state = "moistprime" - inhand_icon_state = "moistprime" - worn_icon_state = "moistprime" + icon_state = "lionhunter" + inhand_icon_state = "lionhunter" + worn_icon_state = "lionhunter" accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/lionhunter fire_sound = 'sound/weapons/gun/sniper/shot.ogg' + SET_BASE_PIXEL(-8, 0) + /obj/item/gun/ballistic/rifle/lionhunter/Initialize(mapload) . = ..() AddComponent(/datum/component/scope, range_modifier = 3.2) /obj/item/ammo_box/magazine/internal/boltaction/lionhunter name = "lionhunter rifle internal magazine" - ammo_type = /obj/item/ammo_casing/a762/lionhunter - caliber = CALIBER_A762 + ammo_type = /obj/item/ammo_casing/strilka310/lionhunter + caliber = CALIBER_STRILKA310 max_ammo = 3 multiload = TRUE -/obj/item/ammo_casing/a762/lionhunter - projectile_type = /obj/projectile/bullet/a762/lionhunter +/obj/item/ammo_casing/strilka310/lionhunter + projectile_type = /obj/projectile/bullet/strilka310/lionhunter /// Whether we're currently aiming this casing at something var/currently_aiming = FALSE /// How many seconds it takes to aim per tile of distance between the target @@ -34,7 +36,7 @@ /// The minimum distance required to gain a damage bonus from aiming var/min_distance = 4 -/obj/item/ammo_casing/a762/lionhunter/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, atom/fired_from) +/obj/item/ammo_casing/strilka310/lionhunter/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, atom/fired_from) if(!loaded_projectile) return if(!check_fire(target, user)) @@ -43,7 +45,7 @@ return ..() /// Checks if we can successfully fire our projectile. -/obj/item/ammo_casing/a762/lionhunter/proc/check_fire(atom/target, mob/living/user) +/obj/item/ammo_casing/strilka310/lionhunter/proc/check_fire(atom/target, mob/living/user) // In case someone puts this in turrets or something wacky, just fire like normal if(!iscarbon(user) || !istype(loc, /obj/item/gun/ballistic/rifle/lionhunter)) return TRUE @@ -97,13 +99,13 @@ return . /// Callback for the do_after within the check_fire proc to see if something will prevent us from firing while aiming -/obj/item/ammo_casing/a762/lionhunter/proc/check_fire_callback(mob/living/target, mob/living/user) +/obj/item/ammo_casing/strilka310/lionhunter/proc/check_fire_callback(mob/living/target, mob/living/user) if(!isturf(target.loc)) return FALSE return TRUE -/obj/item/ammo_casing/a762/lionhunter/ready_proj(atom/target, mob/living/user, quiet, zone_override, atom/fired_from) +/obj/item/ammo_casing/strilka310/lionhunter/ready_proj(atom/target, mob/living/user, quiet, zone_override, atom/fired_from) if(!loaded_projectile) return @@ -125,8 +127,8 @@ return ..() -/obj/projectile/bullet/a762/lionhunter - name = "hunter's 7.62 bullet" +/obj/projectile/bullet/strilka310/lionhunter + name = "hunter's .310 bullet" // These stats are only applied if the weapon is fired fully aimed // If fired without aiming or at someone too close, it will do much less damage = 30 @@ -134,11 +136,11 @@ projectile_phasing = PASSTABLE | PASSGLASS | PASSGRILLE | PASSCLOSEDTURF | PASSMACHINE | PASSSTRUCTURE | PASSDOORS // Extra ammunition can be made with a heretic ritual. -/obj/item/ammo_box/a762/lionhunter - name = "stripper clip (7.62mm hunter)" +/obj/item/ammo_box/strilka310/lionhunter + name = "stripper clip (.310 hunter)" desc = "A stripper clip of mysterious, atypical ammo. It doesn't fit into normal ballistic rifles." - icon_state = "762" - ammo_type = /obj/item/ammo_casing/a762/lionhunter + icon_state = "310_strip" + ammo_type = /obj/item/ammo_casing/strilka310/lionhunter max_ammo = 3 multiple_sprites = AMMO_BOX_PER_BULLET diff --git a/code/modules/antagonists/heretic/knowledge/ash_lore.dm b/code/modules/antagonists/heretic/knowledge/ash_lore.dm index 4e017999d16..df29ba9efa0 100644 --- a/code/modules/antagonists/heretic/knowledge/ash_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/ash_lore.dm @@ -188,12 +188,13 @@ route = PATH_ASH /// A static list of all traits we apply on ascension. var/static/list/traits_to_apply = list( - TRAIT_RESISTHEAT, + TRAIT_BOMBIMMUNE, TRAIT_NOBREATH, + TRAIT_NOFIRE, TRAIT_RESISTCOLD, + TRAIT_RESISTHEAT, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE, - TRAIT_NOFIRE, ) /datum/heretic_knowledge/ultimate/ash_final/is_valid_sacrifice(mob/living/carbon/human/sacrifice) @@ -223,6 +224,9 @@ existing_beam_spell.beam_duration *= 0.66 // Faster beams existing_beam_spell.cooldown_time *= 0.66 // Lower cooldown + var/datum/action/cooldown/spell/aoe/fiery_rebirth/fiery_rebirth = locate() in user.actions + fiery_rebirth?.cooldown_time *= 0.16 + user.client?.give_award(/datum/award/achievement/misc/ash_ascension, user) if(length(traits_to_apply)) user.add_traits(traits_to_apply, MAGIC_TRAIT) diff --git a/code/modules/antagonists/heretic/knowledge/blade_lore.dm b/code/modules/antagonists/heretic/knowledge/blade_lore.dm index bbaf6014821..d97b59763f3 100644 --- a/code/modules/antagonists/heretic/knowledge/blade_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/blade_lore.dm @@ -225,7 +225,10 @@ During this process, you will rapidly regenerate stamina and quickly recover from stuns, however, you will be unable to attack. \ This spell can be cast in rapid succession, but doing so will increase the cooldown." gain_text = "In the flurry of death, he found peace within himself. Despite insurmountable odds, he forged on." - next_knowledge = list(/datum/heretic_knowledge/duel_stance) + next_knowledge = list( + /datum/heretic_knowledge/duel_stance, + /datum/heretic_knowledge/rifle, + ) spell_to_add = /datum/action/cooldown/spell/realignment cost = 1 route = PATH_BLADE @@ -372,7 +375,7 @@ next_knowledge = list( /datum/heretic_knowledge/summon/maid_in_mirror, /datum/heretic_knowledge/ultimate/blade_final, - /datum/heretic_knowledge/rifle, + /datum/heretic_knowledge/spell/rust_charge, ) spell_to_add = /datum/action/cooldown/spell/pointed/projectile/furious_steel cost = 1 diff --git a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm index b6b7fa6f77b..4de3b510836 100644 --- a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm @@ -249,7 +249,7 @@ /datum/heretic_knowledge/ultimate/cosmic_final/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) . = ..() priority_announce("[generate_heretic_text()] A Star Gazer has arrived into the station, [user.real_name] has ascended! This station is the domain of the Cosmos! [generate_heretic_text()]","[generate_heretic_text()]", ANNOUNCER_SPANOMALIES) - var/mob/living/basic/star_gazer/star_gazer_mob = new /mob/living/basic/star_gazer(loc) + var/mob/living/basic/heretic_summon/star_gazer/star_gazer_mob = new /mob/living/basic/heretic_summon/star_gazer(loc) star_gazer_mob.maxHealth = INFINITY star_gazer_mob.health = INFINITY user.AddElement(/datum/element/death_linked, star_gazer_mob) diff --git a/code/modules/antagonists/heretic/knowledge/rust_lore.dm b/code/modules/antagonists/heretic/knowledge/rust_lore.dm index 9c981e5bebf..bbb98f84bd6 100644 --- a/code/modules/antagonists/heretic/knowledge/rust_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/rust_lore.dm @@ -85,6 +85,7 @@ /datum/heretic_knowledge/codex_cicatrix, /datum/heretic_knowledge/armor, /datum/heretic_knowledge/essence, + /datum/heretic_knowledge/entropy_pulse, ) cost = 1 route = PATH_RUST @@ -155,7 +156,10 @@ Anyone overtop the wall will be throw aside (or upwards) and sustain damage." gain_text = "Images of foreign and ominous structures began to dance in my mind. Covered head to toe in thick rust, \ they no longer looked man made. Or perhaps they never were in the first place." - next_knowledge = list(/datum/heretic_knowledge/spell/area_conversion) + next_knowledge = list( + /datum/heretic_knowledge/spell/area_conversion, + /datum/heretic_knowledge/rifle, + ) spell_to_add = /datum/action/cooldown/spell/pointed/rust_construction cost = 1 route = PATH_RUST @@ -195,9 +199,9 @@ gain_text = "The corrosion was unstoppable. The rust was unpleasable. \ The Blacksmith was gone, and you hold their blade. Champions of hope, the Rustbringer is nigh!" next_knowledge = list( - /datum/heretic_knowledge/rifle, /datum/heretic_knowledge/ultimate/rust_final, /datum/heretic_knowledge/summon/rusty, + /datum/heretic_knowledge/spell/rust_charge, ) spell_to_add = /datum/action/cooldown/spell/cone/staggered/entropic_plume cost = 1 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 1b3e90aa5fb..375a1b78590 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm @@ -187,7 +187,6 @@ LAZYADD(target_blacklist, sacrifice.mind) heretic_datum.remove_sacrifice_target(sacrifice) - var/feedback = "Your patrons accept your offer" var/sac_department_flag = sacrifice.mind?.assigned_role?.departments_bitflags | sacrifice.last_mind?.assigned_role?.departments_bitflags if(sac_department_flag & DEPARTMENT_BITFLAG_COMMAND) @@ -374,8 +373,11 @@ sac_target.remove_status_effect(/datum/status_effect/unholy_determination) sac_target.reagents?.del_reagent(/datum/reagent/inverse/helgrasp/heretic) sac_target.clear_mood_event("shadow_realm") - sac_target.gain_trauma(/datum/brain_trauma/mild/phobia/supernatural, TRAUMA_RESILIENCE_MAGIC) - + 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 + sac_target.gain_trauma(/datum/brain_trauma/mild/phobia/heresy, TRAUMA_RESILIENCE_MAGIC) // 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) sac_target.adjust_stutter(40 SECONDS) @@ -444,7 +446,10 @@ */ /datum/heretic_knowledge/hunt_and_sacrifice/proc/after_return_live_target(mob/living/carbon/human/sac_target) to_chat(sac_target, span_hypnophrase("The fight is over, but at great cost. You have been returned to the station in one piece.")) - to_chat(sac_target, span_big(span_hypnophrase("You don't remember anything leading up to the experience - All you can think about are those horrific hands..."))) + if(IS_HERETIC(sac_target)) + to_chat(sac_target, span_big(span_hypnophrase("You don't remember anything leading up to the experience, but you feel your connection with the Mansus weakened - Knowledge once known, forgotten..."))) + else + to_chat(sac_target, span_big(span_hypnophrase("You don't remember anything leading up to the experience - All you can think about are those horrific hands..."))) // Oh god where are we? sac_target.flash_act() @@ -457,7 +462,10 @@ // Glad i'm outta there, though! sac_target.add_mood_event("shadow_realm_survived", /datum/mood_event/shadow_realm_live) - sac_target.add_mood_event("shadow_realm_survived_sadness", /datum/mood_event/shadow_realm_live_sad) + if(IS_HERETIC(sac_target)) + sac_target.add_mood_event("shadow_realm_survived_sadness", /datum/mood_event/shadow_realm_live_sad_heretic) + else + sac_target.add_mood_event("shadow_realm_survived_sadness", /datum/mood_event/shadow_realm_live_sad) // Could use a little pick-me-up... sac_target.reagents?.add_reagent(/datum/reagent/medicine/atropine, 8) diff --git a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_moodlets.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_moodlets.dm index 0bf6692f092..48724b0d091 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_moodlets.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_moodlets.dm @@ -13,3 +13,8 @@ description = "The hands! The horrible, horrific hands! I see them when I close my eyes!" mood_change = -6 timeout = 10 MINUTES + +/datum/mood_event/shadow_realm_live_sad_heretic + description = "I've been humiliated! My knowledge sapped from my being! The world feels much duller again..." + mood_change = -8 + timeout = 8 MINUTES diff --git a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm b/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm index 09c5f6cd8eb..a8fb031fed2 100644 --- a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm +++ b/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm @@ -61,7 +61,7 @@ route = PATH_SIDE /datum/heretic_knowledge/rifle_ammo - name = "Lionhunter Rifle Ammunition" + name = "Lionhunter Rifle Ammunition (free)" desc = "Allows you to transmute 3 ballistic ammo casings (used or unused) of any caliber, \ including shotgun shot, with any animal hide to create an extra clip of ammunition for the Lionhunter Rifle." gain_text = "The weapon came with three rough iron balls, intended to be used as ammunition. \ @@ -71,8 +71,8 @@ /obj/item/stack/sheet/animalhide = 1, /obj/item/ammo_casing = 3, ) - result_atoms = list(/obj/item/ammo_box/a762/lionhunter) - cost = 1 + result_atoms = list(/obj/item/ammo_box/strilka310/lionhunter) + cost = 0 route = PATH_SIDE /// A list of calibers that the ritual will deny. Only ballistic calibers are allowed. var/static/list/caliber_blacklist = list( @@ -95,3 +95,11 @@ // We removed any invalid casings from the atoms list, // return to allow the ritual to fill out selected atoms with the new list return TRUE + +/datum/heretic_knowledge/spell/rust_charge + name = "Rust Charge" + desc = "A charge that must be started on a rusted tile and will destroy any rusted objects you come into contact with, will deal high damage to others and rust around you during the charge." + gain_text = "The hills sparkled now, as I neared them my mind began to wander. I quickly regained my resolve and pushed forward, this last leg would be the most treacherous." + spell_to_add = /datum/action/cooldown/mob_cooldown/charge/rust + cost = 1 + route = PATH_SIDE diff --git a/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm b/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm index 70dc559db59..b776b7f4469 100644 --- a/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm +++ b/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm @@ -15,7 +15,7 @@ /obj/item/organ/internal/liver = 1, /obj/item/stack/sheet/mineral/plasma = 1, ) - mob_to_summon = /mob/living/basic/fire_shark + mob_to_summon = /mob/living/basic/heretic_summon/fire_shark cost = 1 route = PATH_SIDE poll_ignore_define = POLL_IGNORE_FIRE_SHARK diff --git a/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm b/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm index 27925e50750..8aecfe06e1f 100644 --- a/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm +++ b/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm @@ -18,6 +18,28 @@ cost = 1 route = PATH_SIDE +/datum/heretic_knowledge/entropy_pulse + name = "Pulse of Entropy" + desc = "Allows you to transmute 20 irons and 2 garbage items to fill the surrounding vicinity of the rune with rust." + gain_text = "Reality begins to whisper to me. To give it its entropic end." + required_atoms = list( + /obj/item/stack/sheet/iron = 20, + /obj/item/trash = 2 + ) + cost = 0 + route = PATH_SIDE + var/rusting_range = 4 + +/datum/heretic_knowledge/entropy_pulse/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) + for(var/turf/nearby_turf in view(rusting_range, loc)) + if(get_dist(nearby_turf, loc) <= 1) //tiles on rune should always be rusted + nearby_turf.rust_heretic_act() + //we exclude closed turf to avoid exposing cultist bases + if(prob(20) || isclosedturf(nearby_turf)) + continue + nearby_turf.rust_heretic_act() + return TRUE + /datum/heretic_knowledge/curse/corrosion name = "Curse of Corrosion" desc = "Allows you to transmute wirecutters, a pool of vomit, and a heart to cast a curse of sickness on a crew member. \ diff --git a/code/modules/antagonists/heretic/magic/rust_charge.dm b/code/modules/antagonists/heretic/magic/rust_charge.dm new file mode 100644 index 00000000000..0d693b0de86 --- /dev/null +++ b/code/modules/antagonists/heretic/magic/rust_charge.dm @@ -0,0 +1,49 @@ +// Rust charge, a charge action that can only be started on rust (and only destroys rust tiles) +/datum/action/cooldown/mob_cooldown/charge/rust + name = "Rust Charge" + desc = "A charge that must be started on a rusted tile and will destroy any rusted objects you come into contact with, will deal high damage to others and rust around you during the charge. As it is the rust that empoweres you for this ability, no focus is needed" + charge_distance = 10 + charge_damage = 50 + cooldown_time = 45 SECONDS + +/datum/action/cooldown/mob_cooldown/charge/rust/Activate(atom/target_atom) + var/turf/open/start_turf = get_turf(owner) + if(!istype(start_turf) || !HAS_TRAIT(start_turf, TRAIT_RUSTY)) + return FALSE + StartCooldown(135 SECONDS, 135 SECONDS) + charge_sequence(owner, target_atom, charge_delay, charge_past) + StartCooldown() + return TRUE +/datum/action/cooldown/mob_cooldown/charge/rust/on_move(atom/source, atom/new_loc, atom/target) + var/turf/victim = get_turf(owner) + if(!actively_moving) + return COMPONENT_MOVABLE_BLOCK_PRE_MOVE + new /obj/effect/temp_visual/decoy/fading(source.loc, source) + INVOKE_ASYNC(src, PROC_REF(DestroySurroundings), source) + victim.rust_heretic_act() + for(var/dir in GLOB.cardinals) + var/turf/nearby_turf = get_step(victim, dir) + if(istype(nearby_turf)) + nearby_turf.rust_heretic_act() + +/datum/action/cooldown/mob_cooldown/charge/rust/DestroySurroundings(atom/movable/charger) + if(!destroy_objects) + return + for(var/dir in GLOB.cardinals) + var/turf/source = get_turf(owner) + var/turf/closed/next_turf = get_step(charger, dir) + if(!istype(source) || !istype(next_turf) || !HAS_TRAIT(source, TRAIT_RUSTY) || !HAS_TRAIT(next_turf, TRAIT_RUSTY)) + continue + SSexplosions.medturf += next_turf + +/datum/action/cooldown/mob_cooldown/charge/rust/on_bump(atom/movable/source, atom/target) + if(owner == target) + return + if(destroy_objects) + if(isturf(target)) + INVOKE_ASYNC(src, PROC_REF(DestroySurroundings), source) + if(isobj(target) && target.density) + SSexplosions.med_mov_atom += target + + INVOKE_ASYNC(src, PROC_REF(DestroySurroundings), source) + hit_target(source, target, charge_damage) diff --git a/code/modules/antagonists/heretic/magic/star_touch.dm b/code/modules/antagonists/heretic/magic/star_touch.dm index a7e2c5387c9..de3a56128de 100644 --- a/code/modules/antagonists/heretic/magic/star_touch.dm +++ b/code/modules/antagonists/heretic/magic/star_touch.dm @@ -54,12 +54,12 @@ return target_turfs /// To set the star gazer -/datum/action/cooldown/spell/touch/star_touch/proc/set_star_gazer(mob/living/basic/star_gazer/star_gazer_mob) +/datum/action/cooldown/spell/touch/star_touch/proc/set_star_gazer(mob/living/basic/heretic_summon/star_gazer/star_gazer_mob) star_gazer = WEAKREF(star_gazer_mob) /// To obtain the star gazer if there is one /datum/action/cooldown/spell/touch/star_touch/proc/get_star_gazer() - var/mob/living/basic/star_gazer/star_gazer_resolved = star_gazer?.resolve() + var/mob/living/basic/heretic_summon/star_gazer/star_gazer_resolved = star_gazer?.resolve() if(star_gazer_resolved) return star_gazer_resolved return FALSE @@ -94,7 +94,7 @@ /obj/item/melee/touch_attack/star_touch/attack_self(mob/living/user) var/datum/action/cooldown/spell/touch/star_touch/star_touch_spell = spell_which_made_us?.resolve() - var/mob/living/basic/star_gazer/star_gazer_mob = star_touch_spell?.get_star_gazer() + var/mob/living/basic/heretic_summon/star_gazer/star_gazer_mob = star_touch_spell?.get_star_gazer() if(!star_gazer_mob) balloon_alert(user, "no linked star gazer!") return ..() @@ -229,7 +229,7 @@ /// What to add when the beam connects to a target /datum/status_effect/cosmic_beam/proc/on_beam_hit(mob/living/target) - if(!istype(target, /mob/living/basic/star_gazer)) + if(!istype(target, /mob/living/basic/heretic_summon/star_gazer)) target.AddElement(/datum/element/effect_trail, /obj/effect/forcefield/cosmic_field/fast) return @@ -241,6 +241,6 @@ /// What to remove when the beam disconnects from a target /datum/status_effect/cosmic_beam/proc/on_beam_release(mob/living/target) - if(!istype(target, /mob/living/basic/star_gazer)) + if(!istype(target, /mob/living/basic/heretic_summon/star_gazer)) target.RemoveElement(/datum/element/effect_trail, /obj/effect/forcefield/cosmic_field/fast) return diff --git a/code/modules/antagonists/heretic/status_effects/debuffs.dm b/code/modules/antagonists/heretic/status_effects/debuffs.dm index 8b63a8e6683..3c7715111be 100644 --- a/code/modules/antagonists/heretic/status_effects/debuffs.dm +++ b/code/modules/antagonists/heretic/status_effects/debuffs.dm @@ -168,7 +168,7 @@ return ..() /datum/status_effect/star_mark/on_apply() - if(istype(owner, /mob/living/basic/star_gazer)) + if(istype(owner, /mob/living/basic/heretic_summon/star_gazer)) return FALSE var/mob/living/spell_caster_resolved = spell_caster?.resolve() var/datum/antagonist/heretic_monster/monster = owner.mind?.has_antag_datum(/datum/antagonist/heretic_monster) diff --git a/code/modules/antagonists/heretic/status_effects/ghoul.dm b/code/modules/antagonists/heretic/status_effects/ghoul.dm index 079acda6596..5c19fb1bf9a 100644 --- a/code/modules/antagonists/heretic/status_effects/ghoul.dm +++ b/code/modules/antagonists/heretic/status_effects/ghoul.dm @@ -16,8 +16,8 @@ /datum/status_effect/ghoul/Destroy() master_mind = null - QDEL_NULL(on_made_callback) - QDEL_NULL(on_lost_callback) + on_made_callback = null + on_lost_callback = null return ..() /datum/status_effect/ghoul/on_creation( diff --git a/code/modules/antagonists/nightmare/nightmare_equipment.dm b/code/modules/antagonists/nightmare/nightmare_equipment.dm index 57d79170110..530f39bea62 100644 --- a/code/modules/antagonists/nightmare/nightmare_equipment.dm +++ b/code/modules/antagonists/nightmare/nightmare_equipment.dm @@ -10,7 +10,8 @@ armour_penetration = 35 lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi' righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' - item_flags = ABSTRACT | DROPDEL | ACID_PROOF + item_flags = ABSTRACT | DROPDEL + resistance_flags = INDESTRUCTIBLE | ACID_PROOF | FIRE_PROOF | LAVA_PROOF | UNACIDABLE w_class = WEIGHT_CLASS_HUGE sharpness = SHARP_EDGED tool_behaviour = TOOL_MINING diff --git a/code/modules/antagonists/ninja/energy_net_nets.dm b/code/modules/antagonists/ninja/energy_net_nets.dm index ab05eb6230b..111d1f26515 100644 --- a/code/modules/antagonists/ninja/energy_net_nets.dm +++ b/code/modules/antagonists/ninja/energy_net_nets.dm @@ -12,34 +12,35 @@ desc = "It's a net made of green energy." icon = 'icons/effects/effects.dmi' icon_state = "energynet" - - density = TRUE//Can't pass through. - opacity = FALSE //Can see through. - mouse_opacity = MOUSE_OPACITY_ICON//So you can hit it with stuff. - anchored = TRUE//Can't drag/grab the net. + density = TRUE //Can't pass through. + anchored = TRUE //Can't drag/grab the net. layer = ABOVE_ALL_MOB_LAYER plane = ABOVE_GAME_PLANE max_integrity = 60 //How much health it has. - can_buckle = 1 + can_buckle = TRUE buckle_lying = 0 buckle_prevents_pull = TRUE - ///The creature currently caught in the net - var/mob/living/affected_mob + +/obj/structure/energy_net/Initialize(mapload) + . = ..() + var/image/underlay = image(icon, "energynet_underlay") + underlay.layer = BELOW_MOB_LAYER + SET_PLANE_EXPLICIT(underlay, GAME_PLANE, src) + add_overlay(underlay) /obj/structure/energy_net/play_attack_sound(damage, damage_type = BRUTE, damage_flag = 0) if(damage_type == BRUTE || damage_type == BURN) playsound(src, 'sound/weapons/slash.ogg', 80, TRUE) -/obj/structure/energy_net/Destroy() - if(!QDELETED(affected_mob)) - affected_mob.visible_message(span_notice("[affected_mob.name] is recovered from the energy net!"), span_notice("You are recovered from the energy net!"), span_hear("You hear a grunt.")) - affected_mob = null +/obj/structure/energy_net/atom_destruction(damage_flag) + for(var/mob/recovered_mob as anything in buckled_mobs) + recovered_mob.visible_message(span_notice("[recovered_mob] is recovered from the energy net!"), span_notice("You are recovered from the energy net!"), span_hear("You hear a grunt.")) return ..() /obj/structure/energy_net/attack_paw(mob/user, list/modifiers) return attack_hand(user, modifiers) -/obj/structure/energy_net/user_buckle_mob(mob/living/M, mob/user, check_loc = TRUE) +/obj/structure/energy_net/user_buckle_mob(mob/living/buckled_mob, mob/user, check_loc = TRUE) return//We only want our target to be buckled /obj/structure/energy_net/user_unbuckle_mob(mob/living/buckled_mob, mob/living/user) diff --git a/code/modules/antagonists/ninja/ninjaDrainAct.dm b/code/modules/antagonists/ninja/ninjaDrainAct.dm index 50d3be1740a..ccb8e67fb9b 100644 --- a/code/modules/antagonists/ninja/ninjaDrainAct.dm +++ b/code/modules/antagonists/ninja/ninjaDrainAct.dm @@ -204,7 +204,7 @@ /obj/machinery/door/airlock/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) if(!ninja || !hacking_module) return NONE - if(!operating && density && hasPower() && !(obj_flags & EMAGGED)) + if(!operating && density && hasPower() && !(obj_flags & EMAGGED) && hacking_module.mod.subtract_charge(DEFAULT_CHARGE_DRAIN * 5)) INVOKE_ASYNC(src, TYPE_PROC_REF(/atom, emag_act)) hacking_module.door_hack_counter++ var/datum/antagonist/ninja/ninja_antag = ninja.mind.has_antag_datum(/datum/antagonist/ninja) @@ -329,7 +329,147 @@ //Got that electric touch var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread() spark_system.set_up(5, 0, loc) - playsound(src, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + spark_system.start() visible_message(span_danger("[ninja] electrocutes [src] with [ninja.p_their()] touch!"), span_userdanger("[ninja] electrocutes you with [ninja.p_their()] touch!")) - Knockdown(3 SECONDS) + addtimer(CALLBACK(src, PROC_REF(ninja_knockdown)), 0.3 SECONDS) return NONE + +/mob/living/carbon/proc/ninja_knockdown() + Knockdown(3 SECONDS) + set_jitter_if_lower(3 SECONDS) + +//CAMERAS// +/obj/machinery/camera/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) + if(isEmpProof(TRUE)) + balloon_alert(ninja, "camera is shielded!") + return COMPONENT_CANCEL_ATTACK_CHAIN + + if(!hacking_module.mod.subtract_charge(DEFAULT_CHARGE_DRAIN * 5)) + return + + emp_act(EMP_HEAVY) + return COMPONENT_CANCEL_ATTACK_CHAIN + +//BOTS// +/mob/living/simple_animal/bot/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) + to_chat(src, span_boldwarning("Your circutry suddenly begins heating up!")) + if(!do_after(ninja, 1.5 SECONDS, target = src)) + return COMPONENT_CANCEL_ATTACK_CHAIN + + if(!hacking_module.mod.subtract_charge(DEFAULT_CHARGE_DRAIN * 7)) + return COMPONENT_CANCEL_ATTACK_CHAIN + + do_sparks(number = 3, cardinal_only = FALSE, source = src) + playsound(get_turf(src), 'sound/machines/warning-buzzer.ogg', 35, TRUE) + balloon_alert(ninja, "stand back!") + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), src, 0, 1, 2, 3), 2.5 SECONDS) + return COMPONENT_CANCEL_ATTACK_CHAIN + +/mob/living/simple_animal/bot/medbot/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) + var/static/list/death_cry = list( + MEDIBOT_VOICED_NO_SAD, + MEDIBOT_VOICED_OH_FUCK, + ) + speak(pick(death_cry)) + return ..() + +//ENERGY WEAPONS// +/obj/item/gun/energy/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) + if(cell.charge == 0) + balloon_alert(ninja, "no energy!") + return COMPONENT_CANCEL_ATTACK_CHAIN + + if(!do_after(ninja, 1.5 SECONDS, target = src)) + return COMPONENT_CANCEL_ATTACK_CHAIN + + hacking_module.mod.add_charge(cell.charge) + hacking_module.charge_message(src, cell.charge) + cell.charge = 0 + update_appearance() + visible_message(span_warning("[ninja] drains the energy from the [src]!")) + do_sparks(number = 3, cardinal_only = FALSE, source = src) + return COMPONENT_CANCEL_ATTACK_CHAIN + +//VENDING MACHINES// +/obj/machinery/vending/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) + if(shoot_inventory) + balloon_alert(ninja, "already hacked!") + return COMPONENT_CANCEL_ATTACK_CHAIN + + if(!do_after(ninja, 2 SECONDS, target = src)) + return COMPONENT_CANCEL_ATTACK_CHAIN + + if(!hacking_module.mod.subtract_charge(DEFAULT_CHARGE_DRAIN * 5)) + return COMPONENT_CANCEL_ATTACK_CHAIN + + do_sparks(number = 3, cardinal_only = FALSE, source = src) + balloon_alert(ninja, "system overloaded!") + wires.on_pulse(WIRE_THROW) + return COMPONENT_CANCEL_ATTACK_CHAIN + +//RECYCLER// +/obj/machinery/recycler/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) + if(obj_flags & EMAGGED) + balloon_alert(ninja, "already hacked!") + return COMPONENT_CANCEL_ATTACK_CHAIN + + AI_notify_hack() + if(!do_after(ninja, 30 SECONDS, target = src)) + return COMPONENT_CANCEL_ATTACK_CHAIN + + do_sparks(3, cardinal_only = FALSE, source = src) + emag_act(ninja) + + return COMPONENT_CANCEL_ATTACK_CHAIN + +//ELEVATOR CONTROLS// +/obj/machinery/elevator_control_panel/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) + if(obj_flags & EMAGGED) + balloon_alert(ninja, "already hacked!") + return COMPONENT_CANCEL_ATTACK_CHAIN + + if(!do_after(ninja, 2 SECONDS, target = src)) + return COMPONENT_CANCEL_ATTACK_CHAIN + + do_sparks(3, cardinal_only = FALSE, source = src) + emag_act(ninja) + + return COMPONENT_CANCEL_ATTACK_CHAIN + +//TRAM CONTROLS// +/obj/machinery/computer/tram_controls/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) + var/datum/round_event/tram_malfunction/malfunction_event = locate(/datum/round_event/tram_malfunction) in SSevents.running + if(malfunction_event) + balloon_alert(ninja, "tram is already malfunctioning!") + return COMPONENT_CANCEL_ATTACK_CHAIN + + if(specific_lift_id != MAIN_STATION_TRAM) + balloon_alert(ninja, "cannot hack this tram!") + return COMPONENT_CANCEL_ATTACK_CHAIN + + AI_notify_hack() + + if(!do_after(ninja, 20 SECONDS, target = src)) //Shorter due to how incredibly easy it is for someone to (even accidentally) interrupt. + return COMPONENT_CANCEL_ATTACK_CHAIN + + force_event(/datum/round_event_control/tram_malfunction, "ninja interference") + malfunction_event = locate(/datum/round_event/tram_malfunction) in SSevents.running + malfunction_event.end_when *= 3 + + return COMPONENT_CANCEL_ATTACK_CHAIN + +//WINDOOR// +/obj/machinery/door/window/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) + if(!operating && density && hasPower() && !(obj_flags & EMAGGED) && hacking_module.mod.subtract_charge(DEFAULT_CHARGE_DRAIN * 5)) + INVOKE_ASYNC(src, TYPE_PROC_REF(/atom, emag_act)) + return COMPONENT_CANCEL_ATTACK_CHAIN + +//BUTTONS// +/obj/machinery/button/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) + if(is_operational && !(obj_flags & EMAGGED)) + emag_act(ninja) + return COMPONENT_CANCEL_ATTACK_CHAIN + +//FIRELOCKS// +/obj/machinery/door/firedoor/ninjadrain_act(mob/living/carbon/human/ninja, obj/item/mod/module/hacker/hacking_module) + crack_open() diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm index 39aec80924d..c15012f409b 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm @@ -523,6 +523,8 @@ GLOBAL_VAR(station_nuke_source) sound_to_playing_players('sound/machines/alarm.ogg') sound_to_playing_players('modular_skyrat/modules/alerts/sound/misc/delta_countdown.ogg') // SKYRAT EDIT ADDITION + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_NUKE_DEVICE_DETONATING, src) + if(SSticker?.mode) SSticker.roundend_check_paused = TRUE addtimer(CALLBACK(src, PROC_REF(actually_explode)), 10 SECONDS) diff --git a/code/modules/antagonists/obsessed/obsessed.dm b/code/modules/antagonists/obsessed/obsessed.dm index 749f6d0fde4..63adacca1e8 100644 --- a/code/modules/antagonists/obsessed/obsessed.dm +++ b/code/modules/antagonists/obsessed/obsessed.dm @@ -63,7 +63,7 @@ suit = /obj/item/clothing/suit/apron /datum/outfit/obsessed/post_equip(mob/living/carbon/human/H) - for(var/obj/item/carried_item in H.get_equipped_items(TRUE)) + for(var/obj/item/carried_item in H.get_equipped_items(include_pockets = TRUE, include_accessories = TRUE)) carried_item.add_mob_blood(H)//Oh yes, there will be blood... H.regenerate_icons() diff --git a/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm b/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm index a99735a2d5c..0966984c671 100644 --- a/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm +++ b/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm @@ -183,7 +183,7 @@ . = ..() if (istype(I)) to_chat(user, span_notice("You register [src] in [I]s buffer.")) - I.buffer = src + I.set_buffer(src) return TRUE /obj/machinery/piratepad/screwdriver_act_secondary(mob/living/user, obj/item/screwdriver/screw) diff --git a/code/modules/antagonists/revenant/haunted_item.dm b/code/modules/antagonists/revenant/haunted_item.dm index 8973139f51e..d035e2694d9 100644 --- a/code/modules/antagonists/revenant/haunted_item.dm +++ b/code/modules/antagonists/revenant/haunted_item.dm @@ -34,7 +34,7 @@ if(istype(haunted_item.ai_controller, /datum/ai_controller/haunted)) // already spooky return COMPONENT_INCOMPATIBLE - haunted_item.AddElement(/datum/element/haunted, haunt_color) + haunted_item.make_haunted(MAGIC_TRAIT, haunt_color) if(isnull(haunted_item.ai_controller)) // failed to make spooky! don't go on return COMPONENT_INCOMPATIBLE @@ -71,7 +71,7 @@ // because we want to make sure they always get dealt with no matter how the component is removed if(!isnull(pre_haunt_throwforce)) haunted_item.throwforce = pre_haunt_throwforce - haunted_item.RemoveElement(/datum/element/haunted) + haunted_item.remove_haunted(MAGIC_TRAIT) return ..() /datum/component/haunted_item/RegisterWithParent() diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm index be59f22d313..d711bb97faf 100644 --- a/code/modules/antagonists/revenant/revenant_abilities.dm +++ b/code/modules/antagonists/revenant/revenant_abilities.dm @@ -23,9 +23,10 @@ /mob/living/simple_animal/revenant/ranged_secondary_attack(atom/target, modifiers) if(revealed || notransform || inhibited || !Adjacent(target) || !incorporeal_move_check(target)) return - var/icon/I = icon(target.icon,target.icon_state,target.dir) - var/orbitsize = (I.Width()+I.Height())*0.5 - orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25) + + var/list/icon_dimensions = get_icon_dimensions(target.icon) + var/orbitsize = (icon_dimensions["width"] + icon_dimensions["height"]) * 0.5 + orbitsize -= (orbitsize / world.icon_size) * (world.icon_size * 0.25) orbit(target, orbitsize) //Harvest; activated by clicking the target, will try to drain their essence. diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm index 83a21b23134..1857223df6b 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -474,8 +474,7 @@ for(var/datum/mind/rev_mind in get_head_revolutionaries()) var/turf/rev_turf = get_turf(rev_mind.current) if(!considered_afk(rev_mind) && considered_alive(rev_mind) && is_station_level(rev_turf.z)) - if(ishuman(rev_mind.current)) - return FALSE + return FALSE return TRUE /// Updates the state of the world depending on if revs won or loss. diff --git a/code/modules/antagonists/space_ninja/space_ninja.dm b/code/modules/antagonists/space_ninja/space_ninja.dm index fc434d91127..ff36c2f262d 100644 --- a/code/modules/antagonists/space_ninja/space_ninja.dm +++ b/code/modules/antagonists/space_ninja/space_ninja.dm @@ -11,8 +11,6 @@ preview_outfit = /datum/outfit/ninja_preview ///Whether or not this ninja will obtain objectives var/give_objectives = TRUE - ///Whether or not this ninja receives the standard equipment - var/give_equipment = TRUE /** * Proc that equips the space ninja outfit on a given individual. By default this is the owner of the antagonist datum. @@ -119,9 +117,9 @@ operative.regenerate_icons() SSquirks.AssignQuirks(operative, operative.client, TRUE, TRUE, null, FALSE, operative) - if(give_equipment) - equip_space_ninja(owner.current) - + equip_space_ninja(owner.current) + owner.current.add_quirk(/datum/quirk/freerunning) + owner.current.add_quirk(/datum/quirk/light_step) owner.current.mind.set_assigned_role(SSjob.GetJobType(/datum/job/space_ninja)) owner.current.mind.special_role = ROLE_NINJA operative.mind.active = TRUE // BUBBED EDIT END diff --git a/code/modules/antagonists/traitor/objectives/demoralise_assault.dm b/code/modules/antagonists/traitor/objectives/demoralise_assault.dm new file mode 100644 index 00000000000..095c646cb99 --- /dev/null +++ b/code/modules/antagonists/traitor/objectives/demoralise_assault.dm @@ -0,0 +1,133 @@ +/datum/traitor_objective_category/demoralise + name = "Demoralise Crew" + objectives = list( + /datum/traitor_objective/target_player/assault = 1, + /datum/traitor_objective/destroy_item/demoralise = 1, + ) + weight = OBJECTIVE_WEIGHT_UNLIKELY + +/datum/traitor_objective/target_player/assault + name = "Assault %TARGET% the %JOB TITLE%" + description = "%TARGET% has been identified as a potential future agent. \ + Pick a fight and give them a good beating. \ + %COUNT% hits should reduce their morale and have them questioning their loyalties. \ + Try not to kill them just yet, we may want to recruit them in the future." + + abstract_type = /datum/traitor_objective/target_player + duplicate_type = /datum/traitor_objective/target_player + + progression_minimum = 0 MINUTES + progression_maximum = 30 MINUTES + progression_reward = list(4 MINUTES, 8 MINUTES) + telecrystal_reward = list(0, 1) + + /// Min attacks required to pass the objective. Picked at random between this and max. + var/min_attacks_required = 2 + /// Max attacks required to pass the objective. Picked at random between this and min. + var/max_attacks_required = 5 + /// The random number picked for the number of required attacks to pass this objective. + var/attacks_required = 0 + /// Total number of successful attacks recorded. + var/attacks_inflicted = 0 + +/datum/traitor_objective/target_player/assault/on_objective_taken(mob/user) + . = ..() + + target.AddElement(/datum/element/relay_attackers) + RegisterSignal(target, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked)) + +/datum/traitor_objective/target_player/assault/proc/on_attacked(mob/source, mob/living/attacker, attack_flags) + SIGNAL_HANDLER + + // Only care about attacks from the objective's owner. + if(attacker != handler.owner.current) + return + + // We want some sort of damaging attack to trigger this, rather than shoves and non-lethals. + if(!(attack_flags & ATTACKER_DAMAGING_ATTACK)) + return + + attacks_inflicted++ + + if(attacks_inflicted == attacks_required) + succeed_objective() + +/datum/traitor_objective/target_player/assault/ungenerate_objective() + UnregisterSignal(target, COMSIG_ATOM_WAS_ATTACKED) + UnregisterSignal(target, COMSIG_LIVING_DEATH) + UnregisterSignal(target, COMSIG_QDELETING) + + target = null + +/datum/traitor_objective/target_player/assault/generate_objective(datum/mind/generating_for, list/possible_duplicates) + var/list/already_targeting = list() //List of minds we're already targeting. The possible_duplicates is a list of objectives, so let's not mix things + for(var/datum/objective/task as anything in handler.primary_objectives) + if(!istype(task.target, /datum/mind)) + continue + already_targeting += task.target //Removing primary objective kill targets from the list + + var/list/possible_targets = list() + + for(var/datum/mind/possible_target as anything in get_crewmember_minds()) + if(possible_target in already_targeting) + continue + + if(possible_target == generating_for) + continue + + if(!ishuman(possible_target.current)) + continue + + if(possible_target.current.stat == DEAD) + continue + + if(possible_target.has_antag_datum(/datum/antagonist/traitor)) + continue + + possible_targets += possible_target + + for(var/datum/traitor_objective/target_player/objective as anything in possible_duplicates) + possible_targets -= objective.target?.mind + + if(generating_for.late_joiner) + var/list/all_possible_targets = possible_targets.Copy() + for(var/datum/mind/possible_target as anything in all_possible_targets) + if(!possible_target.late_joiner) + possible_targets -= possible_target + if(!possible_targets.len) + possible_targets = all_possible_targets + + if(!possible_targets.len) + return FALSE + + var/datum/mind/target_mind = pick(possible_targets) + + target = target_mind.current + replace_in_name("%TARGET%", target.real_name) + replace_in_name("%JOB TITLE%", target_mind.assigned_role.title) + + attacks_required = rand(min_attacks_required, max_attacks_required) + replace_in_name("%COUNT%", attacks_required) + + RegisterSignal(target, COMSIG_LIVING_DEATH, PROC_REF(on_target_death)) + RegisterSignal(target, COMSIG_QDELETING, PROC_REF(on_target_qdeleted)) + + return TRUE + +/datum/traitor_objective/target_player/assault/generate_ui_buttons(mob/user) + var/list/buttons = list() + if(attacks_required > attacks_inflicted) + buttons += add_ui_button("[attacks_required - attacks_inflicted]", "This tells you how many more times you have to attack the target player to succeed.", "hand-rock-o", "none") + return buttons + +/datum/traitor_objective/target_player/assault/proc/on_target_qdeleted() + SIGNAL_HANDLER + + //don't take an objective target of someone who is already obliterated + fail_objective() + +/datum/traitor_objective/target_player/assault/proc/on_target_death() + SIGNAL_HANDLER + + //don't take an objective target of someone who is already dead + fail_objective() diff --git a/code/modules/antagonists/traitor/objectives/demoralise_crew.dm b/code/modules/antagonists/traitor/objectives/demoralise_crew.dm deleted file mode 100644 index 4529273f5e2..00000000000 --- a/code/modules/antagonists/traitor/objectives/demoralise_crew.dm +++ /dev/null @@ -1,53 +0,0 @@ -#define MAX_CREW_RATIO 0.33 -#define MIN_CREW_DEMORALISED 8 -#define MAX_CREW_DEMORALISED 16 - -/datum/traitor_objective_category/demoralise - name = "Demoralise Crew" - objectives = list( - /datum/traitor_objective/demoralise/poster = 2, - /datum/traitor_objective/demoralise/graffiti = 1, - ) - weight = OBJECTIVE_WEIGHT_UNLIKELY - -/datum/traitor_objective/demoralise - name = "Debug your code." - description = "If you actually get this objective someone fucked up." - - abstract_type = /datum/traitor_objective/demoralise - - /// How many 'mood events' are required? - var/demoralised_crew_required = 0 - /// How many 'mood events' have happened so far? - var/demoralised_crew_events = 0 - -/datum/traitor_objective/demoralise/can_generate_objective(datum/mind/generating_for, list/possible_duplicates) - if(length(possible_duplicates) > 0) - return FALSE - return TRUE - -/datum/traitor_objective/demoralise/generate_objective(datum/mind/generating_for, list/possible_duplicates) - demoralised_crew_required = (clamp(rand(MIN_CREW_DEMORALISED, length(get_crewmember_minds()) * MAX_CREW_RATIO), MIN_CREW_DEMORALISED, MAX_CREW_DEMORALISED)) - replace_in_name("%VIEWS%", demoralised_crew_required) - return TRUE - -/** - * Handles an event which increases your progress towards success. - * - * Arguments - * * source - Source atom of the signal. - * * victim - Mind of whoever it was you just triggered some kind of effect on. - */ -/datum/traitor_objective/demoralise/proc/on_mood_event(atom/source, datum/mind/victim) - SIGNAL_HANDLER - if (victim == handler.owner) - return - - demoralised_crew_events++ - if (demoralised_crew_events >= demoralised_crew_required) - to_chat(handler.owner, span_nicegreen("The crew look despondent. Mission accomplished.")) - succeed_objective() - -#undef MAX_CREW_RATIO -#undef MIN_CREW_DEMORALISED -#undef MAX_CREW_DEMORALISED diff --git a/code/modules/antagonists/traitor/objectives/destroy_item.dm b/code/modules/antagonists/traitor/objectives/destroy_item.dm index 965c49de27e..ec247eac9ed 100644 --- a/code/modules/antagonists/traitor/objectives/destroy_item.dm +++ b/code/modules/antagonists/traitor/objectives/destroy_item.dm @@ -34,6 +34,27 @@ /datum/objective_item/steal/blackbox, ) +/// Super early-game destroy objective intended to be items easily tided that the crew tends to value. +/datum/traitor_objective/destroy_item/demoralise + description = "Find %ITEM% and destroy it using any means necessary. \ + We believe this luxury item is important for crew morale. \ + Destruction of this item will help our recruitment efforts." + + progression_minimum = 0 MINUTES + progression_maximum = 10 MINUTES + progression_reward = list(4 MINUTES, 8 MINUTES) + telecrystal_reward = list(0, 1) + + possible_items = list( + /datum/objective_item/steal/traitor/rpd, + /datum/objective_item/steal/traitor/space_law, + /datum/objective_item/steal/traitor/granted_stamp, + /datum/objective_item/steal/traitor/denied_stamp, + /datum/objective_item/steal/traitor/lizard_plush, + /datum/objective_item/steal/traitor/moth_plush, + /datum/objective_item/steal/traitor/insuls, + ) + /datum/traitor_objective/destroy_item/generate_objective(datum/mind/generating_for, list/possible_duplicates) for(var/datum/traitor_objective/destroy_item/objective as anything in possible_duplicates) possible_items -= objective.target_item.type diff --git a/code/modules/antagonists/traitor/objectives/kill_pet.dm b/code/modules/antagonists/traitor/objectives/kill_pet.dm index fc46350aaa3..51a54d99e30 100644 --- a/code/modules/antagonists/traitor/objectives/kill_pet.dm +++ b/code/modules/antagonists/traitor/objectives/kill_pet.dm @@ -54,7 +54,7 @@ possible_heads = list( JOB_HEAD_OF_SECURITY = list( /mob/living/basic/carp/pet/lia, - /mob/living/basic/giant_spider/sgt_araneus, + /mob/living/basic/spider/giant/sgt_araneus, ), JOB_WARDEN = list( /mob/living/basic/pet/dog/pug/mcgriff diff --git a/code/modules/antagonists/traitor/objectives/steal.dm b/code/modules/antagonists/traitor/objectives/steal.dm index b4d8b171274..61d4796d66f 100644 --- a/code/modules/antagonists/traitor/objectives/steal.dm +++ b/code/modules/antagonists/traitor/objectives/steal.dm @@ -97,6 +97,9 @@ GLOBAL_DATUM_INIT(steal_item_handler, /datum/objective_item_handler, new()) possible_items = list( /datum/objective_item/steal/traitor/cargo_budget, /datum/objective_item/steal/traitor/clown_shoes, + /datum/objective_item/steal/traitor/lawyers_badge, + /datum/objective_item/steal/traitor/chef_moustache, + /datum/objective_item/steal/traitor/pka, ) /datum/traitor_objective/steal_item/somewhat_risky diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index 9162a276847..610c8425d97 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -24,6 +24,7 @@ var/theme = THEME_CULT /// Role check, if any needed var/required_role = /datum/antagonist/cult + grind_results = list(/datum/reagent/hauntium = 25, /datum/reagent/silicon = 10) //can be ground into hauntium /obj/item/soulstone/Initialize(mapload) . = ..() diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/challenges.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/challenges.dm index cf86c657514..d200b897588 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook_entries/challenges.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/challenges.dm @@ -8,6 +8,3 @@ /datum/spellbook_entry/challenge/antiwizard name = "Friendly Wizard Scum" desc = "A \"Friendly\" Wizard will protect the station, and try to kill you. They get a spellbook much like you, but will use it for \"GOOD\"." - -/datum/spellbook_entry/challenge/can_be_purchased() - return FALSE diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/offensive.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/offensive.dm index d2398b01448..546ae4da36a 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook_entries/offensive.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/offensive.dm @@ -23,6 +23,14 @@ spell_type = /datum/action/cooldown/spell/touch/smite category = "Offensive" +/datum/spellbook_entry/summon_simians + name = "Summon Simians" + desc = "This spell reaches deep into the elemental plane of bananas (the monkey one, not the clown one), and \ + summons primal monkeys and lesser gorillas that will promptly flip out and attack everything in sight. Fun! \ + Their lesser, easily manipulable minds will be convinced you are one of their allies, but only for a minute. Unless you also are a monkey." + spell_type = /datum/action/cooldown/spell/conjure/simian + category = "Offensive" + /datum/spellbook_entry/blind name = "Blind" desc = "Temporarily blinds a single target." diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/summons.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/summons.dm index 304c98215ae..c31bb4ce2ce 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook_entries/summons.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/summons.dm @@ -1,6 +1,6 @@ // Ritual spells which affect the station at large /// How much threat we need to let these rituals happen on dynamic -#define MINIMUM_THREAT_FOR_RITUALS 100 +#define MINIMUM_THREAT_FOR_RITUALS 98 /datum/spellbook_entry/summon/ghosts name = "Summon Ghosts" @@ -20,7 +20,7 @@ There is a good chance that they will shoot each other first." /datum/spellbook_entry/summon/guns/can_be_purchased() - // Summon Guns requires 100 threat. + // Summon Guns requires 98 threat. var/datum/game_mode/dynamic/mode = SSticker.mode if(mode.threat_level < MINIMUM_THREAT_FOR_RITUALS) return FALSE @@ -38,7 +38,7 @@ why they aren't to be trusted with it at the same time." /datum/spellbook_entry/summon/magic/can_be_purchased() - // Summon Magic requires 100 threat. + // Summon Magic requires 98 threat. var/datum/game_mode/dynamic/mode = SSticker.mode if(mode.threat_level < MINIMUM_THREAT_FOR_RITUALS) return FALSE @@ -59,7 +59,7 @@ limit = 5 // Each purchase can intensify it. /datum/spellbook_entry/summon/events/can_be_purchased() - // Summon Events requires 100 threat. + // Summon Events requires 98 threat. var/datum/game_mode/dynamic/mode = SSticker.mode if(mode.threat_level < MINIMUM_THREAT_FOR_RITUALS) return FALSE diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index 398f43b3fba..8c3fa74f50a 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -79,6 +79,7 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key) CRASH("Wizard datum with no owner.") assign_ritual() equip_wizard() + owner.current.add_quirk(/datum/quirk/introvert) if(give_objectives) create_objectives() if(move_to_lair) diff --git a/code/modules/art/statues.dm b/code/modules/art/statues.dm index f48c2bed4a4..66480038a40 100644 --- a/code/modules/art/statues.dm +++ b/code/modules/art/statues.dm @@ -478,8 +478,8 @@ Moving interrupts user.balloon_alert(user, "no sculpt target!") return FALSE //No big icon things - var/icon/thing_icon = icon(target.icon, target.icon_state) - if(thing_icon.Height() != world.icon_size || thing_icon.Width() != world.icon_size) + var/list/icon_dimensions = get_icon_dimensions(target.icon) + if(icon_dimensions["width"] != world.icon_size || icon_dimensions["height"] != world.icon_size) user.balloon_alert(user, "sculpt target is too big!") return FALSE return TRUE diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index 2a15d78063d..4ea085ca9a3 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -122,7 +122,7 @@ if(LAZYLEN(assembly.assemblies) == igniter_count) return - if((src in user.get_equipped_items(TRUE)) && !user.canUnEquip(src)) + if((src in user.get_equipped_items(include_pockets = TRUE, include_accessories = TRUE)) && !user.canUnEquip(src)) to_chat(user, span_warning("[src] is stuck to you!")) return diff --git a/code/modules/assembly/doorcontrol.dm b/code/modules/assembly/doorcontrol.dm index 552b995aab4..8ca5fd8b10e 100644 --- a/code/modules/assembly/doorcontrol.dm +++ b/code/modules/assembly/doorcontrol.dm @@ -221,9 +221,12 @@ if(!tram || !tram.is_operational) //tram is QDEL or has no power say("The tram is not in service. Please send a technician to repair the internals of the tram.") return - if(tram.travelling) //in use + if(tram.travelling) //already on its way say("The tram is already travelling to [tram.idle_platform].") return + if(tram.controls_locked) //attempting a dispatch or on cooldown + say("The tram controller is busy. Try again in a moment.") + return if(!destination_platform) return var/obj/effect/landmark/tram/current_location = destination_platform.resolve() @@ -233,5 +236,8 @@ say("The tram is already here. Please board the tram and select a destination.") return - say("The tram has been called to [current_location.name]. Please wait for its arrival.") - tram.tram_travel(current_location) + if(tram.tram_travel(current_location)) + say("The tram has been called to [current_location.name]. Please wait for its arrival.") + return + else + say("The tram controller has encountered an error. Try again in a moment.") diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index b71388e13cb..e706c6f7598 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -138,11 +138,7 @@ else if(ismouse(target)) var/mob/living/basic/mouse/splatted = target visible_message(span_boldannounce("SPLAT!")) - if(splatted.health <= 5) - splatted.splat() - else - splatted.adjust_health(5) - splatted.Stun(1 SECONDS) + splatted.splat() // mousetraps are instadeath for mice else if(isregalrat(target)) visible_message(span_boldannounce("Skreeeee!")) //He's simply too large to be affected by a tiny mouse trap. @@ -196,7 +192,7 @@ if(!(MM.movement_type & FLYING)) if(ishuman(AM)) var/mob/living/carbon/H = AM - if(H.m_intent == MOVE_INTENT_RUN) + if(H.move_intent == MOVE_INTENT_RUN) INVOKE_ASYNC(src, PROC_REF(triggered), H) H.visible_message(span_warning("[H] accidentally steps on [src]."), \ span_warning("You accidentally step on [src]")) diff --git a/code/modules/asset_cache/assets/mecha.dm b/code/modules/asset_cache/assets/mecha.dm index ced0fcf234b..fd4b911e20c 100644 --- a/code/modules/asset_cache/assets/mecha.dm +++ b/code/modules/asset_cache/assets/mecha.dm @@ -1,5 +1,6 @@ -/datum/asset/spritesheet/mechaarmor - name = "mechaarmor" +/datum/asset/spritesheet/mecha_equipment + name = "mecha_equipment" -/datum/asset/spritesheet/mechaarmor/create_spritesheets() - InsertAll("", 'icons/ui_icons/mecha/armor.dmi') +/datum/asset/spritesheet/mecha_equipment/create_spritesheets() + InsertAll("", 'icons/mob/mecha_equipment.dmi') + InsertAll("", 'icons/obj/ore.dmi') diff --git a/code/modules/asset_cache/assets/rcd.dm b/code/modules/asset_cache/assets/rcd.dm index 6662caa183b..e4c54929dae 100644 --- a/code/modules/asset_cache/assets/rcd.dm +++ b/code/modules/asset_cache/assets/rcd.dm @@ -27,7 +27,7 @@ //for each airlock type we create its overlayed version with the suffix Glass in the sprite name var/list/airlocks = list( "Standard" = 'icons/obj/doors/airlocks/station/public.dmi', - "Public" = 'icons/obj/doors/airlocks/station2/glass.dmi', + "Public" = 'icons/obj/doors/airlocks/public/glass.dmi', "Engineering" = 'icons/obj/doors/airlocks/station/engineering.dmi', "Atmospherics" = 'icons/obj/doors/airlocks/station/atmos.dmi', "Security" = 'icons/obj/doors/airlocks/station/security.dmi', diff --git a/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm b/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm index f814bf3b09e..3ec8fbdd99b 100644 --- a/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm +++ b/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm @@ -47,7 +47,7 @@ /obj/machinery/airalarm/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) if((buildstage == AIR_ALARM_BUILD_NO_CIRCUIT) && (the_rcd.upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS)) - return list("mode" = RCD_WALLFRAME, "delay" = 20, "cost" = 1) + return list("mode" = RCD_WALLFRAME, "delay" = 2 SECONDS, "cost" = 1) return FALSE /obj/machinery/airalarm/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm index 1170ea32bde..502e35c74e4 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm @@ -75,10 +75,6 @@ if((input_starting_pressure < VOLUME_PUMP_MINIMUM_OUTPUT_PRESSURE) || ((output_starting_pressure > VOLUME_PUMP_MAX_OUTPUT_PRESSURE)) && !overclocked) return - if(overclocked && (output_starting_pressure-input_starting_pressure > VOLUME_PUMP_OVERPRESSURE_ALLOWANCE))//Overclocked pumps can only force gas a certain amount. - return - - var/transfer_ratio = transfer_rate / air1.volume var/datum/gas_mixture/removed = air1.remove_ratio(transfer_ratio) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm b/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm index 1febca39269..d4977eb6454 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/bluespace_sender.dm @@ -122,7 +122,7 @@ GLOBAL_LIST_EMPTY_TYPED(bluespace_senders, /obj/machinery/atmospherics/component /obj/machinery/atmospherics/components/unary/bluespace_sender/multitool_act(mob/living/user, obj/item/item) var/obj/item/multitool/multitool = item - multitool.buffer = src + multitool.set_buffer(src) to_chat(user, span_notice("You store linkage information in [item]'s buffer.")) return TRUE diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 73b7316d6cb..2c4fceed68c 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -208,9 +208,9 @@ if(EXPLODE_LIGHT) SSexplosions.low_mov_atom += beaker -/obj/machinery/atmospherics/components/unary/cryo_cell/handle_atom_del(atom/A) - ..() - if(A == beaker) +/obj/machinery/atmospherics/components/unary/cryo_cell/Exited(atom/movable/gone, direction) + . = ..() + if(gone == beaker) beaker = null /obj/machinery/atmospherics/components/unary/cryo_cell/on_deconstruction() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm index 33de80ffbaf..269091d4bdf 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm @@ -48,12 +48,12 @@ if(istype(multi_tool.buffer, /obj/machinery/air_sensor)) var/obj/machinery/air_sensor/sensor = multi_tool.buffer sensor.inlet_id = id_tag - multi_tool.buffer = null + multi_tool.set_buffer(null) balloon_alert(user, "input linked to sensor") return TOOL_ACT_TOOLTYPE_SUCCESS balloon_alert(user, "saved in buffer") - multi_tool.buffer = src + multi_tool.set_buffer(src) return TOOL_ACT_TOOLTYPE_SUCCESS /obj/machinery/atmospherics/components/unary/outlet_injector/CtrlClick(mob/user) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index 9b05e3d868e..6449dc49357 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -58,12 +58,12 @@ if(istype(multi_tool.buffer, /obj/machinery/air_sensor)) var/obj/machinery/air_sensor/sensor = multi_tool.buffer sensor.outlet_id = id_tag - multi_tool.buffer = null + multi_tool.set_buffer(null) balloon_alert(user, "output linked to sensor") return TOOL_ACT_TOOLTYPE_SUCCESS balloon_alert(user, "saved in buffer") - multi_tool.buffer = src + multi_tool.set_buffer(src) return TOOL_ACT_TOOLTYPE_SUCCESS /obj/machinery/atmospherics/components/unary/vent_pump/Destroy() @@ -171,6 +171,8 @@ if(pressure_delta > 0) if(air_contents.temperature > 0) + if(environment_pressure >= 50 * ONE_ATMOSPHERE) + return FALSE var/transfer_moles = (pressure_delta * environment.volume) / (air_contents.temperature * R_IDEAL_GAS_EQUATION) var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) @@ -188,6 +190,8 @@ pressure_delta = min(pressure_delta, (internal_pressure_bound - air_contents.return_pressure())) if(pressure_delta > 0 && environment.temperature > 0) + if(air_contents.return_pressure() >= 50 * ONE_ATMOSPHERE) + return FALSE var/transfer_moles = (pressure_delta * air_contents.volume) / (environment.temperature * R_IDEAL_GAS_EQUATION) var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) diff --git a/code/modules/autowiki/pages/soup.dm b/code/modules/autowiki/pages/soup.dm index 3134421a39a..75521005d8e 100644 --- a/code/modules/autowiki/pages/soup.dm +++ b/code/modules/autowiki/pages/soup.dm @@ -18,16 +18,54 @@ for(var/soup_recipe_type in subtypesof(/datum/chemical_reaction/food/soup)) var/datum/chemical_reaction/food/soup/soup_recipe = new soup_recipe_type() - var/result_soup_type = soup_recipe.results[1] - var/datum/reagent/result_soup = new result_soup_type() - var/datum/glass_style/has_foodtype/soup_style = GLOB.glass_style_singletons[container_for_images][result_soup_type] - var/filename = "soup_[SANITIZE_FILENAME(escape_value(format_text(result_soup.name)))]" + // Used to determine what icon is displayed on the wiki + var/soup_icon + var/soup_icon_state + // Used to determine what food types the soup is + var/soup_food_types = NONE + // Used for filename and description of the result + var/result_name + var/result_desc + var/result_tastes + // Solid food item results take priority over reagents for showcasing results + if(soup_recipe.resulting_food_path) + var/obj/item/resulting_food = new soup_recipe.resulting_food_path() + result_name = format_text(resulting_food.name) + result_desc = resulting_food.desc + + soup_icon = resulting_food.icon + soup_icon_state = resulting_food.icon_state + + if(istype(resulting_food, /obj/item/food)) + var/obj/item/food/resulting_food_casted = resulting_food + result_tastes = resulting_food_casted.tastes?.Copy() + soup_food_types = resulting_food_casted.foodtypes || NONE + + qdel(resulting_food) + + // Otherwise, it should be a reagent. + else + var/result_soup_type = soup_recipe.results[1] + var/datum/reagent/result_soup = new result_soup_type() + result_name = format_text(result_soup.name) + result_desc = result_soup.description + result_tastes = result_soup.get_taste_description() + + var/datum/glass_style/has_foodtype/soup_style = GLOB.glass_style_singletons[container_for_images][result_soup_type] + soup_icon = soup_style.icon + soup_icon_state = soup_style.icon_state + soup_food_types = soup_style.drink_type + + qdel(result_soup) + + var/filename = "soup_[SANITIZE_FILENAME(escape_value(result_name))]" // -- Compiles a list of required reagents and food items -- var/list/all_needs_text = list() for(var/datum/reagent/reagent_type as anything in soup_recipe.required_reagents) - var/num_needed = soup_recipe.required_reagents[reagent_type] - all_needs_text += "[num_needed] units [initial(reagent_type.name)]" + all_needs_text += "[soup_recipe.required_reagents[reagent_type]] units [initial(reagent_type.name)]" + for(var/datum/reagent/reagent_type as anything in soup_recipe.required_catalysts) + all_needs_text += "[soup_recipe.required_catalysts[reagent_type]] units [initial(reagent_type.name)] (not consumed)" for(var/obj/item/food_type as anything in soup_recipe.required_ingredients) var/num_needed = soup_recipe.required_ingredients[food_type] @@ -51,6 +89,8 @@ for(var/datum/reagent/reagent_type as anything in soup_recipe.results) var/num_given = soup_recipe.results[reagent_type] all_results_text += "[num_given] units [initial(reagent_type.name)]" + if(soup_recipe.resulting_food_path) + all_results_text += "1 [initial(soup_recipe.resulting_food_path.name)]" all_results_text += soup_recipe.describe_result() var/compiled_results = "" @@ -71,23 +111,21 @@ template_list["description"] = "A custom soup recipe, allowing you to throw whatever you want in the pot." else - var/foodtypes_readable = jointext(bitfield_to_list(soup_style.drink_type, FOOD_FLAGS_IC), ", ") || "None" - var/tastes_actual = result_soup.get_taste_description() - template_list["name"] = escape_value(result_soup.name) - template_list["taste"] = escape_value(length(tastes_actual) ? capitalize(jointext(tastes_actual, ", ")) : "No taste") + var/foodtypes_readable = jointext(bitfield_to_list(soup_food_types, FOOD_FLAGS_IC), ", ") || "None" + template_list["name"] = escape_value(result_name) + template_list["taste"] = escape_value(length(result_tastes) ? capitalize(jointext(result_tastes, ", ")) : "No taste") template_list["foodtypes"] = escape_value(foodtypes_readable) - template_list["description"] = escape_value(result_soup.description) + template_list["description"] = escape_value(result_desc) template_list["icon"] = escape_value(filename) template_list["requirements"] = escape_value(compiled_requirements) template_list["results"] = escape_value(compiled_results) // -- While we're here, generate an icon of the bowl -- - var/image/compiled_image = image(icon = soup_style.icon, icon_state = soup_style.icon_state) + var/image/compiled_image = image(icon = soup_icon, icon_state = soup_icon_state) upload_icon(getFlatIcon(compiled_image, no_anim = TRUE), filename) // -- Cleanup -- - qdel(result_soup) qdel(soup_recipe) // -- All done, apply the template -- diff --git a/code/modules/awaymissions/mission_code/moonoutpost19.dm b/code/modules/awaymissions/mission_code/moonoutpost19.dm index 28f8a449376..17385bc70bc 100644 --- a/code/modules/awaymissions/mission_code/moonoutpost19.dm +++ b/code/modules/awaymissions/mission_code/moonoutpost19.dm @@ -16,6 +16,10 @@ name = "MO19 Arrivals" icon_state = "awaycontent2" +/area/awaymission/moonoutpost19/arrivals/shed + name = "MO19 Arrivals Shed" + icon_state = "awaycontent9" + /area/awaymission/moonoutpost19/research name = "MO19 Research" icon_state = "awaycontent3" diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm index 31ccdfa2119..c4bb2d17610 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -1,6 +1,6 @@ // How much "space" we give the edge of the map GLOBAL_LIST_INIT(potentialRandomZlevels, generateMapList(filename = "awaymissionconfig.txt")) -GLOBAL_LIST_INIT(potentialConfigRandomZlevels, generateConfigMapList(directory = "[global.config.directory]/away_missions/")) +GLOBAL_LIST_INIT(potentialConfigRandomZlevels, generate_map_list_from_directory(directory = "[global.config.directory]/away_missions/")) /proc/createRandomZlevel(config_gateway = FALSE) var/map @@ -72,7 +72,8 @@ GLOBAL_LIST_INIT(potentialConfigRandomZlevels, generateConfigMapList(directory = . += t -/proc/generateConfigMapList(directory) +/// Returns a list of all maps to be found in the directory that is passed in. +/proc/generate_map_list_from_directory(directory) var/list/config_maps = list() var/list/maps = flist(directory) for(var/map_file in maps) diff --git a/code/modules/buildmode/buildmode.dm b/code/modules/buildmode/buildmode.dm index 0c3cb23d26e..0e16a13b54a 100644 --- a/code/modules/buildmode/buildmode.dm +++ b/code/modules/buildmode/buildmode.dm @@ -136,10 +136,10 @@ // Scale the preview if it's bigger than one tile var/mutable_appearance/preview_overlay = new(typepath) - var/icon/size_check = icon(initial(typepath.icon), icon_state = initial(typepath.icon_state)) + var/list/icon_dimensions = get_icon_dimensions(initial(typepath.icon)) + var/width = icon_dimensions["width"] + var/height = icon_dimensions["height"] var/scale = 1 - var/width = size_check.Width() - var/height = size_check.Height() if(width > world.icon_size || height > world.icon_size) if(width >= height) scale = world.icon_size / width diff --git a/code/modules/buildmode/submodes/outfit.dm b/code/modules/buildmode/submodes/outfit.dm index 8927e7be9fa..5f8e3319cb9 100644 --- a/code/modules/buildmode/submodes/outfit.dm +++ b/code/modules/buildmode/submodes/outfit.dm @@ -32,11 +32,11 @@ to_chat(c, span_warning("Pick an outfit first.")) return - for (var/item in dollie.get_equipped_items(TRUE)) + for (var/item in dollie.get_equipped_items(include_pockets = TRUE)) qdel(item) if(dressuptime != "Naked") dollie.equipOutfit(dressuptime) if(LAZYACCESS(modifiers, RIGHT_CLICK)) - for (var/item in dollie.get_equipped_items(TRUE)) + for (var/item in dollie.get_equipped_items(include_pockets = TRUE)) qdel(item) diff --git a/code/modules/capture_the_flag/ctf_classes.dm b/code/modules/capture_the_flag/ctf_classes.dm index 95a61bcf64f..0482bd1ec88 100644 --- a/code/modules/capture_the_flag/ctf_classes.dm +++ b/code/modules/capture_the_flag/ctf_classes.dm @@ -74,7 +74,7 @@ r_pocket = /obj/item/ammo_box/magazine/recharge/ctf/shotgun belt = null icon_state = "ctf_assaulter" - class_description = "Close combat class. Armed with a shotgun and rocket gloves." + class_description = "Close combat class. Armed with a shotgun and rocket gloves. Has significantly lower shield values due to higher moving speed." /datum/outfit/ctf/marksman name = "CTF Marksman (Solo)" @@ -83,7 +83,7 @@ r_pocket = /obj/item/ammo_box/magazine/recharge/ctf/marksman belt = null icon_state = "ctf_marksman" - class_description = "Long range class. Armed with a hitscan laser rifle." + class_description = "Long range class. Armed with a hitscan laser rifle with a scope." // RED TEAM CLASSES diff --git a/code/modules/capture_the_flag/ctf_controller.dm b/code/modules/capture_the_flag/ctf_controller.dm index ed8ef652534..8e51f8ef733 100644 --- a/code/modules/capture_the_flag/ctf_controller.dm +++ b/code/modules/capture_the_flag/ctf_controller.dm @@ -48,7 +48,7 @@ for(var/team in teams) var/obj/machinery/ctf/spawner/spawner = teams[team].spawner notify_ghosts("[spawner.name] has been activated!", source = spawner, action = NOTIFY_ORBIT, header = "CTF has been activated") - + /datum/ctf_controller/proc/stop_ctf() ctf_enabled = FALSE clear_control_points() @@ -115,7 +115,7 @@ if(user.ckey in enemy_team_members) to_chat(user, span_warning("No switching teams while the round is going!")) return FALSE - if(friendly_team_members.len > enemy_team_members.len) + else if(friendly_team_members.len > enemy_team_members.len) to_chat(user, span_warning("[team_color] has more team members than [team]! Try joining [team] team to even things up.")) return FALSE return TRUE @@ -208,7 +208,7 @@ var/datum/component/ctf_player/ctf_player = team_members[player] ctf_player.end_game() return ..() - + ///Increases this teams number of points by the provided amount. /datum/ctf_team/proc/score_points(points_scored) points += points_scored diff --git a/code/modules/capture_the_flag/ctf_equipment.dm b/code/modules/capture_the_flag/ctf_equipment.dm index ec269bc6407..5ec412f9017 100644 --- a/code/modules/capture_the_flag/ctf_equipment.dm +++ b/code/modules/capture_the_flag/ctf_equipment.dm @@ -1,4 +1,3 @@ - // GENERIC PROJECTILE /obj/projectile/beam/ctf @@ -26,7 +25,6 @@ . = ..() AddElement(/datum/element/delete_on_drop) - /obj/item/ammo_casing/laser/ctf projectile_type = /obj/projectile/beam/ctf/ @@ -47,15 +45,12 @@ . = ..() AddElement(/datum/element/delete_on_drop) - /obj/item/ammo_box/magazine/recharge/ctf/rifle ammo_type = /obj/item/ammo_casing/laser/ctf/rifle - /obj/item/ammo_casing/laser/ctf/rifle projectile_type = /obj/projectile/beam/ctf/rifle - /obj/projectile/beam/ctf/rifle damage = 45 light_color = LIGHT_COLOR_BLUE @@ -85,13 +80,11 @@ ammo_type = /obj/item/ammo_casing/laser/ctf/shotgun max_ammo = 6 - /obj/item/ammo_casing/laser/ctf/shotgun projectile_type = /obj/projectile/beam/ctf/shotgun pellets = 6 variance = 25 - /obj/projectile/beam/ctf/shotgun damage = 15 light_color = LIGHT_COLOR_BLUE @@ -106,6 +99,10 @@ accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/marksman fire_delay = 1 SECONDS +/obj/item/gun/ballistic/automatic/laser/ctf/marksman/Initialize(mapload) + . = ..() + AddComponent(/datum/component/scope, range_modifier = 1.7) + /obj/item/ammo_box/magazine/recharge/ctf/marksman ammo_type = /obj/item/ammo_casing/laser/ctf/marksman max_ammo = 10 @@ -131,16 +128,13 @@ . = ..() AddElement(/datum/element/delete_on_drop) - /obj/item/ammo_box/magazine/recharge/ctf/deagle ammo_type = /obj/item/ammo_casing/laser/ctf/deagle max_ammo = 7 - /obj/item/ammo_casing/laser/ctf/deagle projectile_type = /obj/projectile/beam/ctf/deagle - /obj/projectile/beam/ctf/deagle icon_state = "bullet" damage = 60 @@ -207,7 +201,7 @@ ///Icon state to be fed into the shielded component var/team_shield_icon = "shield-old" var/max_charges = 150 - var/recharge_start_delay = 20 SECONDS + var/recharge_start_delay = 12 SECONDS var/charge_increment_delay = 1 SECONDS var/charge_recovery = 30 var/lose_multiple_charges = TRUE @@ -229,7 +223,6 @@ greyscale_config = /datum/greyscale_config/ctf_light greyscale_config_worn = /datum/greyscale_config/ctf_light/worn slowdown = -0.25 - max_charges = 30 // RED TEAM GUNS @@ -249,7 +242,6 @@ light_color = COLOR_SOFT_RED impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser - // Shotgun /obj/item/gun/ballistic/shotgun/ctf/red accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/shotgun/red @@ -265,7 +257,6 @@ light_color = COLOR_SOFT_RED impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser - // DMR /obj/item/gun/ballistic/automatic/laser/ctf/marksman/red accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/marksman/red @@ -282,7 +273,6 @@ muzzle_type = /obj/effect/projectile/muzzle/laser impact_type = /obj/effect/projectile/impact/laser - // Instakill /obj/item/gun/energy/laser/instakill/ctf/red desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit. This one has a red design." @@ -328,7 +318,6 @@ icon_state = "bluelaser" impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser - // DMR /obj/item/gun/ballistic/automatic/laser/ctf/marksman/blue accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/marksman/blue @@ -341,7 +330,6 @@ /obj/projectile/beam/ctf/marksman/blue - // Instakill /obj/item/gun/energy/laser/instakill/ctf/blue desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit. This one has a blue design." @@ -374,7 +362,6 @@ light_color = COLOR_VERY_PALE_LIME_GREEN impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser - // Shotgun /obj/item/gun/ballistic/shotgun/ctf/green accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/shotgun/green @@ -390,7 +377,6 @@ light_color = COLOR_VERY_PALE_LIME_GREEN impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser - // DMR /obj/item/gun/ballistic/automatic/laser/ctf/marksman/green accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/marksman/green @@ -407,7 +393,6 @@ muzzle_type = /obj/effect/projectile/muzzle/xray impact_type = /obj/effect/projectile/impact/xray - // Instakill /obj/item/gun/energy/laser/instakill/ctf/green desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit. This one has a green design." @@ -440,7 +425,6 @@ light_color = COLOR_VERY_SOFT_YELLOW impact_effect_type = /obj/effect/temp_visual/impact_effect/yellow_laser - // Shotgun /obj/item/gun/ballistic/shotgun/ctf/yellow accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/shotgun/yellow @@ -456,7 +440,6 @@ light_color = COLOR_VERY_SOFT_YELLOW impact_effect_type = /obj/effect/temp_visual/impact_effect/yellow_laser - // DMR /obj/item/gun/ballistic/automatic/laser/ctf/marksman/yellow accepted_magazine_type = /obj/item/ammo_box/magazine/recharge/ctf/marksman/yellow @@ -473,7 +456,6 @@ muzzle_type = /obj/effect/projectile/muzzle/solar impact_type = /obj/effect/projectile/impact/solar - // Instakill /obj/item/gun/energy/laser/instakill/ctf/yellow desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit. This one has a yellow design." diff --git a/code/modules/capture_the_flag/ctf_game.dm b/code/modules/capture_the_flag/ctf_game.dm index 3e8a3a6fd44..4ab831f7060 100644 --- a/code/modules/capture_the_flag/ctf_game.dm +++ b/code/modules/capture_the_flag/ctf_game.dm @@ -135,7 +135,7 @@ var/datum/outfit/ctf/class = ctf_gear[key] var/datum/radial_menu_choice/option = new option.image = image(icon = initial(class.icon), icon_state = initial(class.icon_state)) - option.info = "[initial(class.class_description)]" + option.info = span_boldnotice("[initial(class.class_description)]") display_classes[key] = option sort_list(display_classes) diff --git a/code/modules/cargo/markets/market_items/misc.dm b/code/modules/cargo/markets/market_items/misc.dm index 937bbc33232..d2b70704e7a 100644 --- a/code/modules/cargo/markets/market_items/misc.dm +++ b/code/modules/cargo/markets/market_items/misc.dm @@ -121,3 +121,12 @@ stock_min = 3 stock_max = 8 availability_prob = 90 + +/datum/market_item/misc/giant_wrench_parts + name = "Big Slappy parts" + desc = "Cheap illegal Big Slappy parts. The fastest and statistically most dangerous wrench." + item = /obj/item/weaponcrafting/giant_wrench + price_min = CARGO_CRATE_VALUE * 2 + price_max = CARGO_CRATE_VALUE * 5 + stock_max = 1 + availability_prob = 25 diff --git a/code/modules/cargo/packs/imports.dm b/code/modules/cargo/packs/imports.dm index eda2bf3ecb2..ad444efc740 100644 --- a/code/modules/cargo/packs/imports.dm +++ b/code/modules/cargo/packs/imports.dm @@ -42,7 +42,7 @@ name = "Duct Spider Crate" desc = "Awww! Straight from the Australicus sector to your station's ventilation system!" cost = CARGO_CRATE_VALUE * 6 - contains = list(/mob/living/basic/giant_spider/maintenance) + contains = list(/mob/living/basic/spider/maintenance) crate_name = "duct spider crate" crate_type = /obj/structure/closet/crate/critter @@ -50,7 +50,7 @@ name = "Duct Spider Crate?" desc = "Wait, is this the right crate? It has a frowny face, what does that mean?" cost = CARGO_CRATE_VALUE * 6 - contains = list(/mob/living/basic/giant_spider/hunter) + contains = list(/mob/living/basic/spider/giant/hunter) contraband = TRUE /datum/supply_pack/imports/bamboo50 @@ -201,6 +201,8 @@ /obj/item/grenade/mirage = 5, ) +// SKYRAT EDIT REMOVAL BEGIN - REPLACED BY LORE BEFITTING CRATE AT: modular_skyrat/modules/cargo/code/packs.dm +/* /datum/supply_pack/imports/russian name = "Russian Surplus Military Gear Crate" desc = "Hello <;~insert appropriate greeting here: 'Comrade'|'Imperalist Scum'|'Quartermaster of Reputable Station'~;>, \ @@ -210,10 +212,10 @@ cost = CARGO_CRATE_VALUE * 12 contains = list( /obj/item/food/rationpack, - /obj/item/ammo_box/a762, - /obj/item/ammo_box/a762/surplus, - /obj/item/storage/toolbox/ammobox/a762, - /obj/item/storage/toolbox/ammobox/a762/surplus, + /obj/item/ammo_box/strilka310, + /obj/item/ammo_box/strilka310/surplus, + /obj/item/storage/toolbox/ammobox/strilka310, + /obj/item/storage/toolbox/ammobox/strilka310/surplus, /obj/item/storage/toolbox/maint_kit, /obj/item/clothing/suit/armor/vest/russian, /obj/item/clothing/head/helmet/rus_helmet, @@ -231,9 +233,11 @@ for(var/items in 1 to 10) var/item = pick(contains) new item(our_crate) +*/ +// SKYRAT EDIT REMOVAL END /datum/supply_pack/imports/moistnuggets - name = "Refurbished Mosin Nagant Crate" + name = "Refurbished Sakhno Precision Rifle Crate" desc = "Hello Comrade Operative. You need gun? You hate garbage we sell to station normally? \ Then we have the perfect weapon for you! Special price for good friends! \ We don't have enough spare ammo, so you'll have to pick up the weapon of \ @@ -291,3 +295,11 @@ cost = CARGO_CRATE_VALUE * 5 contains = list(/obj/item/reagent_containers/cup/glass/bottle/juice/dreadnog = 3) crate_name = "dreadnog crate" + +/datum/supply_pack/imports/giant_wrench_parts + name = "Big Slappy parts" + desc = "Illegal Big Slappy parts. The fastest and statistically most dangerous wrench." + cost = CARGO_CRATE_VALUE * 22 + contraband = TRUE + contains = list(/obj/item/weaponcrafting/giant_wrench) + crate_name = "unknown parts crate" diff --git a/code/modules/cargo/packs/livestock.dm b/code/modules/cargo/packs/livestock.dm index 8c0c0f0c907..db47abc4d02 100644 --- a/code/modules/cargo/packs/livestock.dm +++ b/code/modules/cargo/packs/livestock.dm @@ -6,7 +6,6 @@ name = "Bird Crate" desc = "Contains five expert telecommunication birds." cost = CARGO_CRATE_VALUE * 8 - access_view = ACCESS_CE contains = list(/mob/living/simple_animal/parrot) crate_name = "parrot crate" @@ -20,7 +19,6 @@ desc = "Not a very dangerous insect, but they do give off a better image than, say, flies or cockroaches."//is that a motherfucking worm reference contraband = TRUE cost = CARGO_CRATE_VALUE * 5 - access_view = ACCESS_THEATRE contains = list(/mob/living/basic/butterfly) crate_name = "entomology samples crate" @@ -33,7 +31,6 @@ name = "Cat Crate" desc = "The cat goes meow! Comes with a collar and a nice cat toy! Cheeseburger not included."//i can't believe im making this reference cost = CARGO_CRATE_VALUE * 10 //Cats are worth as much as corgis. - access_view = ACCESS_MEDICAL contains = list(/mob/living/simple_animal/pet/cat, /obj/item/clothing/neck/petcollar, /obj/item/toy/cattoy, @@ -51,7 +48,6 @@ name = "Chicken Crate" desc = "The chicken goes bwaak!" cost = CARGO_CRATE_VALUE * 4 - access_view = ACCESS_KITCHEN contains = list(/mob/living/basic/chick) crate_name = "chicken crate" @@ -60,7 +56,6 @@ desc = "Considered the optimal dog breed by thousands of research scientists, this Corgi is but \ one dog from the millions of Ian's noble bloodline. Comes with a cute collar!" cost = CARGO_CRATE_VALUE * 10 - access_view = ACCESS_HOP contains = list(/mob/living/basic/pet/dog/corgi, /obj/item/clothing/neck/petcollar, ) @@ -78,7 +73,6 @@ name = "Cow Crate" desc = "The cow goes moo! Contains one cow." cost = CARGO_CRATE_VALUE * 6 - access_view = ACCESS_HYDROPONICS contains = list(/mob/living/basic/cow) crate_name = "cow crate" @@ -86,7 +80,6 @@ name = "Sheep Crate" desc = "The sheep goes BAAAA! Contains one sheep." cost = CARGO_CRATE_VALUE * 6 - access_view = ACCESS_HYDROPONICS contains = list(/mob/living/basic/sheep) crate_name = "sheep crate" @@ -94,7 +87,6 @@ name = "Pig Crate" desc = "The pig goes oink! Contains one pig." cost = CARGO_CRATE_VALUE * 6 - access_view = ACCESS_KITCHEN contains = list(/mob/living/basic/pig) crate_name = "pig crate" @@ -102,7 +94,6 @@ name = "Pony Crate" desc = "Ponies, yay! (Just the one.)" cost = CARGO_CRATE_VALUE * 6 - access_view = ACCESS_SERVICE contains = list(/mob/living/basic/pony) crate_name = "pony crate" @@ -116,7 +107,6 @@ EEEEEEEEEEEEEEEEEEEEEEEEE EEEETTTTTTTTTTTTAAAAAAAAA AAAHHHHHHHHHHHHH. CRAB ROCKET. CRAAAB \ ROCKEEEEEEEEEGGGGHHHHTT CRAB CRAB CRAABROCKET CRAB ROCKEEEET."//fun fact: i actually spent like 10 minutes and transcribed the entire video. cost = CARGO_CRATE_VALUE * 8 - access_view = ACCESS_HOS contains = list(/mob/living/basic/crab) crate_name = "look sir free crabs" drop_pod_only = TRUE @@ -140,7 +130,6 @@ name = "Fox Crate" desc = "The fox goes...? Contains one fox. Comes with a collar!"//what does the fox say cost = CARGO_CRATE_VALUE * 10 - access_view = ACCESS_CAPTAIN contains = list( /mob/living/basic/pet/fox, /obj/item/clothing/neck/petcollar, @@ -151,7 +140,6 @@ name = "Goat Crate" desc = "The goat goes baa! Contains one goat. Warranty void if used as a replacement for Pete." cost = CARGO_CRATE_VALUE * 5 - access_view = ACCESS_KITCHEN contains = list(/mob/living/simple_animal/hostile/retaliate/goat) crate_name = "goat crate" @@ -202,7 +190,6 @@ desc = "Tired of these MOTHER FUCKING snakes on this MOTHER FUCKING space station? \ Then this isn't the crate for you. Contains three venomous snakes." cost = CARGO_CRATE_VALUE * 6 - access_view = ACCESS_SECURITY contains = list(/mob/living/simple_animal/hostile/retaliate/snake = 3) crate_name = "snake crate" @@ -221,7 +208,6 @@ name = "Lizard Crate" desc = "Hisss! Containssss a friendly lizard. Not to be confusssed with a lizardperssson." cost = CARGO_CRATE_VALUE * 4 - access_view = ACCESS_JANITOR contains = list(/mob/living/basic/lizard) crate_name = "lizard crate" diff --git a/code/modules/client/client_colour.dm b/code/modules/client/client_colour.dm index 26ab9e850b6..444b4d7ec12 100644 --- a/code/modules/client/client_colour.dm +++ b/code/modules/client/client_colour.dm @@ -16,8 +16,8 @@ * Define subtypes of this datum */ /datum/client_colour - ///Any client.color-valid value - var/colour = "" + ///The color we want to give to the client. This has to be either a hexadecimal color or a color matrix. + var/colour ///The mob that owns this client_colour. var/mob/owner /** @@ -32,8 +32,8 @@ ///Same as above, but on removal. var/fade_out = 0 -/datum/client_colour/New(mob/_owner) - owner = _owner +/datum/client_colour/New(mob/owner) + src.owner = owner /datum/client_colour/Destroy() if(!QDELETED(owner)) @@ -150,7 +150,6 @@ /datum/client_colour/glass_colour priority = PRIORITY_LOW - colour = "red" /datum/client_colour/glass_colour/green colour = "#aaffaa" @@ -209,9 +208,10 @@ colour = list(0,0,0,0,0,0,0,0,0,1,0,0) //pure red. fade_out = 10 -/datum/client_colour/bloodlust/New(mob/_owner) +/datum/client_colour/bloodlust/New(mob/owner) ..() - addtimer(CALLBACK(src, PROC_REF(update_colour), list(1,0,0,0.8,0.2,0, 0.8,0,0.2,0.1,0,0), 10, SINE_EASING|EASE_OUT), 1) + if(owner) + addtimer(CALLBACK(src, PROC_REF(update_colour), list(1,0,0,0.8,0.2,0, 0.8,0,0.2,0.1,0,0), 10, SINE_EASING|EASE_OUT), 1) /datum/client_colour/rave priority = PRIORITY_LOW diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index c2bc7dc4964..407b60074b1 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -1,8 +1,6 @@ //////////// //SECURITY// //////////// -#define UPLOAD_LIMIT 524288 //Restricts client uploads to the server to 0.5MB -#define UPLOAD_LIMIT_ADMIN 5550000 //Restricts admin client uploads to the server to 2.5MB //SKYRAT EDIT CHANGE - CHANGED TO 5.55 MB GLOBAL_LIST_INIT(blacklisted_builds, list( "1407" = "bug preventing client display overrides from working leads to clients being able to see things/mobs they shouldn't be able to see", @@ -207,12 +205,14 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( //This stops files larger than UPLOAD_LIMIT being sent from client to server via input(), client.Import() etc. /client/AllowUpload(filename, filelength) + var/client_max_file_size = CONFIG_GET(number/upload_limit) if (holder) - if(filelength > UPLOAD_LIMIT_ADMIN) - to_chat(src, "Error: AllowUpload(): File Upload too large. Upload Limit: [UPLOAD_LIMIT_ADMIN/1024]KiB.") + var/admin_max_file_size = CONFIG_GET(number/upload_limit_admin) + if(filelength > admin_max_file_size) + to_chat(src, span_warning("Error: AllowUpload(): File Upload too large. Upload Limit: [admin_max_file_size/1024]KiB.")) return FALSE - else if(filelength > UPLOAD_LIMIT) - to_chat(src, "Error: AllowUpload(): File Upload too large. Upload Limit: [UPLOAD_LIMIT/1024]KiB.") + else if(filelength > client_max_file_size) + to_chat(src, span_warning("Error: AllowUpload(): File Upload too large. Upload Limit: [client_max_file_size/1024]KiB.")) return FALSE return TRUE @@ -944,8 +944,6 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( add_verb(src, /client/proc/export_preferences) -#undef UPLOAD_LIMIT - //checks if a client is afk //3000 frames = 5 minutes /client/proc/is_afk(duration = CONFIG_GET(number/inactivity_period)) @@ -1070,7 +1068,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( void.UpdateGreed(actualview[1],actualview[2]) /client/proc/AnnouncePR(announcement) - if(prefs && prefs.chat_toggles & CHAT_PULLR) + if(get_chat_toggles(src) & CHAT_PULLR) to_chat(src, announcement) ///Redirect proc that makes it easier to call the unlock achievement proc. Achievement type is the typepath to the award, user is the mob getting the award, and value is an optional variable used for leaderboard value increments @@ -1271,4 +1269,3 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( #undef LIMITER_SIZE #undef MINUTE_COUNT #undef SECOND_COUNT -#undef UPLOAD_LIMIT_ADMIN diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index b92f87df512..5c64155056e 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -539,6 +539,55 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(GetQuirkBalance() < 0) all_quirks = list() +/** + * Safely read a given preference datum from a given client. + * + * Reads the given preference datum from the given client, and guards against null client and null prefs. + * The client object is fickle and can go null at times, so use this instead of read_preference() if you + * want to ensure no runtimes. + * + * returns client.prefs.read_preference(prefs_to_read) or FALSE if something went wrong. + * + * Arguments: + * * client/prefs_holder - the client to read the pref from + * * datum/preference/pref_to_read - the type of preference datum to read. + */ +/proc/safe_read_pref(client/prefs_holder, datum/preference/pref_to_read) + if(!prefs_holder) + return FALSE + if(prefs_holder && !prefs_holder?.prefs) + stack_trace("[prefs_holder?.mob] ([prefs_holder?.ckey]) had null prefs, which shouldn't be possible!") + return FALSE + + return prefs_holder?.prefs.read_preference(pref_to_read) + +/** + * Get the given client's chat toggle prefs. + * + * Getter function for prefs.chat_toggles which guards against null client and null prefs. + * The client object is fickle and can go null at times, so use this instead of directly accessing the var + * if you want to ensure no runtimes. + * + * returns client.prefs.chat_toggles or FALSE if something went wrong. + * + * Arguments: + * * client/prefs_holder - the client to get the chat_toggles pref from. + */ +/proc/get_chat_toggles(client/target) + if(ismob(target)) + var/mob/target_mob = target + target = target_mob.client + + if(isnull(target)) + return NONE + + var/datum/preferences/preferences = target.prefs + if(isnull(preferences)) + stack_trace("[key_name(target)] preference datum was null") + return NONE + + return preferences.chat_toggles + /// Sanitizes the preferences, applies the randomization prefs, and then applies the preference to the human mob. /datum/preferences/proc/safe_transfer_prefs_to(mob/living/carbon/human/character, icon_updates = TRUE, is_antag = FALSE) apply_character_randomization_prefs(is_antag) diff --git a/code/modules/client/preferences/README.md b/code/modules/client/preferences/README.md index 9df77515e51..00899536398 100644 --- a/code/modules/client/preferences/README.md +++ b/code/modules/client/preferences/README.md @@ -135,14 +135,18 @@ Choiced preferences can generate icons. This is how the clothing/species prefere savefile_key = "favorite_drink" should_generate_icons = TRUE // NEW! This is necessary. -// Instead of returning a flat list, this now returns an assoc list -// of values to icons. /datum/preference/choiced/favorite_drink/init_possible_values() - return list( - "Milk" = icon('drinks.dmi', "milk"), - "Cola" = icon('drinks.dmi', "cola"), - "Water" = icon('drinks.dmi', "water"), - ) + return list("Milk", "Cola", "Water") + +// New! This proc will get called for every value. +/datum/preference/choiced/favorite_drink/icon_for(value) + switch (value) + if ("Milk") + return icon('drinks.dmi', "milk") + if ("Cola") + return icon('drinks.dmi', "cola") + if ("Water") + return icon('drinks.dmi', "water") ``` Then, change your `.tsx` file to look like: diff --git a/code/modules/client/preferences/_preference.dm b/code/modules/client/preferences/_preference.dm index e43f852a267..8d2d52ae0d1 100644 --- a/code/modules/client/preferences/_preference.dm +++ b/code/modules/client/preferences/_preference.dm @@ -347,9 +347,8 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key()) /// A preference that is a choice of one option among a fixed set. /// Used for preferences such as clothing. /datum/preference/choiced - /// If this is TRUE, icons will be generated. - /// This is necessary for if your `init_possible_values()` override - /// returns an assoc list of names to atoms/icons. + /// If this is TRUE, an icon will be generated for every value. + /// If you implement this, you must implement `icon_for(value)` for every possible value. var/should_generate_icons = FALSE var/list/cached_values @@ -376,34 +375,31 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key()) return cached_values /// Returns a list of every possible value, serialized. -/// Return value can be in the form of: -/// - A flat list of serialized values, such as list(MALE, FEMALE, PLURAL). -/// - An assoc list of serialized values to atoms/icons. /datum/preference/choiced/proc/get_choices_serialized() // Override `init_values()` instead. SHOULD_NOT_OVERRIDE(TRUE) var/list/serialized_choices = list() - var/choices = get_choices() - if (should_generate_icons) - for (var/choice in choices) - serialized_choices[serialize(choice)] = choices[choice] - else - for (var/choice in choices) - serialized_choices += serialize(choice) + for (var/choice in get_choices()) + serialized_choices += serialize(choice) return serialized_choices /// Returns a list of every possible value. /// This must be overriden by `/datum/preference/choiced` subtypes. -/// Return value can be in the form of: -/// - A flat list of raw values, such as list(MALE, FEMALE, PLURAL). -/// - An assoc list of raw values to atoms/icons, in which case -/// icons will be generated. +/// If `should_generate_icons` is TRUE, then you will also need to implement `icon_for(value)` +/// for every possible value. /datum/preference/choiced/proc/init_possible_values() CRASH("`init_possible_values()` was not implemented for [type]!") +/// When `should_generate_icons` is TRUE, this proc is called for every value. +/// It can return either an icon or a typepath to an atom to create. +/datum/preference/choiced/proc/icon_for(value) + SHOULD_CALL_PARENT(FALSE) + SHOULD_NOT_SLEEP(TRUE) + CRASH("`icon_for()` was not implemented for [type], even though should_generate_icons = TRUE!") + /datum/preference/choiced/is_valid(value) return value in get_choices() @@ -453,51 +449,6 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key()) /datum/preference/color/is_valid(value) return findtext(value, GLOB.is_color) -/// Takes an assoc list of names to /datum/sprite_accessory and returns a value -/// fit for `/datum/preference/init_possible_values()` -/proc/possible_values_for_sprite_accessory_list(list/datum/sprite_accessory/sprite_accessories) - var/list/possible_values = list() - for (var/name in sprite_accessories) - var/datum/sprite_accessory/sprite_accessory = sprite_accessories[name] - if (istype(sprite_accessory)) - possible_values[name] = icon(sprite_accessory.icon, sprite_accessory.icon_state) - else - // This means it didn't have an icon state - possible_values[name] = icon('icons/mob/landmarks.dmi', "x") - return possible_values - -/// Takes an assoc list of names to /datum/sprite_accessory and returns a value -/// fit for `/datum/preference/init_possible_values()` -/// Different from `possible_values_for_sprite_accessory_list` in that it takes a list of layers -/// such as BEHIND, FRONT, and ADJ. -/// It also takes a "body part name", such as body_markings, moth_wings, etc -/// They are expected to be in order from lowest to top. -/proc/possible_values_for_sprite_accessory_list_for_body_part( - list/datum/sprite_accessory/sprite_accessories, - body_part, - list/layers, -) - var/list/possible_values = list() - - for (var/name in sprite_accessories) - var/datum/sprite_accessory/sprite_accessory = sprite_accessories[name] - if(sprite_accessory.locked) - continue - - var/icon/final_icon - - for (var/layer in layers) - var/icon/icon = icon(sprite_accessory.icon, "m_[body_part]_[sprite_accessory.icon_state]_[layer]") - - if (isnull(final_icon)) - final_icon = icon - else - final_icon.Blend(icon, ICON_OVERLAY) - - possible_values[name] = final_icon - - return possible_values - /// A numeric preference with a minimum and maximum value /datum/preference/numeric /// The minimum value diff --git a/code/modules/client/preferences/ai_core_display.dm b/code/modules/client/preferences/ai_core_display.dm index 1abbc586a1a..924b475961e 100644 --- a/code/modules/client/preferences/ai_core_display.dm +++ b/code/modules/client/preferences/ai_core_display.dm @@ -6,14 +6,13 @@ should_generate_icons = TRUE /datum/preference/choiced/ai_core_display/init_possible_values() - var/list/values = list() + return GLOB.ai_core_display_screens - "Portrait" - values["Random"] = icon('icons/mob/silicon/ai.dmi', "questionmark") - - for (var/screen in GLOB.ai_core_display_screens - "Portrait" - "Random") - values[screen] = icon('icons/mob/silicon/ai.dmi', resolve_ai_icon_sync(screen)) - - return values +/datum/preference/choiced/ai_core_display/icon_for(value) + if (value == "Random") + return icon('icons/mob/silicon/ai.dmi', "questionmark") + else + return icon('icons/mob/silicon/ai.dmi', resolve_ai_icon_sync(value)) /datum/preference/choiced/ai_core_display/is_accessible(datum/preferences/preferences) if (!..(preferences)) diff --git a/code/modules/client/preferences/ai_emote_display.dm b/code/modules/client/preferences/ai_emote_display.dm index 31e59433fec..eea059c8fe9 100644 --- a/code/modules/client/preferences/ai_emote_display.dm +++ b/code/modules/client/preferences/ai_emote_display.dm @@ -6,15 +6,13 @@ should_generate_icons = TRUE /datum/preference/choiced/ai_emote_display/init_possible_values() - var/list/values = list() + return assoc_to_keys(GLOB.ai_status_display_emotes) - values["Random"] = icon('icons/mob/silicon/ai.dmi', "questionmark") - - for(var/emote in GLOB.ai_status_display_emotes) - var/emote_icon = GLOB.ai_status_display_emotes[emote] - values[emote] = icon('icons/obj/machines/status_display.dmi', emote_icon) - - return values +/datum/preference/choiced/ai_emote_display/icon_for(value) + if (value == "Random") + return icon('icons/mob/silicon/ai.dmi', "questionmark") + else + return icon('icons/obj/machines/status_display.dmi', GLOB.ai_status_display_emotes[value]) /datum/preference/choiced/ai_emote_display/is_accessible(datum/preferences/preferences) if (!..(preferences)) diff --git a/code/modules/client/preferences/ai_hologram_display.dm b/code/modules/client/preferences/ai_hologram_display.dm index fdf49aecb2b..e71f806c3e4 100644 --- a/code/modules/client/preferences/ai_hologram_display.dm +++ b/code/modules/client/preferences/ai_hologram_display.dm @@ -6,14 +6,13 @@ should_generate_icons = TRUE /datum/preference/choiced/ai_hologram_display/init_possible_values() - var/list/values = list() + return assoc_to_keys(GLOB.ai_hologram_icons) + "Random" - values["Random"] = icon('icons/mob/silicon/ai.dmi', "questionmark") - - for(var/hologram in GLOB.ai_hologram_icons - "Random") - values[hologram] = icon(GLOB.ai_hologram_icons[hologram], GLOB.ai_hologram_icon_state[hologram]) - - return values +/datum/preference/choiced/ai_hologram_display/icon_for(value) + if (value == "Random") + return icon('icons/mob/silicon/ai.dmi', "questionmark") + else + return icon(GLOB.ai_hologram_icons[value], GLOB.ai_hologram_icon_state[value]) /datum/preference/choiced/ai_hologram_display/is_accessible(datum/preferences/preferences) if (!..(preferences)) diff --git a/code/modules/client/preferences/assets.dm b/code/modules/client/preferences/assets.dm index fbd4d0698ca..6fa29b9f90f 100644 --- a/code/modules/client/preferences/assets.dm +++ b/code/modules/client/preferences/assets.dm @@ -15,9 +15,8 @@ if (!preference.should_generate_icons) continue - var/list/choices = preference.get_choices_serialized() - for (var/preference_value in choices) - var/create_icon_of = choices[preference_value] + for (var/preference_value in preference.get_choices()) + var/create_icon_of = preference.icon_for(preference_value) var/icon/icon var/icon_state @@ -31,8 +30,8 @@ else CRASH("[create_icon_of] is an invalid preference value (from [preference_key]:[preference_value]).") - to_insert[preference.get_spritesheet_key(preference_value)] = list(icon, icon_state) - + to_insert[preference.get_spritesheet_key(preference.serialize(preference_value))] = list(icon, icon_state) + for (var/spritesheet_key in to_insert) var/list/inserting = to_insert[spritesheet_key] Insert(spritesheet_key, inserting[1], inserting[2]) diff --git a/code/modules/client/preferences/clothing.dm b/code/modules/client/preferences/clothing.dm index fae46b31be9..827b91c49c2 100644 --- a/code/modules/client/preferences/clothing.dm +++ b/code/modules/client/preferences/clothing.dm @@ -1,28 +1,16 @@ -/proc/generate_values_for_underwear(list/accessory_list, list/icons, color, icon_offset) //SKYRAT EDIT CHANGE - Colorable Undershirt/Socks - var/icon/lower_half = icon('icons/blanks/32x32.dmi', "nothing") +/proc/generate_underwear_icon(datum/sprite_accessory/accessory, icon/base_icon, color, icon_offset = 0) //SKYRAT EDIT CHANGE : adds icon_offset - Colorable Undershirt/Socks + var/icon/final_icon = new(base_icon) - for (var/icon in icons) - lower_half.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', icon), ICON_OVERLAY) + if (!isnull(accessory)) + var/icon/accessory_icon = icon(accessory.icon, accessory.icon_state) // SKYRAT EDIT CHANGE: ORIGINAL - var/icon/accessory_icon = icon('icons/mob/clothing/underwear.dmi', accessory.icon_state) + if (color && !accessory.use_static) + accessory_icon.Blend(color, ICON_MULTIPLY) + final_icon.Blend(accessory_icon, ICON_OVERLAY) - var/list/values = list() + final_icon.Crop(10, 1+icon_offset, 22, 13+icon_offset) //SKYRAT EDIT CHANGE : adds icon_offset - Colorable Undershirt/Socks + final_icon.Scale(32, 32) - for (var/accessory_name in accessory_list) - var/icon/icon_with_socks = new(lower_half) - var/datum/sprite_accessory/accessory = accessory_list[accessory_name] - //SKYRAT EDIT CHANGE - if (accessory_name != "Nude" && accessory) - var/icon/accessory_icon = icon(accessory.icon, accessory.icon_state) - //SKYRAT EDIT CHANGE END - if (color && !accessory.use_static) - accessory_icon.Blend(color, ICON_MULTIPLY) - icon_with_socks.Blend(accessory_icon, ICON_OVERLAY) - icon_with_socks.Crop(10, 1+icon_offset, 22, 13+icon_offset) //SKYRAT EDIT CHANGE - Colorable Undershirt/Socks - - icon_with_socks.Scale(32, 32) - - values[accessory_name] = icon_with_socks - - return values + return final_icon /// Backpack preference /datum/preference/choiced/backpack @@ -33,22 +21,43 @@ should_generate_icons = TRUE /datum/preference/choiced/backpack/init_possible_values() - var/list/values = list() + return list( + GBACKPACK, + GSATCHEL, + LSATCHEL, + GDUFFELBAG, + GMESSENGER, + DBACKPACK, + DSATCHEL, + DDUFFELBAG, + DMESSENGER, + ) - values[GBACKPACK] = /obj/item/storage/backpack - values[GSATCHEL] = /obj/item/storage/backpack/satchel - values[LSATCHEL] = /obj/item/storage/backpack/satchel/leather - values[GDUFFELBAG] = /obj/item/storage/backpack/duffelbag +/datum/preference/choiced/backpack/icon_for(value) + switch (value) + if (GBACKPACK) + return /obj/item/storage/backpack + if (GSATCHEL) + return /obj/item/storage/backpack/satchel + if (LSATCHEL) + return /obj/item/storage/backpack/satchel/leather + if (GDUFFELBAG) + return /obj/item/storage/backpack/duffelbag + if (GMESSENGER) + return /obj/item/storage/backpack/messenger - // In a perfect world, these would be your department's backpack. - // However, this doesn't factor in assistants, or no high slot, and would - // also increase the spritesheet size a lot. - // I play medical doctor, and so medical doctor you get. - values[DBACKPACK] = /obj/item/storage/backpack/medic - values[DSATCHEL] = /obj/item/storage/backpack/satchel/med - values[DDUFFELBAG] = /obj/item/storage/backpack/duffelbag/med - - return values + // In a perfect world, these would be your department's backpack. + // However, this doesn't factor in assistants, or no high slot, and would + // also increase the spritesheet size a lot. + // I play medical doctor, and so medical doctor you get. + if (DBACKPACK) + return /obj/item/storage/backpack/medic + if (DSATCHEL) + return /obj/item/storage/backpack/satchel/med + if (DDUFFELBAG) + return /obj/item/storage/backpack/duffelbag/med + if (DMESSENGER) + return /obj/item/storage/backpack/messenger/med /datum/preference/choiced/backpack/apply_to_human(mob/living/carbon/human/target, value) target.backpack = value @@ -62,12 +71,17 @@ should_generate_icons = TRUE /datum/preference/choiced/jumpsuit/init_possible_values() - var/list/values = list() + return list( + PREF_SUIT, + PREF_SKIRT, + ) - values[PREF_SUIT] = /obj/item/clothing/under/color/grey - values[PREF_SKIRT] = /obj/item/clothing/under/color/jumpskirt/grey - - return values +/datum/preference/choiced/jumpsuit/icon_for(value) + switch (value) + if (PREF_SUIT) + return /obj/item/clothing/under/color/grey + if (PREF_SKIRT) + return /obj/item/clothing/under/color/jumpskirt/grey /datum/preference/choiced/jumpsuit/apply_to_human(mob/living/carbon/human/target, value) target.jumpsuit_style = value @@ -81,7 +95,17 @@ should_generate_icons = TRUE /datum/preference/choiced/socks/init_possible_values() - return generate_values_for_underwear(GLOB.socks_list, list("human_r_leg", "human_l_leg")) + return assoc_to_keys_features(GLOB.socks_list) + +/datum/preference/choiced/socks/icon_for(value) + var/static/icon/lower_half + + if (isnull(lower_half)) + lower_half = icon('icons/blanks/32x32.dmi', "nothing") + lower_half.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_leg"), ICON_OVERLAY) + lower_half.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_leg"), ICON_OVERLAY) + + return generate_underwear_icon(GLOB.socks_list[value], lower_half) /datum/preference/choiced/socks/apply_to_human(mob/living/carbon/human/target, value) target.socks = value @@ -95,28 +119,28 @@ should_generate_icons = TRUE /datum/preference/choiced/undershirt/init_possible_values() - var/icon/body = icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_leg") - body.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_leg"), ICON_OVERLAY) - body.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_arm"), ICON_OVERLAY) - body.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_arm"), ICON_OVERLAY) - body.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_hand"), ICON_OVERLAY) - body.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_hand"), ICON_OVERLAY) - body.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_chest_m"), ICON_OVERLAY) + return assoc_to_keys_features(GLOB.undershirt_list) - var/list/values = list() +/datum/preference/choiced/undershirt/icon_for(value) + var/static/icon/body + if (isnull(body)) + body = icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_leg") + body.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_leg"), ICON_OVERLAY) + body.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_arm"), ICON_OVERLAY) + body.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_arm"), ICON_OVERLAY) + body.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_hand"), ICON_OVERLAY) + body.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_hand"), ICON_OVERLAY) + body.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_chest_m"), ICON_OVERLAY) - for (var/accessory_name in GLOB.undershirt_list) - var/icon/icon_with_undershirt = icon(body) + var/icon/icon_with_undershirt = icon(body) - if (accessory_name != "Nude") - var/datum/sprite_accessory/accessory = GLOB.undershirt_list[accessory_name] - icon_with_undershirt.Blend(icon('icons/mob/clothing/underwear.dmi', accessory.icon_state), ICON_OVERLAY) + if (value != "Nude") + var/datum/sprite_accessory/accessory = GLOB.undershirt_list[value] + icon_with_undershirt.Blend(icon(accessory.icon, accessory.icon_state), ICON_OVERLAY) // SKYRAT EDIT CHANGE: ORIGINAL - icon_with_undershirt.Blend(icon('icons/mob/clothing/underwear.dmi', accessory.icon_state), ICON_OVERLAY) - icon_with_undershirt.Crop(9, 9, 23, 23) - icon_with_undershirt.Scale(32, 32) - values[accessory_name] = icon_with_undershirt - - return values + icon_with_undershirt.Crop(10, 11, 22, 23) // SKYRAT EDIT CHANGE : ORIGINAL - icon_with_undershirt.Crop(9, 9, 23, 23) + icon_with_undershirt.Scale(32, 32) + return icon_with_undershirt /datum/preference/choiced/undershirt/apply_to_human(mob/living/carbon/human/target, value) target.undershirt = value @@ -130,7 +154,18 @@ should_generate_icons = TRUE /datum/preference/choiced/underwear/init_possible_values() - return generate_values_for_underwear(GLOB.underwear_list, list("human_chest_m", "human_r_leg", "human_l_leg"), COLOR_ALMOST_BLACK) + return assoc_to_keys_features(GLOB.underwear_list) + +/datum/preference/choiced/underwear/icon_for(value) + var/static/icon/lower_half + + if (isnull(lower_half)) + lower_half = icon('icons/blanks/32x32.dmi', "nothing") + lower_half.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_chest_m"), ICON_OVERLAY) + lower_half.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_leg"), ICON_OVERLAY) + lower_half.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_leg"), ICON_OVERLAY) + + return generate_underwear_icon(GLOB.underwear_list[value], lower_half, COLOR_ALMOST_BLACK, icon_offset = 5) // SKYRAT EDIT CHANGE : ICON_OFFSET /datum/preference/choiced/underwear/apply_to_human(mob/living/carbon/human/target, value) target.underwear = value diff --git a/code/modules/client/preferences/ghost.dm b/code/modules/client/preferences/ghost.dm index ae84249507d..e3d7fbf6328 100644 --- a/code/modules/client/preferences/ghost.dm +++ b/code/modules/client/preferences/ghost.dm @@ -71,12 +71,10 @@ ) /datum/preference/choiced/ghost_form/init_possible_values() - var/list/values = list() + return assoc_to_keys(ghost_forms) - for (var/ghost_form in ghost_forms) - values[ghost_form] = icon('icons/mob/simple/mob.dmi', ghost_form) - - return values +/datum/preference/choiced/ghost_form/icon_for(value) + return icon('icons/mob/simple/mob.dmi', value) /datum/preference/choiced/ghost_form/create_default_value() return "ghost" diff --git a/code/modules/client/preferences/glasses.dm b/code/modules/client/preferences/glasses.dm index 6e93c98fd37..e34cdd0e090 100644 --- a/code/modules/client/preferences/glasses.dm +++ b/code/modules/client/preferences/glasses.dm @@ -5,14 +5,13 @@ should_generate_icons = TRUE /datum/preference/choiced/glasses/init_possible_values() - var/list/values = list() + return assoc_to_keys(GLOB.nearsighted_glasses) + "Random" - values["Random"] = icon('icons/effects/random_spawners.dmi', "questionmark") - - for(var/glass_design in GLOB.nearsighted_glasses - "Random") - values[glass_design] = icon('icons/obj/clothing/glasses.dmi', "glasses_[lowertext(glass_design)]") - - return values +/datum/preference/choiced/glasses/icon_for(value) + if (value == "Random") + return icon('icons/effects/random_spawners.dmi', "questionmark") + else + return icon('icons/obj/clothing/glasses.dmi', "glasses_[lowertext(value)]") /datum/preference/choiced/glasses/is_accessible(datum/preferences/preferences) if (!..(preferences)) diff --git a/code/modules/client/preferences/middleware/jobs.dm b/code/modules/client/preferences/middleware/jobs.dm index 581a1f35b8b..d61fb53c98f 100644 --- a/code/modules/client/preferences/middleware/jobs.dm +++ b/code/modules/client/preferences/middleware/jobs.dm @@ -99,7 +99,7 @@ /datum/preference_middleware/jobs/get_ui_static_data(mob/user) var/list/data = list() // SKYRAT EDIT - if(is_veteran_player(user.client)) + if(SSplayer_ranks.is_veteran(user.client)) data["is_veteran"] = TRUE // SKYRAT EDIT END var/list/required_job_playtime = get_required_job_playtime(user) diff --git a/code/modules/client/preferences/middleware/quirks.dm b/code/modules/client/preferences/middleware/quirks.dm index 22020129b1a..169650b61cf 100644 --- a/code/modules/client/preferences/middleware/quirks.dm +++ b/code/modules/client/preferences/middleware/quirks.dm @@ -44,7 +44,7 @@ return list( "max_positive_quirks" = MAX_QUIRKS, "quirk_info" = quirk_info, - "quirk_blacklist" = SSquirks.quirk_blacklist, + "quirk_blacklist" = GLOB.quirk_string_blacklist, "quirk_species_whitelist" = SSquirks.quirk_species_whitelist, //BUBBER EDIT - Species quirks ) @@ -57,7 +57,7 @@ //SKYRAT EDIT ADDITION var/list/quirks = SSquirks.get_quirks() var/datum/quirk/quirk = quirks[quirk_name] - if(initial(quirk.veteran_only) && !is_veteran_player(preferences?.parent)) + if(initial(quirk.veteran_only) && !SSplayer_ranks.is_veteran(preferences?.parent)) return FALSE //SKYRAT EDIT END @@ -97,7 +97,7 @@ //SKYRAT EDIT ADDITION var/list/quirks = SSquirks.get_quirks() var/datum/quirk/quirk_datum = quirks[quirk] - if(initial(quirk_datum.veteran_only) && !is_veteran_player(preferences?.parent)) + if(initial(quirk_datum.veteran_only) && !SSplayer_ranks.is_veteran(preferences?.parent)) preferences.all_quirks -= quirk continue //SKYRAT EDIT END diff --git a/code/modules/client/preferences/species_features/basic.dm b/code/modules/client/preferences/species_features/basic.dm index 5cf0fc5905f..faa86cc07e2 100644 --- a/code/modules/client/preferences/species_features/basic.dm +++ b/code/modules/client/preferences/species_features/basic.dm @@ -1,26 +1,24 @@ -/proc/generate_possible_values_for_sprite_accessories_on_head(accessories) - var/list/values = possible_values_for_sprite_accessory_list(accessories) +/proc/generate_icon_with_head_accessory(datum/sprite_accessory/sprite_accessory) + var/static/icon/head_icon + if (isnull(head_icon)) + head_icon = icon('icons/mob/human/bodyparts_greyscale.dmi', "human_head_m") + head_icon.Blend(skintone2hex("caucasian1"), ICON_MULTIPLY) - var/icon/head_icon = icon('icons/mob/human/bodyparts_greyscale.dmi', "human_head_m") - head_icon.Blend(skintone2hex("caucasian1"), ICON_MULTIPLY) + if (isnull(sprite_accessory)) + return head_icon - for (var/name in values) - var/datum/sprite_accessory/accessory = accessories[name] - if (accessory == null || accessory.icon_state == null) - continue + ASSERT(istype(sprite_accessory)) - var/icon/final_icon = new(head_icon) + var/icon/final_icon = new(head_icon) - var/icon/beard_icon = values[name] - beard_icon.Blend(COLOR_DARK_BROWN, ICON_MULTIPLY) - final_icon.Blend(beard_icon, ICON_OVERLAY) + var/icon/head_accessory_icon = icon(sprite_accessory.icon, sprite_accessory.icon_state) + head_accessory_icon.Blend(COLOR_DARK_BROWN, ICON_MULTIPLY) + final_icon.Blend(head_accessory_icon, ICON_OVERLAY) - final_icon.Crop(10, 19, 22, 31) - final_icon.Scale(32, 32) + final_icon.Crop(10, 19, 22, 31) + final_icon.Scale(32, 32) - values[name] = final_icon - - return values + return final_icon /datum/preference/color/eye_color priority = PREFERENCE_PRIORITY_BODYPARTS @@ -64,7 +62,10 @@ relevant_head_flag = HEAD_FACIAL_HAIR /datum/preference/choiced/facial_hairstyle/init_possible_values() - return generate_possible_values_for_sprite_accessories_on_head(GLOB.facial_hairstyles_list) + return assoc_to_keys_features(GLOB.facial_hairstyles_list) + +/datum/preference/choiced/facial_hairstyle/icon_for(value) + return generate_icon_with_head_accessory(GLOB.facial_hairstyles_list[value]) /datum/preference/choiced/facial_hairstyle/apply_to_human(mob/living/carbon/human/target, value) target.set_facial_hairstyle(value, update = FALSE) @@ -137,7 +138,10 @@ relevant_head_flag = HEAD_HAIR /datum/preference/choiced/hairstyle/init_possible_values() - return generate_possible_values_for_sprite_accessories_on_head(GLOB.hairstyles_list) + return assoc_to_keys_features(GLOB.hairstyles_list) + +/datum/preference/choiced/hairstyle/icon_for(value) + return generate_icon_with_head_accessory(GLOB.hairstyles_list[value]) /datum/preference/choiced/hairstyle/apply_to_human(mob/living/carbon/human/target, value) target.set_hairstyle(value, update = FALSE) diff --git a/code/modules/client/preferences/species_features/ethereal.dm b/code/modules/client/preferences/species_features/ethereal.dm index ba0f3d3a202..19c2fd650e1 100644 --- a/code/modules/client/preferences/species_features/ethereal.dm +++ b/code/modules/client/preferences/species_features/ethereal.dm @@ -6,28 +6,26 @@ should_generate_icons = TRUE /datum/preference/choiced/ethereal_color/init_possible_values() - var/list/values = list() + return assoc_to_keys(GLOB.color_list_ethereal) - var/icon/ethereal_base = icon('icons/mob/human/species/ethereal/bodyparts.dmi', "ethereal_head") - ethereal_base.Blend(icon('icons/mob/human/species/ethereal/bodyparts.dmi', "ethereal_chest"), ICON_OVERLAY) - ethereal_base.Blend(icon('icons/mob/human/species/ethereal/bodyparts.dmi', "ethereal_l_arm"), ICON_OVERLAY) - ethereal_base.Blend(icon('icons/mob/human/species/ethereal/bodyparts.dmi', "ethereal_r_arm"), ICON_OVERLAY) +/datum/preference/choiced/ethereal_color/icon_for(value) + var/static/icon/ethereal_base + if (isnull(ethereal_base)) + ethereal_base = icon('icons/mob/human/species/ethereal/bodyparts.dmi', "ethereal_head") + ethereal_base.Blend(icon('icons/mob/human/species/ethereal/bodyparts.dmi', "ethereal_chest"), ICON_OVERLAY) + ethereal_base.Blend(icon('icons/mob/human/species/ethereal/bodyparts.dmi', "ethereal_l_arm"), ICON_OVERLAY) + ethereal_base.Blend(icon('icons/mob/human/species/ethereal/bodyparts.dmi', "ethereal_r_arm"), ICON_OVERLAY) - var/icon/eyes = icon('icons/mob/human/human_face.dmi', "eyes") - eyes.Blend(COLOR_BLACK, ICON_MULTIPLY) - ethereal_base.Blend(eyes, ICON_OVERLAY) + var/icon/eyes = icon('icons/mob/human/human_face.dmi', "eyes") + eyes.Blend(COLOR_BLACK, ICON_MULTIPLY) + ethereal_base.Blend(eyes, ICON_OVERLAY) - ethereal_base.Scale(64, 64) - ethereal_base.Crop(15, 64, 15 + 31, 64 - 31) + ethereal_base.Scale(64, 64) + ethereal_base.Crop(15, 64, 15 + 31, 64 - 31) - for (var/name in GLOB.color_list_ethereal) - var/color = GLOB.color_list_ethereal[name] - - var/icon/icon = new(ethereal_base) - icon.Blend(color, ICON_MULTIPLY) - values[name] = icon - - return values + var/icon/icon = new(ethereal_base) + icon.Blend(GLOB.color_list_ethereal[value], ICON_MULTIPLY) + return icon /datum/preference/choiced/ethereal_color/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["ethcolor"] = GLOB.color_list_ethereal[value] diff --git a/code/modules/client/preferences/species_features/lizard.dm b/code/modules/client/preferences/species_features/lizard.dm index 9c0b6e36519..2e0b3f3e513 100644 --- a/code/modules/client/preferences/species_features/lizard.dm +++ b/code/modules/client/preferences/species_features/lizard.dm @@ -1,31 +1,28 @@ /* SKYRAT EDIT REMOVAL -/proc/generate_lizard_side_shots(list/sprite_accessories, key, include_snout = TRUE) - var/list/values = list() +/proc/generate_lizard_side_shot(datum/sprite_accessory/sprite_accessory, key, include_snout = TRUE) + var/static/icon/lizard + var/static/icon/lizard_with_snout - var/icon/lizard = icon('icons/mob/human/species/lizard/bodyparts.dmi', "lizard_head", EAST) - var/icon/eyes = icon('icons/mob/human/human_face.dmi', "eyes", EAST) - eyes.Blend(COLOR_GRAY, ICON_MULTIPLY) - lizard.Blend(eyes, ICON_OVERLAY) + if (isnull(lizard)) + lizard = icon('icons/mob/human/species/lizard/bodyparts.dmi', "lizard_head", EAST) + var/icon/eyes = icon('icons/mob/human/human_face.dmi', "eyes", EAST) + eyes.Blend(COLOR_GRAY, ICON_MULTIPLY) + lizard.Blend(eyes, ICON_OVERLAY) - if (include_snout) - lizard.Blend(icon('icons/mob/human/species/lizard/lizard_misc.dmi', "m_snout_round_ADJ", EAST), ICON_OVERLAY) + lizard_with_snout = icon(lizard) + lizard_with_snout.Blend(icon('icons/mob/human/species/lizard/lizard_misc.dmi', "m_snout_round_ADJ", EAST), ICON_OVERLAY) - for (var/name in sprite_accessories) - var/datum/sprite_accessory/sprite_accessory = sprite_accessories[name] + var/icon/final_icon = include_snout ? icon(lizard_with_snout) : icon(lizard) - var/icon/final_icon = icon(lizard) + if (!isnull(sprite_accessory)) + var/icon/accessory_icon = icon(sprite_accessory.icon, "m_[key]_[sprite_accessory.icon_state]_ADJ", EAST) + final_icon.Blend(accessory_icon, ICON_OVERLAY) - if (sprite_accessory.icon_state != "none") - var/icon/accessory_icon = icon(sprite_accessory.icon, "m_[key]_[sprite_accessory.icon_state]_ADJ", EAST) - final_icon.Blend(accessory_icon, ICON_OVERLAY) + final_icon.Crop(11, 20, 23, 32) + final_icon.Scale(32, 32) + final_icon.Blend(COLOR_VIBRANT_LIME, ICON_MULTIPLY) - final_icon.Crop(11, 20, 23, 32) - final_icon.Scale(32, 32) - final_icon.Blend(COLOR_VIBRANT_LIME, ICON_MULTIPLY) - - values[name] = final_icon - - return values + return final_icon /datum/preference/choiced/lizard_body_markings savefile_key = "feature_lizard_body_markings" @@ -36,31 +33,27 @@ relevant_mutant_bodypart = "body_markings" /datum/preference/choiced/lizard_body_markings/init_possible_values() - var/list/values = list() + return assoc_to_keys_features(GLOB.body_markings_list) - var/icon/lizard = icon('icons/mob/human/species/lizard/bodyparts.dmi', "lizard_chest_m") +/datum/preference/choiced/lizard_body_markings/icon_for(value) + var/datum/sprite_accessory/sprite_accessory = GLOB.body_markings_list[value] - for (var/name in GLOB.body_markings_list) - var/datum/sprite_accessory/sprite_accessory = GLOB.body_markings_list[name] + var/icon/final_icon = icon('icons/mob/human/species/lizard/bodyparts.dmi', "lizard_chest_m") - var/icon/final_icon = icon(lizard) + if (sprite_accessory.icon_state != "none") + var/icon/body_markings_icon = icon( + 'icons/mob/human/species/lizard/lizard_misc.dmi', + "m_body_markings_[sprite_accessory.icon_state]_ADJ", + ) - if (sprite_accessory.icon_state != "none") - var/icon/body_markings_icon = icon( - 'icons/mob/human/species/lizard/lizard_misc.dmi', - "m_body_markings_[sprite_accessory.icon_state]_ADJ", - ) + final_icon.Blend(body_markings_icon, ICON_OVERLAY) - final_icon.Blend(body_markings_icon, ICON_OVERLAY) + final_icon.Blend(COLOR_VIBRANT_LIME, ICON_MULTIPLY) + final_icon.Crop(10, 8, 22, 23) + final_icon.Scale(26, 32) + final_icon.Crop(-2, 1, 29, 32) - final_icon.Blend(COLOR_VIBRANT_LIME, ICON_MULTIPLY) - final_icon.Crop(10, 8, 22, 23) - final_icon.Scale(26, 32) - final_icon.Crop(-2, 1, 29, 32) - - values[name] = final_icon - - return values + return final_icon /datum/preference/choiced/lizard_body_markings/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["body_markings"] = value @@ -73,7 +66,10 @@ should_generate_icons = TRUE /datum/preference/choiced/lizard_frills/init_possible_values() - return generate_lizard_side_shots(GLOB.frills_list, "frills") + return assoc_to_keys_features(GLOB.frills_list) + +/datum/preference/choiced/lizard_frills/icon_for(value) + return generate_lizard_side_shot(GLOB.frills_list[value], "frills") /datum/preference/choiced/lizard_frills/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["frills"] = value @@ -86,7 +82,10 @@ should_generate_icons = TRUE /datum/preference/choiced/lizard_horns/init_possible_values() - return generate_lizard_side_shots(GLOB.horns_list, "horns") + return assoc_to_keys_features(GLOB.horns_list) + +/datum/preference/choiced/lizard_horns/icon_for(value) + return generate_lizard_side_shot(GLOB.horns_list[value], "horns") /datum/preference/choiced/lizard_horns/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["horns"] = value @@ -111,7 +110,10 @@ should_generate_icons = TRUE /datum/preference/choiced/lizard_snout/init_possible_values() - return generate_lizard_side_shots(GLOB.snouts_list, "snout", include_snout = FALSE) + return assoc_to_keys_features(GLOB.snouts_list) + +/datum/preference/choiced/lizard_snout/icon_for(value) + return generate_lizard_side_shot(GLOB.snouts_list[value], "snout", include_snout = FALSE) /datum/preference/choiced/lizard_snout/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["snout"] = value diff --git a/code/modules/client/preferences/species_features/moth.dm b/code/modules/client/preferences/species_features/moth.dm index ba80ad56b1d..2879cfb8788 100644 --- a/code/modules/client/preferences/species_features/moth.dm +++ b/code/modules/client/preferences/species_features/moth.dm @@ -7,24 +7,24 @@ should_generate_icons = TRUE /datum/preference/choiced/moth_antennae/init_possible_values() - var/list/values = list() + return assoc_to_keys_features(GLOB.moth_antennae_list) - var/icon/moth_head = icon('icons/mob/human/species/moth/bodyparts.dmi', "moth_head") - moth_head.Blend(icon('icons/mob/human/human_face.dmi', "motheyes"), ICON_OVERLAY) +/datum/preference/choiced/moth_antennae/icon_for(value) + var/static/icon/moth_head - for (var/antennae_name in GLOB.moth_antennae_list) - var/datum/sprite_accessory/antennae = GLOB.moth_antennae_list[antennae_name] - if(antennae.locked) - continue + if (isnull(moth_head)) + moth_head = icon('icons/mob/human/species/moth/bodyparts.dmi', "moth_head") + moth_head.Blend(icon('icons/mob/human/human_face.dmi', "motheyes_l"), ICON_OVERLAY) + moth_head.Blend(icon('icons/mob/human/human_face.dmi', "motheyes_r"), ICON_OVERLAY) - var/icon/icon_with_antennae = new(moth_head) - icon_with_antennae.Blend(icon(antennae.icon, "m_moth_antennae_[antennae.icon_state]_FRONT"), ICON_OVERLAY) - icon_with_antennae.Scale(64, 64) - icon_with_antennae.Crop(15, 64, 15 + 31, 64 - 31) + var/datum/sprite_accessory/antennae = GLOB.moth_antennae_list[value] - values[antennae.name] = icon_with_antennae + var/icon/icon_with_antennae = new(moth_head) + icon_with_antennae.Blend(icon(antennae.icon, "m_moth_antennae_[antennae.icon_state]_FRONT"), ICON_OVERLAY) + icon_with_antennae.Scale(64, 64) + icon_with_antennae.Crop(15, 64, 15 + 31, 64 - 31) - return values + return icon_with_antennae /datum/preference/choiced/moth_antennae/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["moth_antennae"] = value @@ -38,47 +38,45 @@ relevant_mutant_bodypart = "moth_markings" /datum/preference/choiced/moth_markings/init_possible_values() - var/list/values = list() + return assoc_to_keys_features(GLOB.moth_markings_list) - var/icon/moth_body = icon('icons/blanks/32x32.dmi', "nothing") - - moth_body.Blend(icon('icons/mob/human/species/moth/moth_wings.dmi', "m_moth_wings_plain_BEHIND"), ICON_OVERLAY) - - var/list/body_parts = list( +/datum/preference/choiced/moth_markings/icon_for(value) + var/static/list/body_parts = list( /obj/item/bodypart/head/moth, /obj/item/bodypart/chest/moth, /obj/item/bodypart/arm/left/moth, /obj/item/bodypart/arm/right/moth, ) - for (var/obj/item/bodypart/body_part in body_parts) - var/gender = (initial(body_part.is_dimorphic)) ? "_m" : "" - moth_body.Blend(icon('icons/mob/human/species/moth/bodyparts.dmi', "moth_[body_part][gender]"), ICON_OVERLAY) + var/static/icon/moth_body + if (isnull(moth_body)) + moth_body = icon('icons/blanks/32x32.dmi', "nothing") - moth_body.Blend(icon('icons/mob/human/human_face.dmi', "motheyes"), ICON_OVERLAY) + moth_body.Blend(icon('icons/mob/human/species/moth/moth_wings.dmi', "m_moth_wings_plain_BEHIND"), ICON_OVERLAY) - for (var/markings_name in GLOB.moth_markings_list) - var/datum/sprite_accessory/markings = GLOB.moth_markings_list[markings_name] - if(markings.locked) - continue - var/icon/icon_with_markings = new(moth_body) + for (var/obj/item/bodypart/body_part as anything in body_parts) + moth_body.Blend(icon('icons/mob/human/species/moth/bodyparts.dmi', initial(body_part.icon_state)), ICON_OVERLAY) - if (markings_name != "None") - for (var/body_part in body_parts) - var/icon/body_part_icon = icon(markings.icon, "[markings.icon_state]_[body_part]") - body_part_icon.Crop(1, 1, 32, 32) - icon_with_markings.Blend(body_part_icon, ICON_OVERLAY) + moth_body.Blend(icon('icons/mob/human/human_face.dmi', "motheyes_l"), ICON_OVERLAY) + moth_body.Blend(icon('icons/mob/human/human_face.dmi', "motheyes_r"), ICON_OVERLAY) - icon_with_markings.Blend(icon('icons/mob/human/species/moth/moth_wings.dmi', "m_moth_wings_plain_FRONT"), ICON_OVERLAY) - icon_with_markings.Blend(icon('icons/mob/human/species/moth/moth_antennae.dmi', "m_moth_antennae_plain_FRONT"), ICON_OVERLAY) + var/datum/sprite_accessory/markings = GLOB.moth_markings_list[value] + var/icon/icon_with_markings = new(moth_body) - // Zoom in on the top of the head and the chest - icon_with_markings.Scale(64, 64) - icon_with_markings.Crop(15, 64, 15 + 31, 64 - 31) + if (value != "None") + for (var/obj/item/bodypart/body_part as anything in body_parts) + var/icon/body_part_icon = icon(markings.icon, "[markings.icon_state]_[initial(body_part.body_zone)]") + body_part_icon.Crop(1, 1, 32, 32) + icon_with_markings.Blend(body_part_icon, ICON_OVERLAY) - values[markings.name] = icon_with_markings + icon_with_markings.Blend(icon('icons/mob/human/species/moth/moth_wings.dmi', "m_moth_wings_plain_FRONT"), ICON_OVERLAY) + icon_with_markings.Blend(icon('icons/mob/human/species/moth/moth_antennae.dmi', "m_moth_antennae_plain_FRONT"), ICON_OVERLAY) - return values + // Zoom in on the top of the head and the chest + icon_with_markings.Scale(64, 64) + icon_with_markings.Crop(15, 64, 15 + 31, 64 - 31) + + return icon_with_markings /datum/preference/choiced/moth_markings/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["moth_markings"] = value @@ -91,11 +89,13 @@ should_generate_icons = TRUE /datum/preference/choiced/moth_wings/init_possible_values() - return possible_values_for_sprite_accessory_list_for_body_part( - GLOB.moth_wings_list, - "moth_wings", - list("BEHIND", "FRONT"), - ) + return assoc_to_keys_features(GLOB.moth_wings_list) + +/datum/preference/choiced/moth_wings/icon_for(value) + var/datum/sprite_accessory/moth_wings = GLOB.moth_wings_list[value] + var/icon/final_icon = icon(moth_wings.icon, "m_moth_wings_[moth_wings.icon_state]_BEHIND") + final_icon.Blend(icon(moth_wings.icon, "m_moth_wings_[moth_wings.icon_state]_FRONT"), ICON_OVERLAY) + return final_icon /datum/preference/choiced/moth_wings/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["moth_wings"] = value diff --git a/code/modules/client/preferences/species_features/pod.dm b/code/modules/client/preferences/species_features/pod.dm index c5315d95380..7f7746ea41d 100644 --- a/code/modules/client/preferences/species_features/pod.dm +++ b/code/modules/client/preferences/species_features/pod.dm @@ -8,27 +8,22 @@ should_generate_icons = TRUE /datum/preference/choiced/pod_hair/init_possible_values() - var/list/values = list() + return assoc_to_keys_features(GLOB.pod_hair_list) - var/icon/pod_head = icon('icons/mob/human/bodyparts_greyscale.dmi', "pod_head_m") +/datum/preference/choiced/pod_hair/icon_for(value) + var/datum/sprite_accessory/pod_hair = GLOB.pod_hair_list[value] - for (var/pod_name in GLOB.pod_hair_list) - var/datum/sprite_accessory/pod_hair = GLOB.pod_hair_list[pod_name] - if(pod_hair.locked) - continue + var/icon/icon_with_hair = icon('icons/mob/human/bodyparts_greyscale.dmi', "pod_head_m") - var/icon/icon_with_hair = new(pod_head) - var/icon/icon_adj = icon(pod_hair.icon, "m_pod_hair_[pod_hair.icon_state]_ADJ") - var/icon/icon_front = icon(pod_hair.icon, "m_pod_hair_[pod_hair.icon_state]_FRONT") - icon_adj.Blend(icon_front, ICON_OVERLAY) - icon_with_hair.Blend(icon_adj, ICON_OVERLAY) - icon_with_hair.Scale(64, 64) - icon_with_hair.Crop(15, 64, 15 + 31, 64 - 31) - icon_with_hair.Blend(COLOR_GREEN, ICON_MULTIPLY) + var/icon/icon_adj = icon(pod_hair.icon, "m_pod_hair_[pod_hair.icon_state]_ADJ") + var/icon/icon_front = icon(pod_hair.icon, "m_pod_hair_[pod_hair.icon_state]_FRONT") + icon_adj.Blend(icon_front, ICON_OVERLAY) + icon_with_hair.Blend(icon_adj, ICON_OVERLAY) + icon_with_hair.Scale(64, 64) + icon_with_hair.Crop(15, 64, 15 + 31, 64 - 31) + icon_with_hair.Blend(COLOR_GREEN, ICON_MULTIPLY) - values[pod_hair.name] = icon_with_hair - - return values + return icon_with_hair /datum/preference/choiced/pod_hair/create_default_value() return pick(assoc_to_keys_features(GLOB.pod_hair_list)) diff --git a/code/modules/client/preferences/species_features/vampire.dm b/code/modules/client/preferences/species_features/vampire.dm index 710dd37a1f2..5ecdae7b1bf 100644 --- a/code/modules/client/preferences/species_features/vampire.dm +++ b/code/modules/client/preferences/species_features/vampire.dm @@ -11,12 +11,14 @@ return "Inoculated" //eh, have em try out the mechanic first /datum/preference/choiced/vampire_status/init_possible_values() - var/list/values = list() + return list("Inoculated", "Outcast") - values["Inoculated"] = icon('icons/obj/drinks/drinks.dmi', "bloodglass") - values["Outcast"] = icon('icons/obj/medical/bloodpack.dmi', "generic_bloodpack") - - return values +/datum/preference/choiced/vampire_status/icon_for(value) + switch (value) + if ("Inoculated") + return icon('icons/obj/drinks/drinks.dmi', "bloodglass") + if ("Outcast") + return icon('icons/obj/medical/bloodpack.dmi', "generic_bloodpack") ///list that stores a vampire house name for each department GLOBAL_LIST_EMPTY(vampire_houses) diff --git a/code/modules/client/preferences/ui_style.dm b/code/modules/client/preferences/ui_style.dm index 08f1af6c7dd..64a82b592c6 100644 --- a/code/modules/client/preferences/ui_style.dm +++ b/code/modules/client/preferences/ui_style.dm @@ -6,18 +6,16 @@ should_generate_icons = TRUE /datum/preference/choiced/ui_style/init_possible_values() - var/list/values = list() + return assoc_to_keys(GLOB.available_ui_styles) - for (var/style in GLOB.available_ui_styles) - var/icon/icons = GLOB.available_ui_styles[style] +/datum/preference/choiced/ui_style/icon_for(value) + var/icon/icons = GLOB.available_ui_styles[value] - var/icon/icon = icon(icons, "hand_r") - icon.Crop(1, 1, world.icon_size * 2, world.icon_size) - icon.Blend(icon(icons, "hand_l"), ICON_OVERLAY, world.icon_size) + var/icon/icon = icon(icons, "hand_r") + icon.Crop(1, 1, world.icon_size * 2, world.icon_size) + icon.Blend(icon(icons, "hand_l"), ICON_OVERLAY, world.icon_size) - values[style] = icon - - return values + return icon /datum/preference/choiced/ui_style/create_default_value() return GLOB.available_ui_styles[1] diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index cca60f206e1..5df802b9f60 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -68,7 +68,7 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8") message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]") return - if(!(prefs.chat_toggles & CHAT_OOC)) + if(!(get_chat_toggles(src) & CHAT_OOC)) to_chat(src, span_danger("You have OOC muted.")) return @@ -90,7 +90,7 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8") for(var/client/receiver as anything in GLOB.clients) if(!receiver.prefs) // Client being created or deleted. Despite all, this can be null. continue - if(!(receiver.prefs.chat_toggles & CHAT_OOC)) + if(!(get_chat_toggles(receiver) & CHAT_OOC)) continue if(holder?.fakekey in receiver.prefs.ignoring) continue diff --git a/code/modules/clothing/belts/polymorph_belt.dm b/code/modules/clothing/belts/polymorph_belt.dm index 33bb3dcf691..f6ccccae971 100644 --- a/code/modules/clothing/belts/polymorph_belt.dm +++ b/code/modules/clothing/belts/polymorph_belt.dm @@ -57,7 +57,7 @@ return if (!isliving(target_mob)) return - if (ishuman(target_mob) && !ismonkey(target_mob)) + if (!isanimal_or_basicmob(target_mob)) balloon_alert(user, "target too complex!") return TRUE if (!(target_mob.mob_biotypes & MOB_ORGANIC)) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index ef1769bf029..26792014fff 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -254,6 +254,17 @@ LAZYSET(user_vars_remembered, variable, user.vars[variable]) user.vv_edit_var(variable, user_vars_to_edit[variable]) +// If the item is a piece of clothing and is being worn, make sure it updates on the player +/obj/item/clothing/update_greyscale() + . = ..() + + var/mob/living/carbon/human/wearer = loc + + if(!istype(wearer)) + return + + wearer.update_clothing(slot_flags) + /** * Inserts a trait (or multiple traits) into the clothing traits list * @@ -392,7 +403,7 @@ if(isliving(loc)) //It's not important enough to warrant a message if it's not on someone var/mob/living/M = loc - if(src in M.get_equipped_items(FALSE)) + if(src in M.get_equipped_items()) to_chat(M, span_warning("Your [name] start[p_s()] to fall apart!")) else to_chat(M, span_warning("[src] start[p_s()] to fall apart!")) @@ -515,7 +526,7 @@ BLIND // can't see anything update_clothes_damaged_state(CLOTHING_SHREDDED) if(isliving(loc)) var/mob/living/M = loc - if(src in M.get_equipped_items(FALSE)) //make sure they were wearing it and not attacking the item in their hands + if(src in M.get_equipped_items()) //make sure they were wearing it and not attacking the item in their hands M.visible_message(span_danger("[M]'s [src.name] fall[p_s()] off, [p_theyre()] completely shredded!"), span_warning("Your [src.name] fall[p_s()] off, [p_theyre()] completely shredded!"), vision_distance = COMBAT_MESSAGE_RANGE) M.dropItemToGround(src) else diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 0d581b67923..688b63bddbb 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -291,7 +291,7 @@ return if(isliving(movable)) var/mob/living/crusher = movable - if(crusher.m_intent != MOVE_INTENT_WALK && (!(crusher.movement_type & (FLYING|FLOATING)) || crusher.buckled)) + if(crusher.move_intent != MOVE_INTENT_WALK && (!(crusher.movement_type & (FLYING|FLOATING)) || crusher.buckled)) playsound(src, 'sound/effects/footstep/glass_step.ogg', 30, TRUE) visible_message(span_warning("[crusher] steps on [src], damaging it!")) take_damage(100, sound_effect = FALSE) diff --git a/code/modules/clothing/head/mind_monkey_helmet.dm b/code/modules/clothing/head/mind_monkey_helmet.dm index 419fa903f09..c0463fed74c 100644 --- a/code/modules/clothing/head/mind_monkey_helmet.dm +++ b/code/modules/clothing/head/mind_monkey_helmet.dm @@ -81,7 +81,9 @@ if(prob(10)) switch(rand(1,4)) if(1) //blood rage - magnification.ai_controller.set_blackboard_key(BB_MONKEY_AGGRESSIVE, TRUE) + var/datum/ai_controller/monkey/monky_controller = magnification.ai_controller + monky_controller.set_trip_mode(mode = FALSE) + monky_controller.set_blackboard_key(BB_MONKEY_AGGRESSIVE, TRUE) if(2) //brain death magnification.apply_damage(500,BRAIN,BODY_ZONE_HEAD,FALSE,FALSE,FALSE) if(3) //primal gene (gorilla) diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index 2e89d20e019..9f0be80e7a8 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -17,6 +17,19 @@ if(GET_ATOM_BLOOD_DNA_LENGTH(src)) . += mutable_appearance('icons/effects/blood.dmi', "maskblood") +/obj/item/clothing/neck/bowtie + name = "bow tie" + desc = "A small neosilk bowtie." + icon = 'icons/obj/clothing/neck.dmi' + icon_state = "bowtie_greyscale" + inhand_icon_state = "" //no inhands + w_class = WEIGHT_CLASS_SMALL + custom_price = PAYCHECK_CREW + greyscale_config = /datum/greyscale_config/ties + greyscale_config_worn = /datum/greyscale_config/ties/worn + greyscale_colors = "#151516ff" + flags_1 = IS_PLAYER_COLORABLE_1 + /obj/item/clothing/neck/tie name = "slick tie" desc = "A neosilk tie." diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index e365c685546..5bedbb86fa8 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -150,9 +150,9 @@ id_trim = /datum/id_trim/centcom/official uniform = /obj/item/clothing/under/rank/centcom/official back = /obj/item/storage/backpack/satchel + box = /obj/item/storage/box/survival backpack_contents = list( /obj/item/stamp/centcom = 1, - /obj/item/storage/box/survival = 1, ) belt = /obj/item/gun/energy/e_gun ears = /obj/item/radio/headset/headset_cent @@ -181,9 +181,7 @@ back = /obj/item/mod/control/pre_equipped/responsory/inquisitory/commander r_hand = /obj/item/nullrod/vibro/talking/chainsword - backpack_contents = list( - /obj/item/storage/box/survival = 1, - ) + backpack_contents = null /datum/outfit/centcom/ert/security/inquisitor name = "Inquisition Security" @@ -295,16 +293,14 @@ id_trim = /datum/id_trim/centcom/intern uniform = /obj/item/clothing/under/rank/centcom/intern back = /obj/item/storage/backpack/satchel - backpack_contents = list( - /obj/item/storage/box/survival = 1, - ) + box = /obj/item/storage/box/survival belt = /obj/item/melee/baton ears = /obj/item/radio/headset/headset_cent glasses = /obj/item/clothing/glasses/sunglasses gloves = /obj/item/clothing/gloves/color/black shoes = /obj/item/clothing/shoes/sneakers/black - l_pocket = /obj/item/ammo_box/a762 - r_pocket = /obj/item/ammo_box/a762 + l_pocket = /obj/item/ammo_box/strilka310 + r_pocket = /obj/item/ammo_box/strilka310 l_hand = /obj/item/gun/ballistic/rifle/boltaction /datum/outfit/centcom/centcom_intern/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) @@ -549,11 +545,11 @@ shoes = /obj/item/clothing/shoes/cowboy gloves = /obj/item/clothing/gloves/combat back = /obj/item/storage/backpack/satchel/leather + box = /obj/item/storage/box/survival l_pocket = /obj/item/switchblade r_pocket = /obj/item/reagent_containers/hypospray/medipen/salacid ears = /obj/item/radio/headset backpack_contents = list( - /obj/item/storage/box/survival = 1, /obj/item/storage/medkit/emergency = 1, /obj/item/crowbar = 1, /obj/item/restraints/handcuffs = 1, diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index 15ede663374..061fbe3a1de 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -95,9 +95,7 @@ suit = /obj/item/clothing/suit/redtag suit_store = /obj/item/gun/energy/laser/redtag back = /obj/item/storage/backpack - backpack_contents = list( - /obj/item/storage/box = 1, -) + box = /obj/item/storage/box ears = /obj/item/radio/headset gloves = /obj/item/clothing/gloves/color/red head = /obj/item/clothing/head/helmet/redtaghelm @@ -177,7 +175,7 @@ l_hand = /obj/item/fireaxe /datum/outfit/psycho/post_equip(mob/living/carbon/human/H) - for(var/obj/item/carried_item in H.get_equipped_items(TRUE)) + for(var/obj/item/carried_item in H.get_equipped_items(include_pockets = TRUE, include_accessories = TRUE)) carried_item.add_mob_blood(H)//Oh yes, there will be blood... for(var/obj/item/I in H.held_items) I.add_mob_blood(H) diff --git a/code/modules/clothing/shoes/costume.dm b/code/modules/clothing/shoes/costume.dm index ca16c5d6560..e591bda1258 100644 --- a/code/modules/clothing/shoes/costume.dm +++ b/code/modules/clothing/shoes/costume.dm @@ -84,6 +84,17 @@ icon_state = "saints_shoes" inhand_icon_state = null +/obj/item/clothing/shoes/jester_shoes + name = "jester shoes" + desc = "Shoes that jingle with every step!!" + icon_state = "green_jester_shoes" + inhand_icon_state = null + +/obj/item/clothing/shoes/jester_shoes/Initialize(mapload) + . = ..() + + LoadComponent(/datum/component/squeak, list('sound/effects/jingle.ogg' = 1), 50, falloff_exponent = 20, step_delay_override = 0) + /obj/item/clothing/shoes/ducky_shoes name = "ducky shoes" desc = "I got boots, that go *quack quack quack quack quack." diff --git a/code/modules/clothing/shoes/sandals.dm b/code/modules/clothing/shoes/sandals.dm index f6c867bca7a..9c948e2fac8 100644 --- a/code/modules/clothing/shoes/sandals.dm +++ b/code/modules/clothing/shoes/sandals.dm @@ -18,3 +18,7 @@ name = "magical sandals" desc = "A pair of sandals imbued with magic." resistance_flags = FIRE_PROOF | ACID_PROOF + +/obj/item/clothing/shoes/sandal/beach + name = "flip-flops" + desc = "A very fashionable pair of flip-flops." diff --git a/code/modules/clothing/shoes/sneakers.dm b/code/modules/clothing/shoes/sneakers.dm index b0e51926d24..66af19f503c 100644 --- a/code/modules/clothing/shoes/sneakers.dm +++ b/code/modules/clothing/shoes/sneakers.dm @@ -92,11 +92,6 @@ . = ..() AddElement(/datum/element/update_icon_updates_onmob, ITEM_SLOT_HANDCUFFED) -/obj/item/clothing/shoes/sneakers/orange/handle_atom_del(atom/deleting_atom) - if(deleting_atom == attached_cuffs) - moveToNullspace(attached_cuffs) - return ..() - /obj/item/clothing/shoes/sneakers/orange/Destroy() QDEL_NULL(attached_cuffs) return ..() diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index 2519443247b..6912e3bed4f 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -134,11 +134,11 @@ return ..() // Clean up the cell on destroy -/obj/item/clothing/suit/space/handle_atom_del(atom/A) - if(A == cell) +/obj/item/clothing/suit/space/Exited(atom/movable/gone, direction) + . = ..() + if(gone == cell) cell = null thermal_on = FALSE - return ..() // support for items that interact with the cell /obj/item/clothing/suit/space/get_cell() diff --git a/code/modules/clothing/spacesuits/specialops.dm b/code/modules/clothing/spacesuits/specialops.dm index 77c49c96d3a..3634066e72f 100644 --- a/code/modules/clothing/spacesuits/specialops.dm +++ b/code/modules/clothing/spacesuits/specialops.dm @@ -6,7 +6,7 @@ icon_state = "beret_badge" inhand_icon_state = null greyscale_colors = "#397F3F#FFCE5B" - + clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT flags_inv = 0 armor_type = /datum/armor/space_beret strip_delay = 130 diff --git a/code/modules/clothing/suits/costume.dm b/code/modules/clothing/suits/costume.dm index b25fa7a8efc..49cb7ffb174 100644 --- a/code/modules/clothing/suits/costume.dm +++ b/code/modules/clothing/suits/costume.dm @@ -82,21 +82,6 @@ body_parts_covered = CHEST|GROIN|LEGS|ARMS allowed = list(/obj/item/storage/fancy/cigarettes, /obj/item/stack/spacecash) -/obj/item/clothing/suit/apron/overalls - name = "coveralls" - desc = "A set of denim overalls." - icon_state = "overalls" - inhand_icon_state = "overalls" - body_parts_covered = CHEST|GROIN|LEGS - species_exception = list(/datum/species/golem) - -/obj/item/clothing/suit/apron/purple_bartender - name = "purple bartender apron" - desc = "A fancy purple apron for a stylish person." - icon_state = "purplebartenderapron" - inhand_icon_state = null - body_parts_covered = CHEST|GROIN - /obj/item/clothing/suit/syndicatefake name = "black and red space suit replica" icon_state = "syndicate-black-red" diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index fb05df7e26d..1f29d198d53 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -40,6 +40,18 @@ inhand_icon_state = null body_parts_covered = CHEST|GROIN|LEGS +/obj/item/clothing/suit/apron/overalls + name = "coveralls" + desc = "A set of overalls, good for protecting thinner clothes from the elements." + icon_state = "overalls" + inhand_icon_state = "" + body_parts_covered = CHEST|GROIN|LEGS + species_exception = list(/datum/species/golem) + greyscale_config = /datum/greyscale_config/overalls + greyscale_config_worn = /datum/greyscale_config/overalls/worn + greyscale_colors = "#313c6e" + flags_1 = IS_PLAYER_COLORABLE_1 + //Captain /obj/item/clothing/suit/jacket/capjacket name = "captain's parade jacket" @@ -173,8 +185,8 @@ //Lawyer /obj/item/clothing/suit/toggle/lawyer - name = "blue suit jacket" - desc = "A snappy dress jacket." + name = "blue formal suit jacket" + desc = "A professional suit jacket." icon_state = "suitjacket_blue" icon = 'icons/obj/clothing/suits/jacket.dmi' worn_icon = 'icons/mob/clothing/suits/jacket.dmi' @@ -184,17 +196,53 @@ species_exception = list(/datum/species/golem) /obj/item/clothing/suit/toggle/lawyer/purple - name = "purple suit jacket" - desc = "A foppish dress jacket." + name = "purple formal suit jacket" icon_state = "suitjacket_purp" inhand_icon_state = null /obj/item/clothing/suit/toggle/lawyer/black - name = "black suit jacket" - desc = "A professional suit jacket." + name = "black formal suit jacket" icon_state = "suitjacket_black" inhand_icon_state = "ro_suit" +// Cargo + +/obj/item/clothing/suit/toggle/cargo_tech + name = "cargo gorka" + desc = "A brown and black puffy jacket; made from synthetic fabric. Inspired by old Eastern European designs." + icon_state = "cargo_jacket" + icon = 'icons/obj/clothing/suits/jacket.dmi' + worn_icon = 'icons/mob/clothing/suits/jacket.dmi' + inhand_icon_state = null + blood_overlay_type = "coat" + body_parts_covered = CHEST|ARMS + allowed = list( + /obj/item/stamp, + /obj/item/storage/bag/mail, + ) + +// Quartermaster + +/obj/item/clothing/suit/jacket/quartermaster + name = "quatermaster's overcoat" + desc = "A luxury, brown double-breasted overcoat, made from kangaroo skin. It's gold cuffs linked are styled on the credits symbol. It makes you feel more important then you probably are." + icon_state = "qm_coat" + blood_overlay_type = "coat" + body_parts_covered = CHEST|GROIN|LEGS|ARMS + allowed = list( + /obj/item/stamp, + /obj/item/storage/bag/mail, + ) + +/obj/item/clothing/suit/toggle/lawyer/greyscale + name = "formal suit jacket" + icon_state = "jacket_lawyer" + inhand_icon_state = "" + greyscale_config = /datum/greyscale_config/jacket_lawyer + greyscale_config_worn = /datum/greyscale_config/jacket_lawyer/worn + greyscale_colors = "#ffffff" + flags_1 = IS_PLAYER_COLORABLE_1 + //Mime /obj/item/clothing/suit/toggle/suspenders name = "suspenders" @@ -295,7 +343,6 @@ cold_protection = CHEST|ARMS heat_protection = CHEST|ARMS -//Robotocist /datum/armor/jacket_curator melee = 25 bullet = 10 @@ -303,6 +350,7 @@ energy = 35 acid = 45 +//Robotocist /obj/item/clothing/suit/hooded/techpriest name = "techpriest robes" desc = "For those who REALLY love their toasters." diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index 3a4fcfb0361..7a3e155d6f8 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -101,7 +101,10 @@ /obj/item/clothing/suit/toggle/labcoat/coroner/Initialize(mapload) . = ..() - allowed += /obj/item/autopsy_scanner + allowed += list( + /obj/item/autopsy_scanner, + /obj/item/scythe, + ) /obj/item/clothing/suit/toggle/labcoat/science name = "scientist labcoat" diff --git a/code/modules/clothing/suits/wintercoats.dm b/code/modules/clothing/suits/wintercoats.dm index 59dd22f5f6e..a0f6e6d1047 100644 --- a/code/modules/clothing/suits/wintercoats.dm +++ b/code/modules/clothing/suits/wintercoats.dm @@ -384,7 +384,10 @@ /obj/item/clothing/suit/hooded/wintercoat/medical/coroner/Initialize(mapload) . = ..() - allowed += /obj/item/autopsy_scanner + allowed += list( + /obj/item/autopsy_scanner, + /obj/item/scythe, + ) /obj/item/clothing/head/hooded/winterhood/medical/coroner desc = "A white winter coat hood." diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 374d48148cd..4f4111a0eb4 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -238,6 +238,15 @@ accessory_overlay.alpha = prime_accessory.alpha accessory_overlay.color = prime_accessory.color +/// Updates the accessory's worn overlay mutable appearance +/obj/item/clothing/under/proc/update_accessory_overlay() + if(isnull(accessory_overlay)) + return + + cut_overlay(accessory_overlay) + create_accessory_overlay() + update_appearance() // so we update the suit inventory overlay too + /obj/item/clothing/under/Exited(atom/movable/gone, direction) . = ..() // If one of our accessories was moved out, handle it diff --git a/code/modules/clothing/under/accessories/_accessories.dm b/code/modules/clothing/under/accessories/_accessories.dm index 1792bff82bb..8ecc3962abd 100644 --- a/code/modules/clothing/under/accessories/_accessories.dm +++ b/code/modules/clothing/under/accessories/_accessories.dm @@ -54,6 +54,22 @@ return TRUE +// If accessory is being worn, make sure it updates on the player +/obj/item/clothing/accessory/update_greyscale() + . = ..() + + var/obj/item/clothing/under/attached_to = loc + + if(!istype(attached_to)) + return + + var/mob/living/carbon/human/wearer = attached_to.loc + + if(!istype(wearer)) + return + + attached_to.update_accessory_overlay() + /** * Actually attach this accessory to the passed clothing article. * @@ -145,10 +161,12 @@ /// Called when the uniform this accessory is pinned to is equipped in a valid slot /obj/item/clothing/accessory/proc/accessory_equipped(obj/item/clothing/under/clothes, mob/living/user) + equipped(user, user.get_slot_by_item(clothes)) // so we get any actions, item_flags get set, etc return /// Called when the uniform this accessory is pinned to is dropped /obj/item/clothing/accessory/proc/accessory_dropped(obj/item/clothing/under/clothes, mob/living/user) + dropped(user) return /// Signal proc for [COMSIG_CLOTHING_UNDER_ADJUSTED] on the uniform we're pinned to diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm index 5a42d6596e6..6ef6489f389 100644 --- a/code/modules/clothing/under/costume.dm +++ b/code/modules/clothing/under/costume.dm @@ -382,6 +382,24 @@ female_sprite_flags = NO_FEMALE_UNIFORM can_adjust = FALSE +/obj/item/clothing/under/costume/traditional + name = "Traditional Suit" + desc = "A full, vibrantly coloured suit. Likely with traditional purposes. Maybe the colours represent a familly, clan, or rank, who knows." + icon_state = "tradition" + inhand_icon_state = null + female_sprite_flags = NO_FEMALE_UNIFORM + can_adjust = FALSE + +/obj/item/clothing/under/costume/loincloth + name = "Leather Loincloth" + desc = "Just a piece of leather to cover private areas. Itchy to the touch. Whoever made this must have been desperate, or savage." + icon_state = "loincloth" + inhand_icon_state = null + body_parts_covered = GROIN + female_sprite_flags = NO_FEMALE_UNIFORM + can_adjust = TRUE + alt_covers_chest = TRUE + /obj/item/clothing/under/costume/henchmen name = "henchmen jumpsuit" desc = "A very gaudy jumpsuit for a proper Henchman. Guild regulations, you understand." @@ -391,3 +409,4 @@ inhand_icon_state = null body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS|HEAD flags_inv = HIDEGLOVES|HIDESHOES|HIDEEARS|HIDEEYES|HIDEHAIR + diff --git a/code/modules/clothing/under/jobs/cargo.dm b/code/modules/clothing/under/jobs/cargo.dm index d1f1ab01d90..12688a22737 100644 --- a/code/modules/clothing/under/jobs/cargo.dm +++ b/code/modules/clothing/under/jobs/cargo.dm @@ -3,31 +3,35 @@ worn_icon = 'icons/mob/clothing/under/cargo.dmi' /obj/item/clothing/under/rank/cargo/qm - name = "quartermaster's jumpsuit" - desc = "It's a jumpsuit worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper." + name = "quartermaster's outfit" + desc = "A brown dress shirt, coupled with a pair of black slacks. It's specially designed to prevent back injuries caused by pushing paper." icon_state = "qm" inhand_icon_state = "lb_suit" /obj/item/clothing/under/rank/cargo/qm/skirt - name = "quartermaster's jumpskirt" - desc = "It's a jumpskirt worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper." + name = "quartermaster's skirt" + desc = "A brown dress shirt, coupled with a long pleated black skirt. It's specially designed to prevent back injuries caused by pushing paper." icon_state = "qm_skirt" inhand_icon_state = "lb_suit" body_parts_covered = CHEST|GROIN|ARMS dying_key = DYE_REGISTRY_JUMPSKIRT - female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY - supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON /obj/item/clothing/under/rank/cargo/tech - name = "cargo technician's jumpsuit" - desc = "Shooooorts! They're comfy and easy to wear!" + name = "cargo technician's outfit" + desc = "A brown sweater and black jeans, because, honestly, who likes shorts?" icon_state = "cargotech" inhand_icon_state = "lb_suit" + +/obj/item/clothing/under/rank/cargo/tech/alt + name = "cargo technician's shorts" + desc = "I like shooooorts! They're comfy and easy to wear!" + icon_state = "cargotech_alt" + inhand_icon_state = "lb_suit" body_parts_covered = CHEST|GROIN|ARMS supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION /obj/item/clothing/under/rank/cargo/tech/skirt - name = "cargo technician's jumpskirt" + name = "cargo technician's skirt" desc = "Skiiiiirts! They're comfy and easy to wear!" icon_state = "cargo_skirt" inhand_icon_state = "lb_suit" diff --git a/code/modules/clothing/under/jobs/civilian/civilian.dm b/code/modules/clothing/under/jobs/civilian/civilian.dm index 31a691668a2..35eb2db3029 100644 --- a/code/modules/clothing/under/jobs/civilian/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian/civilian.dm @@ -4,29 +4,12 @@ icon = 'icons/obj/clothing/under/civilian.dmi' worn_icon = 'icons/mob/clothing/under/civilian.dmi' -/obj/item/clothing/under/rank/civilian/bartender - desc = "It looks like it could use some more flair." - name = "bartender's uniform" - icon_state = "barman" - inhand_icon_state = "bar_suit" - alt_covers_chest = TRUE - -/obj/item/clothing/under/rank/civilian/bartender/purple +/obj/item/clothing/under/rank/civilian/purple_bartender desc = "It looks like it has lots of flair!" name = "purple bartender's uniform" icon_state = "purplebartender" can_adjust = FALSE -/obj/item/clothing/under/rank/civilian/bartender/skirt - name = "bartender's skirt" - desc = "It looks like it could use some more flair." - icon_state = "barman_skirt" - inhand_icon_state = "bar_suit" - body_parts_covered = CHEST|GROIN|ARMS - dying_key = DYE_REGISTRY_JUMPSKIRT - female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY - supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON - /obj/item/clothing/under/rank/civilian/chaplain desc = "It's a black jumpsuit, often worn by religious folk." name = "chaplain's jumpsuit" @@ -44,22 +27,6 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON -/obj/item/clothing/under/rank/civilian/chef - name = "cook's suit" - desc = "A suit which is given only to the most hardcore cooks in space." - icon_state = "chef" - inhand_icon_state = "chef" - alt_covers_chest = TRUE - -/obj/item/clothing/under/rank/civilian/chef/skirt - name = "cook's skirt" - desc = "A skirt which is given only to the most hardcore cooks in space." - icon_state = "chef_skirt" - body_parts_covered = CHEST|GROIN|ARMS - dying_key = DYE_REGISTRY_JUMPSKIRT - female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY - supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON - /obj/item/clothing/under/rank/civilian/head_of_personnel desc = "A slick uniform worn by those to earn the position of \"Head of Personnel\"." name = "head of personnel's uniform" @@ -142,8 +109,10 @@ can_adjust = FALSE /obj/item/clothing/under/rank/civilian/lawyer - desc = "Slick threads." name = "Lawyer suit" + desc = "Slick threads." + icon = 'icons/obj/clothing/under/suits.dmi' + worn_icon = 'icons/mob/clothing/under/suits.dmi' can_adjust = FALSE /obj/item/clothing/under/rank/civilian/lawyer/dye_item(dye_color, dye_key_override) @@ -173,8 +142,6 @@ desc = "A tacky suit perfect for a CRIMINAL lawyer!" icon_state = "good_suit" inhand_icon_state = "good_suit" - icon = 'icons/obj/clothing/under/suits.dmi' - worn_icon = 'icons/mob/clothing/under/suits.dmi' /obj/item/clothing/under/rank/civilian/lawyer/beige/skirt name = "good lawyer's suitskirt" @@ -212,18 +179,21 @@ supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON /obj/item/clothing/under/rank/civilian/lawyer/bluesuit - name = "blue suit" - desc = "A classy suit." - icon_state = "bluesuit" - inhand_icon_state = "b_suit" + name = "blue buttondown suit" + icon = 'icons/obj/clothing/under/shorts_pants_shirts.dmi' + worn_icon = 'icons/mob/clothing/under/shorts_pants_shirts.dmi' + icon_state = "buttondown_slacks" + greyscale_config = /datum/greyscale_config/buttondown_slacks + greyscale_config_worn = /datum/greyscale_config/buttondown_slacks/worn + greyscale_colors = "#EEEEEE#CBDBFC#17171B#2B65A8" can_adjust = TRUE alt_covers_chest = TRUE /obj/item/clothing/under/rank/civilian/lawyer/bluesuit/skirt - name = "blue suitskirt" - desc = "A classy suitskirt." - icon_state = "bluesuit_skirt" - inhand_icon_state = "b_suit" + name = "blue buttondown suitskirt" + icon_state = "buttondown_skirt" + greyscale_config = /datum/greyscale_config/buttondown_skirt + greyscale_config_worn = /datum/greyscale_config/buttondown_skirt/worn body_parts_covered = CHEST|GROIN|ARMS dying_key = DYE_REGISTRY_JUMPSKIRT female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY @@ -247,6 +217,7 @@ supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON /obj/item/clothing/under/rank/civilian/lawyer/galaxy + icon = 'icons/obj/clothing/under/lawyer_galaxy.dmi' worn_icon = 'icons/mob/clothing/under/lawyer_galaxy.dmi' can_adjust = FALSE name = "blue galaxy suit" diff --git a/code/modules/detectivework/evidence.dm b/code/modules/detectivework/evidence.dm index 1f9f572ce42..e22235084f9 100644 --- a/code/modules/detectivework/evidence.dm +++ b/code/modules/detectivework/evidence.dm @@ -19,7 +19,8 @@ if(evidencebagEquip(I, user)) return 1 -/obj/item/evidencebag/handle_atom_del(atom/A) +/obj/item/evidencebag/Exited(atom/movable/gone, direction) + . = ..() cut_overlays() w_class = initial(w_class) icon_state = initial(icon_state) @@ -56,9 +57,12 @@ if(!isturf(I.loc)) //If it isn't on the floor. Do some checks to see if it's in our hands or a box. Otherwise give up. if(I.loc.atom_storage) //in a container. I.loc.atom_storage.remove_single(user, I, src) - if(!user.dropItemToGround(I)) + if(!user.is_holding(I) || HAS_TRAIT(I, TRAIT_NODROP)) return + if(QDELETED(I)) + return + user.visible_message(span_notice("[user] puts [I] into [src]."), span_notice("You put [I] inside [src]."),\ span_hear("You hear a rustle as someone puts something into a plastic bag.")) diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm index 53f1ab4ca34..3be319fd233 100644 --- a/code/modules/economy/account.dm +++ b/code/modules/economy/account.dm @@ -205,7 +205,7 @@ icon_source = id_card.get_cached_flat_icon() var/mob/card_holder = recursive_loc_check(card, /mob) if(ismob(card_holder)) //If on a mob - if(!card_holder.client || (!(card_holder.client.prefs.chat_toggles & CHAT_BANKCARD) && !force)) + if(!card_holder.client || (!(get_chat_toggles(card_holder.client) & CHAT_BANKCARD) && !force)) return if(card_holder.can_hear()) @@ -214,7 +214,7 @@ else if(isturf(card.loc)) //If on the ground var/turf/card_location = card.loc for(var/mob/potential_hearer in hearers(1,card_location)) - if(!potential_hearer.client || (!(potential_hearer.client.prefs.chat_toggles & CHAT_BANKCARD) && !force)) + if(!potential_hearer.client || (!(get_chat_toggles(potential_hearer.client) & CHAT_BANKCARD) && !force)) continue if(potential_hearer.can_hear()) potential_hearer.playsound_local(card_location, 'sound/machines/twobeep_high.ogg', 50, TRUE) @@ -222,7 +222,7 @@ else var/atom/sound_atom for(var/mob/potential_hearer in card.loc) //If inside a container with other mobs (e.g. locker) - if(!potential_hearer.client || (!(potential_hearer.client.prefs.chat_toggles & CHAT_BANKCARD) && !force)) + if(!potential_hearer.client || (!(get_chat_toggles(potential_hearer.client) & CHAT_BANKCARD) && !force)) continue if(!sound_atom) sound_atom = card.drop_location() //in case we're inside a bodybag in a crate or something. doing this here to only process it if there's a valid mob who can hear the sound. @@ -280,6 +280,20 @@ account_holder = SSeconomy.department_accounts[dep_id] SSeconomy.departmental_accounts += src +/datum/bank_account/department/adjust_money(amount, reason) + . = ..() + if(department_id != ACCOUNT_CAR) + return + // If we're under (or equal) 3 crates woth of money (600?) in the cargo department, we unlock the scrapheap, which gives us a buncha money. Useful in an emergency? + if(account_balance >= CARGO_CRATE_VALUE * 3) + return + // We only allow people to actually buy the shuttle once the round gets going - otherwise you'd just be able to do it roundstart (Not really intended) + var/minimum_allowed_purchase_time = (CONFIG_GET(number/shuttle_refuel_delay) * 0.6) + if((world.time - SSticker.round_start_time) > minimum_allowed_purchase_time) + SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_SCRAPHEAP] = TRUE + else + SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_SCRAPHEAP] = FALSE + /datum/bank_account/remote // Bank account not belonging to the local station add_to_accounts = FALSE diff --git a/code/modules/escape_menu/home_page.dm b/code/modules/escape_menu/home_page.dm index 548f5bcbf63..6d48285ae77 100644 --- a/code/modules/escape_menu/home_page.dm +++ b/code/modules/escape_menu/home_page.dm @@ -86,7 +86,7 @@ /atom/movable/screen/escape_menu/home_button/Destroy() escape_menu = null - QDEL_NULL(on_click_callback) + on_click_callback = null return ..() diff --git a/code/modules/escape_menu/leave_body.dm b/code/modules/escape_menu/leave_body.dm index 9ad238c85a0..14de01749bf 100644 --- a/code/modules/escape_menu/leave_body.dm +++ b/code/modules/escape_menu/leave_body.dm @@ -105,7 +105,7 @@ screen_loc = "CENTER:[pixel_offset],CENTER-1" /atom/movable/screen/escape_menu/leave_body_button/Destroy() - QDEL_NULL(on_click_callback) + on_click_callback = null return ..() diff --git a/code/modules/events/ghost_role/morph_event.dm b/code/modules/events/ghost_role/morph_event.dm index 29bfe202cc3..e9ac8bb9ea0 100644 --- a/code/modules/events/ghost_role/morph_event.dm +++ b/code/modules/events/ghost_role/morph_event.dm @@ -26,13 +26,13 @@ if(isnull(spawn_loc)) return MAP_ERROR - var/mob/living/simple_animal/hostile/morph/S = new /mob/living/simple_animal/hostile/morph(spawn_loc) - player_mind.transfer_to(S) + var/mob/living/basic/morph/corpus_accipientis = new(spawn_loc) + player_mind.transfer_to(corpus_accipientis) player_mind.set_assigned_role(SSjob.GetJobType(/datum/job/morph)) player_mind.special_role = ROLE_MORPH player_mind.add_antag_datum(/datum/antagonist/morph) - SEND_SOUND(S, sound('sound/magic/mutate.ogg')) - message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a morph by an event.") - S.log_message("was spawned as a morph by an event.", LOG_GAME) - spawned_mobs += S + SEND_SOUND(corpus_accipientis, sound('sound/magic/mutate.ogg')) + message_admins("[ADMIN_LOOKUPFLW(corpus_accipientis)] has been made into a morph by an event.") + corpus_accipientis.log_message("was spawned as a morph by an event.", LOG_GAME) + spawned_mobs += corpus_accipientis return SUCCESSFUL_SPAWN diff --git a/code/modules/events/ghost_role/sentience.dm b/code/modules/events/ghost_role/sentience.dm index fbc1dfad9d5..caf49e13b6b 100644 --- a/code/modules/events/ghost_role/sentience.dm +++ b/code/modules/events/ghost_role/sentience.dm @@ -4,7 +4,7 @@ GLOBAL_LIST_INIT(high_priority_sentience, typecacheof(list( /mob/living/basic/carp/pet/cayenne, /mob/living/basic/chicken, /mob/living/basic/cow, - /mob/living/basic/giant_spider/sgt_araneus, + /mob/living/basic/spider/giant/sgt_araneus, /mob/living/basic/lizard, /mob/living/basic/mouse/brown/tom, /mob/living/basic/pet, diff --git a/code/modules/events/immovable_rod/immovable_rod.dm b/code/modules/events/immovable_rod/immovable_rod.dm index 07aa4d25683..e2350d810a6 100644 --- a/code/modules/events/immovable_rod/immovable_rod.dm +++ b/code/modules/events/immovable_rod/immovable_rod.dm @@ -182,7 +182,12 @@ SSexplosions.highturf += clong return ..() + // If we Bump into the tram front or back, push the tram. Otherwise smash the object as usual. if(isobj(clong)) + if(istramwall(clong) && !special_target) + rod_vs_tram_battle(clong) + return ..() + var/obj/clong_obj = clong clong_obj.take_damage(INFINITY, BRUTE, NONE, TRUE, dir, INFINITY) return ..() @@ -290,3 +295,25 @@ /obj/effect/immovablerod/proc/walk_in_direction(direction) destination_turf = get_edge_target_turf(src, direction) SSmove_manager.move_towards(src, destination_turf) + +/** + * Rod will push the tram to a landmark if it hits the tram from the front/back + * while flying parallel. + */ +/obj/effect/immovablerod/proc/rod_vs_tram_battle() + var/obj/structure/industrial_lift/tram/industrial_lift = locate() in src.loc + + if(isnull(industrial_lift)) + return + + var/datum/lift_master/tram/lift_master = industrial_lift.lift_master_datum + + if(isnull(lift_master)) + return + + var/push_target = lift_master.rod_collision(src) + + if(!push_target) + return + + go_for_a_walk(push_target) diff --git a/code/modules/events/shuttle_loan/shuttle_loan_datum.dm b/code/modules/events/shuttle_loan/shuttle_loan_datum.dm index f8085b2aedd..3cc5a15a507 100644 --- a/code/modules/events/shuttle_loan/shuttle_loan_datum.dm +++ b/code/modules/events/shuttle_loan/shuttle_loan_datum.dm @@ -196,11 +196,11 @@ var/datum/supply_pack/pack = SSshuttle.supply_packs[/datum/supply_pack/imports/specialops] pack.generate(pick_n_take(empty_shuttle_turfs)) - spawn_list.Add(/mob/living/basic/giant_spider) - spawn_list.Add(/mob/living/basic/giant_spider) - spawn_list.Add(/mob/living/basic/giant_spider/nurse) + spawn_list.Add(/mob/living/basic/spider/giant) + spawn_list.Add(/mob/living/basic/spider/giant) + spawn_list.Add(/mob/living/basic/spider/giant/nurse) if(prob(50)) - spawn_list.Add(/mob/living/basic/giant_spider/hunter) + spawn_list.Add(/mob/living/basic/spider/giant/hunter) var/turf/victim_turf = pick_n_take(empty_shuttle_turfs) diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index 87e692a787e..70a7900ef8c 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -75,7 +75,7 @@ var/static/list/mob_list = list( /mob/living/basic/butterfly, /mob/living/basic/cockroach, - /mob/living/basic/giant_spider/maintenance, + /mob/living/basic/spider/maintenance, /mob/living/basic/mouse, ) return pick(mob_list) @@ -222,7 +222,7 @@ var/static/list/mob_list = list( /mob/living/basic/bee, /mob/living/basic/cockroach/hauberoach, - /mob/living/basic/giant_spider, + /mob/living/basic/spider/giant, /mob/living/basic/mouse/rat, ) return pick(mob_list) diff --git a/code/modules/events/wizard/greentext.dm b/code/modules/events/wizard/greentext.dm index bdb053365df..6b4b8be0ff8 100644 --- a/code/modules/events/wizard/greentext.dm +++ b/code/modules/events/wizard/greentext.dm @@ -67,7 +67,7 @@ /obj/item/greentext/Destroy(force) LAZYREMOVE(SSticker.round_end_events, roundend_callback) - QDEL_NULL(roundend_callback) //This ought to free the callback datum, and prevent us from harddeling + roundend_callback = null //This ought to free the callback datum, and prevent us from harddeling if(LAZYLEN(color_altered_mobs)) INVOKE_ASYNC(src, PROC_REF(release_victims)) return ..() diff --git a/code/modules/events/wizard/petsplosion.dm b/code/modules/events/wizard/petsplosion.dm index c213c141c9a..7ca7ef2ba2d 100644 --- a/code/modules/events/wizard/petsplosion.dm +++ b/code/modules/events/wizard/petsplosion.dm @@ -5,7 +5,7 @@ GLOBAL_LIST_INIT(petsplosion_candidates, typecacheof(list( /mob/living/basic/carp/pet/cayenne, /mob/living/basic/chicken, /mob/living/basic/cow, - /mob/living/basic/giant_spider/sgt_araneus, + /mob/living/basic/spider/giant/sgt_araneus, /mob/living/basic/lizard, /mob/living/basic/mothroach, /mob/living/basic/mouse/brown/tom, diff --git a/code/modules/experisci/experiment/experiments.dm b/code/modules/experisci/experiment/experiments.dm index d8870cce058..ab971196092 100644 --- a/code/modules/experisci/experiment/experiments.dm +++ b/code/modules/experisci/experiment/experiments.dm @@ -142,15 +142,10 @@ experiment_proper = TRUE required_gas = /datum/gas/halon -// SKYRAT EDIT BEGIN - MATERIAL MEAT WAS REMOVED -// ORIGINAL: /datum/experiment/scanning/random/material/meat -/datum/experiment/scanning/random/material/silver +/datum/experiment/scanning/random/material/meat name = "Biological Material Scanning Experiment" -// ORIGINAL: description = "They told us we couldn't make chairs out of every material in the world. You're here to prove those nay-sayers wrong." - description = "Supposedly silver has an inert anti-microbial effect; scan a few samples to test this." -// ORIGINAL: possible_material_types = list(/datum/material/meat) - possible_material_types = list(/datum/material/silver) -// SKYRAT EDIT END - MATERIAL MEAT WAS REMOVED + description = "They told us we couldn't make chairs out of every material in the world. You're here to prove those nay-sayers wrong." + possible_material_types = list(/datum/material/meat) /datum/experiment/scanning/random/material/easy name = "Low Grade Material Scanning Experiment" @@ -189,7 +184,7 @@ /datum/experiment/scanning/random/plants/wild name = "Wild Biomatter Mutation Sample" - description = "Due to a number of reasons, (Solar Rays, a diet consisting only of unstable mutagen, entropy) plants with lower levels of instability may occasionally mutate with little reason. Scan one of these samples for us." + description = "Due to a number of reasons, (Solar Rays, a diet consisting only of unstable mutagen, entropy) plants with lower levels of instability may occasionally mutate upon harvest. Scan one of these samples for us." performance_hint = "\"Wild\" mutations have been recorded to occur above 30 points of instability, while species mutations occur above 60 points of instability." total_requirement = 1 diff --git a/code/modules/explorer_drone/exodrone.dm b/code/modules/explorer_drone/exodrone.dm index d2ddc6d2535..567d5a93412 100644 --- a/code/modules/explorer_drone/exodrone.dm +++ b/code/modules/explorer_drone/exodrone.dm @@ -418,8 +418,9 @@ GLOBAL_LIST_EMPTY(exodrone_launchers) playsound(src,'sound/effects/podwoosh.ogg',50, FALSE) do_smoke(1, holder = src, location = get_turf(src)) -/obj/machinery/exodrone_launcher/handle_atom_del(atom/A) - if(A == fuel_canister) +/obj/machinery/exodrone_launcher/Exited(atom/movable/gone, direction) + . = ..() + if(gone == fuel_canister) fuel_canister = null update_icon() diff --git a/code/modules/fishing/aquarium/aquarium.dm b/code/modules/fishing/aquarium/aquarium.dm index 8d6baa732e5..7b50d13c61f 100644 --- a/code/modules/fishing/aquarium/aquarium.dm +++ b/code/modules/fishing/aquarium/aquarium.dm @@ -150,12 +150,12 @@ if(istype(item, /obj/item/fish_feed)) if(!item.reagents.total_volume) - to_chat(user, span_warning("[item] is empty.")) + balloon_alert(user, "[item] is empty!") return TRUE var/list/fishes = get_fishes() for(var/obj/item/fish/fish as anything in fishes) fish.feed(item.reagents) - to_chat(user, span_notice("You feed the fish.")) + balloon_alert(user, "fed the fish") return TRUE return ..() diff --git a/code/modules/fishing/aquarium/aquarium_kit.dm b/code/modules/fishing/aquarium/aquarium_kit.dm index 2279b1c4ad3..cba44721e3a 100644 --- a/code/modules/fishing/aquarium/aquarium_kit.dm +++ b/code/modules/fishing/aquarium/aquarium_kit.dm @@ -45,7 +45,7 @@ var/fluid_type /obj/item/storage/fish_case/random/get_fish_type() - return random_fish_type(required_fluid = fluid_type) + return random_fish_type(fluid_type) /obj/item/storage/fish_case/random/freshwater fluid_type = AQUARIUM_FLUID_FRESHWATER diff --git a/code/modules/fishing/fish/_fish.dm b/code/modules/fishing/fish/_fish.dm index a5149b29e3d..21585a07546 100644 --- a/code/modules/fishing/fish/_fish.dm +++ b/code/modules/fishing/fish/_fish.dm @@ -64,8 +64,6 @@ /// Should this fish type show in fish catalog var/show_in_catalog = TRUE - /// Should this fish spawn in random fish cases - var/available_in_random_cases = TRUE /// How rare this fish is in the random cases var/random_case_rarity = FISH_RARITY_BASIC @@ -117,16 +115,27 @@ */ var/list/disliked_bait = list() - /// Size in centimeters. Item size class scales with it. - var/size = 50 + /// Size in centimeters. Null until update_size_and_weight is called. Number of fillets and w_class scale with it. + var/size /// Average size for this fish type in centimeters. Will be used as gaussian distribution with 20% deviation for fishing, bought fish are always standard size var/average_size = 50 - /// Weight in grams. number of fillets and grind results scale with it, just don't think too hard how someone could manage to fit a trout in a blender. - var/weight = 1000 + /// Weight in grams. Null until update_size_and_weight is called. Grind results scale with it. Don't think too hard how a trout could fit in a blender. + var/weight /// Average weight for this fish type in grams var/average_weight = 1000 + /// When outside of an aquarium, these gases that are checked (as well as pressure and temp) to assert if the environment is safe or not. + var/list/safe_air_limits = list( + /datum/gas/oxygen = list(12, 100), + /datum/gas/nitrogen, + /datum/gas/carbon_dioxide = list(0, 10), + /datum/gas/water_vapor, + ) + /// Outside of an aquarium, the pressure needs to be within these two variables for the environment to be safe. + var/min_pressure = WARNING_LOW_PRESSURE + var/max_pressure = HAZARD_HIGH_PRESSURE + /obj/item/fish/Initialize(mapload, apply_qualities = TRUE) . = ..() AddComponent(/datum/component/aquarium_content, PROC_REF(get_aquarium_animation), list(COMSIG_FISH_STATUS_CHANGED,COMSIG_FISH_STIRRED)) @@ -144,7 +153,7 @@ if(apply_qualities) apply_traits() //Make sure traits are applied before size and weight. - update_size_and_weight(first_run = TRUE) + update_size_and_weight() progenitors = full_capitalize(name) //default value register_evolutions() @@ -156,6 +165,19 @@ icon_state = initial(icon_state) return ..() +/obj/item/fish/attackby(obj/item/item, mob/living/user, params) + if(!istype(item, /obj/item/fish_feed)) + return ..() + if(!item.reagents.total_volume) + balloon_alert(user, "[item] is empty!") + return TRUE + if(status == FISH_DEAD) + balloon_alert(user, "[src] is dead!") + return TRUE + feed(item.reagents) + balloon_alert(user, "you feed [src]") + return TRUE + /obj/item/fish/examine(mob/user) . = ..() // All spacemen have magic eyes of fish weight perception until fish scale (get it?) is implemented. @@ -173,8 +195,8 @@ update_size_and_weight(new_size, new_weight, first_run) ///Updates weight and size, along with weight class, number of fillets you can get and grind results. -/obj/item/fish/proc/update_size_and_weight(new_size = average_size, new_weight = average_weight, first_run = FALSE) - if(!first_run && fillet_type) +/obj/item/fish/proc/update_size_and_weight(new_size = average_size, new_weight = average_weight) + if(size && fillet_type) RemoveElement(/datum/element/processable, TOOL_KNIFE, fillet_type, num_fillets, 0.5 SECONDS, screentip_verb = "Cut") size = new_size switch(size) @@ -199,7 +221,7 @@ num_fillets = amount AddElement(/datum/element/processable, TOOL_KNIFE, fillet_type, num_fillets, 0.5 SECONDS, screentip_verb = "Cut") - if(!first_run) + if(weight) for(var/reagent_type in grind_results) grind_results[reagent_type] /= FLOOR(weight/FISH_GRIND_RESULTS_WEIGHT_DIVISOR, 0.1) weight = new_weight @@ -383,18 +405,12 @@ var/datum/gas_mixture/mixture = loc.return_air() if(!mixture) return FALSE - var/static/list/gases_to_check = list( - /datum/gas/oxygen = list(12, 100), - /datum/gas/nitrogen, - /datum/gas/carbon_dioxide = list(0, 10), - /datum/gas/water_vapor, - ) - if(!check_gases(mixture.gases, gases_to_check)) + if(safe_air_limits && !check_gases(mixture.gases, safe_air_limits)) return FALSE if(!ISINRANGE(mixture.temperature, required_temperature_min, required_temperature_max)) return FALSE var/pressure = mixture.return_pressure() - if((pressure <= 20) || (pressure >= 550)) + if(!ISINRANGE(pressure, min_pressure, max_pressure)) return FALSE return TRUE @@ -580,21 +596,23 @@ flop_animation(src) /// Returns random fish, using random_case_rarity probabilities. -/proc/random_fish_type(case_fish_only=TRUE, required_fluid) +/proc/random_fish_type(required_fluid) var/static/probability_table - var/argkey = "fish_[required_fluid]_[case_fish_only]" //If this expands more extract bespoke element arg generation to some common helper. + var/argkey = "fish_[required_fluid]" //If this expands more extract bespoke element arg generation to some common helper. if(!probability_table || !probability_table[argkey]) if(!probability_table) probability_table = list() var/chance_table = list() for(var/_fish_type in subtypesof(/obj/item/fish)) var/obj/item/fish/fish = _fish_type + var/rarity = initial(fish.random_case_rarity) + if(!rarity) + continue if(required_fluid) var/init_fish_fluid_type = initial(fish.required_fluid_type) if(!compatible_fluid_type(init_fish_fluid_type, required_fluid)) continue - if(initial(fish.available_in_random_cases) || !case_fish_only) - chance_table[fish] = initial(fish.random_case_rarity) + chance_table[fish] = initial(fish.random_case_rarity) probability_table[argkey] = chance_table return pick_weight(probability_table[argkey]) diff --git a/code/modules/fishing/fish/chasm_detritus.dm b/code/modules/fishing/fish/chasm_detritus.dm index 0412936be20..9e686958536 100644 --- a/code/modules/fishing/fish/chasm_detritus.dm +++ b/code/modules/fishing/fish/chasm_detritus.dm @@ -5,12 +5,17 @@ /// No corpses (so there's still lobstrosities because they're the main threat with this). #define NO_CORPSES "no_corpses" -/// An object which should replace itself on initialisation with something which fell into a chasm. -/obj/item/chasm_detritus - name = "chasm detritus" - desc = "Abstract concept of an object which once fell into a deep hole." - icon = 'icons/obj/maintenance_loot.dmi' - icon_state = "skub" +///List containing chasm detritus singletons. +GLOBAL_LIST_INIT_TYPED(chasm_detritus_types, /datum/chasm_detritus, init_chasm_detritus()) + +/proc/init_chasm_detritus() + //as the name suggests, init_subtypes_w_path_keys doesn't init the prototype, so here we go. + var/list/glob_list = list() + glob_list[/datum/chasm_detritus] = new /datum/chasm_detritus + return init_subtypes_w_path_keys(/datum/chasm_detritus, glob_list) + +/// A datum that retrieves something which fell into a chasm. +/datum/chasm_detritus /// The chance (out of 100) to fish out something from `default_contents` /// even if there's something in GLOB.chasm_storage. var/default_contents_chance = 25 @@ -35,37 +40,28 @@ ), ) -/obj/item/chasm_detritus/Initialize(mapload) - . = ..() +/datum/chasm_detritus/proc/dispense_reward(turf/fishing_spot) if (prob(default_contents_chance)) - create_default_object() - return - RegisterSignal(src, COMSIG_ATOM_FISHING_REWARD, PROC_REF(find_chasm_contents)) + var/default_spawn = pick(default_contents[default_contents_key]) + return new default_spawn(fishing_spot) + return find_chasm_contents(fishing_spot) /// Returns the chosen detritus from the given list of things to choose from -/obj/item/chasm_detritus/proc/determine_detritus(list/chasm_stuff) +/datum/chasm_detritus/proc/determine_detritus(list/chasm_stuff) return pick(chasm_stuff) -/// Instantiates something in its place from the default_contents list. -/obj/item/chasm_detritus/proc/create_default_object() - var/contents_type = pick(default_contents[default_contents_key]) - new contents_type(get_turf(src)) - qdel(src) - /// Returns an objected which is currently inside of a nearby chasm. -/obj/item/chasm_detritus/proc/find_chasm_contents(datum/source, turf/fishing_spot) +/datum/chasm_detritus/proc/find_chasm_contents(datum/source, turf/fishing_spot) SIGNAL_HANDLER var/list/chasm_contents = get_chasm_contents(fishing_spot) if (!length(chasm_contents)) - create_default_object() - return + var/default_spawn = pick(default_contents[default_contents_key]) + return new default_spawn(fishing_spot) - var/atom/movable/detritus = determine_detritus(chasm_contents) - detritus.forceMove(get_turf(src)) - qdel(src) + return determine_detritus(chasm_contents) -/obj/item/chasm_detritus/proc/get_chasm_contents(turf/fishing_spot) +/datum/chasm_detritus/proc/get_chasm_contents(turf/fishing_spot) . = list() for (var/obj/effect/abstract/chasm_storage/storage in range(5, fishing_spot)) for (var/thing as anything in storage.contents) @@ -73,12 +69,12 @@ /// Variant of the chasm detritus that allows for an easier time at fishing out /// bodies, and sometimes less desireable monsters too. -/obj/item/chasm_detritus/restricted +/datum/chasm_detritus/restricted /// What type do we check for in the contents of the `/obj/effect/abstract/chasm_storage` /// contained in the `GLOB.chasm_storage` global list in `find_chasm_contents()`. var/chasm_storage_restricted_type = /obj -/obj/item/chasm_detritus/restricted/get_chasm_contents(turf/fishing_spot) +/datum/chasm_detritus/restricted/get_chasm_contents(turf/fishing_spot) . = list() for (var/obj/effect/abstract/chasm_storage/storage in range(5, fishing_spot)) for (var/thing as anything in storage.contents) @@ -86,24 +82,24 @@ continue . += thing -/obj/item/chasm_detritus/restricted/objects +/datum/chasm_detritus/restricted/objects default_contents_chance = 12.5 default_contents_key = NO_CORPSES -/obj/item/chasm_detritus/restricted/bodies +/datum/chasm_detritus/restricted/bodies default_contents_chance = 12.5 default_contents_key = BODIES_ONLY chasm_storage_restricted_type = /mob /// This also includes all mobs fallen into chasms, regardless of distance -/obj/item/chasm_detritus/restricted/bodies/get_chasm_contents(turf/fishing_spot) +/datum/chasm_detritus/restricted/bodies/get_chasm_contents(turf/fishing_spot) . = ..() . |= GLOB.chasm_fallen_mobs /// Body detritus is selected in favor of bodies belonging to sentient mobs /// The first sentient body found in the list of contents is returned, otherwise /// if none are sentient choose randomly. -/obj/item/chasm_detritus/restricted/bodies/determine_detritus(list/chasm_stuff) +/datum/chasm_detritus/restricted/bodies/determine_detritus(list/chasm_stuff) for(var/mob/fallen_mob as anything in chasm_stuff) if(fallen_mob.mind) return fallen_mob diff --git a/code/modules/fishing/fish/fish_evolution.dm b/code/modules/fishing/fish/fish_evolution.dm index ccdf50f9e0e..c04ef2c3079 100644 --- a/code/modules/fishing/fish/fish_evolution.dm +++ b/code/modules/fishing/fish/fish_evolution.dm @@ -1,12 +1,4 @@ -GLOBAL_LIST_INIT(fish_evolutions, init_fish_evolutions()) - -/proc/init_fish_evolutions() - . = list() - for(var/datum/fish_evolution/evolution as anything in subtypesof(/datum/fish_evolution)) - //Skip abstract types. - if(!initial(evolution.probability) || !initial(evolution.new_fish_type)) - continue - .[evolution] = new evolution +GLOBAL_LIST_INIT(fish_evolutions, init_subtypes_w_path_keys(/datum/fish_evolution, list())) /** * Fish evolution datums diff --git a/code/modules/fishing/fish/fish_traits.dm b/code/modules/fishing/fish/fish_traits.dm index fbebef8c2e2..6c7fb38e279 100644 --- a/code/modules/fishing/fish/fish_traits.dm +++ b/code/modules/fishing/fish/fish_traits.dm @@ -47,7 +47,7 @@ GLOBAL_LIST_INIT(fish_traits, init_subtypes_w_path_keys(/datum/fish_trait, list( . = ..() // Wary fish require transparent line or they're harder if(!rod.line || !(rod.line.fishing_line_traits & FISHING_LINE_CLOAKED)) - .[ADDITIVE_FISHING_MOD] = -FISH_TRAIT_MINOR_DIFFICULTY_BOOST + .[ADDITIVE_FISHING_MOD] += FISH_TRAIT_MINOR_DIFFICULTY_BOOST /datum/fish_trait/shiny_lover name = "Shiny Lover" @@ -57,7 +57,7 @@ GLOBAL_LIST_INIT(fish_traits, init_subtypes_w_path_keys(/datum/fish_trait, list( . = ..() // These fish are easier to catch with shiny lure if(rod.hook && rod.hook.fishing_hook_traits & FISHING_HOOK_SHINY) - .[ADDITIVE_FISHING_MOD] = FISH_TRAIT_MINOR_DIFFICULTY_BOOST + .[ADDITIVE_FISHING_MOD] -= FISH_TRAIT_MINOR_DIFFICULTY_BOOST /datum/fish_trait/picky_eater name = "Picky Eater" diff --git a/code/modules/fishing/fish/fish_types.dm b/code/modules/fishing/fish/fish_types.dm index 34c945241da..e8752acb1de 100644 --- a/code/modules/fishing/fish/fish_types.dm +++ b/code/modules/fishing/fish/fish_types.dm @@ -84,7 +84,6 @@ average_size = 30 average_weight = 500 stable_population = 4 - grind_results = list(/datum/reagent/blood = 20, /datum/reagent/consumable/liquidgibs = 2) fish_traits = list(/datum/fish_trait/picky_eater) evolution_types = list(/datum/fish_evolution/lubefish) compatible_types = list(/obj/item/fish/clownfish/lube) @@ -239,7 +238,17 @@ random_case_rarity = FISH_RARITY_RARE fillet_type = /obj/item/food/meat/slab/rawcrab required_temperature_min = MIN_AQUARIUM_TEMP+9 - required_temperature_max = MAX_AQUARIUM_TEMP+150 + required_temperature_max = LAVALAND_MAX_TEMPERATURE+50 + min_pressure = HAZARD_LOW_PRESSURE + safe_air_limits = list( + /datum/gas/oxygen = list(2, 100), + /datum/gas/nitrogen, + /datum/gas/carbon_dioxide = list(0, 20), + /datum/gas/water_vapor, + /datum/gas/plasma = list(0, 5), + /datum/gas/bz = list(0, 5), + /datum/gas/miasma = list(0, 5), + ) evolution_types = list(/datum/fish_evolution/ice_chrab) compatible_types = list(/obj/item/fish/chasm_crab/ice) @@ -248,7 +257,7 @@ desc = "A subspecies of chasm chrabs that has adapted to the cold climate and lack of abysmal holes of the icemoon." icon_state = "arctic_chrab" dedicated_in_aquarium_icon_state = "ice_chrab_small" - required_temperature_min = MIN_AQUARIUM_TEMP-150 + required_temperature_min = ICEBOX_MIN_TEMPERATURE-20 required_temperature_max = MIN_AQUARIUM_TEMP+15 evolution_types = list(/datum/fish_evolution/chasm_chrab) compatible_types = list(/obj/item/fish/chasm_crab) @@ -331,7 +340,7 @@ desc = "A misshapen, fragile, loosely fish-like living goop. This one has developed sexual reproduction mechanisms, and a purple tint to boot." icon_state = "sludgefish_purple" dedicated_in_aquarium_icon_state = "sludgefish_purple_small" - available_in_random_cases = FALSE + random_case_rarity = FISH_RARITY_NOPE random_case_rarity = FISH_RARITY_VERY_RARE fish_traits = list(/datum/fish_trait/parthenogenesis) @@ -343,7 +352,7 @@ dedicated_in_aquarium_icon_state = "slimefish_small" sprite_width = 7 sprite_height = 7 - do_flop_animation = FALSE //it already has our cute bouncy wiggle. :3 + do_flop_animation = FALSE //it already has a cute bouncy wiggle. :3 random_case_rarity = FISH_RARITY_VERY_RARE required_fluid_type = AQUARIUM_FLUID_ANADROMOUS stable_population = 4 @@ -374,6 +383,7 @@ fish_ai_type = FISH_AI_ZIPPY random_case_rarity = FISH_RARITY_GOOD_LUCK_FINDING_THIS required_fluid_type = AQUARIUM_FLUID_ANY_WATER + min_pressure = HAZARD_LOW_PRESSURE health = 150 stable_population = 3 grind_results = list(/datum/reagent/bone_dust = 20) @@ -397,10 +407,10 @@ sprite_width = 12 sprite_height = 7 show_in_catalog = FALSE - available_in_random_cases = FALSE - random_case_rarity = FISH_RARITY_GOOD_LUCK_FINDING_THIS + random_case_rarity = FISH_RARITY_NOPE fishing_difficulty_modifier = 5 required_fluid_type = AQUARIUM_FLUID_ANY_WATER + min_pressure = HAZARD_LOW_PRESSURE health = 300 stable_population = 2 //This means they can only crossbreed. grind_results = list(/datum/reagent/bone_dust = 15, /datum/reagent/consumable/liquidgibs = 5) @@ -418,7 +428,7 @@ desc = "A holographic representation of a common goldfish, slowly flickering out, removed from its holo-habitat." icon_state = "goldfish" show_in_catalog = FALSE - available_in_random_cases = FALSE + random_case_rarity = FISH_RARITY_NOPE sprite_width = 8 sprite_height = 8 stable_population = 1 @@ -427,7 +437,7 @@ required_fluid_type = AQUARIUM_FLUID_ANADROMOUS grind_results = null fillet_type = null - death_text = "%SRC disappears." + death_text = "%SRC gently disappears." fish_traits = list(/datum/fish_trait/no_mating) //just to be sure, these shouldn't reproduce /obj/item/fish/holo/Initialize(mapload) @@ -440,7 +450,8 @@ /obj/item/fish/holo/set_status(new_status) . = ..() if(status == FISH_DEAD) - qdel(src) + animate(src, alpha = 0, 3 SECONDS, easing = SINE_EASING) + QDEL_IN(src, 3 SECONDS) /obj/item/fish/holo/crab name = "holographic crab" diff --git a/code/modules/fishing/fish_catalog.dm b/code/modules/fishing/fish_catalog.dm index 962486d6d1d..d41b4657e50 100644 --- a/code/modules/fishing/fish_catalog.dm +++ b/code/modules/fishing/fish_catalog.dm @@ -28,7 +28,7 @@ fish_data["temp_max"] = initial(fish.required_temperature_max) fish_data["icon"] = sanitize_css_class_name("[initial(fish.icon)][initial(fish.icon_state)]") fish_data["color"] = initial(fish.color) - fish_data["source"] = initial(fish.available_in_random_cases) ? "[AQUARIUM_COMPANY] Fish Packs" : "Unknown" + fish_data["source"] = initial(fish.random_case_rarity) ? "[AQUARIUM_COMPANY] Fish Packs" : "Unknown" fish_data["size"] = initial(fish.average_size) fish_data["weight"] = initial(fish.average_weight) var/datum/reagent/food_type = initial(fish.food) @@ -64,10 +64,9 @@ . = list() //// Where can it be found - iterate fish sources, how should this handle key var/list/spot_descriptions = list() - for(var/datum/fish_source/fishing_spot_type as anything in subtypesof(/datum/fish_source)) - var/datum/fish_source/temp = new fishing_spot_type - if((fish_type in temp.fish_table) && temp.catalog_description) - spot_descriptions += temp.catalog_description + for(var/datum/fish_source/source as anything in GLOB.preset_fish_sources) + if(source.catalog_description && (fish_type in source.fish_table)) + spot_descriptions += source.catalog_description .["spots"] = english_list(spot_descriptions, nothing_text = "Unknown") ///Difficulty descriptor switch(initial(fishy.fishing_difficulty_modifier)) diff --git a/code/modules/fishing/fishing_equipment.dm b/code/modules/fishing/fishing_equipment.dm index 0a5e697e271..43a79106356 100644 --- a/code/modules/fishing/fishing_equipment.dm +++ b/code/modules/fishing/fishing_equipment.dm @@ -63,7 +63,7 @@ /// icon state added to main rod icon when this hook is equipped var/rod_overlay_icon_state = "hook_overlay" /// What subtype of `/obj/item/chasm_detritus` do we fish out of chasms? Defaults to `/obj/item/chasm_detritus`. - var/chasm_detritus_type = /obj/item/chasm_detritus + var/chasm_detritus_type = /datum/chasm_detritus /** @@ -100,7 +100,7 @@ desc = "Won't make catching fish any easier, but it might help with looking for other things." icon_state = "treasure" rod_overlay_icon_state = "hook_treasure_overlay" - chasm_detritus_type = /obj/item/chasm_detritus/restricted/objects + chasm_detritus_type = /datum/chasm_detritus/restricted/objects /obj/item/fishing_hook/magnet/get_hook_bonus_multiplicative(fish_type, datum/fish_source/source) @@ -129,7 +129,7 @@ desc = "An unwieldy hook meant to help with the rescue of those that have fallen down in chasms. You can tell there's no way you'll catch any fish with this, and that it won't be of any use outside of chasms." icon_state = "rescue" rod_overlay_icon_state = "hook_rescue_overlay" - chasm_detritus_type = /obj/item/chasm_detritus/restricted/bodies + chasm_detritus_type = /datum/chasm_detritus/restricted/bodies // This hook can only fish in chasms. @@ -169,11 +169,11 @@ /obj/item/fishing_hook/stabilized/examine(mob/user) . = ..() - . += span_notice("While fishing, you can press the Ctrl key down to move the bait down, rather than up.") + . += span_notice("While fishing, you can hold the Ctrl key to move the bait down, rather than up.") /obj/item/fishing_hook/jaws name = "jawed hook" - desc = "Despite hints of rust, this gritty beartrap-like hook hybrid manages to look even more threating than the real thing. May neptune have mercy of whatever is caught by its jaws." + desc = "Despite hints of rust, this gritty beartrap-like hook hybrid manages to look even more threating than the real thing. May neptune have mercy of whatever gets caught in its jaws." icon_state = "jaws" fishing_hook_traits = FISHING_HOOK_NO_ESCAPE|FISHING_HOOK_ENSNARE|FISHING_HOOK_KILL rod_overlay_icon_state = "hook_jaws_overlay" @@ -197,6 +197,18 @@ new /obj/item/fishing_hook(src) new /obj/item/fishing_line(src) +/obj/item/storage/toolbox/fishing/small + name = "compact fishing toolbox" + desc = "Contains everything you need for your fishing trip. Except for the bait." + w_class = WEIGHT_CLASS_NORMAL + force = 5 + throwforce = 5 + +/obj/item/storage/toolbox/fishing/small/PopulateContents() + new /obj/item/fishing_rod(src) + new /obj/item/fishing_hook(src) + new /obj/item/fishing_line(src) + /obj/item/storage/box/fishing_hooks name = "fishing hook set" diff --git a/code/modules/fishing/fishing_minigame.dm b/code/modules/fishing/fishing_minigame.dm index 55d6411cf10..d1b77e4ec0a 100644 --- a/code/modules/fishing/fishing_minigame.dm +++ b/code/modules/fishing/fishing_minigame.dm @@ -161,7 +161,7 @@ if(win) if(reward_path != FISHING_DUD) playsound(lure, 'sound/effects/bigsplash.ogg', 100) - SEND_SIGNAL(src, COMSIG_FISHING_CHALLENGE_COMPLETED, user, win, perfect_win) + SEND_SIGNAL(src, COMSIG_FISHING_CHALLENGE_COMPLETED, user, win) qdel(src) /datum/fishing_challenge/proc/start_baiting_phase() @@ -258,7 +258,7 @@ switch(action) if("win") - complete(win = TRUE, perfect_win = params["perfect"]) + complete(win = TRUE) if("lose") send_alert("it got away") complete(win = FALSE) diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm index a6f623353f4..cc873036d08 100644 --- a/code/modules/fishing/fishing_rod.dm +++ b/code/modules/fishing/fishing_rod.dm @@ -268,16 +268,15 @@ var/line_color = line?.line_color || default_line_color /// Line part by the rod, always visible var/mutable_appearance/reel_appearance = mutable_appearance(icon, reel_overlay) - reel_appearance.color = line_color; + reel_appearance.color = line_color . += reel_appearance // Line & hook is also visible when only bait is equipped but it uses default appearances then if(hook || bait) var/mutable_appearance/line_overlay = mutable_appearance(icon, "line_overlay") - line_overlay.color = line_color; + line_overlay.color = line_color . += line_overlay - var/mutable_appearance/hook_overlay = mutable_appearance(icon, hook?.rod_overlay_icon_state || "hook_overlay") - . += hook_overlay + . += hook?.rod_overlay_icon_state || "hook_overlay" if(bait) var/bait_state = "worm_overlay" //default to worm overlay for anything without specific one @@ -512,7 +511,7 @@ name = "master fishing rod" desc = "The mythical rod of a lost fisher king. Said to be imbued with un-paralleled fishing power. There's writing on the back of the pole. \"中国航天制造\"" difficulty_modifier = -10 - ui_description = "This rods makes fishing easy even for an absolute beginner." + ui_description = "This rod makes fishing easy even for an absolute beginner." icon_state = "fishing_rod_master" reel_overlay = "reel_master" active_force = 13 //It's that sturdy diff --git a/code/modules/fishing/sources/_fish_source.dm b/code/modules/fishing/sources/_fish_source.dm index 11aa87d96a0..13d2fa6c687 100644 --- a/code/modules/fishing/sources/_fish_source.dm +++ b/code/modules/fishing/sources/_fish_source.dm @@ -1,26 +1,9 @@ -/// Keyed list of preset sources to configuration instance -GLOBAL_LIST_INIT(preset_fish_sources,init_fishing_configurations()) +GLOBAL_LIST_INIT(preset_fish_sources, init_subtypes_w_path_keys(/datum/fish_source, list())) -/// These are shared between their spots -/proc/init_fishing_configurations() - . = list() - - var/datum/fish_source/ocean/beach/beach_preset = new - .[FISHING_SPOT_PRESET_BEACH] = beach_preset - - var/datum/fish_source/lavaland/lava_preset = new - .[FISHING_SPOT_PRESET_LAVALAND_LAVA] = lava_preset - - var/datum/fish_source/lavaland/icemoon/plasma_preset = new - .[FISHING_SPOT_PRESET_ICEMOON_PLASMA] = plasma_preset - - var/datum/fish_source/chasm/chasm_preset = new - .[FISHING_SPOT_PRESET_CHASM] = chasm_preset - - var/datum/fish_source/toilet/toilet_preset = new - .[FISHING_SPOT_PRESET_TOILET] = toilet_preset - -/// Where the fish actually come from - every fishing spot has one assigned but multiple fishing holes can share single source, ie single shared one for ocean/lavaland river +/** + * Where the fish actually come from - every fishing spot has one assigned but multiple fishing holes + * can share single source, ie single shared one for ocean/lavaland river + */ /datum/fish_source /// Fish catch weight table - these are relative weights var/list/fish_table = list() @@ -39,11 +22,28 @@ GLOBAL_LIST_INIT(preset_fish_sources,init_fishing_configurations()) /datum/fish_source/proc/reason_we_cant_fish(obj/item/fishing_rod/rod, mob/fisherman) return rod.reason_we_cant_fish(src) - -/// DIFFICULTY = (SPOT_BASE_VALUE + FISH_MODIFIER + ROD_MODIFIER + FAV/DISLIKED_BAIT_MODIFIER + TRAITS_ADDITIVE) * TRAITS_MULTIPLICATIVE , For non-fish it's just SPOT_BASE_VALUE +/** + * Calculates the difficulty of the minigame: + * + * This includes the source's fishing difficulty, that of the fish, the rod, + * favorite and disliked baits, fish traits and the fisherman skill. + * + * For non-fish, it's just the source's fishing difficulty minus the fisherman skill, rod and settler modifiers. + */ /datum/fish_source/proc/calculate_difficulty(result, obj/item/fishing_rod/rod, mob/fisherman, datum/fishing_challenge/challenge) . = fishing_difficulty + // Difficulty modifier added by having the Settler quirk + if(HAS_TRAIT(fisherman, TRAIT_SETTLER)) + . += SETTLER_DIFFICULTY_MOD + + // Difficulty modifier added by the fisher's skill level + if(!challenge || !(FISHING_MINIGAME_RULE_NO_EXP in challenge.special_effects)) + . += fisherman.mind?.get_skill_modifier(/datum/skill/fishing, SKILL_VALUE_MODIFIER) + + // Difficulty modifier added by the rod + . += rod.difficulty_modifier + if(!ispath(result,/obj/item/fish)) // In the future non-fish rewards can have variable difficulty calculated here return @@ -52,7 +52,7 @@ GLOBAL_LIST_INIT(preset_fish_sources,init_fishing_configurations()) var/obj/item/fish/caught_fish = result // Baseline fish difficulty . += initial(caught_fish.fishing_difficulty_modifier) - . += rod.difficulty_modifier + if(rod.bait) var/obj/item/bait = rod.bait @@ -67,9 +67,6 @@ GLOBAL_LIST_INIT(preset_fish_sources,init_fishing_configurations()) if(is_matching_bait(bait, bait_identifer)) . += DISLIKED_BAIT_DIFFICULTY_MOD - if(!challenge || !(FISHING_MINIGAME_RULE_NO_EXP in challenge.special_effects)) - . += fisherman.mind?.get_skill_modifier(/datum/skill/fishing, SKILL_VALUE_MODIFIER) - // Matching/not matching fish traits and equipment var/list/fish_traits = fish_list_properties[caught_fish][NAMEOF(caught_fish, fish_traits)] @@ -103,7 +100,7 @@ GLOBAL_LIST_INIT(preset_fish_sources,init_fishing_configurations()) * Proc called when the COMSIG_FISHING_CHALLENGE_COMPLETED signal is sent. * Check if we've succeeded. If so, write into memory and dispense the reward. */ -/datum/fish_source/proc/on_challenge_completed(datum/fishing_challenge/source, mob/user, success, perfect) +/datum/fish_source/proc/on_challenge_completed(datum/fishing_challenge/source, mob/user, success) SIGNAL_HANDLER SHOULD_CALL_PARENT(TRUE) if(!success) @@ -115,31 +112,34 @@ GLOBAL_LIST_INIT(preset_fish_sources,init_fishing_configurations()) source.used_rod?.consume_bait(reward) /// Gives out the reward if possible -/datum/fish_source/proc/dispense_reward(reward_path, mob/fisherman, fishing_spot) +/datum/fish_source/proc/dispense_reward(reward_path, mob/fisherman, turf/fishing_spot) if((reward_path in fish_counts)) // This is limited count result - if(fish_counts[reward_path] > 0) - fish_counts[reward_path] -= 1 - else - reward_path = FISHING_DUD //Ran out of these since rolling (multiple fishermen on same source most likely) - var/atom/movable/reward - if(ispath(reward_path)) - reward = new reward_path(get_turf(fisherman)) - if(ispath(reward_path,/obj/item)) - if(ispath(reward_path,/obj/item/fish)) - var/obj/item/fish/caught_fish = reward - caught_fish.randomize_size_and_weight() - //fish caught signal if needed goes here and/or fishing achievements - //Try to put it in hand - INVOKE_ASYNC(fisherman, TYPE_PROC_REF(/mob, put_in_hands), reward) - fisherman.balloon_alert(fisherman, "caught [reward]!") - else //If someone adds fishing out carp/chests/singularities or whatever just plop it down on the fisher's turf - fisherman.balloon_alert(fisherman, "caught something!") - else if (reward_path == FISHING_DUD) - //baloon alert instead + fish_counts[reward_path] -= 1 + if(!fish_counts[reward_path]) + fish_counts -= reward_path //Ran out of these since rolling (multiple fishermen on same source most likely) + + var/atom/movable/reward = spawn_reward(reward_path, fisherman, fishing_spot) + if(!reward) //baloon alert instead fisherman.balloon_alert(fisherman,pick(duds)) + return + if(isitem(reward)) //Try to put it in hand + INVOKE_ASYNC(fisherman, TYPE_PROC_REF(/mob, put_in_hands), reward) + fisherman.balloon_alert(fisherman, "caught [reward]!") SEND_SIGNAL(fisherman, COMSIG_MOB_FISHING_REWARD_DISPENSED, reward) - if(reward) - SEND_SIGNAL(reward, COMSIG_ATOM_FISHING_REWARD, fishing_spot) + return reward + +/// Spawns a reward from a atom path right where the fisherman is. Part of the dispense_reward() logic. +/datum/fish_source/proc/spawn_reward(reward_path, mob/fisherman, turf/fishing_spot) + if(reward_path == FISHING_DUD) + return + if(ispath(reward_path, /datum/chasm_detritus)) + return GLOB.chasm_detritus_types[reward_path].dispense_reward(fishing_spot) + if(!ispath(reward_path, /atom/movable)) + CRASH("Unsupported /datum path [reward_path] passed to fish_source/proc/spawn_reward()") + var/atom/movable/reward = new reward_path(get_turf(fisherman)) + if(isfish(reward)) + var/obj/item/fish/caught_fish = reward + caught_fish.randomize_size_and_weight() return reward /// Cached fish list properties so we don't have to initalize fish every time, init deffered @@ -190,8 +190,7 @@ GLOBAL_LIST(fishing_property_cache) final_table[result] *= rod.multiplicative_fish_bonus(result, src) final_table[result] += rod.additive_fish_bonus(result, src) //Decide on order here so it can be multiplicative - if(result == FISHING_DUD) - else if(ispath(result, /obj/item/fish)) + if(ispath(result, /obj/item/fish)) //Modify fish roll chance var/obj/item/fish/caught_fish = result @@ -214,7 +213,7 @@ GLOBAL_LIST(fishing_property_cache) if(is_matching_bait(bait, bait_identifer)) final_table[result] = round(final_table[result] * 0.5, 1) else - final_table[result] *= round(final_table[result] * 0.15, 1) //Fishing without bait is not going to be easy + final_table[result] = round(final_table[result] * 0.15, 1) //Fishing without bait is not going to be easy // Apply fish trait modifiers var/list/fish_traits = fish_list_properties[caught_fish][NAMEOF(caught_fish, fish_traits)] diff --git a/code/modules/fishing/sources/source_types.dm b/code/modules/fishing/sources/source_types.dm index 206d159414a..77c95f6dca6 100644 --- a/code/modules/fishing/sources/source_types.dm +++ b/code/modules/fishing/sources/source_types.dm @@ -23,14 +23,13 @@ /obj/item/fish/guppy = 10, ) catalog_description = "Fish dimension (Fishing portal generator)" - /datum/fish_source/chasm catalog_description = "Chasm depths" background = "fishing_background_lavaland" fish_table = list( FISHING_DUD = 5, /obj/item/fish/chasm_crab = 15, - /obj/item/chasm_detritus = 30, + /datum/chasm_detritus = 30, ) fishing_difficulty = FISHING_DEFAULT_DIFFICULTY + 5 @@ -38,7 +37,7 @@ /datum/fish_source/chasm/roll_reward(obj/item/fishing_rod/rod, mob/fisherman) var/rolled_reward = ..() - if(!rod.hook || !ispath(rolled_reward, /obj/item/chasm_detritus)) + if(!rod.hook || !ispath(rolled_reward, /datum/chasm_detritus)) return rolled_reward return rod.hook.chasm_detritus_type @@ -130,7 +129,7 @@ if(!istype(get_area(user), /area/station/holodeck)) interrupt_challenge("exited holodeck") -/datum/fish_source/holographic/on_challenge_completed(datum/fishing_challenge/source, mob/user, success, perfect) +/datum/fish_source/holographic/on_challenge_completed(datum/fishing_challenge/source, mob/user, success) . = ..() UnregisterSignal(user, COMSIG_MOVABLE_MOVED) diff --git a/code/modules/food_and_drinks/machinery/coffeemaker.dm b/code/modules/food_and_drinks/machinery/coffeemaker.dm index 122b2325b0f..ff6d3fd0c8a 100644 --- a/code/modules/food_and_drinks/machinery/coffeemaker.dm +++ b/code/modules/food_and_drinks/machinery/coffeemaker.dm @@ -56,11 +56,13 @@ return ..() /obj/machinery/coffeemaker/Exited(atom/movable/gone, direction) + . = ..() if(gone == coffeepot) coffeepot = null + update_appearance(UPDATE_OVERLAYS) if(gone == cartridge) cartridge = null - return ..() + update_appearance(UPDATE_OVERLAYS) /obj/machinery/coffeemaker/RefreshParts() . = ..() @@ -139,14 +141,6 @@ /obj/machinery/coffeemaker/attack_ai_secondary(mob/user, list/modifiers) return attack_hand_secondary(user, modifiers) -/obj/machinery/coffeemaker/handle_atom_del(atom/A) - . = ..() - if(A == coffeepot) - coffeepot = null - if(A == cartridge) - cartridge = null - update_appearance(UPDATE_OVERLAYS) - /obj/machinery/coffeemaker/update_overlays() . = ..() . += overlay_checks() @@ -527,13 +521,6 @@ QDEL_NULL(coffee) return ..() -/obj/machinery/coffeemaker/impressa/Exited(atom/movable/gone, direction) - if(gone == coffeepot) - coffeepot = null - if(gone == coffee) - coffee = null - return ..() - /obj/machinery/coffeemaker/impressa/examine(mob/user) . = ..() if(coffee) @@ -571,13 +558,11 @@ . += "grinder_full" return . -/obj/machinery/coffeemaker/impressa/handle_atom_del(atom/A) +/obj/machinery/coffeemaker/impressa/Exited(atom/movable/gone, direction) . = ..() - if(A == coffeepot) - coffeepot = null - if(A == coffee) - coffee.Cut() - update_appearance(UPDATE_OVERLAYS) + if(gone in coffee) + coffee -= gone + update_appearance(UPDATE_OVERLAYS) /obj/machinery/coffeemaker/impressa/try_brew() if(coffee_amount <= 0) diff --git a/code/modules/food_and_drinks/machinery/deep_fryer.dm b/code/modules/food_and_drinks/machinery/deep_fryer.dm index 0019dd7f870..4b5689383d6 100644 --- a/code/modules/food_and_drinks/machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/machinery/deep_fryer.dm @@ -155,11 +155,6 @@ GLOBAL_LIST_INIT(oilfry_blacklisted_items, typecacheof(list( if(gone == frying) reset_frying() -/obj/machinery/deepfryer/handle_atom_del(atom/deleting_atom) - . = ..() - if(deleting_atom == frying) - reset_frying() - /obj/machinery/deepfryer/proc/reset_frying() if(!QDELETED(frying)) frying.AddElement(/datum/element/fried_item, cook_time) diff --git a/code/modules/food_and_drinks/machinery/grill.dm b/code/modules/food_and_drinks/machinery/grill.dm index 0bf9aa91303..2ca81f36f90 100644 --- a/code/modules/food_and_drinks/machinery/grill.dm +++ b/code/modules/food_and_drinks/machinery/grill.dm @@ -96,15 +96,10 @@ grilled_item.AddComponent(/datum/component/sizzle) /obj/machinery/grill/Exited(atom/movable/gone, direction) + . = ..() if(gone == grilled_item) finish_grill() grilled_item = null - return ..() - -/obj/machinery/grill/handle_atom_del(atom/A) - if(A == grilled_item) - grilled_item = null - return ..() /obj/machinery/grill/wrench_act(mob/living/user, obj/item/I) . = ..() @@ -131,7 +126,7 @@ return ..() /obj/machinery/grill/proc/finish_grill() - if(grilled_item) + if(!QDELETED(grilled_item)) if(grill_time >= 20) grilled_item.AddElement(/datum/element/grilled_item, grill_time) UnregisterSignal(grilled_item, COMSIG_ITEM_GRILLED) diff --git a/code/modules/food_and_drinks/machinery/microwave.dm b/code/modules/food_and_drinks/machinery/microwave.dm index 334573ad032..36d98c907a5 100644 --- a/code/modules/food_and_drinks/machinery/microwave.dm +++ b/code/modules/food_and_drinks/machinery/microwave.dm @@ -148,11 +148,10 @@ for (var/atom/movable/ingredient as anything in ingredients) var/image/ingredient_overlay = image(ingredient, src) - var/icon/ingredient_icon = icon(ingredient.icon, ingredient.icon_state) - + var/list/icon_dimensions = get_icon_dimensions(ingredient.icon) ingredient_overlay.transform = ingredient_overlay.transform.Scale( - MICROWAVE_INGREDIENT_OVERLAY_SIZE / ingredient_icon.Width(), - MICROWAVE_INGREDIENT_OVERLAY_SIZE / ingredient_icon.Height(), + MICROWAVE_INGREDIENT_OVERLAY_SIZE / icon_dimensions["width"], + MICROWAVE_INGREDIENT_OVERLAY_SIZE / icon_dimensions["height"], ) ingredient_overlay.pixel_y = -4 diff --git a/code/modules/food_and_drinks/machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/machinery/monkeyrecycler.dm index 71039e9019b..5bb772c7398 100644 --- a/code/modules/food_and_drinks/machinery/monkeyrecycler.dm +++ b/code/modules/food_and_drinks/machinery/monkeyrecycler.dm @@ -99,5 +99,5 @@ GLOBAL_LIST_EMPTY(monkey_recyclers) . = ..() if(istype(I)) to_chat(user, span_notice("You log [src] in the multitool's buffer.")) - I.buffer = src + I.set_buffer(src) return TRUE diff --git a/code/modules/food_and_drinks/machinery/smartfridge.dm b/code/modules/food_and_drinks/machinery/smartfridge.dm index 74fce5c4002..33012584015 100644 --- a/code/modules/food_and_drinks/machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/machinery/smartfridge.dm @@ -349,7 +349,8 @@ .["name"] = name .["isdryer"] = FALSE -/obj/machinery/smartfridge/handle_atom_del(atom/A) // Update the UIs in case something inside gets deleted +/obj/machinery/smartfridge/Exited(atom/movable/gone, direction) // Update the UIs in case something inside is removed + . = ..() SStgui.update_uis(src) /obj/machinery/smartfridge/ui_act(action, params) diff --git a/code/modules/food_and_drinks/machinery/stove.dm b/code/modules/food_and_drinks/machinery/stove.dm index 7559793ea48..38f98cfa8a8 100644 --- a/code/modules/food_and_drinks/machinery/stove.dm +++ b/code/modules/food_and_drinks/machinery/stove.dm @@ -180,11 +180,18 @@ // Clearing reagents Will do this for us already, but if we have no reagents this is a failsafe dump_ingredients() -/obj/item/reagent_containers/cup/soup_pot/proc/dump_ingredients(atom/drop_loc = drop_location()) +/** + * Dumps all inside ingredients to a spot + * + * * drop_loc - Where to drop the ingredients, defaults to drop loc + * * x_offset - How much pixel X offset to give every ingredient, if not set will be random + * * y_offset - How much pixel Y offset to give every ingredient, if not set will be random + */ +/obj/item/reagent_containers/cup/soup_pot/proc/dump_ingredients(atom/drop_loc = drop_location(), x_offset, y_offset) for(var/obj/item/ingredient as anything in added_ingredients) ingredient.forceMove(drop_loc) - ingredient.pixel_x += rand(-4, 4) - ingredient.pixel_y += rand(-4, 4) + ingredient.pixel_x += (isnum(x_offset) ? x_offset : rand(-4, 4)) + ingredient.pixel_y += (isnum(y_offset) ? x_offset : rand(-4, 4)) ingredient.SpinAnimation(loops = 1) update_appearance(UPDATE_OVERLAYS) diff --git a/code/modules/food_and_drinks/recipes/drinks/drinks_alcoholic.dm b/code/modules/food_and_drinks/recipes/drinks/drinks_alcoholic.dm index 561a4275620..da2d6f1f71a 100644 --- a/code/modules/food_and_drinks/recipes/drinks/drinks_alcoholic.dm +++ b/code/modules/food_and_drinks/recipes/drinks/drinks_alcoholic.dm @@ -586,3 +586,78 @@ mix_message = "Arcs of lightning fly from the mixture." mix_sound = 'sound/weapons/zapbang.ogg' +/datum/chemical_reaction/drink/yuyakita + results = list(/datum/reagent/consumable/ethanol/yuyakita = 4) + required_reagents = list(/datum/reagent/consumable/ethanol/tequila = 2, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/ethanol/yuyake = 1) + +/datum/chemical_reaction/drink/saibasan + results = list(/datum/reagent/consumable/ethanol/saibasan = 10) + required_reagents = list(/datum/reagent/consumable/ethanol/shochu = 2, /datum/reagent/consumable/ethanol/yuyake = 2, /datum/reagent/consumable/triple_citrus = 3, /datum/reagent/consumable/cherryjelly = 3) + +/datum/chemical_reaction/drink/banzai_ti + results = list(/datum/reagent/consumable/ethanol/banzai_ti = 10) + required_reagents = list(/datum/reagent/consumable/ethanol/yuyake = 1, /datum/reagent/consumable/ethanol/triple_sec = 1, /datum/reagent/consumable/ethanol/gin = 1, /datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/ethanol/tequila = 1, /datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/triple_citrus = 2, /datum/reagent/consumable/sodawater = 2) + +/datum/chemical_reaction/drink/sanraizusoda + results = list(/datum/reagent/consumable/ethanol/sanraizusoda = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/yuyake = 1, /datum/reagent/consumable/sodawater = 2, /datum/reagent/consumable/ice = 1, /datum/reagent/consumable/cream = 1) + +/datum/chemical_reaction/drink/kumicho + results = list(/datum/reagent/consumable/ethanol/kumicho = 4) + required_reagents = list(/datum/reagent/consumable/ethanol/godfather = 2, /datum/reagent/consumable/ethanol/shochu = 1, /datum/reagent/consumable/ethanol/bitters = 1) + +/datum/chemical_reaction/drink/red_planet + results = list(/datum/reagent/consumable/ethanol/red_planet = 8) + required_reagents = list(/datum/reagent/consumable/ethanol/shochu = 2, /datum/reagent/consumable/ethanol/triple_sec = 2, /datum/reagent/consumable/ethanol/vermouth = 2, /datum/reagent/consumable/grenadine = 1, /datum/reagent/consumable/ethanol/bitters = 1) + +/datum/chemical_reaction/drink/amaterasu + results = list(/datum/reagent/consumable/ethanol/amaterasu = 10) + required_reagents = list(/datum/reagent/consumable/ethanol/shochu = 1, /datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/grenadine = 1, /datum/reagent/consumable/berryjuice = 2, /datum/reagent/consumable/sodawater = 5) + +/datum/chemical_reaction/drink/nekomimosa + results = list(/datum/reagent/consumable/ethanol/nekomimosa = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/yuyake = 2, /datum/reagent/consumable/watermelonjuice = 2, /datum/reagent/consumable/ethanol/champagne = 1) + +/datum/chemical_reaction/drink/sentai_quencha + results = list(/datum/reagent/consumable/ethanol/sentai_quencha = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/shochu = 1, /datum/reagent/consumable/ethanol/curacao = 1, /datum/reagent/consumable/triple_citrus = 1, /datum/reagent/consumable/melon_soda = 2) + +/datum/chemical_reaction/drink/bosozoku + results = list(/datum/reagent/consumable/ethanol/bosozoku = 2) + required_reagents = list(/datum/reagent/consumable/ethanol/rice_beer = 1, /datum/reagent/consumable/lemonade = 1) + +/datum/chemical_reaction/drink/ersatzche + results = list(/datum/reagent/consumable/ethanol/ersatzche = 10) + required_reagents = list(/datum/reagent/consumable/ethanol/rice_beer = 5, /datum/reagent/consumable/pineapplejuice = 3, /datum/reagent/consumable/capsaicin = 1, /datum/reagent/consumable/sugar = 1) + +/datum/chemical_reaction/drink/red_city_am + results = list(/datum/reagent/consumable/ethanol/red_city_am = 10) + required_reagents = list(/datum/reagent/consumable/ethanol/rice_beer = 5, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/red_bay = 1, /datum/reagent/consumable/soysauce = 1, /datum/reagent/consumable/tomatojuice = 2) + +/datum/chemical_reaction/drink/kings_ransom + results = list(/datum/reagent/consumable/ethanol/kings_ransom = 10) + required_reagents = list(/datum/reagent/consumable/ethanol/rice_beer = 5, /datum/reagent/consumable/ethanol/gin = 2, /datum/reagent/consumable/berryjuice = 2, /datum/reagent/consumable/ethanol/bitters = 1) + +/datum/chemical_reaction/drink/four_bit + results = list(/datum/reagent/consumable/ethanol/four_bit = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/hakka_mate = 2, /datum/reagent/consumable/limejuice = 1) + +/datum/chemical_reaction/drink/white_hawaiian + results = list(/datum/reagent/consumable/ethanol/white_hawaiian = 4) + required_reagents = list(/datum/reagent/consumable/ethanol/kahlua = 1, /datum/reagent/consumable/ethanol/coconut_rum = 1, /datum/reagent/consumable/coconut_milk = 2) + +/datum/chemical_reaction/drink/maui_sunrise + results = list(/datum/reagent/consumable/ethanol/maui_sunrise = 10) + required_reagents = list(/datum/reagent/consumable/ethanol/coconut_rum = 2, /datum/reagent/consumable/pineapplejuice = 2, /datum/reagent/consumable/ethanol/yuyake = 1, /datum/reagent/consumable/triple_citrus = 1, /datum/reagent/consumable/lemon_lime = 4) + +/datum/chemical_reaction/drink/imperial_mai_tai + results = list(/datum/reagent/consumable/ethanol/imperial_mai_tai = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/navy_rum = 1, /datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/ethanol/triple_sec = 1, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/korta_nectar = 1) + +/datum/chemical_reaction/drink/konococo_rumtini + results = list(/datum/reagent/consumable/ethanol/konococo_rumtini = 10) + required_reagents = list(/datum/reagent/consumable/ethanol/coconut_rum = 2, /datum/reagent/consumable/ethanol/kahlua = 3, /datum/reagent/consumable/coffee = 3, /datum/reagent/consumable/sugar = 2) + +/datum/chemical_reaction/drink/blue_hawaiian + results = list(/datum/reagent/consumable/ethanol/blue_hawaiian = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/coconut_rum = 2, /datum/reagent/consumable/pineapplejuice = 1, /datum/reagent/consumable/lemonjuice = 1, /datum/reagent/consumable/ethanol/curacao = 1) diff --git a/code/modules/food_and_drinks/recipes/drinks/drinks_non-alcoholic.dm b/code/modules/food_and_drinks/recipes/drinks/drinks_non-alcoholic.dm index 6432d28e664..b3db43009a0 100644 --- a/code/modules/food_and_drinks/recipes/drinks/drinks_non-alcoholic.dm +++ b/code/modules/food_and_drinks/recipes/drinks/drinks_non-alcoholic.dm @@ -176,3 +176,6 @@ results = list(/datum/reagent/consumable/mississippi_queen = 50) required_reagents = list(/datum/reagent/consumable/tomatojuice = 15, /datum/reagent/consumable/mayonnaise = 10, /datum/reagent/consumable/soysauce = 5, /datum/reagent/consumable/vinegar = 2, /datum/reagent/consumable/capsaicin = 10, /datum/reagent/consumable/coco = 2) +/datum/chemical_reaction/drink/t_letter + results = list(/datum/reagent/consumable/t_letter = 2) + required_reagents = list(/datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/tea = 1) diff --git a/code/modules/food_and_drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm index dd7b7ef655f..54195f63c1f 100644 --- a/code/modules/food_and_drinks/recipes/food_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/food_mixtures.dm @@ -259,3 +259,16 @@ results = list(/datum/reagent/consumable/vinegar = 5) required_reagents = list(/datum/reagent/consumable/ethanol/wine = 1, /datum/reagent/water = 1, /datum/reagent/consumable/sugar = 1) reaction_flags = REACTION_INSTANT + +/datum/chemical_reaction/food/grounding_neutralise + results = list(/datum/reagent/consumable/salt = 2) + required_reagents = list(/datum/reagent/consumable/liquidelectricity/enriched = 2, /datum/reagent/consumable/grounding_solution = 1) + mix_message = "The mixture lets off a sharp snap as the electricity discharges." + mix_sound = 'sound/weapons/taser.ogg' + reaction_flags = REACTION_INSTANT + +/datum/chemical_reaction/food/martian_batter + results = list(/datum/reagent/consumable/martian_batter = 2) + required_reagents = list(/datum/reagent/consumable/flour = 1, /datum/reagent/consumable/nutriment/soup/dashi = 1) + mix_message = "A smooth batter forms." + reaction_flags = REACTION_INSTANT diff --git a/code/modules/food_and_drinks/recipes/soup_guide.dm b/code/modules/food_and_drinks/recipes/soup_guide.dm index 4a1e0a58132..a2bc0faccdb 100644 --- a/code/modules/food_and_drinks/recipes/soup_guide.dm +++ b/code/modules/food_and_drinks/recipes/soup_guide.dm @@ -2,10 +2,27 @@ machinery = list(/obj/machinery/stove) category = CAT_SOUP non_craftable = TRUE - + /// What contained is this reaction expected to be served in? + /// Used to determine the icon to display in the crafting UI. var/expected_container = /obj/item/reagent_containers/cup/bowl +/datum/crafting_recipe/food/reaction/soup/New() + // What are ya using this path for if it's not a food reaction? + if(!ispath(reaction, /datum/chemical_reaction/food)) + return ..() + + var/datum/chemical_reaction/food/soup_reaction = reaction + // If the reaction has a solid food item result, it is prioritized over reagent results + if(ispath(initial(soup_reaction.resulting_food_path), /obj/item/food)) + result = initial(soup_reaction.resulting_food_path) + result_amount = 1 + + return ..() + /datum/crafting_recipe/food/reaction/soup/crafting_ui_data() + if(ispath(result, /obj/item/food)) + return ..() + var/list/data = list() var/datum/glass_style/has_foodtype/soup_style = GLOB.glass_style_singletons[expected_container][result] @@ -20,11 +37,11 @@ if(!istype(chemical_reaction)) return for(var/obj/item/ingredienttype as anything in chemical_reaction.required_ingredients) - reqs[ingredienttype] = chemical_reaction.required_ingredients[ingredienttype] + LAZYSET(reqs, ingredienttype, chemical_reaction.required_ingredients[ingredienttype]) if(ispath(result, /datum/reagent/consumable)) var/datum/reagent/consumable/soup_result = result - total_nutriment_factor = initial(soup_result.nutriment_factor) * result_amount + total_nutriment_factor += initial(soup_result.nutriment_factor) * result_amount /datum/crafting_recipe/food/reaction/soup/meatball_soup reaction = /datum/chemical_reaction/food/soup/meatballsoup diff --git a/code/modules/food_and_drinks/recipes/soup_mixtures.dm b/code/modules/food_and_drinks/recipes/soup_mixtures.dm index 555e402e8f6..edc7867568f 100644 --- a/code/modules/food_and_drinks/recipes/soup_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/soup_mixtures.dm @@ -85,6 +85,12 @@ if(!length(required_ingredients)) return + // This only happens if we're being instant reacted so let's just skip to what we really want + if(isnull(reaction)) + testing("Soup reaction of type [type] instant reacted, cleaning up.") + clean_up(holder) + return + if(isnull(total_ingredient_max)) total_ingredient_max = 0 // We only need to calculate this once, effectively static per-type @@ -158,9 +164,21 @@ var/obj/item/reagent_containers/cup/soup_pot/pot = holder.my_atom if(!istype(pot)) CRASH("[pot ? "Non-pot atom" : "Null pot"]) made it to the end of the [type] reaction chain.") - reaction.data["ingredients"] = null testing("Soup reaction finished with a total react volume of [react_vol] and [length(pot.added_ingredients)] ingredients. Cleaning up.") + clean_up(holder, reaction, react_vol) + +/** + * Cleans up the ingredients and adds whatever leftover reagents to the mixture + * + * * holder: The sou ppot + * * reaction: The reaction being cleaned up, note this CAN be null if being instant reacted + * * react_vol: How much soup was produced + */ +/datum/chemical_reaction/food/soup/proc/clean_up(datum/reagents/holder, datum/equilibrium/reaction, react_vol) + var/obj/item/reagent_containers/cup/soup_pot/pot = holder.my_atom + + reaction?.data["ingredients"] = null for(var/obj/item/ingredient as anything in pot.added_ingredients) // Let's not mess with indestructible items. @@ -180,12 +198,28 @@ else ingredient.AddElement(/datum/element/fried_item, 30) + // Spawning physical food results + if(resulting_food_path) + var/obj/item/created = new resulting_food_path(get_turf(pot)) + created.pixel_y += 8 + // Anything left in the ingredient list will get dumped out - pot.dump_ingredients(get_turf(pot)) + pot.dump_ingredients(get_turf(pot), y_offset = 8) // Blackbox log the chemical reaction used, to account for soup reaction that don't produce typical results BLACKBOX_LOG_FOOD_MADE(type) +/** + * Transfers reagents from the passed reagent to the soup pot, as a "result" + * + * Also handles deleting a portion of nutriment reagents present, pseudo-converting it into soup reagent + * + * * ingredient: The ingredient to transfer reagents from + * * holder: The reagent holder of the soup pot the reaction is taking place in + * * amount: The amount of reagents to transfer, if null will transfer all reagents + */ /datum/chemical_reaction/food/soup/proc/transfer_ingredient_reagents(obj/item/ingredient, datum/reagents/holder, amount) + if(ingredient_reagent_multiplier <= 0) + return var/datum/reagents/ingredient_pool = ingredient.reagents // Some ingredients are purely flavor (no pun intended) and will have reagents if(isnull(ingredient_pool) || ingredient_pool.total_volume <= 0) @@ -201,6 +235,7 @@ // The other half of the nutriment, and the rest of the reagents, will get put directly into the pot ingredient_pool.trans_to(holder, amount, ingredient_reagent_multiplier, no_react = TRUE) +/// Called whenever the soup pot overfills with reagent. /datum/chemical_reaction/food/soup/proc/boil_over(datum/reagents/holder) var/obj/item/reagent_containers/cup/soup_pot/pot = holder.my_atom var/turf/below_pot = get_turf(pot) @@ -1757,3 +1792,408 @@ /datum/reagent/consumable/sugar = 8, ) percentage_of_nutriment_converted = 0.1 + +// Martian Food +// Boiled Noodles +/datum/chemical_reaction/food/soup/boilednoodles + required_reagents = list( + /datum/reagent/consumable/salt = 2 + ) + required_ingredients = list( + /obj/item/food/spaghetti/rawnoodles = 1 + ) + required_catalysts = list( + /datum/reagent/water = 30 + ) + resulting_food_path = /obj/item/food/spaghetti/boilednoodles + ingredient_reagent_multiplier = 0 + +// Dashi Broth +/datum/reagent/consumable/nutriment/soup/dashi + name = "Dashi" + description = "Made with kombu and katsuobushi, this mother stock forms the basis for a large number of Japanese dishes." + data = list("umami" = 1) + color = "#D49D26" + +/datum/glass_style/has_foodtype/soup/dashi + required_drink_type = /datum/reagent/consumable/nutriment/soup/dashi + name = "dashi" + drink_type = SEAFOOD + +/datum/chemical_reaction/food/soup/dashi + required_reagents = list( + /datum/reagent/consumable/dashi_concentrate = 5, + /datum/reagent/water = 40, + ) + results = list( + /datum/reagent/consumable/nutriment/soup/dashi = 40, + ) + +// Teriyaki Sauce +/datum/reagent/consumable/nutriment/soup/teriyaki + name = "Teriyaki Sauce" + description = "A Japanese sauce that's heavy on umami." + data = list("umami" = 1) + color = "#3F0D02" + +/datum/glass_style/has_foodtype/soup/teriyaki + required_drink_type = /datum/reagent/consumable/nutriment/soup/teriyaki + name = "teriyaki sauce" + drink_type = VEGETABLES + +/datum/chemical_reaction/food/soup/teriyaki + required_reagents = list( + /datum/reagent/consumable/soysauce = 10, + /datum/reagent/consumable/ethanol/sake = 10, + /datum/reagent/consumable/honey = 5, + ) + results = list( + /datum/reagent/consumable/nutriment/soup/teriyaki = 20, + ) + +// Curry Sauce +/datum/reagent/consumable/nutriment/soup/curry_sauce + name = "Curry Sauce" + description = "A basic curry sauce that goes well on a wide range of foods." + data = list("curry" = 1) + color = "#F6C800" + +/datum/glass_style/has_foodtype/soup/curry_sauce + required_drink_type = /datum/reagent/consumable/nutriment/soup/curry_sauce + name = "curry sauce" + drink_type = VEGETABLES + +/datum/chemical_reaction/food/soup/curry_sauce + required_reagents = list( + /datum/reagent/water = 30, + /datum/reagent/consumable/curry_powder = 10, + /datum/reagent/consumable/soysauce = 5, + /datum/reagent/consumable/corn_starch = 5, + ) + results = list( + /datum/reagent/consumable/nutriment/soup/curry_sauce = 40, + ) + +// Shoyu Ramen +/datum/reagent/consumable/nutriment/soup/shoyu_ramen + name = "Shōyu Ramen" + description = "A soy-sauce based ramen, with noodles, fishcake, barbecued meat and a boiled egg." + data = list("egg" = 1, "fish" = 1, "noodles" = 1, "meat" = 1, "broth" = 1) + color = "#442621" + +/datum/glass_style/has_foodtype/soup/shoyu_ramen + required_drink_type = /datum/reagent/consumable/nutriment/soup/shoyu_ramen + name = "shōyu ramen" + icon = 'icons/obj/food/martian.dmi' + icon_state = "shoyu_ramen" + drink_type = MEAT | GRAIN | VEGETABLES | SEAFOOD + +/datum/chemical_reaction/food/soup/shoyu_ramen + required_reagents = list( + /datum/reagent/consumable/nutriment/soup/dashi = 20, + /datum/reagent/consumable/nutriment/soup/teriyaki = 15, + ) + required_ingredients = list( + /obj/item/food/spaghetti/boilednoodles = 1, + /obj/item/food/kamaboko_slice = 1, + /obj/item/food/meat/cutlet = 1, + /obj/item/food/boiledegg = 1, + ) + results = list( + /datum/reagent/consumable/nutriment/soup/shoyu_ramen = 30, + /datum/reagent/consumable/nutriment/vitamin = 8, + /datum/reagent/consumable/nutriment/protein = 8, + ) + percentage_of_nutriment_converted = 0.2 + +// Gyuramen +/datum/reagent/consumable/nutriment/soup/gyuramen + name = "Gyuramen Miy Käzu" + description = "A rich beef and onion ramen with cheese- blending several cultural influences seemlessly into one tasty dish." + data = list("beef broth" = 1, "onion" = 1, "cheese" = 1) + color = "#442621" + +/datum/glass_style/has_foodtype/soup/gyuramen + required_drink_type = /datum/reagent/consumable/nutriment/soup/gyuramen + name = "gyuramen miy käzu" + icon = 'icons/obj/food/martian.dmi' + icon_state = "gyuramen" + drink_type = MEAT | GRAIN | DAIRY | VEGETABLES + +/datum/chemical_reaction/food/soup/gyuramen + required_reagents = list( + /datum/reagent/consumable/nutriment/soup/dashi = 20, + /datum/reagent/consumable/soysauce = 5, + ) + required_ingredients = list( + /obj/item/food/spaghetti/boilednoodles = 1, + /obj/item/food/cheese/wedge = 1, + /obj/item/food/onion_slice = 2, + /obj/item/food/meat/cutlet = 1, + ) + results = list( + /datum/reagent/consumable/nutriment/soup/gyuramen = 30, + /datum/reagent/consumable/nutriment/vitamin = 2, + /datum/reagent/consumable/nutriment/protein = 10, + ) + percentage_of_nutriment_converted = 0.15 + +// New Osaka Sunrise +/datum/reagent/consumable/nutriment/soup/new_osaka_sunrise + name = "New Osaka Sunrise Soup" + description = "A bright, flavourful miso soup with tofu that commonly forms part of a traditional Martian breakfast, at least in the capital." + data = list("miso" = 1, "tofu" = 1, "onion" = 1, "eggplant" = 1) + color = "#EAB26E" + +/datum/glass_style/has_foodtype/soup/new_osaka_sunrise + required_drink_type = /datum/reagent/consumable/nutriment/soup/new_osaka_sunrise + name = "\improper New Osaka Sunrise soup" + icon = 'icons/obj/food/martian.dmi' + icon_state = "new_osaka_sunrise" + drink_type = MEAT | GRAIN | DAIRY | VEGETABLES + +/datum/chemical_reaction/food/soup/new_osaka_sunrise + required_reagents = list( + /datum/reagent/consumable/nutriment/soup/miso = 15, + ) + required_ingredients = list( + /obj/item/food/grown/herbs = 1, + /obj/item/food/grown/eggplant = 1, + /obj/item/food/onion_slice = 1, + /obj/item/food/tofu = 1, + ) + results = list( + /datum/reagent/consumable/nutriment/soup/new_osaka_sunrise = 30, + /datum/reagent/consumable/nutriment/vitamin = 8, + /datum/reagent/consumable/nutriment/protein = 2, + ) + percentage_of_nutriment_converted = 0.15 + +// Satsuma Black +/datum/reagent/consumable/nutriment/soup/satsuma_black + name = "Satsuma Black Soup" + description = "A rich, heavy seafood and noodle soup from Mars, employing squid ink to give a strong taste of the sea." + data = list("seafood" = 1, "tofu" = 1, "noodles" = 1) + color = "#171221" + +/datum/glass_style/has_foodtype/soup/satsuma_black + required_drink_type = /datum/reagent/consumable/nutriment/soup/satsuma_black + name = "\improper Satsuma Black soup" + icon = 'icons/obj/food/martian.dmi' + icon_state = "satsuma_black" + drink_type = SEAFOOD | GRAIN | VEGETABLES + +/datum/chemical_reaction/food/soup/satsuma_black + required_reagents = list( + /datum/reagent/consumable/nutriment/soup/dashi = 20, + ) + required_ingredients = list( + /obj/item/food/spaghetti/boilednoodles = 1, + /obj/item/food/seaweedsheet = 1, + /obj/item/food/tofu = 1, + /obj/item/food/canned/squid_ink = 1, + ) + results = list( + /datum/reagent/consumable/nutriment/soup/satsuma_black = 30, + /datum/reagent/consumable/nutriment/vitamin = 4, + /datum/reagent/consumable/nutriment/protein = 6, + ) + percentage_of_nutriment_converted = 0.15 + +// Dragon Style +/datum/reagent/consumable/nutriment/soup/dragon_ramen + name = "Dragon Style Ramen" + description = "For the ramen fan who hates their tastebuds and digestive tract. Traditionally made with seven different chilis, although after two or so the point sorta gets lost." + data = list("meat" = 1, "liquid hot magma" = 1, "noodles" = 1) + color = "#980F00" + +/datum/glass_style/has_foodtype/soup/dragon_ramen + required_drink_type = /datum/reagent/consumable/nutriment/soup/dragon_ramen + name = "\improper Dragon Style ramen" + icon = 'icons/obj/food/martian.dmi' + icon_state = "dragon_ramen" + drink_type = SEAFOOD | GRAIN | VEGETABLES + +/datum/chemical_reaction/food/soup/dragon_ramen + required_reagents = list( + /datum/reagent/consumable/nutriment/soup/dashi = 20, + /datum/reagent/consumable/nutriment/soup/teriyaki = 10, + /datum/reagent/consumable/red_bay = 5, + ) + required_ingredients = list( + /obj/item/food/spaghetti/boilednoodles = 1, + /obj/item/food/grown/ghost_chili = 1, + /obj/item/food/grown/chili = 1, + /obj/item/food/kamaboko_slice = 1, + /obj/item/food/boiledegg = 1, + ) + results = list( + /datum/reagent/consumable/nutriment/soup/dragon_ramen = 30, + /datum/reagent/consumable/nutriment/vitamin = 4, + /datum/reagent/consumable/nutriment/protein = 6, + ) + ingredient_reagent_multiplier = 0.3 //reduces the impact of the chilis to manageable levels + +// Hong Kong Borscht +/datum/reagent/consumable/nutriment/soup/hong_kong_borscht + name = "Hong Kong Borscht" + description = "Also known as luo song tang or Russian soup, this dish bears little to no resemblance to Eastern European borscht- indeed, it's a tomato-based soup with no beets in sight." + data = list("tomato" = 1, "meat" = 1, "cabbage" = 1) + color = "#CA4810" + +/datum/glass_style/has_foodtype/soup/hong_kong_borscht + required_drink_type = /datum/reagent/consumable/nutriment/soup/hong_kong_borscht + name = "\improper Hong Kong borscht" + icon = 'icons/obj/food/martian.dmi' + icon_state = "hong_kong_borscht" + drink_type = MEAT | VEGETABLES + +/datum/chemical_reaction/food/soup/hong_kong_borscht + required_reagents = list( + /datum/reagent/water = 50, + /datum/reagent/consumable/soysauce = 5, + ) + required_ingredients = list( + /obj/item/food/grown/tomato = 1, + /obj/item/food/grown/cabbage = 1, + /obj/item/food/grown/onion = 1, + /obj/item/food/grown/carrot = 1, + /obj/item/food/meat/cutlet = 1, + ) + results = list( + /datum/reagent/consumable/nutriment/soup/hong_kong_borscht = 30, + /datum/reagent/consumable/nutriment/vitamin = 8, + /datum/reagent/consumable/nutriment/protein = 2, + ) + percentage_of_nutriment_converted = 0.1 + +// Huotui Tong Fen +/datum/reagent/consumable/nutriment/soup/hong_kong_macaroni + name = "Hong Kong Macaroni Soup" + description = "A favourite from Hong Kong's Cha Chaan Tengs, this macaroni soup came to Mars with Cantonese settlers under Cybersun Industries, and has become as much of a breakfast staple there as it is in its homeland." + data = list("cream" = 1, "chicken" = 1, "pasta" = 1, "ham" = 1) + color = "#FFFAB5" + +/datum/glass_style/has_foodtype/soup/hong_kong_macaroni + required_drink_type = /datum/reagent/consumable/nutriment/soup/hong_kong_macaroni + name = "\improper Hong Kong macaroni soup" + icon = 'icons/obj/food/martian.dmi' + icon_state = "hong_kong_macaroni" + drink_type = MEAT | VEGETABLES + +/datum/chemical_reaction/food/soup/hong_kong_macaroni + required_reagents = list( + /datum/reagent/water = 30, + /datum/reagent/consumable/cream = 10, + ) + required_ingredients = list( + /obj/item/food/spaghetti/boiledspaghetti = 1, + /obj/item/food/meat/cutlet/chicken = 1, + /obj/item/food/meat/bacon = 1, + ) + results = list( + /datum/reagent/consumable/nutriment/soup/hong_kong_macaroni = 30, + /datum/reagent/consumable/nutriment/protein = 6, + ) + percentage_of_nutriment_converted = 0.2 + +// Fox's Prize Soup +/datum/reagent/consumable/nutriment/soup/foxs_prize_soup + name = "Fox's Prize Soup" + description = "Originally based on the Chinese classic of egg-drop soup, fox's prize soup iterated on the concept via the addition of aburaage and dashi, making a dish that would truly appeal to any hungry fox." + data = list("egg" = 1, "chicken" = 1, "fried tofu" = 1, "umami broth" = 1) + color = "#E9B200" + +/datum/glass_style/has_foodtype/soup/foxs_prize_soup + required_drink_type = /datum/reagent/consumable/nutriment/soup/foxs_prize_soup + name = "fox's prize soup" + icon = 'icons/obj/food/martian.dmi' + icon_state = "foxs_prize_soup" + drink_type = MEAT | VEGETABLES + +/datum/chemical_reaction/food/soup/foxs_prize_soup + required_reagents = list( + /datum/reagent/consumable/nutriment/soup/dashi = 30, + /datum/reagent/consumable/eggwhite = 10, + ) + required_ingredients = list( + /obj/item/food/meat/cutlet/chicken = 1, + /obj/item/food/tofu = 1, + ) + results = list( + /datum/reagent/consumable/nutriment/soup/foxs_prize_soup = 30, + /datum/reagent/consumable/nutriment/protein = 6, + ) + +// Secret Noodle Soup +/datum/reagent/consumable/nutriment/soup/secret_noodle_soup + name = "Secret Noodle Soup" + description = "Made to a secret family recipe (that's in several cookbooks). What is the secret ingredient, you ask? Well, let's just say it could be anything..." + data = list("noodles" = 1, "chicken" = 1, "aromatic broth" = 1) + color = "#D9BB79" + +/datum/glass_style/has_foodtype/soup/secret_noodle_soup + required_drink_type = /datum/reagent/consumable/nutriment/soup/secret_noodle_soup + name = "secret noodle soup" + icon = 'icons/obj/food/martian.dmi' + icon_state = "secret_noodle_soup" + drink_type = MEAT | VEGETABLES + +/datum/chemical_reaction/food/soup/secret_noodle_soup + required_reagents = list( + /datum/reagent/consumable/nutriment/soup/dashi = 30, + ) + required_ingredients = list( + /obj/item/food/meat/cutlet/chicken = 1, + /obj/item/food/spaghetti/boilednoodles = 1, + /obj/item/food/grown/mushroom/chanterelle = 1, + ) + results = list( + /datum/reagent/consumable/nutriment/soup/secret_noodle_soup = 30, + /datum/reagent/consumable/nutriment/protein = 6, + ) + +// Budae-Jjigae +/datum/reagent/consumable/nutriment/soup/budae_jjigae + name = "Budae-Jjigae" + description = "A dish born of the American presence in South Korea, made with ingredients typical to the 1960s American army base- hot dogs, chap, and baked beans, as well as a number of native Korean ingredients such as gochujang and kimchi." + data = list("hot dog" = 1, "pork" = 1, "beans" = 1, "kimchi" = 1, "noodles" = 1) + color = "#C8400E" + +/datum/glass_style/has_foodtype/soup/budae_jjigae + required_drink_type = /datum/reagent/consumable/nutriment/soup/budae_jjigae + name = "budae-jjigae" + icon = 'icons/obj/food/martian.dmi' + icon_state = "budae_jjigae" + drink_type = MEAT | VEGETABLES | GRAIN + +/datum/chemical_reaction/food/soup/budae_jjigae + required_reagents = list( + /datum/reagent/water = 30, + ) + required_ingredients = list( + /obj/item/food/canned/beans = 1, + /obj/item/food/spaghetti/rawnoodles = 1, + /obj/item/food/sausage/american = 1, + /obj/item/food/chapslice = 2, + /obj/item/food/kimchi = 1, + /obj/item/food/cheese/wedge = 1, + ) + results = list( + /datum/reagent/consumable/nutriment/soup/budae_jjigae = 30, + /datum/reagent/consumable/nutriment/protein = 6, + ) + percentage_of_nutriment_converted = 0.1 + +// 24-Volt Fish +// Simply poach the fish in boiling energy drink, easy as +/datum/chemical_reaction/food/soup/volt_fish + required_reagents = list( + /datum/reagent/consumable/volt_energy = 15, + ) + required_ingredients = list( + /obj/item/food/fishmeat = 1 + ) + resulting_food_path = /obj/item/food/volt_fish + ingredient_reagent_multiplier = 0 + mix_message = "The air fills with a hellish mix of fish and artificial flavouring." diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm index e15c4f45c92..5ef95ca8ab6 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm @@ -386,3 +386,14 @@ ) result = /obj/item/food/burger/crazy category = CAT_BURGER + +/datum/crafting_recipe/food/sloppy_moe + name = "Sloppy moe" + reqs = list( + /obj/item/food/bun = 1, + /obj/item/food/meat/cutlet = 2, + /obj/item/food/onion_slice = 1, + /datum/reagent/consumable/bbqsauce = 5, + ) + result = /obj/item/food/burger/sloppy_moe + category = CAT_BURGER 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 37b7a00b7eb..b70b3b9114c 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm @@ -257,3 +257,13 @@ ) result = /obj/item/food/cake/wedding category = CAT_CAKE + +/datum/crafting_recipe/food/pineapple_cream_cake + name = "Pineapple cream cake" + reqs = list( + /obj/item/food/cake/plain = 1, + /obj/item/food/grown/pineapple = 1, + /datum/reagent/consumable/cream = 20, + ) + result = /obj/item/food/cake/pineapple_cream_cake + category = CAT_CAKE diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_guide.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_guide.dm index 5a78a10114b..30eee31295b 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_guide.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_guide.dm @@ -38,7 +38,7 @@ /datum/crafting_recipe/food/reaction/New() . = ..() - if(!reaction) + if(!ispath(reaction, /datum/chemical_reaction)) return if(length(GLOB.chemical_reactions_list)) @@ -48,6 +48,7 @@ var/datum/chemical_reaction/chemical_reaction = new reaction() setup_chemical_reaction_details(chemical_reaction) qdel(chemical_reaction) + ..() /** * Sets up information for our recipe based on the chemical reaction we have set. @@ -189,6 +190,13 @@ /datum/crafting_recipe/food/reaction/moonshine reaction = /datum/chemical_reaction/drink/moonshine +/datum/crafting_recipe/food/reaction/martian_batter + reaction = /datum/chemical_reaction/food/martian_batter + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/grounding_neutralise + reaction = /datum/chemical_reaction/food/grounding_neutralise + // Tools: Rolling pin /datum/crafting_recipe/food/rollingpin @@ -356,6 +364,21 @@ result = /obj/item/food/watermelonslice category = CAT_SALAD +/datum/crafting_recipe/food/knife/kamaboko_slice + reqs = list(/obj/item/food/kamaboko = 1) + result = /obj/item/food/kamaboko_slice + category = CAT_MARTIAN + +/datum/crafting_recipe/food/knife/raw_noodles + reqs = list(/obj/item/food/rice_dough = 1) + result = /obj/item/food/spaghetti/rawnoodles + category = CAT_MARTIAN + +/datum/crafting_recipe/food/knife/chapslice + reqs = list(/obj/item/food/canned/chap = 1) + result = /obj/item/food/chapslice + category = CAT_MEAT + // Machinery: Grill /datum/crafting_recipe/food/grill @@ -426,11 +449,26 @@ result = /obj/item/food/sandwich/cheese/grilled category = CAT_BREAD -/datum/crafting_recipe/food/grill/moonfish +/datum/crafting_recipe/food/grill/grilled_cheese reqs = list(/obj/item/food/cheese/firm_cheese_slice = 1) result = /obj/item/food/grilled_cheese category = CAT_MISCFOOD +/datum/crafting_recipe/food/grill/ballpark_pretzel + reqs = list(/obj/item/food/raw_ballpark_pretzel = 1) + result = /obj/item/food/ballpark_pretzel + category = CAT_MARTIAN + +/datum/crafting_recipe/food/grill/ballpark_tsukune + reqs = list(/obj/item/food/kebab/raw_ballpark_tsukune = 1) + result = /obj/item/food/kebab/ballpark_tsukune + category = CAT_MARTIAN + +/datum/crafting_recipe/food/grill/chapslice + reqs = list(/obj/item/food/chapslice = 1) + result = /obj/item/food/grilled_chapslice + category = CAT_MEAT + /datum/crafting_recipe/food/grill/friedegg reqs = list(/obj/item/food/egg = 1) result = /obj/item/food/friedegg @@ -766,6 +804,16 @@ result = /obj/item/food/yakiimo category = CAT_MISCFOOD +/datum/crafting_recipe/food/oven/reispan + reqs = list(/obj/item/food/rice_dough = 1) + result = /obj/item/food/bread/reispan + category = CAT_MARTIAN + +/datum/crafting_recipe/food/oven/ballpark_pretzel + reqs = list(/obj/item/food/raw_ballpark_pretzel = 1) + result = /obj/item/food/ballpark_pretzel + category = CAT_MARTIAN + // Machinery: Drying rack /datum/crafting_recipe/food/drying machinery = list(/obj/machinery/smartfridge/drying_rack) @@ -799,3 +847,8 @@ /datum/crafting_recipe/food/drying/semki reqs = list(/obj/item/food/grown/sunflower = 1) result = /obj/item/food/semki/healthy + +/datum/crafting_recipe/food/drying/kamaboko + reqs = list(/obj/item/food/surimi = 1) + result = /obj/item/food/kamaboko + category = CAT_MARTIAN diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_martian.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_martian.dm new file mode 100644 index 00000000000..b184347a38f --- /dev/null +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_martian.dm @@ -0,0 +1,915 @@ +/datum/crafting_recipe/food/kimchi + name = "Kimchi" + reqs = list( + /obj/item/food/grown/cabbage = 1, + /obj/item/food/grown/chili = 1, + /datum/reagent/consumable/salt = 5 + ) + result = /obj/item/food/kimchi + category = CAT_MARTIAN + +/datum/crafting_recipe/food/inferno_kimchi + name = "Inferno kimchi" + reqs = list( + /obj/item/food/grown/cabbage = 1, + /obj/item/food/grown/ghost_chili = 1, + /datum/reagent/consumable/salt = 5 + ) + result = /obj/item/food/inferno_kimchi + category = CAT_MARTIAN + +/datum/crafting_recipe/food/garlic_kimchi + name = "Garlic kimchi" + reqs = list( + /obj/item/food/grown/cabbage = 1, + /obj/item/food/grown/chili = 1, + /obj/item/food/grown/garlic = 1, + /datum/reagent/consumable/salt = 5 + ) + result = /obj/item/food/garlic_kimchi + category = CAT_MARTIAN + +/datum/crafting_recipe/food/surimi + name = "Surimi" + reqs = list( + /obj/item/food/fishmeat = 1, + ) + result = /obj/item/food/surimi + category = CAT_MARTIAN + +/datum/crafting_recipe/food/sambal + name = "Sambal" + reqs = list( + /obj/item/food/grown/chili = 1, + /obj/item/food/grown/garlic = 1, + /obj/item/food/grown/onion = 1, + /datum/reagent/consumable/sugar = 3, + /datum/reagent/consumable/limejuice = 3, + ) + result = /obj/item/food/sambal + category = CAT_MARTIAN + +/datum/crafting_recipe/food/katsu_fillet + name = "Katsu fillet" + reqs = list( + /obj/item/food/meat/rawcutlet = 1, + /obj/item/food/breadslice/reispan = 1, + ) + result = /obj/item/food/katsu_fillet + category = CAT_MARTIAN + +/datum/crafting_recipe/food/rice_dough + name = "Rice dough" + reqs = list( + /datum/reagent/consumable/flour = 10, + /datum/reagent/consumable/rice = 10, + /datum/reagent/water = 10, + ) + result = /obj/item/food/rice_dough + category = CAT_MARTIAN + +/datum/crafting_recipe/food/hurricane_rice + name = "Hurricane fried rice" + reqs = list( + /obj/item/food/boiledrice = 1, + /obj/item/food/egg = 1, + /obj/item/food/onion_slice = 1, + /obj/item/food/grown/chili = 1, + /obj/item/food/meat/cutlet = 1, + /obj/item/food/pineappleslice = 1, + /datum/reagent/consumable/soysauce = 3, + ) + result = /obj/item/food/salad/hurricane_rice + category = CAT_MARTIAN + +/datum/crafting_recipe/food/ikareis + name = "Ikareis" + reqs = list( + /obj/item/food/boiledrice = 1, + /obj/item/food/canned/squid_ink = 1, + /obj/item/food/grown/bell_pepper = 1, + /obj/item/food/onion_slice = 1, + /obj/item/food/sausage = 1, + /obj/item/food/grown/chili = 1, + ) + result = /obj/item/food/salad/ikareis + category = CAT_MARTIAN + +/datum/crafting_recipe/food/hawaiian_fried_rice + name = "Hawaiian fried rice" + reqs = list( + /obj/item/food/boiledrice = 1, + /obj/item/food/chapslice = 1, + /obj/item/food/grown/bell_pepper = 1, + /obj/item/food/pineappleslice = 1, + /obj/item/food/onion_slice = 1, + /datum/reagent/consumable/soysauce = 5 + ) + result = /obj/item/food/salad/hawaiian_fried_rice + category = CAT_MARTIAN + +/datum/crafting_recipe/food/ketchup_fried_rice + name = "Ketchup fried rice" + reqs = list( + /obj/item/food/boiledrice = 1, + /obj/item/food/onion_slice = 1, + /obj/item/food/sausage/american = 1, + /obj/item/food/grown/carrot = 1, + /obj/item/food/grown/peas = 1, + /datum/reagent/consumable/ketchup = 5, + /datum/reagent/consumable/worcestershire = 2, + ) + result = /obj/item/food/salad/ketchup_fried_rice + category = CAT_MARTIAN + +/datum/crafting_recipe/food/mediterranean_fried_rice + name = "Mediterranean fried rice" + reqs = list( + /obj/item/food/boiledrice = 1, + /obj/item/food/onion_slice = 1, + /obj/item/food/grown/herbs = 1, + /obj/item/food/cheese/firm_cheese_slice = 1, + /obj/item/food/grown/olive = 1, + /obj/item/food/meatball = 1, + ) + result = /obj/item/food/salad/mediterranean_fried_rice + category = CAT_MARTIAN + +/datum/crafting_recipe/food/egg_fried_rice + name = "Egg fried rice" + reqs = list( + /obj/item/food/boiledrice = 1, + /obj/item/food/egg = 1, + /datum/reagent/consumable/soysauce = 3, + ) + result = /obj/item/food/salad/egg_fried_rice + category = CAT_MARTIAN + +/datum/crafting_recipe/food/bibimbap + name = "Bibimbap" + reqs = list( + /obj/item/food/boiledrice = 1, + /obj/item/food/grown/cucumber = 1, + /obj/item/food/grown/mushroom = 1, + /obj/item/food/meat/cutlet = 1, + /obj/item/food/kimchi = 1, + /obj/item/food/egg = 1, + ) + result = /obj/item/food/salad/bibimbap + category = CAT_MARTIAN + +/datum/crafting_recipe/food/bulgogi_noodles + name = "Bulgogi noodles" + reqs = list( + /obj/item/food/spaghetti/boilednoodles = 1, + /obj/item/food/meat/cutlet = 1, + /obj/item/food/grown/apple = 1, + /obj/item/food/grown/garlic = 1, + /obj/item/food/onion_slice = 1, + /datum/reagent/consumable/nutriment/soup/teriyaki = 4, + ) + result = /obj/item/food/salad/bibimbap + category = CAT_MARTIAN + +/datum/crafting_recipe/food/yakisoba_katsu + name = "Yakisoba katsu" + reqs = list( + /obj/item/food/spaghetti/boilednoodles = 1, + /obj/item/food/grown/cabbage = 1, + /obj/item/food/grown/carrot = 1, + /obj/item/food/onion_slice = 1, + /obj/item/food/katsu_fillet = 1, + /datum/reagent/consumable/worcestershire = 3, + ) + result = /obj/item/food/salad/yakisoba_katsu + category = CAT_MARTIAN + +/datum/crafting_recipe/food/martian_fried_noodles + name = "Martian fried noodles" + reqs = list( + /obj/item/food/spaghetti/boilednoodles = 1, + /obj/item/food/grown/peanut = 2, + /obj/item/food/meat/cutlet = 1, + /obj/item/food/onion_slice = 1, + /obj/item/food/egg = 1, + /datum/reagent/consumable/soysauce = 3, + /datum/reagent/consumable/red_bay = 3, + ) + result = /obj/item/food/salad/martian_fried_noodles + category = CAT_MARTIAN + +/datum/crafting_recipe/food/simple_fried_noodles + name = "Simple fried noodles" + reqs = list( + /obj/item/food/spaghetti/boilednoodles = 1, + /datum/reagent/consumable/soysauce = 3, + ) + result = /obj/item/food/salad/simple_fried_noodles + category = CAT_MARTIAN + +/datum/crafting_recipe/food/setagaya_curry + name = "Setagaya curry" + reqs = list( + /obj/item/food/boiledrice = 1, + /obj/item/food/grown/apple = 1, + /datum/reagent/consumable/honey = 3, + /datum/reagent/consumable/ketchup = 3, + /obj/item/food/chocolatebar = 1, + /datum/reagent/consumable/coffee = 3, + /datum/reagent/consumable/ethanol/wine = 3, + /datum/reagent/consumable/curry_powder = 3, + /obj/item/food/meat/slab = 1, + /obj/item/food/grown/onion = 1, + /obj/item/food/grown/carrot = 1, + /obj/item/food/grown/potato = 1, + ) + result = /obj/item/food/salad/setagaya_curry + category = CAT_MARTIAN + +/datum/crafting_recipe/food/big_blue_burger + name = "Big Blue Burger" + reqs = list( + /obj/item/food/bun = 1, + /obj/item/food/patty = 2, + /obj/item/food/onion_slice = 1, + /obj/item/food/cheese/wedge = 1, + /obj/item/food/meat/bacon = 1, + /obj/item/food/pineappleslice = 1, + /datum/reagent/consumable/nutriment/soup/teriyaki = 4, + ) + result = /obj/item/food/burger/big_blue + category = CAT_MARTIAN + +/datum/crafting_recipe/food/chappy_patty + name = "Chappy Patty" + reqs = list( + /obj/item/food/bun = 1, + /obj/item/food/grilled_chapslice = 2, + /obj/item/food/friedegg = 1, + /obj/item/food/cheese/wedge = 1, + /datum/reagent/consumable/ketchup = 3, + ) + result = /obj/item/food/burger/chappy + category = CAT_MARTIAN + +/datum/crafting_recipe/food/king_katsu_sandwich + name = "King Katsu sandwich" + reqs = list( + /obj/item/food/breadslice/reispan = 2, + /obj/item/food/katsu_fillet = 1, + /obj/item/food/meat/bacon = 1, + /obj/item/food/kimchi = 1, + /obj/item/food/onion_slice = 1, + /obj/item/food/grown/tomato = 1, + ) + result = /obj/item/food/king_katsu_sandwich + category = CAT_MARTIAN + +/datum/crafting_recipe/food/marte_cubano_sandwich + name = "Marte Cubano sandwich" + reqs = list( + /obj/item/food/breadslice/reispan = 2, + /obj/item/food/meat/bacon = 1, + /obj/item/food/pickle = 2, + /obj/item/food/cheese/wedge = 1, + ) + result = /obj/item/food/marte_cubano_sandwich + category = CAT_MARTIAN + +/datum/crafting_recipe/food/little_shiro_sandwich + name = "Little Shiro sandwich" + reqs = list( + /obj/item/food/breadslice/reispan = 2, + /obj/item/food/meat/cutlet = 1, + /obj/item/food/friedegg = 1, + /obj/item/food/garlic_kimchi = 1, + /obj/item/food/cheese/mozzarella = 1, + /obj/item/food/grown/herbs = 1, + ) + result = /obj/item/food/little_shiro_sandwich + category = CAT_MARTIAN + +/datum/crafting_recipe/food/croque_martienne + name = "Croque-Martienne sandwich" + reqs = list( + /obj/item/food/breadslice/reispan = 2, + /obj/item/food/meat/cutlet = 1, + /obj/item/food/cheese/wedge = 1, + /obj/item/food/pineappleslice = 1, + /obj/item/food/friedegg = 1, + ) + result = /obj/item/food/croque_martienne + category = CAT_MARTIAN + +/datum/crafting_recipe/food/prospect_sunrise + name = "Prospect Sunrise sandwich" + reqs = list( + /obj/item/food/breadslice/reispan = 2, + /obj/item/food/meat/bacon = 1, + /obj/item/food/cheese/wedge = 1, + /obj/item/food/omelette = 1, + /obj/item/food/pickle = 1, + ) + result = /obj/item/food/prospect_sunrise + category = CAT_MARTIAN + +/datum/crafting_recipe/food/takoyaki + name = "Takoyaki" + reqs = list( + /obj/item/food/fishmeat/octopus = 1, + /obj/item/food/onion_slice = 1, + /datum/reagent/consumable/martian_batter = 6, + /datum/reagent/consumable/worcestershire = 3, + ) + result = /obj/item/food/takoyaki + category = CAT_MARTIAN + +/datum/crafting_recipe/food/russian_takoyaki + name = "Russian takoyaki" + reqs = list( + /obj/item/food/fishmeat/octopus = 1, + /obj/item/food/grown/ghost_chili = 1, + /datum/reagent/consumable/martian_batter = 6, + /datum/reagent/consumable/capsaicin = 3, + ) + result = /obj/item/food/takoyaki/russian + category = CAT_MARTIAN + +/datum/crafting_recipe/food/tacoyaki + name = "Tacoyaki" + reqs = list( + /obj/item/food/meatball = 1, + /obj/item/food/grown/corn = 1, + /datum/reagent/consumable/martian_batter = 6, + /datum/reagent/consumable/red_bay = 3, + /obj/item/food/cheese/wedge = 1, + ) + result = /obj/item/food/takoyaki/taco + category = CAT_MARTIAN + +/datum/crafting_recipe/food/okonomiyaki + name = "Okonomiyaki" + reqs = list( + /datum/reagent/consumable/martian_batter = 6, + /datum/reagent/consumable/worcestershire = 3, + /datum/reagent/consumable/mayonnaise = 3, + /obj/item/food/grown/cabbage = 1, + /obj/item/food/grown/potato/sweet = 1, + ) + result = /obj/item/food/okonomiyaki + category = CAT_MARTIAN + +/datum/crafting_recipe/food/brat_kimchi + name = "Brat-kimchi" + reqs = list( + /obj/item/food/sausage = 1, + /obj/item/food/kimchi = 1, + /datum/reagent/consumable/sugar = 3, + ) + result = /obj/item/food/brat_kimchi + category = CAT_MARTIAN + +/datum/crafting_recipe/food/tonkatsuwurst + name = "Tonkatsuwurst" + reqs = list( + /obj/item/food/sausage = 1, + /obj/item/food/fries = 1, + /datum/reagent/consumable/worcestershire = 3, + /datum/reagent/consumable/red_bay = 2, + ) + result = /obj/item/food/tonkatsuwurst + category = CAT_MARTIAN + +/datum/crafting_recipe/food/ti_hoeh_koe + name = "Ti hoeh koe" + reqs = list( + /obj/item/food/boiledrice = 1, + /obj/item/food/peanuts/salted = 1, + /obj/item/food/grown/herbs = 1, + /datum/reagent/blood = 5, + ) + result = /obj/item/food/kebab/ti_hoeh_koe + category = CAT_MARTIAN + +/datum/crafting_recipe/food/kitzushi + name = "Kitzushi" + reqs = list( + /obj/item/food/boiledrice = 1, + /obj/item/food/tofu = 1, + /obj/item/food/cheese/wedge = 1, + /obj/item/food/grown/chili = 1, + ) + result = /obj/item/food/kitzushi + category = CAT_MARTIAN + +/datum/crafting_recipe/food/epok_epok + name = "Epok-epok" + reqs = list( + /obj/item/food/doughslice = 1, + /obj/item/food/meat/cutlet/chicken = 1, + /obj/item/food/grown/potato/wedges = 1, + /obj/item/food/boiledegg = 1, + /datum/reagent/consumable/curry_powder = 3, + ) + result = /obj/item/food/epok_epok + category = CAT_MARTIAN + +/datum/crafting_recipe/food/roti_john + name = "Roti John" + reqs = list( + /obj/item/food/baguette = 1, + /obj/item/food/raw_meatball = 1, + /obj/item/food/egg = 1, + /obj/item/food/onion_slice = 1, + /datum/reagent/consumable/capsaicin = 3, + /datum/reagent/consumable/mayonnaise = 3, + ) + result = /obj/item/food/roti_john + category = CAT_MARTIAN + +/datum/crafting_recipe/food/izakaya_fries + name = "Izakaya fries" + reqs = list( + /obj/item/food/fries = 1, + /obj/item/food/grown/herbs = 1, + /datum/reagent/consumable/red_bay = 3, + /datum/reagent/consumable/mayonnaise = 3, + ) + result = /obj/item/food/izakaya_fries + category = CAT_MARTIAN + +/datum/crafting_recipe/food/kurry_ok_subsando + name = "Kurry-OK subsando" + reqs = list( + /obj/item/food/baguette = 1, + /obj/item/food/izakaya_fries = 1, + /obj/item/food/katsu_fillet = 1, + /datum/reagent/consumable/nutriment/soup/curry_sauce = 5, + ) + result = /obj/item/food/kurry_ok_subsando + category = CAT_MARTIAN + +/datum/crafting_recipe/food/loco_moco + name = "Loco moco" + reqs = list( + /obj/item/food/boiledrice = 1, + /obj/item/food/patty = 1, + /obj/item/food/onion_slice = 1, + /obj/item/food/friedegg = 1, + /datum/reagent/consumable/gravy = 5, + ) + result = /obj/item/food/loco_moco + category = CAT_MARTIAN + +/datum/crafting_recipe/food/wild_duck_fries + name = "Wild duck fries" + reqs = list( + /obj/item/food/izakaya_fries = 1, + /obj/item/food/meat/cutlet = 1, + /datum/reagent/consumable/ketchup = 3, + ) + result = /obj/item/food/wild_duck_fries + category = CAT_MARTIAN + +/datum/crafting_recipe/food/little_hawaii_hotdog + name = "Little Hawaii hotdog" + reqs = list( + /obj/item/food/hotdog = 1, + /obj/item/food/pineappleslice = 1, + /obj/item/food/onion_slice = 1, + /datum/reagent/consumable/nutriment/soup/teriyaki = 3, + ) + result = /obj/item/food/little_hawaii_hotdog + category = CAT_MARTIAN + +/datum/crafting_recipe/food/salt_chilli_fries + name = "Salt n' chilli fries" + reqs = list( + /obj/item/food/fries = 1, + /obj/item/food/grown/chili = 1, + /obj/item/food/grown/onion = 1, + /obj/item/food/grown/garlic = 1, + /datum/reagent/consumable/salt = 3, + ) + result = /obj/item/food/salt_chilli_fries + category = CAT_MARTIAN + +/datum/crafting_recipe/food/steak_croquette + name = "Steak croquette" + reqs = list( + /obj/item/food/meat/steak = 1, + /obj/item/food/mashed_potatoes = 1, + /obj/item/food/breadslice/reispan = 1, + ) + result = /obj/item/food/steak_croquette + category = CAT_MARTIAN + +/datum/crafting_recipe/food/chapsilog + name = "Chapsilog" + reqs = list( + /obj/item/food/grilled_chapslice = 2, + /obj/item/food/friedegg = 1, + /obj/item/food/boiledrice = 1, + /obj/item/food/grown/garlic = 1, + ) + result = /obj/item/food/chapsilog + category = CAT_MARTIAN + +/datum/crafting_recipe/food/chap_hash + name = "Chap hash" + reqs = list( + /obj/item/food/chapslice = 2, + /obj/item/food/egg = 1, + /obj/item/food/grown/bell_pepper = 1, + /obj/item/food/grown/potato = 1, + /obj/item/food/onion_slice = 1, + ) + result = /obj/item/food/chap_hash + category = CAT_MARTIAN + +/datum/crafting_recipe/food/agedashi_tofu + name = "Agedashi tofu" + reqs = list( + /obj/item/food/tofu = 1, + /obj/item/food/onion_slice = 1, + /datum/reagent/consumable/nutriment/soup/dashi = 20, + /obj/item/reagent_containers/cup/bowl = 1, + ) + result = /obj/item/food/salad/agedashi_tofu + category = CAT_MARTIAN + +/datum/crafting_recipe/food/po_kok_gai + name = "Po kok gai" + reqs = list( + /obj/item/food/boiledrice = 1, + /obj/item/food/meat/slab/chicken = 1, + /datum/reagent/consumable/coconut_milk = 5, + /datum/reagent/consumable/curry_powder = 3, + ) + result = /obj/item/food/salad/po_kok_gai + category = CAT_MARTIAN + +/datum/crafting_recipe/food/huoxing_tofu + name = "Huoxing tofu" + reqs = list( + /obj/item/food/tofu = 1, + /obj/item/food/raw_meatball = 1, + /obj/item/food/grown/chili = 1, + /obj/item/food/grown/soybeans = 1, + /obj/item/reagent_containers/cup/bowl = 1, + ) + result = /obj/item/food/salad/huoxing_tofu + category = CAT_MARTIAN + +/datum/crafting_recipe/food/feizhou_ji + name = "Fēizhōu jī" + reqs = list( + /obj/item/food/meat/slab/chicken = 1, + /obj/item/food/grown/chili = 1, + /obj/item/food/grown/bell_pepper = 1, + /datum/reagent/consumable/vinegar = 5, + ) + result = /obj/item/food/feizhou_ji + category = CAT_MARTIAN + +/datum/crafting_recipe/food/galinha_de_cabidela + name = "Galinha de cabidela" + reqs = list( + /obj/item/food/meat/slab/chicken = 1, + /obj/item/food/grown/tomato = 1, + /obj/item/food/uncooked_rice = 1, + /datum/reagent/blood = 5, + ) + result = /obj/item/food/salad/galinha_de_cabidela + category = CAT_MARTIAN + +/datum/crafting_recipe/food/katsu_curry + name = "Katsu curry" + reqs = list( + /obj/item/food/katsu_fillet = 1, + /obj/item/food/boiledrice = 1, + /datum/reagent/consumable/nutriment/soup/curry_sauce = 5, + ) + result = /obj/item/food/salad/katsu_curry + category = CAT_MARTIAN + +/datum/crafting_recipe/food/beef_bowl + name = "Beef bowl" + reqs = list( + /obj/item/food/meat/cutlet = 1, + /obj/item/food/onion_slice = 1, + /obj/item/food/boiledrice = 1, + /datum/reagent/consumable/nutriment/soup/dashi = 5, + ) + result = /obj/item/food/salad/beef_bowl + category = CAT_MARTIAN + +/datum/crafting_recipe/food/salt_chilli_bowl + name = "Salt n' chilli octopus bowl" + reqs = list( + /obj/item/food/grilled_octopus = 1, + /obj/item/food/grown/chili = 1, + /obj/item/food/grown/onion = 1, + /obj/item/food/boiledrice = 1, + /datum/reagent/consumable/salt = 2, + /datum/reagent/consumable/nutriment/soup/curry_sauce = 5, + ) + result = /obj/item/food/salad/salt_chilli_bowl + category = CAT_MARTIAN + +/datum/crafting_recipe/food/kansai_bowl + name = "Kansai bowl" + reqs = list( + /obj/item/food/kamaboko_slice = 2, + /obj/item/food/boiledegg = 1, + /obj/item/food/grown/onion = 1, + /obj/item/food/boiledrice = 1, + /datum/reagent/consumable/nutriment/soup/dashi = 5, + ) + result = /obj/item/food/salad/kansai_bowl + category = CAT_MARTIAN + +/datum/crafting_recipe/food/eigamudo_curry + name = "Eigamudo curry" + reqs = list( + /obj/item/food/grown/olive = 1, + /obj/item/food/kimchi = 1, + /obj/item/food/fishmeat = 1, + /obj/item/food/boiledrice = 1, + /datum/reagent/consumable/cafe_latte = 5, + ) + result = /obj/item/food/salad/eigamudo_curry + category = CAT_MARTIAN + +/datum/crafting_recipe/food/cilbir + name = "Çilbir" + reqs = list( + /obj/item/food/grown/garlic = 1, + /obj/item/food/friedegg = 1, + /obj/item/food/grown/chili = 1, + /datum/reagent/consumable/yoghurt = 5, + /datum/reagent/consumable/quality_oil = 2, + ) + result = /obj/item/food/cilbir + category = CAT_MARTIAN + +/datum/crafting_recipe/food/peking_duck_crepes + name = "Peking duck crepes a l'orange" + reqs = list( + /obj/item/food/pancakes = 1, + /obj/item/food/meat/cutlet = 1, + /obj/item/food/grown/citrus/orange = 1, + /datum/reagent/consumable/ethanol/cognac = 2, + ) + result = /obj/item/food/peking_duck_crepes + category = CAT_MARTIAN + +/datum/crafting_recipe/food/vulgaris_spekkoek + name = "Vulgaris spekkoek" + reqs = list( + /obj/item/food/cake/plain = 1, + /obj/item/food/grown/ambrosia/vulgaris = 1, + /obj/item/food/butterslice = 2, + ) + result = /obj/item/food/cake/spekkoek + category = CAT_MARTIAN + +/datum/crafting_recipe/food/pineapple_foster + name = "Pineapple foster" + reqs = list( + /obj/item/food/pineappleslice = 1, + /datum/reagent/consumable/caramel = 2, + /obj/item/food/icecream = 1, + /datum/reagent/consumable/ethanol/rum = 2, + ) + result = /obj/item/food/salad/pineapple_foster + category = CAT_MARTIAN + +/datum/crafting_recipe/food/pastel_de_nata + name = "Pastel de nata" + reqs = list( + /obj/item/food/pastrybase = 1, + /obj/item/food/grown/vanillapod = 1, + /obj/item/food/egg = 1, + /datum/reagent/consumable/sugar = 2, + ) + result = /obj/item/food/pastel_de_nata + category = CAT_MARTIAN + +/datum/crafting_recipe/food/boh_loh_yah + name = "Boh loh yah" + reqs = list( + /obj/item/food/doughslice = 1, + /obj/item/food/butterslice = 1, + /datum/reagent/consumable/sugar = 5, + ) + result = /obj/item/food/boh_loh_yah + category = CAT_MARTIAN + +/datum/crafting_recipe/food/banana_fritter + name = "Banana fritter" + reqs = list( + /obj/item/food/grown/banana = 1, + /datum/reagent/consumable/martian_batter = 2 + ) + result = /obj/item/food/banana_fritter + category = CAT_MARTIAN + +/datum/crafting_recipe/food/pineapple_fritter + name = "Pineapple fritter" + reqs = list( + /obj/item/food/pineappleslice = 1, + /datum/reagent/consumable/martian_batter = 2 + ) + result = /obj/item/food/pineapple_fritter + category = CAT_MARTIAN + +/datum/crafting_recipe/food/kasei_dango + name = "Kasei dango" + reqs = list( + /obj/item/stack/rods = 1, + /datum/reagent/consumable/sugar = 5, + /datum/reagent/consumable/rice = 5, + /datum/reagent/consumable/orangejuice = 2, + /datum/reagent/consumable/grenadine = 2, + ) + result = /obj/item/food/kebab/kasei_dango + category = CAT_MARTIAN + +/datum/crafting_recipe/food/pb_ice_cream_mochi + name = "Peanut-butter ice cream mochi" + reqs = list( + /datum/reagent/consumable/sugar = 5, + /datum/reagent/consumable/rice = 5, + /datum/reagent/consumable/peanut_butter = 2, + /obj/item/food/icecream = 1, + ) + result = /obj/item/food/pb_ice_cream_mochi + category = CAT_MARTIAN + +/datum/crafting_recipe/food/frozen_pineapple_pop + name = "Frozen pineapple pop" + reqs = list( + /obj/item/food/pineappleslice = 1, + /obj/item/food/chocolatebar = 1, + /obj/item/popsicle_stick = 1, + ) + result = /obj/item/food/popsicle/pineapple_pop + category = CAT_MARTIAN + +/datum/crafting_recipe/food/sea_salt_pop + name = "Sea-salt ice cream bar" + reqs = list( + /datum/reagent/consumable/cream = 5, + /datum/reagent/consumable/sugar = 5, + /datum/reagent/consumable/salt = 3, + /obj/item/popsicle_stick = 1, + ) + result = /obj/item/food/popsicle/sea_salt + category = CAT_MARTIAN + +/datum/crafting_recipe/food/berry_topsicle + name = "Berry topsicle" + reqs = list( + /obj/item/food/tofu = 1, + /datum/reagent/consumable/berryjuice = 5, + /datum/reagent/consumable/sugar = 5, + /obj/item/popsicle_stick = 1, + ) + result = /obj/item/food/popsicle/topsicle + category = CAT_MARTIAN + +/datum/crafting_recipe/food/banana_topsicle + name = "Banana topsicle" + reqs = list( + /obj/item/food/tofu = 1, + /datum/reagent/consumable/banana = 5, + /datum/reagent/consumable/sugar = 5, + /obj/item/popsicle_stick = 1, + ) + result = /obj/item/food/popsicle/topsicle/banana + category = CAT_MARTIAN + +/datum/crafting_recipe/food/berry_topsicle + name = "Pineapple topsicle" + reqs = list( + /obj/item/food/tofu = 1, + /datum/reagent/consumable/pineapplejuice = 5, + /datum/reagent/consumable/sugar = 5, + /obj/item/popsicle_stick = 1, + ) + result = /obj/item/food/popsicle/topsicle/pineapple + category = CAT_MARTIAN + +/datum/crafting_recipe/food/plasma_dog_supreme + name = "Plasma Dog Supreme" + reqs = list( + /obj/item/food/hotdog = 1, + /obj/item/food/pineappleslice = 1, + /obj/item/food/sambal = 1, + /obj/item/food/onion_slice = 1, + ) + result = /obj/item/food/plasma_dog_supreme + category = CAT_MARTIAN + +/datum/crafting_recipe/food/frickles + name = "Frickles" + reqs = list( + /obj/item/food/pickle = 1, + /datum/reagent/consumable/martian_batter = 2, + /datum/reagent/consumable/red_bay = 1, + ) + result = /obj/item/food/frickles + category = CAT_MARTIAN + +/datum/crafting_recipe/food/raw_ballpark_pretzel + name = "Raw ballpark pretzel" + reqs = list( + /obj/item/food/doughslice = 1, + /datum/reagent/consumable/salt = 2, + ) + result = /obj/item/food/raw_ballpark_pretzel + category = CAT_MARTIAN + +/datum/crafting_recipe/food/raw_ballpark_tsukune + name = "Raw ballpark tsukune" + reqs = list( + /obj/item/food/raw_meatball/chicken = 1, + /datum/reagent/consumable/nutriment/soup/teriyaki = 2, + /obj/item/stack/rods = 1, + ) + result = /obj/item/food/kebab/raw_ballpark_tsukune + category = CAT_MARTIAN + +/datum/crafting_recipe/food/sprout_bowl + name = "Sprout bowl" + reqs = list( + /obj/item/food/pickled_voltvine = 1, + /obj/item/food/fishmeat = 1, + /obj/item/food/boiledrice = 1, + /datum/reagent/consumable/nutriment/soup/dashi = 5, + ) + result = /obj/item/food/salad/sprout_bowl + category = CAT_MARTIAN + +// Soups + +/datum/crafting_recipe/food/reaction/soup/boilednoodles + reaction = /datum/chemical_reaction/food/soup/boilednoodles + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/dashi + reaction = /datum/chemical_reaction/food/soup/dashi + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/teriyaki + reaction = /datum/chemical_reaction/food/soup/teriyaki + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/curry_sauce + reaction = /datum/chemical_reaction/food/soup/curry_sauce + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/shoyu_ramen + reaction = /datum/chemical_reaction/food/soup/shoyu_ramen + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/gyuramen + reaction = /datum/chemical_reaction/food/soup/gyuramen + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/new_osaka_sunrise + reaction = /datum/chemical_reaction/food/soup/new_osaka_sunrise + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/satsuma_black + reaction = /datum/chemical_reaction/food/soup/satsuma_black + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/dragon_ramen + reaction = /datum/chemical_reaction/food/soup/dragon_ramen + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/hong_kong_borscht + reaction = /datum/chemical_reaction/food/soup/hong_kong_borscht + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/hong_kong_macaroni + reaction = /datum/chemical_reaction/food/soup/hong_kong_macaroni + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/foxs_prize_soup + reaction = /datum/chemical_reaction/food/soup/foxs_prize_soup + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/secret_noodle_soup + reaction = /datum/chemical_reaction/food/soup/secret_noodle_soup + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/budae_jjigae + reaction = /datum/chemical_reaction/food/soup/budae_jjigae + category = CAT_MARTIAN + +/datum/crafting_recipe/food/reaction/soup/volt_fish + reaction = /datum/chemical_reaction/food/soup/volt_fish + category = CAT_MARTIAN diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm index c9bb566e19b..fcb25b39ba8 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm @@ -295,3 +295,24 @@ ) result = /obj/item/food/raw_meatloaf category = CAT_MEAT + +/datum/crafting_recipe/food/sweet_and_sour_meatballs + name = "Sweet and sour meatballs" + reqs = list( + /obj/item/food/meatball = 3, + /obj/item/food/pineappleslice = 1, + /obj/item/food/grown/bell_pepper = 1, + /datum/reagent/consumable/sugar = 5, + ) + result = /obj/item/food/sweet_and_sour_meatballs + category = CAT_MEAT + +/datum/crafting_recipe/food/pineapple_skewer + name = "Pineapple skewer" + reqs = list( + /obj/item/stack/rods = 1, + /obj/item/food/pineappleslice = 2, + /obj/item/food/meat/cutlet = 2, + ) + result = /obj/item/food/kebab/pineapple_skewer + category = CAT_MEAT diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm index 267cdea69b3..8778ee976ef 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_mexican.dm @@ -190,3 +190,14 @@ ) result = /obj/item/food/spanish_rice category = CAT_MEXICAN + +/datum/crafting_recipe/food/pineapple_salsa + name = "Pineapple salsa" + reqs = list( + /obj/item/food/pineappleslice = 2, + /obj/item/food/grown/tomato = 1, + /obj/item/food/grown/onion = 1, + /obj/item/food/grown/chili = 1, + ) + result = /obj/item/food/pineapple_salsa + category = CAT_MEXICAN diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm index 091c8606bcc..908ac40c016 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm @@ -428,3 +428,128 @@ result = /obj/item/storage/fancy/pickles_jar category = CAT_MISCFOOD delete_contents = FALSE + +/datum/crafting_recipe/food/sauteed_eggplant + name = "Sauteed eggplant" + reqs = list( + /obj/item/food/grown/eggplant = 1, + /obj/item/food/grown/garlic = 1, + /datum/reagent/consumable/quality_oil = 3, + ) + result = /obj/item/food/sauteed_eggplant + category = CAT_MISCFOOD + +/datum/crafting_recipe/food/stuffed_eggplant + name = "Stuffed eggplant" + reqs = list( + /obj/item/food/grown/eggplant = 1, + /obj/item/food/grown/garlic = 1, + /obj/item/food/grown/cabbage = 1, + /obj/item/food/cheese/wedge = 1, + /obj/item/food/meat/cutlet = 1, + ) + result = /obj/item/food/stuffed_eggplant + category = CAT_MISCFOOD + +/datum/crafting_recipe/food/baba_ghanoush + name = "Baba ghanoush" + reqs = list( + /obj/item/reagent_containers/cup/bowl = 1, + /obj/item/food/pita_bread = 1, + /obj/item/food/grown/eggplant = 1, + /obj/item/food/grown/garlic = 1, + /datum/reagent/consumable/quality_oil = 5, + /datum/reagent/consumable/lemonjuice = 3, + ) + result = /obj/item/food/baba_ghanoush + category = CAT_MISCFOOD + +/datum/crafting_recipe/food/moussaka + name = "Moussaka" + reqs = list( + /obj/item/food/grown/eggplant = 2, + /obj/item/food/grown/garlic = 1, + /obj/item/food/grown/onion = 1, + /obj/item/food/meat/cutlet = 1, + /obj/item/food/bechamel_sauce = 1, + ) + result = /obj/item/food/moussaka + category = CAT_MISCFOOD + +/datum/crafting_recipe/food/falafel + name = "Falafel" + reqs = list( + /obj/item/food/grown/soybeans = 1, + /obj/item/food/grown/garlic = 1, + /obj/item/food/grown/onion = 1, + /obj/item/food/grown/herbs = 1, + ) + result = /obj/item/food/falafel + category = CAT_MISCFOOD + +/datum/crafting_recipe/food/candied_pineapple + name = "Candied pineapple" + reqs = list( + /obj/item/food/pineappleslice = 1, + /datum/reagent/consumable/sugar = 2, + /datum/reagent/water = 2, + ) + result = /obj/item/food/candied_pineapple + category = CAT_MISCFOOD + +/datum/crafting_recipe/food/tzatziki_sauce + name = "Tzatziki sauce" + reqs = list( + /obj/item/food/grown/cucumber = 1, + /datum/reagent/consumable/quality_oil = 2, + /obj/item/food/grown/garlic = 1, + /datum/reagent/consumable/salt = 1, + ) + result = /obj/item/food/tzatziki_sauce + category = CAT_MISCFOOD + +/datum/crafting_recipe/food/tzatziki_and_pita_bread + name = "Tzatziki and pita bread" + reqs = list( + /obj/item/food/tzatziki_sauce = 1, + /obj/item/food/pita_bread = 1, + ) + result = /obj/item/food/tzatziki_and_pita_bread + category = CAT_MISCFOOD + +/datum/crafting_recipe/food/grilled_beef_gyro + name = "Grilled beef gyro" + reqs = list( + /obj/item/food/tzatziki_sauce = 1, + /obj/item/food/pita_bread = 1, + /obj/item/food/meat/cutlet = 2, + /obj/item/food/grown/cabbage = 1, + /obj/item/food/grown/tomato = 1, + /obj/item/food/grown/onion = 1, + ) + result = /obj/item/food/grilled_beef_gyro + category = CAT_MISCFOOD + +/datum/crafting_recipe/food/vegetarian_gyro + name = "Vegetarian gyro" + reqs = list( + /obj/item/food/tzatziki_sauce = 1, + /obj/item/food/pita_bread = 1, + /obj/item/food/grown/cucumber = 1, + /obj/item/food/grown/cabbage = 1, + /obj/item/food/grown/tomato = 1, + /obj/item/food/grown/onion = 1, + ) + result = /obj/item/food/vegetarian_gyro + category = CAT_MISCFOOD + +/datum/crafting_recipe/food/raw_pita_bread + name = "Raw pita bread" + reqs = list( + /datum/reagent/consumable/flour = 10, + /datum/reagent/water = 5, + /datum/reagent/consumable/quality_oil = 2, + /datum/reagent/consumable/sugar = 2, + ) + result = /obj/item/food/raw_pita_bread + category = CAT_MISCFOOD diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm index 24c84b6c15a..3ce319b1985 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm @@ -631,3 +631,40 @@ ) result = /obj/item/food/crunchy_peanut_butter_tart category = CAT_PASTRY + +/datum/crafting_recipe/food/chocolate_chip_cookie + name = "Chocolate chip cookie" + reqs = list( + /obj/item/food/pastrybase = 1, + /obj/item/food/chocolatebar = 1, + ) + result = /obj/item/food/cookie/chocolate_chip_cookie + category = CAT_PASTRY + +/datum/crafting_recipe/food/snickerdoodle + name = "Snickerdoodle" + reqs = list( + /obj/item/food/pastrybase = 1, + /datum/reagent/consumable/vanilla = 5, + ) + result = /obj/item/food/cookie/snickerdoodle + category = CAT_PASTRY + +/datum/crafting_recipe/food/thumbprint_cookie + name = "Thumbprint cookie" + reqs = list( + /obj/item/food/pastrybase = 1, + /datum/reagent/consumable/cherryjelly = 5, + ) + result = /obj/item/food/cookie/thumbprint_cookie + category = CAT_PASTRY + +/datum/crafting_recipe/food/macaron + name = "Macaron" + reqs = list( + /datum/reagent/consumable/eggwhite = 2, + /datum/reagent/consumable/cream = 5, + /datum/reagent/consumable/flour = 5, + ) + result = /obj/item/food/cookie/macaron + category = CAT_PASTRY diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_seafood.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_seafood.dm index 0e56a3e1d56..60c7de2e333 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_seafood.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_seafood.dm @@ -121,3 +121,27 @@ ) result = /obj/item/food/fish_poke category = CAT_SEAFOOD + +/datum/crafting_recipe/food/futomaki_sushi_roll + name ="Futomaki sushi roll" + reqs = list( + /obj/item/food/seaweedsheet = 1, + /obj/item/food/boiledrice = 1, + /obj/item/food/boiledegg = 1, + /obj/item/food/fishmeat = 1, + /obj/item/food/grown/cucumber = 1, + ) + result = /obj/item/food/futomaki_sushi_roll + category = CAT_SEAFOOD + +/datum/crafting_recipe/food/philadelphia_sushi_roll + name ="Philadelphia sushi roll" + reqs = list( + /obj/item/food/seaweedsheet = 1, + /obj/item/food/boiledrice = 1, + /obj/item/food/cheese/wedge = 1, + /obj/item/food/fishmeat = 1, + /obj/item/food/grown/cucumber = 1, + ) + result = /obj/item/food/philadelphia_sushi_roll + category = CAT_SEAFOOD diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm index ec5227c8e9d..589235eacb7 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm @@ -80,3 +80,80 @@ ) result = /obj/item/food/spaghetti/mac_n_cheese category = CAT_SPAGHETTI + +/datum/crafting_recipe/food/shoyu_tonkotsu_ramen + name = "Shoyu Tonkotsu ramen" + reqs = list( + /obj/item/reagent_containers/cup/bowl = 1, + /obj/item/food/spaghetti/boiledspaghetti = 1, + /obj/item/food/boiledegg = 1, + /obj/item/food/seaweedsheet = 1, + /obj/item/food/meat/cutlet = 1, + /obj/item/food/grown/onion = 1, + ) + result = /obj/item/food/spaghetti/shoyu_tonkotsu_ramen + category = CAT_SPAGHETTI + +/datum/crafting_recipe/food/kitakata_ramen + name = "Kitakata ramen" + reqs = list( + /obj/item/reagent_containers/cup/bowl = 1, + /obj/item/food/spaghetti/boiledspaghetti = 1, + /obj/item/food/meat/cutlet = 2, + /obj/item/food/grown/onion = 1, + /obj/item/food/grown/mushroom/chanterelle = 1, + /obj/item/food/grown/garlic = 1, + ) + result = /obj/item/food/spaghetti/kitakata_ramen + category = CAT_SPAGHETTI + +/datum/crafting_recipe/food/kitsune_udon + name = "Kitsune udon" + reqs = list( + /obj/item/reagent_containers/cup/bowl = 1, + /obj/item/food/spaghetti/boiledspaghetti = 1, + /obj/item/food/tofu = 2, + /obj/item/food/grown/onion = 1, + /datum/reagent/consumable/soysauce = 5, + /datum/reagent/consumable/sugar = 5, + ) + result = /obj/item/food/spaghetti/kitsune_udon + category = CAT_SPAGHETTI + +/datum/crafting_recipe/food/nikujaga + name = "Nikujaga" + reqs = list( + /obj/item/reagent_containers/cup/bowl = 1, + /obj/item/food/spaghetti/boiledspaghetti = 1, + /obj/item/food/meat/cutlet = 2, + /obj/item/food/grown/potato = 1, + /obj/item/food/grown/carrot = 1, + /obj/item/food/grown/peas = 1, + ) + result = /obj/item/food/spaghetti/nikujaga + category = CAT_SPAGHETTI + +/datum/crafting_recipe/food/pho + name = "Pho" + reqs = list( + /obj/item/reagent_containers/cup/bowl = 1, + /obj/item/food/spaghetti/boiledspaghetti = 1, + /obj/item/food/meat/cutlet = 1, + /obj/item/food/grown/onion = 1, + /obj/item/food/grown/cabbage = 1, + ) + result = /obj/item/food/spaghetti/pho + category = CAT_SPAGHETTI + +/datum/crafting_recipe/food/pad_thai + name = "Pad thai" + reqs = list( + /obj/item/reagent_containers/cup/bowl = 1, + /obj/item/food/spaghetti/boiledspaghetti = 1, + /obj/item/food/tofu = 1, + /obj/item/food/grown/onion = 1, + /obj/item/food/grown/peanut = 1, + /obj/item/food/grown/citrus/lime = 1, + ) + result = /obj/item/food/spaghetti/pad_thai + category = CAT_SPAGHETTI diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm index 1565bf74ba4..8a8946fa836 100644 --- a/code/modules/holiday/holidays.dm +++ b/code/modules/holiday/holidays.dm @@ -460,7 +460,7 @@ begin_month = AUGUST begin_day = 24 -/datum/holiday/indigenous/getStationPrefix() +/datum/holiday/ukraine/getStationPrefix() return pick("Kyiv", "Ukraine") // SEPTEMBER diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index 63ccab321d9..7a2b8f9841f 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -117,14 +117,12 @@ if(EXPLODE_LIGHT) SSexplosions.low_mov_atom += beaker -/obj/machinery/biogenerator/handle_atom_del(atom/deleting_atom) +/obj/machinery/biogenerator/Exited(atom/movable/gone, direction) . = ..() - - if(deleting_atom == beaker) + if(gone == beaker) beaker = null update_appearance() - /obj/machinery/biogenerator/RefreshParts() . = ..() diff --git a/code/modules/hydroponics/grown/corn.dm b/code/modules/hydroponics/grown/corn.dm index 9570b1ec3d8..655123d5a74 100644 --- a/code/modules/hydroponics/grown/corn.dm +++ b/code/modules/hydroponics/grown/corn.dm @@ -36,6 +36,7 @@ AddElement(/datum/element/microwavable, /obj/item/food/popcorn) /obj/item/grown/corncob + seed = /obj/item/seeds/corn name = "corn cob" desc = "A reminder of meals gone by." icon_state = "corncob" @@ -89,5 +90,10 @@ user.put_in_hands(S) snap_pops -= 1 if(!snap_pops) - new /obj/item/grown/corncob(user.loc) + new /obj/item/grown/corncob/snap(user.loc) qdel(src) + +/obj/item/grown/corncob/snap + seed = /obj/item/seeds/corn/snapcorn + name = "snap corn cob" + desc = "A reminder of pranks gone by." diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm index 4aac900c01f..8e5dda5a7fa 100644 --- a/code/modules/hydroponics/grown/replicapod.dm +++ b/code/modules/hydroponics/grown/replicapod.dm @@ -155,7 +155,7 @@ // Prevent accidental harvesting. Make sure the user REALLY wants to do this if there's a chance of this coming from a living creature. if(mind || ckey) var/choice = tgui_alert(usr,"The pod is currently devoid of soul. There is a possibility that a soul could claim this creature, or you could harvest it for seeds.", "Harvest Seeds?", list("Harvest Seeds", "Cancel")) - if(choice == "Cancel") + if(choice != "Harvest Seeds") return result // If this plant has already been harvested, return early. diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index b297008dd3d..a847d8aef04 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -833,7 +833,7 @@ message_admins("[ADMIN_LOOKUPFLW(user)] last altered a hydro tray's contents which spawned spiderlings.") user.log_message("last altered a hydro tray, which spiderlings spawned from.", LOG_GAME) visible_message(span_warning("The pests seem to behave oddly...")) - spawn_atom_to_turf(/mob/living/basic/spiderling/hunter, src, 3, FALSE) + spawn_atom_to_turf(/mob/living/basic/spider/growing/spiderling/hunter, src, 3, FALSE) else if(myseed) visible_message(span_warning("The pests seem to behave oddly in [myseed.name] tray, but quickly settle down...")) diff --git a/code/modules/industrial_lift/industrial_lift.dm b/code/modules/industrial_lift/industrial_lift.dm index e658528dd80..dd1b3f9604a 100644 --- a/code/modules/industrial_lift/industrial_lift.dm +++ b/code/modules/industrial_lift/industrial_lift.dm @@ -552,7 +552,7 @@ GLOBAL_LIST_INIT(all_radial_directions, list( var/list/atom/movable/foreign_contents_in_loc = list() for(var/atom/movable/foreign_movable as anything in (turf_loc.contents - original_contents)) - if(foreign_objects && ismovable(foreign_movable) && !ismob(foreign_movable)) + if(foreign_objects && ismovable(foreign_movable) && !ismob(foreign_movable) && !istype(foreign_movable, /obj/effect/landmark/tram)) foreign_contents_in_loc += foreign_movable continue diff --git a/code/modules/industrial_lift/tram/tram_doors.dm b/code/modules/industrial_lift/tram/tram_doors.dm index 3515adad900..f0253659eb6 100644 --- a/code/modules/industrial_lift/tram/tram_doors.dm +++ b/code/modules/industrial_lift/tram/tram_doors.dm @@ -3,6 +3,7 @@ desc = "Probably won't crush you if you try to rush them as they close. But we know you live on that danger, try and beat the tram!" icon = 'icons/obj/doors/tramdoor.dmi' req_access = list("tcomms") + multi_tile = TRUE var/associated_lift = MAIN_STATION_TRAM var/datum/weakref/tram_ref /// Are the doors in a malfunctioning state (dangerous) @@ -99,6 +100,8 @@ /obj/machinery/door/window/tram/Initialize(mapload, set_dir, unres_sides) . = ..() RemoveElement(/datum/element/atmos_sensitive, mapload) + if(filler) + filler.set_density(FALSE) // tram doors allow you to stand on the tile INVOKE_ASYNC(src, PROC_REF(open)) GLOB.tram_doors += src find_tram() diff --git a/code/modules/industrial_lift/tram/tram_landmark.dm b/code/modules/industrial_lift/tram/tram_landmark.dm index 0c6648c6d42..72dd32698dc 100644 --- a/code/modules/industrial_lift/tram/tram_landmark.dm +++ b/code/modules/industrial_lift/tram/tram_landmark.dm @@ -19,44 +19,9 @@ GLOBAL_LIST_EMPTY(tram_landmarks) LAZYREMOVEASSOC(GLOB.tram_landmarks, specific_lift_id, src) return ..() -//tramstation - -/obj/effect/landmark/tram/tramstation/west - name = "West Wing" - platform_code = TRAMSTATION_WEST - tgui_icons = list("Arrivals" = "plane-arrival", "Command" = "bullhorn", "Security" = "gavel") - -/obj/effect/landmark/tram/tramstation/central - name = "Central Wing" - platform_code = TRAMSTATION_CENTRAL - tgui_icons = list("Service" = "cocktail", "Medical" = "plus", "Engineering" = "wrench") - -/obj/effect/landmark/tram/tramstation/east - name = "East Wing" - platform_code = TRAMSTATION_EAST - tgui_icons = list("Departures" = "plane-departure", "Cargo" = "box", "Science" = "flask") - -//birdshot - -/obj/effect/landmark/tram/birdshot/sec_wing - name = "Security Wing" - platform_code = BIRDSHOT_SECURITY_WING - tgui_icons = list("Security" = "gavel") - -/obj/effect/landmark/tram/birdshot/prison_wing - name = "Prison Wing" - platform_code = BIRDSHOT_PRISON_WING - tgui_icons = list("Prison" = "box") - -/obj/effect/landmark/tram/birdshot/maint_left - name = "Port Platform" - platform_code = BIRDSHOT_MAINTENANCE_LEFT - tgui_icons = list("Port Platform" = "plane-departure") - -/obj/effect/landmark/tram/birdshot/maint_right - name = "Starboard Platform" - platform_code = BRIDSHOT_MAINTENANCE_RIGHT - tgui_icons = list("Starboard Platform" = "plane-arrival") +/obj/effect/landmark/tram/nav + name = "tram nav beacon" + invisibility = INVISIBILITY_MAXIMUM // nav aids can't be abstract since they stay with the tram /** * lift_id landmarks. used to map in specific_lift_id to trams. when the trams lift_master encounters one on a trams tile @@ -65,6 +30,80 @@ GLOBAL_LIST_EMPTY(tram_landmarks) /obj/effect/landmark/lift_id name = "lift id setter" icon_state = "lift_id" - - ///what specific id we give to the tram we're placed on, should explicitely set this if its a subtype, or weird things might happen + ///what specific id we give to the tram we're placed on, should explicitly set this if its a subtype, or weird things might happen var/specific_lift_id = MAIN_STATION_TRAM + +//tramstation + +/obj/effect/landmark/tram/nav/tramstation/main + name = MAIN_STATION_TRAM + specific_lift_id = TRAM_NAV_BEACONS + dir = WEST + +/obj/effect/landmark/tram/platform/tramstation/west + name = "West Wing" + platform_code = TRAMSTATION_WEST + tgui_icons = list("Arrivals" = "plane-arrival", "Command" = "bullhorn", "Security" = "gavel") + +/obj/effect/landmark/tram/platform/tramstation/central + name = "Central Wing" + platform_code = TRAMSTATION_CENTRAL + tgui_icons = list("Service" = "cocktail", "Medical" = "plus", "Engineering" = "wrench") + +/obj/effect/landmark/tram/platform/tramstation/east + name = "East Wing" + platform_code = TRAMSTATION_EAST + tgui_icons = list("Departures" = "plane-departure", "Cargo" = "box", "Science" = "flask") + +//map-agnostic landmarks + +/obj/effect/landmark/tram/nav/immovable_rod + name = "DESTINATION/NOT/FOUND" + specific_lift_id = IMMOVABLE_ROD_DESTINATIONS + +/obj/effect/landmark/tram/nav/hilbert/research + name = HILBERT_TRAM + specific_lift_id = TRAM_NAV_BEACONS + dir = WEST + +//birdshot + +/obj/effect/landmark/lift_id/birdshot/prison + specific_lift_id = PRISON_TRAM + +/obj/effect/landmark/lift_id/birdshot/maint + specific_lift_id = MAINTENANCE_TRAM + +/obj/effect/landmark/tram/nav/birdshot/prison + name = PRISON_TRAM + specific_lift_id = TRAM_NAV_BEACONS + dir = NORTH + +/obj/effect/landmark/tram/nav/birdshot/maint + name = MAINTENANCE_TRAM + specific_lift_id = TRAM_NAV_BEACONS + dir = WEST + +/obj/effect/landmark/tram/platform/birdshot/sec_wing + name = "Security Wing" + specific_lift_id = PRISON_TRAM + platform_code = BIRDSHOT_SECURITY_WING + tgui_icons = list("Security" = "gavel") + +/obj/effect/landmark/tram/platform/birdshot/prison_wing + name = "Prison Wing" + specific_lift_id = PRISON_TRAM + platform_code = BIRDSHOT_PRISON_WING + tgui_icons = list("Prison" = "box") + +/obj/effect/landmark/tram/platform/birdshot/maint_left + name = "Port Platform" + specific_lift_id = MAINTENANCE_TRAM + platform_code = BIRDSHOT_MAINTENANCE_LEFT + tgui_icons = list("Port Platform" = "plane-departure") + +/obj/effect/landmark/tram/platform/birdshot/maint_right + name = "Starboard Platform" + specific_lift_id = MAINTENANCE_TRAM + platform_code = BRIDSHOT_MAINTENANCE_RIGHT + tgui_icons = list("Starboard Platform" = "plane-arrival") diff --git a/code/modules/industrial_lift/tram/tram_lift_master.dm b/code/modules/industrial_lift/tram/tram_lift_master.dm index ed031d3dd24..e2d044dc5b2 100644 --- a/code/modules/industrial_lift/tram/tram_lift_master.dm +++ b/code/modules/industrial_lift/tram/tram_lift_master.dm @@ -17,6 +17,9 @@ /// and the destination landmark. var/obj/effect/landmark/tram/idle_platform + /// a navigational landmark that we use to find the tram's location on the map at any time + var/obj/effect/landmark/tram/nav/nav_beacon + ///decisecond delay between horizontal movement. cannot make the tram move faster than 1 movement per world.tick_lag. ///this var is poorly named its actually horizontal movement delay but whatever. var/horizontal_speed = 0.5 @@ -58,14 +61,18 @@ /datum/lift_master/tram/check_for_landmarks(obj/structure/industrial_lift/tram/new_lift_platform) . = ..() for(var/turf/platform_loc as anything in new_lift_platform.locs) - var/obj/effect/landmark/tram/initial_destination = locate() in platform_loc + var/obj/effect/landmark/tram/platform/initial_destination = locate() in platform_loc + var/obj/effect/landmark/tram/nav/beacon = locate() in platform_loc if(initial_destination) idle_platform = initial_destination + if(beacon) + nav_beacon = beacon + /datum/lift_master/tram/proc/check_starting_landmark() - if(!idle_platform) - CRASH("a tram lift_master was initialized without any tram landmark to give it direction!") + if(!idle_platform || !nav_beacon) + CRASH("a tram lift_master was initialized without the required landmarks to give it direction!") SStramprocess.can_fire = TRUE @@ -114,19 +121,21 @@ */ /datum/lift_master/tram/proc/tram_travel(obj/effect/landmark/tram/destination_platform, rapid = FALSE) if(destination_platform == idle_platform) - return + return FALSE - travel_direction = get_dir(idle_platform, destination_platform) - travel_distance = get_dist(idle_platform, destination_platform) + travel_direction = get_dir(nav_beacon, destination_platform) + travel_distance = get_dist(nav_beacon, destination_platform) travel_trip_length = travel_distance idle_platform = destination_platform set_travelling(TRUE) set_controls(LIFT_PLATFORM_LOCKED) if(rapid) // bypass for unsafe, rapid departure dispatch_tram(destination_platform) + return TRUE else update_tram_doors(CLOSE_DOORS) addtimer(CALLBACK(src, PROC_REF(dispatch_tram), destination_platform), 3 SECONDS) + return TRUE /datum/lift_master/tram/proc/dispatch_tram(obj/effect/landmark/tram/destination_platform) SEND_SIGNAL(src, COMSIG_TRAM_TRAVEL, idle_platform, destination_platform) @@ -219,3 +228,103 @@ else stack_trace("Tram doors update_tram_doors called with an improper action ([action]).") + +/datum/lift_master/tram/proc/set_operational(new_value) + if(is_operational != new_value) + is_operational = new_value + +/** + * Returns the closest tram nav beacon to an atom + * + * Creates a list of nav beacons in the requested direction + * and returns the closest to be passed to the industrial_lift + * + * Arguments: source: the starting point to find a beacon + * travel_dir: travel direction in tram form, INBOUND or OUTBOUND + * beacon_type: what list of beacons we pull from + */ +/datum/lift_master/tram/proc/closest_nav_in_travel_dir(atom/origin, travel_dir, beacon_type) + if(!istype(origin) || !origin.z) + return FALSE + + var/list/obj/effect/landmark/tram/nav/inbound_candidates = list() + var/list/obj/effect/landmark/tram/nav/outbound_candidates = list() + + for(var/obj/effect/landmark/tram/nav/candidate_beacon in GLOB.tram_landmarks[beacon_type]) + if(candidate_beacon.z != origin.z || candidate_beacon.z != nav_beacon.z) + continue + + switch(nav_beacon.dir) + if(EAST, WEST) + if(candidate_beacon.y != nav_beacon.y) + continue + else if(candidate_beacon.x < nav_beacon.x) + inbound_candidates += candidate_beacon + else + outbound_candidates += candidate_beacon + if(NORTH, SOUTH) + if(candidate_beacon.x != nav_beacon.x) + continue + else if(candidate_beacon.y < nav_beacon.y) + inbound_candidates += candidate_beacon + else + outbound_candidates += candidate_beacon + + switch(travel_dir) + if(INBOUND) + var/obj/effect/landmark/tram/nav/selected = get_closest_atom(/obj/effect/landmark/tram/nav, inbound_candidates, origin) + if(selected) + return selected + stack_trace("No inbound beacon candidate found for [origin]. Cancelling dispatch.") + return FALSE + + if(OUTBOUND) + var/obj/effect/landmark/tram/nav/selected = get_closest_atom(/obj/effect/landmark/tram/nav, outbound_candidates, origin) + if(selected) + return selected + stack_trace("No outbound beacon candidate found for [origin]. Cancelling dispatch.") + return FALSE + + else + stack_trace("Tram receieved invalid travel direction [travel_dir]. Cancelling dispatch.") + + return FALSE + +/** + * Moves the tram when hit by an immovable rod + * + * Tells the individual tram parts where to actually go and has an extra safety checks + * incase multiple inputs get through, preventing conflicting directions and the tram + * literally ripping itself apart. all of the actual movement is handled by SStramprocess + * + * Arguments: collided_rod (the immovable rod that hit the tram) + * Return: push_destination (the landmark /obj/effect/landmark/tram/nav that the tram is being pushed to due to the rod's trajectory) + */ +/datum/lift_master/tram/proc/rod_collision(obj/effect/immovablerod/collided_rod) + if(!is_operational) + return + var/rod_velocity_sign + // Determine inbound or outbound + if(collided_rod.dir & (NORTH|SOUTH)) + rod_velocity_sign = collided_rod.dir & NORTH ? OUTBOUND : INBOUND + else + rod_velocity_sign = collided_rod.dir & EAST ? OUTBOUND : INBOUND + + var/obj/effect/landmark/tram/nav/push_destination = closest_nav_in_travel_dir(origin = nav_beacon, travel_dir = rod_velocity_sign, beacon_type = IMMOVABLE_ROD_DESTINATIONS) + if(!push_destination) + return + travel_direction = get_dir(nav_beacon, push_destination) + travel_distance = get_dist(nav_beacon, push_destination) + travel_trip_length = travel_distance + idle_platform = push_destination + // Don't bother processing crossing signals, where this tram's going there are no signals + for(var/obj/machinery/crossing_signal/xing as anything in GLOB.tram_signals) + xing.temp_malfunction() + priority_announce("In a turn of rather peculiar events, it appears that [GLOB.station_name] has struck an immovable rod. (Don't ask us where it came from.) This has led to a station brakes failure on one of the tram platforms.\n\n\ + Our diligent team of engineers have been informed and they're rushing over - although not quite at the speed of our recently flying tram.\n\n\ + So while we all look in awe at the universe's mysterious sense of humour, please stand clear of the tracks and remember to stand behind the yellow line.", "Braking News") + set_travelling(TRUE) + set_controls(LIFT_PLATFORM_LOCKED) + dispatch_tram(destination_platform = push_destination) + set_operational(FALSE) + return push_destination diff --git a/code/modules/industrial_lift/tram/tram_machinery.dm b/code/modules/industrial_lift/tram/tram_machinery.dm index 1a092052229..2e4399cce70 100644 --- a/code/modules/industrial_lift/tram/tram_machinery.dm +++ b/code/modules/industrial_lift/tram/tram_machinery.dm @@ -144,7 +144,8 @@ GLOBAL_LIST_EMPTY(tram_doors) return FALSE if(tram_part.controls_locked || tram_part.travelling) // someone else started already return FALSE - tram_part.tram_travel(destination_platform) + if(!tram_part.tram_travel(destination_platform)) + return FALSE // lift_master failure say("The next station is: [destination_platform.name]") update_appearance() return TRUE @@ -412,6 +413,10 @@ GLOBAL_LIST_EMPTY(tram_doors) malfunctioning = FALSE process() +/obj/machinery/crossing_signal/proc/temp_malfunction() + start_malfunction() + addtimer(CALLBACK(src, PROC_REF(end_malfunction)), 15 SECONDS) + /** * Finds the tram, just like the tram computer * @@ -692,44 +697,44 @@ GLOBAL_LIST_EMPTY(tram_doors) return PROCESS_KILL if(!tram.travelling) - if(istype(tram.idle_platform, /obj/effect/landmark/tram/tramstation/west)) + if(istype(tram.idle_platform, /obj/effect/landmark/tram/platform/tramstation/west)) icon_state = "[base_icon_state][DESTINATION_WEST_IDLE]" light_mask = "[base_icon_state][DESTINATION_WEST_IDLE]_e" previous_destination = tram.idle_platform update_appearance() return PROCESS_KILL - if(istype(tram.idle_platform, /obj/effect/landmark/tram/tramstation/central)) + if(istype(tram.idle_platform, /obj/effect/landmark/tram/platform/tramstation/central)) icon_state = "[base_icon_state][DESTINATION_CENTRAL_IDLE]" light_mask = "[base_icon_state][DESTINATION_CENTRAL_IDLE]_e" previous_destination = tram.idle_platform update_appearance() return PROCESS_KILL - if(istype(tram.idle_platform, /obj/effect/landmark/tram/tramstation/east)) + if(istype(tram.idle_platform, /obj/effect/landmark/tram/platform/tramstation/east)) icon_state = "[base_icon_state][DESTINATION_EAST_IDLE]" light_mask = "[base_icon_state][DESTINATION_EAST_IDLE]_e" previous_destination = tram.idle_platform update_appearance() return PROCESS_KILL - if(istype(tram.idle_platform, /obj/effect/landmark/tram/tramstation/west)) + if(istype(tram.idle_platform, /obj/effect/landmark/tram/platform/tramstation/west)) icon_state = "[base_icon_state][DESTINATION_WEST_ACTIVE]" light_mask = "[base_icon_state][DESTINATION_WEST_ACTIVE]_e" update_appearance() return PROCESS_KILL - if(istype(tram.idle_platform, /obj/effect/landmark/tram/tramstation/central)) - if(istype(previous_destination, /obj/effect/landmark/tram/tramstation/west)) + if(istype(tram.idle_platform, /obj/effect/landmark/tram/platform/tramstation/central)) + if(istype(previous_destination, /obj/effect/landmark/tram/platform/tramstation/west)) icon_state = "[base_icon_state][DESTINATION_CENTRAL_EASTBOUND_ACTIVE]" light_mask = "[base_icon_state][DESTINATION_CENTRAL_EASTBOUND_ACTIVE]_e" - if(istype(previous_destination, /obj/effect/landmark/tram/tramstation/east)) + if(istype(previous_destination, /obj/effect/landmark/tram/platform/tramstation/east)) icon_state = "[base_icon_state][DESTINATION_CENTRAL_WESTBOUND_ACTIVE]" light_mask = "[base_icon_state][DESTINATION_CENTRAL_WESTBOUND_ACTIVE]_e" update_appearance() return PROCESS_KILL - if(istype(tram.idle_platform, /obj/effect/landmark/tram/tramstation/east)) + if(istype(tram.idle_platform, /obj/effect/landmark/tram/platform/tramstation/east)) icon_state = "[base_icon_state][DESTINATION_EAST_ACTIVE]" light_mask = "[base_icon_state][DESTINATION_EAST_ACTIVE]_e" update_appearance() diff --git a/code/modules/industrial_lift/tram/tram_remote.dm b/code/modules/industrial_lift/tram/tram_remote.dm index d29d595e08d..abb3b430e18 100644 --- a/code/modules/industrial_lift/tram/tram_remote.dm +++ b/code/modules/industrial_lift/tram/tram_remote.dm @@ -1,5 +1,3 @@ -#define TRAMCTRL_INBOUND 1 -#define TRAMCTRL_OUTBOUND 0 #define TRAMCTRL_FAST 1 #define TRAMCTRL_SAFE 0 @@ -13,7 +11,7 @@ desc = "A remote control that can be linked to a tram. This can only go well." w_class = WEIGHT_CLASS_TINY ///desired tram direction - var/direction = TRAMCTRL_INBOUND + var/direction = INBOUND ///fast and fun, or safe and boring var/mode = TRAMCTRL_FAST ///weakref to the tram piece we control @@ -37,10 +35,10 @@ ///set tram control direction /obj/item/tram_remote/attack_self_secondary(mob/user) switch(direction) - if(TRAMCTRL_INBOUND) - direction = TRAMCTRL_OUTBOUND - if(TRAMCTRL_OUTBOUND) - direction = TRAMCTRL_INBOUND + if(INBOUND) + direction = OUTBOUND + if(OUTBOUND) + direction = INBOUND update_appearance() balloon_alert(user, "[direction ? "< inbound" : "outbound >"]") return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN @@ -77,9 +75,9 @@ icon_state = "tramremote_nis" return switch(direction) - if(TRAMCTRL_INBOUND) + if(INBOUND) icon_state = "tramremote_ib" - if(TRAMCTRL_OUTBOUND) + if(OUTBOUND) icon_state = "tramremote_ob" /obj/item/tram_remote/update_overlays() @@ -107,9 +105,9 @@ var/destination_platform = null var/platform = 0 switch(direction) - if(TRAMCTRL_INBOUND) + if(INBOUND) platform = clamp(tram_part.idle_platform.platform_code - 1, 1, INFINITY) - if(TRAMCTRL_OUTBOUND) + if(OUTBOUND) platform = clamp(tram_part.idle_platform.platform_code + 1, 1, INFINITY) if(platform == tram_part.idle_platform.platform_code) balloon_alert(user, "invalid command!") @@ -148,7 +146,5 @@ balloon_alert(user, "link failed!") update_appearance() -#undef TRAMCTRL_INBOUND -#undef TRAMCTRL_OUTBOUND #undef TRAMCTRL_FAST #undef TRAMCTRL_SAFE diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index f60e78221f4..2a5a14b066d 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -41,7 +41,7 @@ var/obj/item/mmi/brain_mmi = accessor.loc if(ismecha(brain_mmi.loc)) var/obj/vehicle/sealed/mecha/big_stompy_robot = brain_mmi.loc - return check_access_list(big_stompy_robot.operation_req_access) + return check_access_list(big_stompy_robot.accesses) return FALSE /obj/item/proc/GetAccess() diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index 36a79b429c8..e4f2d5536f9 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -288,6 +288,7 @@ var/backpack = /obj/item/storage/backpack var/satchel = /obj/item/storage/backpack/satchel var/duffelbag = /obj/item/storage/backpack/duffelbag + var/messenger = /obj/item/storage/backpack/messenger var/pda_slot = ITEM_SLOT_BELT @@ -302,10 +303,16 @@ back = /obj/item/storage/backpack/duffelbag //Grey Duffel bag if(LSATCHEL) back = /obj/item/storage/backpack/satchel/leather //Leather Satchel + if(GMESSENGER) + back = /obj/item/storage/backpack/messenger //Grey messenger bag if(DSATCHEL) back = satchel //Department satchel + if(DMESSENGER) + back = messenger //SKYRAT EDIT - Messenger Bags if(DDUFFELBAG) back = duffelbag //Department duffel bag + if(DMESSENGER) + back = messenger //Department messenger bag else back = backpack //Department backpack diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm index 77f52fd8ab6..8947a77c508 100644 --- a/code/modules/jobs/job_types/atmospheric_technician.dm +++ b/code/modules/jobs/job_types/atmospheric_technician.dm @@ -52,6 +52,7 @@ backpack = /obj/item/storage/backpack/industrial satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering + messenger = /obj/item/storage/backpack/messenger/eng box = /obj/item/storage/box/survival/engineer pda_slot = ITEM_SLOT_LPOCKET diff --git a/code/modules/jobs/job_types/bartender.dm b/code/modules/jobs/job_types/bartender.dm index 0d33c968e56..13a4162ff3b 100644 --- a/code/modules/jobs/job_types/bartender.dm +++ b/code/modules/jobs/job_types/bartender.dm @@ -48,7 +48,8 @@ jobtype = /datum/job/bartender id_trim = /datum/id_trim/job/bartender - uniform = /obj/item/clothing/under/rank/civilian/bartender + neck = /obj/item/clothing/neck/bowtie + uniform = /obj/item/clothing/under/costume/buttondown/slacks/service suit = /obj/item/clothing/suit/armor/vest backpack_contents = list( /obj/item/storage/box/beanbag = 1, diff --git a/code/modules/jobs/job_types/botanist.dm b/code/modules/jobs/job_types/botanist.dm index d977b221b47..7ccc4b31ceb 100644 --- a/code/modules/jobs/job_types/botanist.dm +++ b/code/modules/jobs/job_types/botanist.dm @@ -54,3 +54,4 @@ backpack = /obj/item/storage/backpack/botany satchel = /obj/item/storage/backpack/satchel/hyd duffelbag = /obj/item/storage/backpack/duffelbag/hydroponics + messenger = /obj/item/storage/backpack/messenger/hyd diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index 1729b3c713f..bccfbe1ce1a 100755 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -75,6 +75,7 @@ backpack = /obj/item/storage/backpack/captain satchel = /obj/item/storage/backpack/satchel/cap duffelbag = /obj/item/storage/backpack/duffelbag/captain + messenger = /obj/item/storage/backpack/messenger/cap accessory = /obj/item/clothing/accessory/medal/gold/captain chameleon_extras = list( diff --git a/code/modules/jobs/job_types/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm index a6c398feafd..dd269bc7e37 100644 --- a/code/modules/jobs/job_types/cargo_technician.dm +++ b/code/modules/jobs/job_types/cargo_technician.dm @@ -46,6 +46,7 @@ id_trim = /datum/id_trim/job/cargo_technician uniform = /obj/item/clothing/under/rank/cargo/tech belt = /obj/item/modular_computer/pda/cargo + suit = /obj/item/clothing/suit/toggle/cargo_tech ears = /obj/item/radio/headset/headset_cargo l_hand = /obj/item/universal_scanner diff --git a/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm b/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm index bd15158e872..15dd39861a4 100644 --- a/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm +++ b/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm @@ -19,12 +19,14 @@ If the scythe isn't empowered when you sheath it, you take a heap of damage and var/obj/item/vorpalscythe/scythe = active_item if(!scythe) return FALSE - if(scythe.empowerment < SCYTHE_SATED) - to_chat(owner, span_userdanger("[scythe] tears into you for your unworthy display of arrogance!")) - playsound(owner, 'sound/magic/demon_attack1.ogg', 50, TRUE) - var/obj/item/bodypart/part = owner.get_holding_bodypart_of_item(scythe) - if(part) - part.receive_damage(brute = 25, wound_bonus = 10, sharpness = SHARP_EDGED) + + var/obj/item/bodypart/part = hand + if(isnull(part) || scythe.empowerment > SCYTHE_SATED) + return ..() + + to_chat(owner, span_userdanger("[scythe] tears into you for your unworthy display of arrogance!")) + playsound(owner, 'sound/magic/demon_attack1.ogg', 50, TRUE) + part.receive_damage(brute = 25, wound_bonus = 10, sharpness = SHARP_EDGED) return ..() /obj/item/vorpalscythe diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm index b53f95cd687..bdb48c84f35 100644 --- a/code/modules/jobs/job_types/chemist.dm +++ b/code/modules/jobs/job_types/chemist.dm @@ -55,6 +55,7 @@ backpack = /obj/item/storage/backpack/chemistry satchel = /obj/item/storage/backpack/satchel/chem duffelbag = /obj/item/storage/backpack/duffelbag/chemistry + messenger = /obj/item/storage/backpack/messenger/chem box = /obj/item/storage/box/survival/medical chameleon_extras = /obj/item/gun/syringe diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index b3b648e6d08..cee7b7ca7eb 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -61,7 +61,8 @@ uniform = /obj/item/clothing/under/rank/engineering/chief_engineer backpack_contents = list( /obj/item/melee/baton/telescopic = 1, - ) + /obj/item/construction/rcd/ce = 1, + ) belt = /obj/item/storage/belt/utility/chief/full ears = /obj/item/radio/headset/heads/ce gloves = /obj/item/clothing/gloves/color/black @@ -72,6 +73,7 @@ backpack = /obj/item/storage/backpack/industrial satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering + messenger = /obj/item/storage/backpack/messenger/eng box = /obj/item/storage/box/survival/engineer chameleon_extras = /obj/item/stamp/head/ce diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index 448c764d44e..92c272167a0 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -72,6 +72,7 @@ backpack = /obj/item/storage/backpack/medic satchel = /obj/item/storage/backpack/satchel/med duffelbag = /obj/item/storage/backpack/duffelbag/med + messenger = /obj/item/storage/backpack/messenger/med box = /obj/item/storage/box/survival/medical chameleon_extras = list( diff --git a/code/modules/jobs/job_types/clown.dm b/code/modules/jobs/job_types/clown.dm index 7e9fa44d052..607c7214d90 100644 --- a/code/modules/jobs/job_types/clown.dm +++ b/code/modules/jobs/job_types/clown.dm @@ -66,6 +66,7 @@ backpack = /obj/item/storage/backpack/clown satchel = /obj/item/storage/backpack/clown duffelbag = /obj/item/storage/backpack/duffelbag/clown //strangely has a duffel + messenger = /obj/item/storage/backpack/messenger/clown box = /obj/item/storage/box/survival/hug chameleon_extras = /obj/item/stamp/clown diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm index 66af08e4b8d..a3f03c2d9b1 100644 --- a/code/modules/jobs/job_types/cook.dm +++ b/code/modules/jobs/job_types/cook.dm @@ -63,7 +63,7 @@ jobtype = /datum/job/cook id_trim = /datum/id_trim/job/cook/chef - uniform = /obj/item/clothing/under/rank/civilian/chef + uniform = /obj/item/clothing/under/costume/buttondown/slacks/service suit = /obj/item/clothing/suit/toggle/chef backpack_contents = list( /obj/item/choice_beacon/ingredient = 1, diff --git a/code/modules/jobs/job_types/coroner.dm b/code/modules/jobs/job_types/coroner.dm index 14928b76dc5..22f6c5e65db 100644 --- a/code/modules/jobs/job_types/coroner.dm +++ b/code/modules/jobs/job_types/coroner.dm @@ -69,5 +69,6 @@ backpack = /obj/item/storage/backpack/coroner satchel = /obj/item/storage/backpack/satchel/coroner duffelbag = /obj/item/storage/backpack/duffelbag/coroner + messenger = /obj/item/storage/backpack/messenger/coroner skillchips = list(/obj/item/skillchip/entrails_reader) diff --git a/code/modules/jobs/job_types/geneticist.dm b/code/modules/jobs/job_types/geneticist.dm index 0b97bcb36e6..2498eb7c2a3 100644 --- a/code/modules/jobs/job_types/geneticist.dm +++ b/code/modules/jobs/job_types/geneticist.dm @@ -48,3 +48,4 @@ backpack = /obj/item/storage/backpack/genetics satchel = /obj/item/storage/backpack/satchel/gen duffelbag = /obj/item/storage/backpack/duffelbag/genetics + messenger = /obj/item/storage/backpack/messenger/gen diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index d648ae3536a..7cab0feab96 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -63,10 +63,6 @@ shoes = /obj/item/clothing/shoes/laceup suit = /obj/item/clothing/suit/armor/vest/hop - backpack = /obj/item/storage/backpack/head_of_personnel // SKYRAT EDIT CHANGE - HOP DRIP - satchel = /obj/item/storage/backpack/satchel/head_of_personnel // SKYRAT EDIT CHANGE - HOP DRIP - duffelbag = /obj/item/storage/backpack/duffelbag/head_of_personnel // SKYRAT EDIT CHANGE - HOP DRIP - chameleon_extras = list( /obj/item/gun/energy/e_gun, /obj/item/stamp/head/hop, diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index 6834884e478..973c2a4a139 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -51,14 +51,12 @@ id_trim = /datum/id_trim/job/head_of_security uniform = /obj/item/clothing/under/rank/security/head_of_security suit = /obj/item/clothing/suit/armor/hos/trenchcoat - suit_store = /obj/item/gun/energy/e_gun //KEPLER EDIT RESTORATION + suit_store = /obj/item/gun/energy/e_gun backpack_contents = list( /obj/item/evidencebag = 1, - /obj/item/flashlight/seclite = 1, - /obj/item/modular_computer/pda/heads/hos = 1, - /obj/item/choice_beacon/head_of_security = 1, + /obj/item/choice_beacon/head_of_security = 1, // BUBBER EDIT ADDITION ) - belt = /obj/item/storage/belt/security/full + belt = /obj/item/modular_computer/pda/heads/hos ears = /obj/item/radio/headset/heads/hos/alt glasses = /obj/item/clothing/glasses/hud/security/sunglasses gloves = /obj/item/clothing/gloves/color/black/security //SKYRAT EDIT CHANGE - Original: /obj/item/clothing/gloves/color/black @@ -70,6 +68,7 @@ backpack = /obj/item/storage/backpack/security satchel = /obj/item/storage/backpack/satchel/sec duffelbag = /obj/item/storage/backpack/duffelbag/sec + messenger = /obj/item/storage/backpack/messenger/sec box = /obj/item/storage/box/survival/security chameleon_extras = list( @@ -88,7 +87,7 @@ mask = /obj/item/clothing/mask/gas/sechailer internals_slot = ITEM_SLOT_SUITSTORE -//TEST THIS OUT WHEN NEEDED +//BUBBER EDIT ADDITION BEGIN /obj/item/choice_beacon/head_of_security name = "gun choice beacon" @@ -136,4 +135,4 @@ new /obj/item/clothing/under/rank/security/head_of_security/peacekeeper/sol(src) new /obj/item/clothing/neck/tie/red(src) new /obj/item/storage/pill_bottle/probital(src) - +// BUBBER EDIT ADDITION END diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm index 049ca748957..6f7359ddb7a 100644 --- a/code/modules/jobs/job_types/medical_doctor.dm +++ b/code/modules/jobs/job_types/medical_doctor.dm @@ -56,6 +56,7 @@ backpack = /obj/item/storage/backpack/medic satchel = /obj/item/storage/backpack/satchel/med duffelbag = /obj/item/storage/backpack/duffelbag/med + messenger = /obj/item/storage/backpack/messenger/med box = /obj/item/storage/box/survival/medical chameleon_extras = /obj/item/gun/syringe diff --git a/code/modules/jobs/job_types/mime.dm b/code/modules/jobs/job_types/mime.dm index 43ed9a817dd..eba86ec2af0 100644 --- a/code/modules/jobs/job_types/mime.dm +++ b/code/modules/jobs/job_types/mime.dm @@ -97,7 +97,10 @@ spell_icons[initial(type.name)] = image(icon = initial(type.button_icon), icon_state = initial(type.button_icon_state)) name_to_spell[initial(type.name)] = type var/picked_spell = show_radial_menu(user, src, spell_icons, custom_check = CALLBACK(src, PROC_REF(check_menu), user), radius = 36, require_near = TRUE) + if(!picked_spell) + return FALSE granted_action = name_to_spell[picked_spell] + return TRUE /obj/item/book/granter/action/spell/mime/mimery/on_reading_finished(mob/living/user) // Gives the user a vow ability too, if they don't already have one diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm index 09bd837382a..53e9b22bf1d 100644 --- a/code/modules/jobs/job_types/paramedic.dm +++ b/code/modules/jobs/job_types/paramedic.dm @@ -60,6 +60,7 @@ backpack = /obj/item/storage/backpack/medic satchel = /obj/item/storage/backpack/satchel/med duffelbag = /obj/item/storage/backpack/duffelbag/med + messenger = /obj/item/storage/backpack/messenger/med box = /obj/item/storage/box/survival/medical chameleon_extras = /obj/item/gun/syringe diff --git a/code/modules/jobs/job_types/psychologist.dm b/code/modules/jobs/job_types/psychologist.dm index 3ece5c84371..4a1d291c867 100644 --- a/code/modules/jobs/job_types/psychologist.dm +++ b/code/modules/jobs/job_types/psychologist.dm @@ -56,6 +56,7 @@ backpack = /obj/item/storage/backpack/medic satchel = /obj/item/storage/backpack/satchel/med duffelbag = /obj/item/storage/backpack/duffelbag/med + messenger = /obj/item/storage/backpack/messenger/med pda_slot = ITEM_SLOT_BELT skillchips = list(/obj/item/skillchip/job/psychology) diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm index bc23cdc2f86..0ca4b0a1052 100644 --- a/code/modules/jobs/job_types/quartermaster.dm +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -34,6 +34,7 @@ ) rpg_title = "Steward" job_flags = STATION_JOB_FLAGS | JOB_BOLD_SELECT_TEXT | JOB_CANNOT_OPEN_SLOTS + voice_of_god_power = 1.4 //Command staff has authority ignore_human_authority = TRUE /datum/outfit/job/quartermaster @@ -46,9 +47,10 @@ id = /obj/item/card/id/advanced/silver uniform = /obj/item/clothing/under/rank/cargo/qm belt = /obj/item/modular_computer/pda/heads/quartermaster + suit = /obj/item/clothing/suit/jacket/quartermaster ears = /obj/item/radio/headset/heads/qm glasses = /obj/item/clothing/glasses/sunglasses - shoes = /obj/item/clothing/shoes/sneakers/brown + shoes = /obj/item/clothing/shoes/laceup l_hand = /obj/item/clipboard chameleon_extras = /obj/item/stamp/head/qm diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index 8a3071f21a9..f2994388838 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -72,6 +72,7 @@ backpack = /obj/item/storage/backpack/science satchel = /obj/item/storage/backpack/satchel/science duffelbag = /obj/item/storage/backpack/duffelbag/science + messenger = /obj/item/storage/backpack/messenger/science chameleon_extras = /obj/item/stamp/head/rd skillchips = list(/obj/item/skillchip/job/research_director) @@ -82,5 +83,6 @@ suit_store = /obj/item/tank/internals/oxygen back = /obj/item/mod/control/pre_equipped/research suit = null + head = null mask = /obj/item/clothing/mask/breath internals_slot = ITEM_SLOT_SUITSTORE diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm index 46c62f54ad9..69b58335768 100644 --- a/code/modules/jobs/job_types/roboticist.dm +++ b/code/modules/jobs/job_types/roboticist.dm @@ -49,10 +49,6 @@ ears = /obj/item/radio/headset/headset_sci l_pocket = /obj/item/modular_computer/pda/roboticist - backpack = /obj/item/storage/backpack/science/robo //SKYRAT CHANGE - Roboticist Bags - satchel = /obj/item/storage/backpack/satchel/science/robo //SKYRAT CHANGE - Roboticist Bags - duffelbag = /obj/item/storage/backpack/duffelbag/science/robo //SKYRAT ADDITION - Roboticist Bags - pda_slot = ITEM_SLOT_LPOCKET skillchips = list(/obj/item/skillchip/job/roboticist) diff --git a/code/modules/jobs/job_types/scientist.dm b/code/modules/jobs/job_types/scientist.dm index 2dc97c2f89d..878167f2548 100644 --- a/code/modules/jobs/job_types/scientist.dm +++ b/code/modules/jobs/job_types/scientist.dm @@ -30,7 +30,6 @@ mail_goodies = list( /obj/item/raw_anomaly_core/random = 10, /obj/item/disk/design_disk/bepis = 2, - /obj/item/camera_bug = 1 ) rpg_title = "Thaumaturgist" job_flags = STATION_JOB_FLAGS @@ -52,6 +51,7 @@ backpack = /obj/item/storage/backpack/science satchel = /obj/item/storage/backpack/satchel/science duffelbag = /obj/item/storage/backpack/duffelbag/science + messenger = /obj/item/storage/backpack/messenger/science /datum/outfit/job/scientist/pre_equip(mob/living/carbon/human/H) ..() diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index c67919f26b2..858b7f1b445 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -225,6 +225,7 @@ GLOBAL_LIST_EMPTY(security_officer_distribution) backpack = /obj/item/storage/backpack/security satchel = /obj/item/storage/backpack/satchel/sec duffelbag = /obj/item/storage/backpack/duffelbag/sec + messenger = /obj/item/storage/backpack/messenger/sec box = /obj/item/storage/box/survival/security chameleon_extras = list( diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index 1186615dcbf..b3a31a132e8 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -52,6 +52,7 @@ backpack = /obj/item/storage/backpack/explorer satchel = /obj/item/storage/backpack/satchel/explorer duffelbag = /obj/item/storage/backpack/duffelbag/explorer + messenger = /obj/item/storage/backpack/messenger/explorer box = /obj/item/storage/box/survival/mining chameleon_extras = /obj/item/gun/energy/recharge/kinetic_accelerator diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm index bf90ab0200f..8738389ab41 100644 --- a/code/modules/jobs/job_types/station_engineer.dm +++ b/code/modules/jobs/job_types/station_engineer.dm @@ -55,6 +55,11 @@ backpack = /obj/item/storage/backpack/industrial satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering + messenger = /obj/item/storage/backpack/messenger/eng + + backpack_contents = list( + /obj/item/construction/rcd/loaded, + ) box = /obj/item/storage/box/survival/engineer pda_slot = ITEM_SLOT_LPOCKET diff --git a/code/modules/jobs/job_types/virologist.dm b/code/modules/jobs/job_types/virologist.dm index 20ebf3ac8dd..39cbc0ccce7 100644 --- a/code/modules/jobs/job_types/virologist.dm +++ b/code/modules/jobs/job_types/virologist.dm @@ -55,5 +55,6 @@ backpack = /obj/item/storage/backpack/virology satchel = /obj/item/storage/backpack/satchel/vir duffelbag = /obj/item/storage/backpack/duffelbag/virology + messenger = /obj/item/storage/backpack/messenger/vir box = /obj/item/storage/box/survival/medical diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index be9719d474a..da9ad104604 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -67,6 +67,7 @@ backpack = /obj/item/storage/backpack/security satchel = /obj/item/storage/backpack/satchel/sec duffelbag = /obj/item/storage/backpack/duffelbag/sec + messenger = /obj/item/storage/backpack/messenger/sec box = /obj/item/storage/box/survival/security implants = list(/obj/item/implant/mindshield) diff --git a/code/modules/library/skill_learning/job_skillchips/roboticist.dm b/code/modules/library/skill_learning/job_skillchips/roboticist.dm index b6835c9d484..401315e265a 100644 --- a/code/modules/library/skill_learning/job_skillchips/roboticist.dm +++ b/code/modules/library/skill_learning/job_skillchips/roboticist.dm @@ -1,7 +1,7 @@ /obj/item/skillchip/job/roboticist name = "Cyborg C1-RCU-1T skillchip" desc = "A roboticist's second best friend." - auto_traits = list(TRAIT_KNOW_CYBORG_WIRES) + auto_traits = list(TRAIT_KNOW_ROBO_WIRES) skill_name = "Cyborg Circuitry" skill_description = "Recognise cyborg wire layouts and understand their functionality at a glance." skill_icon = "sitemap" diff --git a/code/modules/mafia/outfits.dm b/code/modules/mafia/outfits.dm index 43ccfe73a1e..b962b4530f1 100644 --- a/code/modules/mafia/outfits.dm +++ b/code/modules/mafia/outfits.dm @@ -155,7 +155,7 @@ suit = /obj/item/clothing/suit/apron /datum/outfit/mafia/obsessed/post_equip(mob/living/carbon/human/H) - for(var/obj/item/carried_item in H.get_equipped_items(TRUE)) + for(var/obj/item/carried_item in H.get_equipped_items(include_pockets = TRUE, include_accessories = TRUE)) carried_item.add_mob_blood(H)//Oh yes, there will be blood... H.regenerate_icons() diff --git a/code/modules/mapfluff/ruins/objects_and_mobs/cursed_slot_machine.dm b/code/modules/mapfluff/ruins/objects_and_mobs/cursed_slot_machine.dm new file mode 100644 index 00000000000..e85a90b783c --- /dev/null +++ b/code/modules/mapfluff/ruins/objects_and_mobs/cursed_slot_machine.dm @@ -0,0 +1,126 @@ +/// Greed's slot machine: Used in the Greed ruin. Deals damage on each use, with a successful use giving a d20 of fate. +/obj/structure/cursed_slot_machine + name = "greed's slot machine" + desc = "High stakes, high rewards." + icon = 'icons/obj/machines/computer.dmi' + icon_state = "slots" + anchored = TRUE + density = TRUE + /// Variable that tracks the screen we display. + var/icon_screen = "slots_screen" + /// Should we be emitting light? + var/brightness_on = TRUE + /// The probability the player has to win. + var/win_prob = 5 + /// The maximum amount of curses we will allow a player to have before disallowing them to use the machine. + var/max_curse_amount = 5 + /// machine's reward when you hit jackpot + var/prize = /obj/structure/cursed_money + /// should we be applying the cursed status effect? + var/status_effect_on_roll = TRUE + /// Length of the cooldown between the machine being used and being able to spin the machine again. + var/cooldown_length = 15 SECONDS + /// Are we currently in use? Anti-spam prevention measure. + var/in_use = FALSE + /// Cooldown between pulls of the cursed slot machine. + COOLDOWN_DECLARE(spin_cooldown) + +/obj/structure/cursed_slot_machine/Initialize(mapload) + . = ..() + update_appearance() + set_light(brightness_on) + +/obj/structure/cursed_slot_machine/interact(mob/user) + if(!ishuman(user)) + return + + var/mob/living/carbon/human/human_user = user + + if(in_use) + balloon_alert(human_user, "already spinning!") + return + + if(!COOLDOWN_FINISHED(src, spin_cooldown)) + to_chat(human_user, span_danger("The machine doesn't engage. You get the compulsion to try again in a few seconds.")) + return + + in_use = TRUE + + var/signal_value = SEND_SIGNAL(human_user, COMSIG_CURSED_SLOT_MACHINE_USE, max_curse_amount) + + if(signal_value & SLOT_MACHINE_USE_POSTPONE) + return + + if(signal_value & SLOT_MACHINE_USE_CANCEL) // failsafe in case we don't want to let the machine be used for some reason (like if we're maxed out on curses but not getting gibbed) + say("We're sorry, but we can no longer serve you at this establishment.") + return + + user.visible_message( + span_warning("[human_user] pulls [src]'s lever with a glint in [user.p_their()] eyes!"), + span_warning("You feel a draining as you pull the lever, but you know it'll be worth it."), + ) + + icon_screen = "slots_screen_working" + update_appearance() + playsound(src, 'sound/lavaland/cursed_slot_machine.ogg', 50, FALSE) + addtimer(CALLBACK(src, PROC_REF(determine_victor), human_user), 5 SECONDS) + +/obj/structure/cursed_slot_machine/update_overlays() + . = ..() + var/overlay_state = icon_screen + . += mutable_appearance(icon, overlay_state) + . += emissive_appearance(icon, overlay_state, src) + +/obj/structure/cursed_slot_machine/proc/determine_victor(mob/living/user) + icon_screen = initial(icon_screen) + update_appearance() + in_use = FALSE + COOLDOWN_START(src, spin_cooldown, cooldown_length) + if(!prob(win_prob)) + if(status_effect_on_roll && isnull(user.has_status_effect(/datum/status_effect/grouped/cursed))) + user.apply_status_effect(/datum/status_effect/grouped/cursed) + + SEND_SIGNAL(user, COMSIG_CURSED_SLOT_MACHINE_LOST) + playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE) + balloon_alert_to_viewers("you lost!") + return + + playsound(src, 'sound/lavaland/cursed_slot_machine_jackpot.ogg', 50, FALSE) + new prize(get_turf(src)) + if(user) + to_chat(user, span_boldwarning("You've hit the jackpot!!! Laughter echoes around you as your reward appears in the machine's place.")) + + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_CURSED_SLOT_MACHINE_WON) + qdel(src) + +/// Prize given out by the cursed slot machine that will give the user one Die of Fate and then delete itself. +/obj/structure/cursed_money + name = "bag of money" + desc = "RICH! YES! YOU KNEW IT WAS WORTH IT! YOU'RE RICH! RICH! RICH!" + icon = 'icons/obj/storage/storage.dmi' + icon_state = "moneybag" + anchored = FALSE + density = TRUE + +/obj/structure/cursed_money/Initialize(mapload) + . = ..() + addtimer(CALLBACK(src, PROC_REF(collapse)), 1 MINUTES) + +/obj/structure/cursed_money/proc/collapse() + if(QDELETED(src)) + return + visible_message(span_warning("[src] falls in on itself, with the canvas rotting away and contents vanishing.")) + qdel(src) + +/obj/structure/cursed_money/attack_hand(mob/living/user, list/modifiers) + . = ..() + if(.) + return + user.visible_message( + span_warning("[user] opens the bag and removes a die."), + span_warning("[span_boldwarning("You open the bag...!")] But all you see is a bag full of dice. Confused, you take one..."), + ) + var/turf/location = get_turf(user) + var/obj/item/dice/d20/fate/one_use/critical_fail = new(location) + user.put_in_hands(critical_fail) + collapse() diff --git a/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm index 853c4a55d7d..eb5f2437bcd 100644 --- a/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm +++ b/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm @@ -1,95 +1,5 @@ //These objects are used in the cardinal sin-themed ruins (i.e. Gluttony, Pride...) -/obj/structure/cursed_slot_machine //Greed's slot machine: Used in the Greed ruin. Deals clone damage on each use, with a successful use giving a d20 of fate. - name = "greed's slot machine" - desc = "High stakes, high rewards." - icon = 'icons/obj/machines/computer.dmi' - icon_state = "slots" - var/icon_screen = "slots_screen" - var/brightness_on = 1 - anchored = TRUE - density = TRUE - var/win_prob = 5 - /// clone damaged dealt each roll - var/damage_on_roll = 20 - /// machine's reward when you hit jackpot - var/prize = /obj/structure/cursed_money - -/obj/structure/cursed_slot_machine/Initialize(mapload) - . = ..() - update_appearance() - set_light(brightness_on) - -/obj/structure/cursed_slot_machine/interact(mob/living/carbon/human/user) - if(!istype(user)) - return - if(obj_flags & IN_USE) - return - obj_flags |= IN_USE - user.adjustCloneLoss(damage_on_roll) - if(user.stat) - to_chat(user, span_userdanger("No... just one more try...")) - user.investigate_log("has been gibbed by [src].", INVESTIGATE_DEATHS) - user.gib() - else - user.visible_message(span_warning("[user] pulls [src]'s lever with a glint in [user.p_their()] eyes!"), "You feel a draining as you pull the lever, but you \ - know it'll be worth it.") - icon_screen = "slots_screen_working" - update_appearance() - playsound(src, 'sound/lavaland/cursed_slot_machine.ogg', 50, FALSE) - addtimer(CALLBACK(src, PROC_REF(determine_victor), user), 50) - -/obj/structure/cursed_slot_machine/proc/determine_victor(mob/living/user) - icon_screen = "slots_screen" - update_appearance() - obj_flags &= ~IN_USE - if(prob(win_prob)) - playsound(src, 'sound/lavaland/cursed_slot_machine_jackpot.ogg', 50, FALSE) - new prize(get_turf(src)) - if(user) - to_chat(user, span_boldwarning("You've hit jackpot. Laughter echoes around you as your reward appears in the machine's place.")) - qdel(src) - else - if(user) - to_chat(user, span_boldwarning("Fucking machine! Must be rigged. Still... one more try couldn't hurt, right?")) - -/obj/structure/cursed_slot_machine/update_overlays() - . = ..() - var/overlay_state = icon_screen - . += mutable_appearance(icon, overlay_state) - . += emissive_appearance(icon, overlay_state, src) - -/obj/structure/cursed_money - name = "bag of money" - desc = "RICH! YES! YOU KNEW IT WAS WORTH IT! YOU'RE RICH! RICH! RICH!" - icon = 'icons/obj/storage/storage.dmi' - icon_state = "moneybag" - anchored = FALSE - density = TRUE - -/obj/structure/cursed_money/Initialize(mapload) - . = ..() - addtimer(CALLBACK(src, PROC_REF(collapse)), 600) - -/obj/structure/cursed_money/proc/collapse() - visible_message("[src] falls in on itself, \ - canvas rotting away and contents vanishing.") - qdel(src) - -/obj/structure/cursed_money/attack_hand(mob/living/user, list/modifiers) - . = ..() - if(.) - return - user.visible_message("[user] opens the bag and \ - and removes a die. The bag then vanishes.", - "[span_boldwarning("You open the bag...!")]\n\ - And see a bag full of dice. Confused, \ - you take one... and the bag vanishes.") - var/turf/T = get_turf(user) - var/obj/item/dice/d20/fate/one_use/critical_fail = new(T) - user.put_in_hands(critical_fail) - qdel(src) - /obj/effect/gluttony //Gluttony's wall: Used in the Gluttony ruin. Only lets the overweight through. name = "gluttony's wall" desc = "Only those who truly indulge may pass." @@ -108,7 +18,7 @@ return TRUE else to_chat(H, span_warning("You're repulsed by even looking at [src]. Only a pig could force themselves to go through it.")) - if(istype(mover, /mob/living/simple_animal/hostile/morph)) + if(istype(mover, /mob/living/basic/morph)) return TRUE //can't be bothered to do sloth right now, will make later diff --git a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm index 71e897438b4..4fcc88b89bc 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm @@ -527,22 +527,26 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) to_chat(user, "No vacated rooms.") return . -/obj/effect/landmark/lift_id/hilbert +/obj/effect/landmark/lift_id/hilbert/research specific_lift_id = HILBERT_TRAM -/obj/effect/landmark/tram/hilbert/left +/obj/effect/landmark/tram/nav/hilbert/research + name = HILBERT_TRAM + specific_lift_id = TRAM_NAV_BEACONS + +/obj/effect/landmark/tram/platform/hilbert/left name = "Port" specific_lift_id = HILBERT_TRAM platform_code = HILBERT_PORT tgui_icons = list("Reception" = "briefcase", "Botany" = "leaf", "Chemistry" = "flask") -/obj/effect/landmark/tram/hilbert/middle +/obj/effect/landmark/tram/platform/hilbert/middle name = "Central" specific_lift_id = HILBERT_TRAM platform_code = HILBERT_CENTRAL tgui_icons = list("Processing" = "cogs", "Xenobiology" = "paw") -/obj/effect/landmark/tram/hilbert/right +/obj/effect/landmark/tram/platform/hilbert/right name = "Starboard" specific_lift_id = HILBERT_TRAM platform_code = HILBERT_STARBOARD diff --git a/code/modules/mapfluff/ruins/spaceruin_code/oldstation.dm b/code/modules/mapfluff/ruins/spaceruin_code/oldstation.dm index 79e55c47370..209b5798d53 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/oldstation.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/oldstation.dm @@ -64,9 +64,9 @@ /obj/item/paper/fluff/ruins/oldstation/protosupermatter name = "Supermatter Crystal Generator" default_raw_text = "*Supermatter Crystal Shard*

Modern power generation typically comes in two forms, a Fusion Generator or a Fission Generator. Fusion provides the best space to power \ - \ntratio, and is typically seen on military or high security ships and stations, however Fission reactors require the usage of expensive, and rare, materials in its construction. \ - Fission generators are massive and bulky, and require a large reserve of uranium to power, however they are extremely cheap to operate and oft need little maintenance once \ - \ntoperational.

The Supermatter aims to alter this, a functional Supermatter is essentially a gas producer that generates far more radiation than Fusion or Fission \ntgenerators can ever hope to produce. " + ratio, and is typically seen on military or high security ships and stations, however Fission reactors require the usage of expensive and rare materials in its construction. \ + Fission generators are massive and bulky, and require a large reserve of uranium to power, however they are extremely cheap to operate and need little maintenance once \ + \noperational.

The Supermatter aims to alter this, a functional Supermatter is essentially a gas producer that generates far more radiation than Fusion or Fission generators can ever hope to produce. " /obj/item/paper/fluff/ruins/oldstation/protoinv name = "Laboratory Inventory" diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm index a1ef04e204f..96b555457d7 100644 --- a/code/modules/mapping/reader.dm +++ b/code/modules/mapping/reader.dm @@ -330,7 +330,7 @@ var/relative_y = first_column.ycrd var/highest_y = relative_y + y_relative_to_absolute - if(!cropMap && highest_y > world.maxx) + if(!cropMap && highest_y > world.maxy) if(new_z) // Need to avoid improperly loaded area/turf_contents world.increaseMaxY(highest_y, max_zs_to_load = z_offset - 1) @@ -343,7 +343,7 @@ var/y_skip_above = min(world.maxy - y_relative_to_absolute, y_upper, relative_y) // How many lines to skip because they'd be above the y cuttoff line var/y_starting_skip = relative_y - y_skip_above - highest_y += y_starting_skip + highest_y -= y_starting_skip // Y is the LOWEST it will ever be here, so we can easily set a threshold for how low to go diff --git a/code/modules/mining/equipment/lazarus_injector.dm b/code/modules/mining/equipment/lazarus_injector.dm index 789163f688e..a9b7205406e 100644 --- a/code/modules/mining/equipment/lazarus_injector.dm +++ b/code/modules/mining/equipment/lazarus_injector.dm @@ -6,7 +6,7 @@ * Becomes malfunctioning when EMP'd. * If a hostile mob is revived with a malfunctioning injector, it will be hostile to everyone except whoever revived it and gets robust searching enabled. */ -/obj/item/lazarus_injector //SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE +/obj/item/lazarus_injector name = "lazarus injector" desc = "An injector with a cocktail of nanomachines and chemicals, this device can seemingly raise animals from the dead, making them become friendly to the user. Unfortunately, the process is useless on higher forms of life and incredibly costly, so these were hidden in storage until an executive thought they'd be great motivation for some of their employees." icon = 'icons/obj/medical/syringe.dmi' diff --git a/code/modules/mining/equipment/mineral_scanner.dm b/code/modules/mining/equipment/mineral_scanner.dm index 94def72e5a9..c56077c4dfb 100644 --- a/code/modules/mining/equipment/mineral_scanner.dm +++ b/code/modules/mining/equipment/mineral_scanner.dm @@ -1,5 +1,5 @@ /**********************Mining Scanners**********************/ -/obj/item/mining_scanner//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE +/obj/item/mining_scanner desc = "A scanner that checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations." name = "manual mining scanner" icon = 'icons/obj/device.dmi' diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm index 101ad3cb20a..3b1d5233dbf 100644 --- a/code/modules/mining/equipment/mining_tools.dm +++ b/code/modules/mining/equipment/mining_tools.dm @@ -283,3 +283,91 @@ if(user.incapacitated() || !user.Adjacent(src)) return FALSE return TRUE + +/obj/item/shovel/giant_wrench + name = "Big Slappy" + desc = "A gigantic wrench made illegal because of its many incidents involving this tool." + icon_state = "giant_wrench" + icon = 'icons/obj/weapons/giant_wrench.dmi' + inhand_icon_state = null + lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi' + righthand_file = 'icons/mob/inhands/64x64_righthand.dmi' + inhand_x_dimension = 64 + inhand_y_dimension = 64 + w_class = WEIGHT_CLASS_HUGE + slot_flags = NONE + toolspeed = 0.1 + force = 30 + throwforce = 20 + block_chance = 30 + throw_range = 2 + demolition_mod = 2 + armor_type = /datum/armor/giant_wrench + resistance_flags = FIRE_PROOF + wound_bonus = -10 + attack_verb_continuous = list("bonks", "bludgeons", "pounds") + attack_verb_simple = list("bonk", "bludgeon", "pound") + drop_sound = 'sound/weapons/sonic_jackhammer.ogg' + pickup_sound = 'sound/items/handling/crowbar_pickup.ogg' + hitsound = 'sound/weapons/sonic_jackhammer.ogg' + block_sound = 'sound/weapons/sonic_jackhammer.ogg' + obj_flags = IMMUTABLE_SLOW + item_flags = SLOWS_WHILE_IN_HAND + slowdown = 3 + attack_speed = 1.2 SECONDS + /// The factor at which the recoil becomes less. + var/recoil_factor = 3 + /// Wether we knock down and launch away out enemies when we attack. + var/do_launch = TRUE + +/datum/armor/giant_wrench + acid = 30 + bomb = 100 + bullet = 30 + fire = 100 + laser = 30 + melee = 30 + +/obj/item/shovel/giant_wrench/Initialize(mapload) + . = ..() + transform = transform.Translate(-16, -16) + AddComponent(/datum/component/two_handed, require_twohands=TRUE) + AddComponent( \ + /datum/component/transforming, \ + force_on = 40, \ + throwforce_on = throwforce, \ + hitsound_on = hitsound, \ + w_class_on = w_class, \ + sharpness_on = SHARP_POINTY, \ + clumsy_check = TRUE, \ + inhand_icon_change = TRUE, \ + ) + RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) + +/// Used when the tool is transformed through the transforming component. +/obj/item/shovel/giant_wrench/proc/on_transform(obj/item/source, mob/user, active) + SIGNAL_HANDLER + + usesound = (active ? 'sound/items/ratchet.ogg' : initial(usesound)) + block_chance = (active ? 0 : initial(block_chance)) + recoil_factor = (active ? 2 : initial(recoil_factor)) + do_launch = (active ? FALSE : initial(do_launch)) + tool_behaviour = (active ? TOOL_WRENCH : initial(tool_behaviour)) + armour_penetration = (active ? 30 : initial(armour_penetration)) + if(user) + balloon_alert(user, "folded Big Slappy [active ? "open" : "closed"]") + playsound(src, 'sound/items/ratchet.ogg', 50, TRUE) + return COMPONENT_NO_DEFAULT_MESSAGE + +/obj/item/shovel/giant_wrench/attack(mob/living/target_mob, mob/living/user) + ..() + if(QDELETED(target_mob)) + return + if(do_launch) + var/atom/throw_target = get_edge_target_turf(target_mob, get_dir(user, get_step_away(target_mob, user))) + target_mob.throw_at(throw_target, 2, 2, user, gentle = TRUE) + target_mob.Knockdown(2 SECONDS) + var/body_zone = pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) + user.apply_damage(force / recoil_factor, BRUTE, body_zone, user.run_armor_check(body_zone, MELEE)) + to_chat(user, span_danger("The weight of the Big Slappy recoils!")) + log_combat(user, user, "recoiled Big Slappy into") diff --git a/code/modules/mining/equipment/miningradio.dm b/code/modules/mining/equipment/miningradio.dm new file mode 100644 index 00000000000..559740599db --- /dev/null +++ b/code/modules/mining/equipment/miningradio.dm @@ -0,0 +1,24 @@ +/// Portable mining radio purchasable by miners +/obj/item/radio/weather_monitor + icon = 'icons/obj/miningradio.dmi' + name = "mining weather radio" + icon_state = "miningradio" + desc = "A weather radio designed for use in inhospitable environments. Gives audible warnings when storms approach. Has access to cargo channel." + freqlock = RADIO_FREQENCY_LOCKED + luminosity = 1 + light_power = 1 + light_range = 1.6 + +/obj/item/radio/weather_monitor/update_overlays() + . = ..() + . += emissive_appearance(icon, "small_emissive", src, alpha = src.alpha) + +/obj/item/radio/weather_monitor/Initialize(mapload) + . = ..() + AddComponent( \ + /datum/component/weather_announcer, \ + state_normal = "weatherwarning", \ + state_warning = "urgentwarning", \ + state_danger = "direwarning", \ + ) + set_frequency(FREQ_SUPPLY) diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index c125671bcbf..4c0ca13dcd2 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -88,16 +88,12 @@ unload_mineral(gathered_ore) else - var/list/stack_mats = gathered_ore.get_material_composition(BREAKDOWN_FLAGS_ORM) - var/mats = stack_mats & mat_container.materials var/ore_amount = gathered_ore.amount var/ore_points= gathered_ore.points - var/ore_name = gathered_ore.name var/refined_type = gathered_ore?.refined_type - if(mat_container.insert_item(gathered_ore, ore_multiplier, breakdown_flags = BREAKDOWN_FLAGS_ORM) > 0) //increase points only if insertion was successfull + if(mat_container.insert_item(gathered_ore, ore_multiplier, breakdown_flags = BREAKDOWN_FLAGS_ORM, context = src) > 0) //increase points only if insertion was successfull if(refined_type) points += ore_points * point_upgrade * ore_amount - materials.silo_log(src, "smelted", ore_amount, ore_name, mats) SEND_SIGNAL(src, COMSIG_ORM_COLLECTED_ORE) @@ -356,12 +352,7 @@ var/desired = text2num(params["sheets"]) var/sheets_to_remove = round(min(desired, 50, stored_amount)) - - var/count = mat_container.retrieve_sheets(sheets_to_remove, mat, get_step(src, output_dir)) - var/list/mats = list() - mats[mat] = SHEET_MATERIAL_AMOUNT - materials.silo_log(src, "released", -count, "sheets", mats) - //Logging deleted for quick coding + materials.eject_sheets(mat, sheets_to_remove, get_step(src, output_dir)) return TRUE if("Smelt") if(!mat_container) @@ -379,8 +370,7 @@ var/amount = round(min(text2num(params["sheets"]), 50, can_smelt_alloy(alloy))) if(amount < 1) //no negative mats return - mat_container.use_materials(alloy.materials, multiplier = amount) - materials.silo_log(src, "released", -amount, "sheets", alloy.materials) + materials.use_materials(alloy.materials, action = "released", name = "sheets") var/output if(ispath(alloy.build_path, /obj/item/stack/sheet)) output = new alloy.build_path(src, amount) diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index b06188fb2c6..dc15e28a927 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -37,7 +37,10 @@ GLOBAL_LIST_EMPTY(silo_access_logs) /datum/component/material_container, \ materials_list, \ INFINITY, \ - MATCONTAINER_NO_INSERT, \ + container_signals = list( \ + COMSIG_MATCONTAINER_ITEM_CONSUMED = TYPE_PROC_REF(/obj/machinery/ore_silo, log_item_consumed), \ + COMSIG_MATCONTAINER_SHEETS_RETRIEVED = TYPE_PROC_REF(/obj/machinery/ore_silo, log_sheets_ejected), \ + ), \ allowed_items = /obj/item/stack \ ) if (!GLOB.ore_silo_default && mapload && is_station_level(z)) @@ -55,39 +58,21 @@ GLOBAL_LIST_EMPTY(silo_access_logs) return ..() -/obj/machinery/ore_silo/proc/remote_attackby(obj/machinery/M, mob/living/user, obj/item/stack/I, breakdown_flags=NONE) - if(user.combat_mode) - return - if(I.item_flags & ABSTRACT) - return - if(!istype(I) || (I.flags_1 & HOLOGRAM_1) || (I.item_flags & NO_MAT_REDEMPTION)) - to_chat(user, span_warning("[M] won't accept [I]!")) - return - var/item_mats = materials.get_item_material_amount(I, breakdown_flags) - if(!item_mats) - to_chat(user, span_warning("[I] does not contain sufficient materials to be accepted by [M].")) - return - // assumes unlimited space... - var/amount = I.amount - materials.user_insert(I, user, breakdown_flags) - var/list/matlist = I.get_material_composition(breakdown_flags) - silo_log(M, "deposited", amount, I.name, matlist) - return TRUE +/obj/machinery/ore_silo/proc/log_item_consumed(datum/component/material_container/container, obj/item/item_inserted, last_inserted_id, mats_consumed, amount_inserted, atom/context) + SIGNAL_HANDLER -/obj/machinery/ore_silo/attackby(obj/item/W, mob/user, params) - if(default_deconstruction_screwdriver(user, icon_state, icon_state, W)) - updateUsrDialog() - return - if(default_deconstruction_crowbar(W)) - return + silo_log(context, "deposited", amount_inserted, item_inserted.name, mats_consumed) - if(!powered()) - return ..() +/obj/machinery/ore_silo/proc/log_sheets_ejected(datum/component/material_container/container, obj/item/stack/sheet/sheets, atom/context) + SIGNAL_HANDLER - if (isstack(W)) - return remote_attackby(src, user, W) + silo_log(context, "ejected", -sheets.amount, "[sheets.singular_name]", sheets.custom_materials) - return ..() +/obj/machinery/ore_silo/screwdriver_act(mob/living/user, obj/item/tool) + return default_deconstruction_screwdriver(user, icon_state, icon_state, tool) + +/obj/machinery/ore_silo/crowbar_act(mob/living/user, obj/item/tool) + return default_deconstruction_crowbar(tool) /obj/machinery/ore_silo/ui_interact(mob/user) user.set_machine(src) @@ -169,10 +154,8 @@ GLOBAL_LIST_EMPTY(silo_access_logs) return TRUE else if(href_list["ejectsheet"]) var/datum/material/eject_sheet = locate(href_list["ejectsheet"]) - var/count = materials.retrieve_sheets(text2num(href_list["eject_amt"]), eject_sheet, drop_location()) - var/list/matlist = list() - matlist[eject_sheet] = SHEET_MATERIAL_AMOUNT * count - silo_log(src, "ejected", -count, "sheets", matlist) + var/amount = text2num(href_list["eject_amt"]) + materials.retrieve_sheets(amount, eject_sheet, drop_location()) return TRUE else if(href_list["page"]) log_page = text2num(href_list["page"]) || 1 @@ -183,7 +166,7 @@ GLOBAL_LIST_EMPTY(silo_access_logs) . = ..() if (istype(I)) to_chat(user, span_notice("You log [src] in the multitool's buffer.")) - I.buffer = src + I.set_buffer(src) return TRUE /** diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm index 1635c5c2fa3..d7381d48e66 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -26,7 +26,7 @@ if(!multitool_check_buffer(user, I)) return var/obj/item/multitool/M = I - M.buffer = src + M.set_buffer(src) to_chat(user, span_notice("You store linkage information in [I]'s buffer.")) return TRUE @@ -145,8 +145,7 @@ if(materials.silo && !materials.on_hold()) var/matlist = inp.custom_materials & materials.mat_container.materials if (length(matlist)) - var/inserted = materials.mat_container.insert_item(inp) - materials.silo_log(src, "collected", inserted, "sheets", matlist) + materials.mat_container.insert_item(inp, context = src) return // No silo attached process to internal storage diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 5db496370d1..ef5df0e8e34 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -36,6 +36,7 @@ new /obj/item/storage/backpack/duffelbag/explorer(src) new /obj/item/storage/backpack/explorer(src) new /obj/item/storage/backpack/satchel/explorer(src) + new /obj/item/storage/backpack/messenger/explorer(src) new /obj/item/clothing/under/rank/cargo/miner/lavaland(src) new /obj/item/clothing/under/rank/cargo/miner/lavaland(src) new /obj/item/clothing/under/rank/cargo/miner/lavaland(src) @@ -69,7 +70,6 @@ new /obj/item/storage/bag/plants(src) new /obj/item/storage/bag/ore(src) new /obj/item/t_scanner/adv_mining_scanner/lesser(src) - new /obj/item/gun/energy/recharge/kinetic_accelerator(src) new /obj/item/clothing/glasses/meson(src) if (HAS_TRAIT(SSstation, STATION_TRAIT_SMALLER_PODS)) new /obj/item/survivalcapsule/bathroom(src) @@ -78,6 +78,11 @@ new /obj/item/assault_pod/mining(src) +/obj/structure/closet/secure_closet/miner/populate_contents_immediate() + . = ..() + + new /obj/item/gun/energy/recharge/kinetic_accelerator(src) + /**********************Shuttle Computer**************************/ /obj/machinery/computer/shuttle/mining diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index ac797850816..f7a6c030d2c 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -32,7 +32,7 @@ wanted_objects = list(/obj/item/stack/ore/diamond, /obj/item/stack/ore/gold, /obj/item/stack/ore/silver, /obj/item/stack/ore/plasma, /obj/item/stack/ore/uranium, /obj/item/stack/ore/iron, /obj/item/stack/ore/bananium, /obj/item/stack/ore/titanium) - healable = 0 + mob_biotypes = MOB_ROBOTIC loot = list(/obj/effect/decal/cleanable/robot_debris) del_on_death = TRUE light_system = MOVABLE_LIGHT diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index c56f218aa3a..e9c652fd7bd 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -72,7 +72,7 @@ /obj/item/stack/ore/uranium name = "uranium ore" - icon_state = "Uranium ore" + icon_state = "uranium" singular_name = "uranium ore chunk" points = 30 material_flags = NONE @@ -85,7 +85,7 @@ /obj/item/stack/ore/iron name = "iron ore" - icon_state = "Iron ore" + icon_state = "iron" singular_name = "iron ore chunk" points = 1 mats_per_unit = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT) @@ -97,7 +97,7 @@ /obj/item/stack/ore/glass name = "sand pile" - icon_state = "Glass ore" + icon_state = "glass" singular_name = "sand pile" points = 1 mats_per_unit = list(/datum/material/glass=SHEET_MATERIAL_AMOUNT) @@ -149,7 +149,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ /obj/item/stack/ore/plasma name = "plasma ore" - icon_state = "Plasma ore" + icon_state = "plasma" singular_name = "plasma ore chunk" points = 15 mats_per_unit = list(/datum/material/plasma=SHEET_MATERIAL_AMOUNT) @@ -165,7 +165,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ /obj/item/stack/ore/silver name = "silver ore" - icon_state = "Silver ore" + icon_state = "silver" singular_name = "silver ore chunk" points = 16 mine_experience = 3 @@ -177,7 +177,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ /obj/item/stack/ore/gold name = "gold ore" - icon_state = "Gold ore" + icon_state = "gold" singular_name = "gold ore chunk" points = 18 mine_experience = 5 @@ -189,7 +189,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ /obj/item/stack/ore/diamond name = "diamond ore" - icon_state = "Diamond ore" + icon_state = "diamond" singular_name = "diamond ore chunk" points = 50 mats_per_unit = list(/datum/material/diamond=SHEET_MATERIAL_AMOUNT) @@ -200,7 +200,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ /obj/item/stack/ore/bananium name = "bananium ore" - icon_state = "Bananium ore" + icon_state = "bananium" singular_name = "bananium ore chunk" points = 60 mats_per_unit = list(/datum/material/bananium=SHEET_MATERIAL_AMOUNT) @@ -211,7 +211,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ /obj/item/stack/ore/titanium name = "titanium ore" - icon_state = "Titanium ore" + icon_state = "titanium" singular_name = "titanium ore chunk" points = 50 mats_per_unit = list(/datum/material/titanium=SHEET_MATERIAL_AMOUNT) @@ -232,7 +232,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ name = "gibtonite ore" desc = "Extremely explosive if struck with mining equipment, Gibtonite is often used by miners to speed up their work by using it as a mining charge. This material is illegal to possess by unauthorized personnel under space law." icon = 'icons/obj/ore.dmi' - icon_state = "Gibtonite ore" + icon_state = "gibtonite" inhand_icon_state = "Gibtonite ore" w_class = WEIGHT_CLASS_BULKY throw_range = 0 @@ -284,7 +284,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ if(det_timer) deltimer(det_timer) defuser?.visible_message(span_notice("The chain reaction stopped! ...The ore's quality looks diminished."), span_notice("You stopped the chain reaction. ...The ore's quality looks diminished.")) - icon_state = "Gibtonite ore" + icon_state = "gibtonite" quality = GIBTONITE_QUALITY_LOW /obj/item/gibtonite/attack_self(user) @@ -306,7 +306,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ return primed = TRUE playsound(src,'sound/effects/hit_on_shattered_glass.ogg',50,TRUE) - icon_state = "Gibtonite active" + icon_state = "gibtonite_active" var/notify_admins = FALSE if(!is_mining_level(z))//Only annoy the admins ingame if we're triggered off the mining zlevel notify_admins = TRUE diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index d0ac54aed18..03f88cf9e6a 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -165,7 +165,7 @@ return JOB_UNAVAILABLE_LANGUAGE if(job.has_banned_quirk(client.prefs)) return JOB_UNAVAILABLE_QUIRK - if(job.veteran_only && !is_veteran_player(client)) + if(job.veteran_only && !SSplayer_ranks.is_veteran(client)) return JOB_NOT_VETERAN if(job.has_banned_species(client.prefs)) return JOB_UNAVAILABLE_SPECIES @@ -267,8 +267,6 @@ log_manifest(character.mind.key,character.mind,character,latejoin = TRUE) - SEND_GLOBAL_SIGNAL(COMSIG_GLOB_CREWMEMBER_JOINED, character, rank) - // SKYRAT EDIT ADDITION START if(humanc) for(var/datum/loadout_item/item as anything in loadout_list_to_datums(humanc?.client?.prefs?.loadout_list)) @@ -298,9 +296,11 @@ if(!isAI(spawning_mob)) // Unfortunately there's still snowflake AI code out there. - mind.original_character_slot_index = client.prefs.default_slot - mind.transfer_to(spawning_mob) //won't transfer key since the mind is not active - mind.set_original_character(spawning_mob) + // transfer_to sets mind to null + var/datum/mind/preserved_mind = mind + preserved_mind.original_character_slot_index = client.prefs.default_slot + preserved_mind.transfer_to(spawning_mob) //won't transfer key since the mind is not active + preserved_mind.set_original_character(spawning_mob) client.init_verbs() . = spawning_mob new_character = . diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index 6dcc02a99e6..9b8a192260f 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -56,7 +56,7 @@ var/datum/quirk/picked_quirk = pick(available_hardcore_quirks) var/picked_quirk_blacklisted = FALSE - for(var/bl in SSquirks.quirk_blacklist) //Check if the quirk is blacklisted with our current quirks. quirk_blacklist is a list of lists. + for(var/bl in GLOB.quirk_blacklist) //Check if the quirk is blacklisted with our current quirks. quirk_blacklist is a list of lists. var/list/blacklist = bl if(!(picked_quirk in blacklist)) continue diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index f6dc82c0535..a28153a2196 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -502,9 +502,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if (!istype(target) || (is_secret_level(target.z) && !client?.holder)) return - var/icon/I = icon(target.icon,target.icon_state,target.dir) - - var/orbitsize = (I.Width()+I.Height())*0.5 + var/list/icon_dimensions = get_icon_dimensions(target.icon) + var/orbitsize = (icon_dimensions["width"] + icon_dimensions["height"]) * 0.5 orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25) var/rot_seg diff --git a/code/modules/mob/dead/observer/observer_say.dm b/code/modules/mob/dead/observer/observer_say.dm index 08f3c262cc5..e63839b123f 100644 --- a/code/modules/mob/dead/observer/observer_say.dm +++ b/code/modules/mob/dead/observer/observer_say.dm @@ -60,7 +60,7 @@ to_follow = V.source var/link = FOLLOW_LINK(src, to_follow) // Create map text prior to modifying message for goonchat - if (client?.prefs.read_preference(/datum/preference/toggle/enable_runechat) && (client.prefs.read_preference(/datum/preference/toggle/enable_runechat_non_mobs) || ismob(speaker))) + if (safe_read_pref(client, /datum/preference/toggle/enable_runechat) && (safe_read_pref(client, /datum/preference/toggle/enable_runechat_non_mobs) || ismob(speaker))) create_chat_message(speaker, message_language, raw_message, spans) // Recompose the message, because it's scrambled by default message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mods) diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm index 0e9334b896f..db6acc346b1 100644 --- a/code/modules/mob/dead/observer/orbit.dm +++ b/code/modules/mob/dead/observer/orbit.dm @@ -172,10 +172,10 @@ GLOBAL_DATUM_INIT(orbit_menu, /datum/orbit_menu, new) if(!potential_mob_poi.mind && !potential_mob_poi.ckey) if(!mob_allowed_typecache) mob_allowed_typecache = typecacheof(list( - /mob/living/simple_animal/bot, /mob/camera, + /mob/living/basic/regal_rat, + /mob/living/simple_animal/bot, /mob/living/simple_animal/hostile/megafauna, - /mob/living/simple_animal/hostile/regalrat, )) if(!is_type_in_typecache(potential_mob_poi, mob_allowed_typecache) && !potential_mob_poi.GetComponent(/datum/component/deadchat_control)) return FALSE diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index f772c4756cf..7e288ebcee5 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -385,9 +385,10 @@ * * Argument(s): * * Optional - include_pockets (TRUE/FALSE), whether or not to include the pockets and suit storage in the returned list + * * Optional - include_accessories (TRUE/FALSE), whether or not to include the accessories in the returned list */ -/mob/living/proc/get_equipped_items(include_pockets = FALSE) +/mob/living/proc/get_equipped_items(include_pockets = FALSE, include_accessories = FALSE) var/list/items = list() for(var/obj/item/item_contents in contents) if(item_contents.item_flags & IN_INVENTORY) @@ -400,17 +401,21 @@ * * Argument(s): * * Optional - include_pockets (TRUE/FALSE), whether or not to include the pockets and suit storage in the returned list + * * Optional - include_accessories (TRUE/FALSE), whether or not to include the accessories in the returned list */ -/mob/living/carbon/human/get_equipped_items(include_pockets = FALSE) +/mob/living/carbon/human/get_equipped_items(include_pockets = FALSE, include_accessories = FALSE) var/list/items = ..() if(!include_pockets) items -= list(l_store, r_store, s_store) + if(include_accessories && w_uniform) + var/obj/item/clothing/under/worn_under = w_uniform + items += worn_under.attached_accessories return items /mob/living/proc/unequip_everything() var/list/items = list() - items |= get_equipped_items(TRUE) + items |= get_equipped_items(include_pockets = TRUE) for(var/I in items) dropItemToGround(I) drop_all_held_items() @@ -536,7 +541,7 @@ //GetAllContents that is reasonable and not stupid /mob/living/carbon/proc/get_all_gear() - var/list/processing_list = get_equipped_items(include_pockets = TRUE) + held_items + var/list/processing_list = get_equipped_items(include_pockets = TRUE, include_accessories = TRUE) + held_items list_clear_nulls(processing_list) // handles empty hands var/i = 0 while(i < length(processing_list) ) diff --git a/code/modules/mob/living/basic/basic.dm b/code/modules/mob/living/basic/basic.dm index 5810a253151..5a9ccacf6e3 100644 --- a/code/modules/mob/living/basic/basic.dm +++ b/code/modules/mob/living/basic/basic.dm @@ -205,6 +205,13 @@ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/simplemob_varspeed, multiplicative_slowdown = speed) SEND_SIGNAL(src, POST_BASIC_MOB_UPDATE_VARSPEED) +/mob/living/basic/update_movespeed() + . = ..() + if (cached_multiplicative_slowdown > END_GLIDE_SPEED) + ADD_TRAIT(src, TRAIT_NO_GLIDE, SPEED_TRAIT) + else + REMOVE_TRAIT(src, TRAIT_NO_GLIDE, SPEED_TRAIT) + /mob/living/basic/relaymove(mob/living/user, direction) if(user.incapacitated()) return diff --git a/code/modules/mob/living/basic/farm_animals/rabbit.dm b/code/modules/mob/living/basic/farm_animals/rabbit.dm index 071470264db..fd95b7ef83b 100644 --- a/code/modules/mob/living/basic/farm_animals/rabbit.dm +++ b/code/modules/mob/living/basic/farm_animals/rabbit.dm @@ -17,6 +17,8 @@ mob_biotypes = MOB_ORGANIC | MOB_BEAST health = 15 maxHealth = 15 + mob_size = MOB_SIZE_SMALL + can_be_held = TRUE density = FALSE gold_core_spawnable = FRIENDLY_SPAWN speak_emote = list("sniffles", "twitches") diff --git a/code/modules/mob/living/basic/festivus_pole.dm b/code/modules/mob/living/basic/festivus_pole.dm index 637a01cb0ec..058b74bfad8 100644 --- a/code/modules/mob/living/basic/festivus_pole.dm +++ b/code/modules/mob/living/basic/festivus_pole.dm @@ -42,6 +42,7 @@ /mob/living/basic/festivus/Initialize(mapload) . = ..() + AddComponent(/datum/component/seethrough_mob) var/static/list/death_loot = list(/obj/item/stack/rods) AddElement(/datum/element/death_drops, death_loot) AddComponent(/datum/component/aggro_emote, emote_list = string_list(list("growls")), emote_chance = 20) diff --git a/code/modules/mob/living/basic/heretic/fire_shark.dm b/code/modules/mob/living/basic/heretic/fire_shark.dm index fe4d5cc752a..ac1f1cc6970 100644 --- a/code/modules/mob/living/basic/heretic/fire_shark.dm +++ b/code/modules/mob/living/basic/heretic/fire_shark.dm @@ -1,16 +1,10 @@ -/mob/living/basic/fire_shark +/mob/living/basic/heretic_summon/fire_shark name = "fire shark" desc = "It is a eldritch dwarf space shark, also known as a fire shark." - icon = 'icons/mob/nonhuman-player/eldritch_mobs.dmi' icon_state = "fire_shark" icon_living = "fire_shark" pass_flags = PASSTABLE | PASSMOB - combat_mode = TRUE mob_biotypes = MOB_ORGANIC | MOB_BEAST - basic_mob_flags = DEL_ON_DEATH - unsuitable_atmos_damage = 0 - unsuitable_cold_damage = 0 - unsuitable_heat_damage = 0 speed = -0.5 health = 16 maxHealth = 16 @@ -26,15 +20,9 @@ mob_size = MOB_SIZE_TINY speak_emote = list("screams") basic_mob_flags = DEL_ON_DEATH - death_message = "implodes into itself." - ai_controller = null -/mob/living/basic/fire_shark/Initialize(mapload) +/mob/living/basic/heretic_summon/fire_shark/Initialize(mapload) . = ..() - var/static/list/death_loot - if(!death_loot) - death_loot = string_list(list(/obj/effect/gibspawner/human)) - AddElement(/datum/element/death_drops, death_loot) AddElement(/datum/element/death_gases, /datum/gas/plasma, 40) AddElement(/datum/element/simple_flying) AddElement(/datum/element/venomous, /datum/reagent/phlogiston, 2) diff --git a/code/modules/mob/living/basic/heretic/heretic_summon.dm b/code/modules/mob/living/basic/heretic/heretic_summon.dm new file mode 100644 index 00000000000..0f7d63f903c --- /dev/null +++ b/code/modules/mob/living/basic/heretic/heretic_summon.dm @@ -0,0 +1,33 @@ +/mob/living/basic/heretic_summon + name = "Eldritch Demon" + real_name = "Eldritch Demon" + desc = "A horror from beyond this realm." + icon = 'icons/mob/nonhuman-player/eldritch_mobs.dmi' + faction = list(FACTION_HERETIC) + basic_mob_flags = DEL_ON_DEATH + gender = NEUTER + mob_biotypes = NONE + + unsuitable_atmos_damage = 0 + unsuitable_cold_damage = 0 + unsuitable_heat_damage = 0 + damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) + speed = 0 + + attack_sound = 'sound/weapons/punch1.ogg' + response_help_continuous = "thinks better of touching" + response_help_simple = "think better of touching" + response_disarm_continuous = "flails at" + response_disarm_simple = "flail at" + response_harm_continuous = "reaps" + response_harm_simple = "tears" + death_message = "implodes into itself." + + combat_mode = TRUE + ai_controller = null + speak_emote = list("screams") + gold_core_spawnable = NO_SPAWN + +/mob/living/basic/heretic_summon/Initialize(mapload) + . = ..() + AddElement(/datum/element/death_drops, string_list(list(/obj/effect/gibspawner/generic))) diff --git a/code/modules/mob/living/basic/heretic/star_gazer.dm b/code/modules/mob/living/basic/heretic/star_gazer.dm index b08736a4e15..e4450aa5dbf 100644 --- a/code/modules/mob/living/basic/heretic/star_gazer.dm +++ b/code/modules/mob/living/basic/heretic/star_gazer.dm @@ -1,4 +1,4 @@ -/mob/living/basic/star_gazer +/mob/living/basic/heretic_summon/star_gazer name = "Star Gazer" desc = "A creature that has been tasked to watch over the stars." icon = 'icons/mob/nonhuman-player/96x96eldritch_mobs.dmi' @@ -6,9 +6,7 @@ icon_living = "star_gazer" pixel_x = -32 base_pixel_x = -32 - basic_mob_flags = DEL_ON_DEATH mob_biotypes = MOB_HUMANOID | MOB_EPIC - faction = list(FACTION_HERETIC) response_help_continuous = "passes through" response_help_simple = "pass through" speed = -0.2 @@ -19,7 +17,6 @@ armour_penetration = 20 melee_damage_lower = 40 melee_damage_upper = 40 - combat_mode = TRUE sentience_type = SENTIENCE_BOSS attack_verb_continuous = "ravages" attack_verb_simple = "ravage" @@ -29,11 +26,6 @@ damage_coeff = list(BRUTE = 1, BURN = 0.5, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) death_sound = 'sound/magic/cosmic_expansion.ogg' - unsuitable_atmos_damage = 0 - unsuitable_cold_damage = 0 - unsuitable_heat_damage = 0 - - gold_core_spawnable = NO_SPAWN slowed_by_drag = FALSE move_force = MOVE_FORCE_OVERPOWERING move_resist = MOVE_FORCE_OVERPOWERING @@ -45,7 +37,7 @@ ai_controller = /datum/ai_controller/basic_controller/star_gazer -/mob/living/basic/star_gazer/Initialize(mapload) +/mob/living/basic/heretic_summon/star_gazer/Initialize(mapload) . = ..() var/static/list/death_loot = list(/obj/effect/temp_visual/cosmic_domain) AddElement(/datum/element/death_drops, death_loot) diff --git a/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp.dm b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp.dm new file mode 100644 index 00000000000..465d724944b --- /dev/null +++ b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp.dm @@ -0,0 +1,88 @@ +/mob/living/basic/mining/ice_whelp + name = "ice whelp" + desc = "The offspring of an ice drake, weak in comparison but still terrifying." + icon = 'icons/mob/simple/icemoon/icemoon_monsters.dmi' + icon_state = "ice_whelp" + icon_living = "ice_whelp" + icon_dead = "ice_whelp_dead" + mob_biotypes = MOB_ORGANIC|MOB_BEAST + mouse_opacity = MOUSE_OPACITY_ICON + butcher_results = list( + /obj/item/stack/ore/diamond = 3, + /obj/item/stack/sheet/animalhide/ashdrake = 1, + /obj/item/stack/sheet/bone = 10, + /obj/item/stack/sheet/sinew = 2, + ) + crusher_loot = /obj/item/crusher_trophy/tail_spike + speed = 12 + + maxHealth = 300 + health = 300 + obj_damage = 40 + armour_penetration = 20 + melee_damage_lower = 20 + melee_damage_upper = 20 + + attack_verb_continuous = "chomps" + attack_verb_simple = "chomp" + death_message = "collapses on its side." + death_sound = 'sound/magic/demon_dies.ogg' + + attack_sound = 'sound/magic/demon_attack1.ogg' + move_force = MOVE_FORCE_VERY_STRONG + move_resist = MOVE_FORCE_VERY_STRONG + pull_force = MOVE_FORCE_VERY_STRONG + + ai_controller = /datum/ai_controller/basic_controller/ice_whelp + ///how much we will heal when cannibalizing a target + var/heal_on_cannibalize = 5 + +/mob/living/basic/mining/ice_whelp/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_NO_GLIDE, INNATE_TRAIT) + AddElement(/datum/element/footstep, FOOTSTEP_MOB_HEAVY) + AddComponent(/datum/component/basic_mob_ability_telegraph) + AddComponent(/datum/component/basic_mob_attack_telegraph, telegraph_duration = 0.6 SECONDS) + var/datum/action/cooldown/mob_cooldown/ice_breath/flamethrower = new(src) + var/datum/action/cooldown/mob_cooldown/ice_breathe_all_directions/wide_flames = new(src) + flamethrower.Grant(src) + wide_flames.Grant(src) + ai_controller.set_blackboard_key(BB_WHELP_WIDESPREAD_FIRE, wide_flames) + ai_controller.set_blackboard_key(BB_WHELP_STRAIGHTLINE_FIRE, flamethrower) + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) + + +/mob/living/basic/mining/ice_whelp/proc/pre_attack(mob/living/sculptor, atom/target) + SIGNAL_HANDLER + + if(istype(target, /obj/structure/flora/rock/icy)) + INVOKE_ASYNC(src, PROC_REF(create_sculpture), target) + return COMPONENT_HOSTILE_NO_ATTACK + + if(!istype(target, src.type)) + return + + var/mob/living/victim = target + if(victim.stat != DEAD) + return + + INVOKE_ASYNC(src, PROC_REF(cannibalize_victim), victim) + return COMPONENT_HOSTILE_NO_ATTACK + +/mob/living/basic/mining/ice_whelp/proc/create_sculpture(atom/target) + balloon_alert(src, "sculpting...") + if(!do_after(src, 5 SECONDS, target = target)) + return + var/obj/structure/statue/custom/dragon_statue = new(get_turf(target)) + dragon_statue.set_visuals(src) + dragon_statue.name = "statue of [src]" + dragon_statue.desc = "Let this serve as a warning." + dragon_statue.set_anchored(TRUE) + qdel(target) + +/mob/living/basic/mining/ice_whelp/proc/cannibalize_victim(mob/living/target) + balloon_alert(src, "devouring...") + if(!do_after(src, 5 SECONDS, target)) + return + target.gib() + adjustBruteLoss(-1 * heal_on_cannibalize) diff --git a/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_abilities.dm b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_abilities.dm new file mode 100644 index 00000000000..d5dc50d0a69 --- /dev/null +++ b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_abilities.dm @@ -0,0 +1,37 @@ +/datum/action/cooldown/mob_cooldown/ice_breath + name = "Ice Breath" + desc = "Fire a cold line of fire towards the enemy!" + button_icon = 'icons/effects/magic.dmi' + button_icon_state = "fireball" + cooldown_time = 3 SECONDS + melee_cooldown_time = 0 SECONDS + click_to_activate = TRUE + ///the range of fire + var/fire_range = 4 + +/datum/action/cooldown/mob_cooldown/ice_breath/Activate(atom/target_atom) + var/turf/target_fire_turf = get_ranged_target_turf_direct(owner, target_atom, fire_range) + var/list/burn_turfs = get_line(owner, target_fire_turf) - get_turf(owner) + // This proc sleeps + INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(dragon_fire_line), owner, /* burn_turfs = */ burn_turfs, /* frozen = */ TRUE) + StartCooldown() + return TRUE + +/datum/action/cooldown/mob_cooldown/ice_breathe_all_directions + name = "Fire all directions" + desc = "Unleash lines of cold fire in all directions" + button_icon = 'icons/effects/fire.dmi' + button_icon_state = "1" + cooldown_time = 4 SECONDS + melee_cooldown_time = 0 SECONDS + click_to_activate = FALSE + ///the range of fire + var/fire_range = 6 + +/datum/action/cooldown/mob_cooldown/ice_breathe_all_directions/Activate(atom/target_atom) + for(var/direction in GLOB.cardinals) + var/turf/target_fire_turf = get_ranged_target_turf(owner, direction, fire_range) + var/list/burn_turfs = get_line(owner, target_fire_turf) - get_turf(owner) + INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(dragon_fire_line), owner, burn_turfs, frozen = TRUE) + StartCooldown() + return TRUE diff --git a/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_ai.dm b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_ai.dm new file mode 100644 index 00000000000..08c5fda3fd8 --- /dev/null +++ b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_ai.dm @@ -0,0 +1,182 @@ +#define ENRAGE_ADDITION 25 +/datum/ai_controller/basic_controller/ice_whelp + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/allow_items/goliath, + BB_WHELP_ENRAGED = 0, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/targeted_mob_ability/ice_whelp, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/sculpt_statues, + /datum/ai_planning_subtree/find_and_hunt_target/cannibalize, + /datum/ai_planning_subtree/burn_trees, + ) + + +/datum/ai_planning_subtree/find_and_hunt_target/cannibalize + target_key = BB_TARGET_CANNIBAL + hunting_behavior = /datum/ai_behavior/cannibalize + finding_behavior = /datum/ai_behavior/find_hunt_target/dragon_corpse + hunt_targets = list(/mob/living/basic/mining/ice_whelp) + hunt_range = 10 + +/datum/ai_behavior/find_hunt_target/dragon_corpse + +/datum/ai_behavior/find_hunt_target/dragon_corpse/valid_dinner(mob/living/source, mob/living/dinner, radius) + if(dinner.stat != DEAD) + return FALSE + if(dinner.pulledby) //someone already got him before us + return FALSE + + return can_see(source, dinner, radius) + +/datum/ai_behavior/cannibalize + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + +/datum/ai_behavior/cannibalize/setup(datum/ai_controller/controller, target_key) + . = ..() + var/atom/target = controller.blackboard[target_key] + if(QDELETED(target)) + return FALSE + set_movement_target(controller, target) + +/datum/ai_behavior/cannibalize/perform(seconds_per_tick, datum/ai_controller/controller, target_key, attack_key) + . = ..() + var/mob/living/basic/living_pawn = controller.pawn + var/mob/living/target = controller.blackboard[target_key] + + if(QDELETED(target)) + finish_action(controller, FALSE) + return + + if(target.stat != DEAD || target.pulledby) //we were too slow + finish_action(controller, FALSE) + return + + living_pawn.start_pulling(target) + living_pawn.melee_attack(target) + finish_action(controller, TRUE) + +/datum/ai_behavior/cannibalize/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + controller.clear_blackboard_key(target_key) + +///subtree to find icy rocks and create sculptures out of them +/datum/ai_planning_subtree/sculpt_statues + +/datum/ai_planning_subtree/sculpt_statues/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/obj/target = controller.blackboard[BB_TARGET_ROCK] + + if(QDELETED(target)) + controller.queue_behavior(/datum/ai_behavior/find_and_set, BB_TARGET_ROCK, /obj/structure/flora/rock/icy) + return + + controller.queue_behavior(/datum/ai_behavior/sculpt_statue, BB_TARGET_ROCK) + return SUBTREE_RETURN_FINISH_PLANNING + +/datum/ai_behavior/sculpt_statue + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + action_cooldown = 5 MINUTES + +/datum/ai_behavior/sculpt_statue/setup(datum/ai_controller/controller, target_key) + . = ..() + var/obj/target = controller.blackboard[target_key] + if(QDELETED(target)) + return FALSE + set_movement_target(controller, target) + +/datum/ai_behavior/sculpt_statue/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + + var/atom/target = controller.blackboard[target_key] + var/mob/living/basic/living_pawn = controller.pawn + + if(QDELETED(target)) + finish_action(controller, FALSE, target_key) + return + + living_pawn.melee_attack(target) + finish_action(controller, TRUE, target_key) + +/datum/ai_behavior/sculpt_statue/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + controller.clear_blackboard_key(target_key) + + +//subtree to use our attacks on the victim +/datum/ai_planning_subtree/targeted_mob_ability/ice_whelp + ability_key = BB_WHELP_STRAIGHTLINE_FIRE + use_ability_behaviour = /datum/ai_behavior/targeted_mob_ability/ice_whelp + finish_planning = FALSE + + +/datum/ai_behavior/targeted_mob_ability/ice_whelp + ///key that stores how enraged we are + var/enraged_key = BB_WHELP_ENRAGED + ///key that stores the ability we will use instead if we are fully enraged + var/secondary_ability_key = BB_WHELP_WIDESPREAD_FIRE + +/datum/ai_behavior/targeted_mob_ability/ice_whelp/get_ability_to_use(datum/ai_controller/controller, ability_key) + var/enraged_value = controller.blackboard[enraged_key] + + if(prob(enraged_value)) + controller.set_blackboard_key(enraged_key, 0) + return controller.blackboard[secondary_ability_key] + + controller.set_blackboard_key(enraged_key, enraged_value + ENRAGE_ADDITION) + return controller.blackboard[ability_key] + +///subtree to look for trees and burn them with our flamethrower +/datum/ai_planning_subtree/burn_trees + +/datum/ai_planning_subtree/burn_trees/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/datum/action/cooldown/using_action = controller.blackboard[BB_WHELP_STRAIGHTLINE_FIRE] + if (!using_action.IsAvailable()) + return + + var/obj/structure/target = controller.blackboard[BB_TARGET_TREE] + if(QDELETED(target)) + controller.queue_behavior(/datum/ai_behavior/set_target_tree, BB_TARGET_TREE) + return + + controller.queue_behavior(/datum/ai_behavior/targeted_mob_ability/and_clear_target/burn_trees, BB_WHELP_STRAIGHTLINE_FIRE, BB_TARGET_TREE) + return SUBTREE_RETURN_FINISH_PLANNING + +/datum/ai_behavior/set_target_tree + +/datum/ai_behavior/set_target_tree/perform(seconds_per_tick, datum/ai_controller/controller, tree_key) + . = ..() + + var/mob/living_pawn = controller.pawn + var/list/possible_trees = list() + + for(var/obj/structure/flora/tree/possible_tree in oview(9, living_pawn)) + if(istype(possible_tree, /obj/structure/flora/tree/stump)) //no leaves to burn + continue + possible_trees += possible_tree + + if(!length(possible_trees)) + finish_action(controller, FALSE) + return + + controller.set_blackboard_key(tree_key, pick(possible_trees)) + finish_action(controller, TRUE) + +/datum/ai_behavior/targeted_mob_ability/and_clear_target/burn_trees + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + required_distance = 2 + action_cooldown = 2 MINUTES + +/datum/ai_behavior/targeted_mob_ability/and_clear_target/burn_trees/setup(datum/ai_controller/controller, ability_key, target_key) + . = ..() + var/obj/target = controller.blackboard[target_key] + if(QDELETED(target)) + return FALSE + set_movement_target(controller, target) + +#undef ENRAGE_ADDITION diff --git a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid.dm b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid.dm new file mode 100644 index 00000000000..bb109fdde61 --- /dev/null +++ b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid.dm @@ -0,0 +1,55 @@ +//Large and powerful, but timid. It won't engage anything above 50 health, or anything without legcuffs. +//It can fire fleshy snares that legcuff anyone that it hits, making them look especially tasty to the arachnid. +/mob/living/basic/mega_arachnid + name = "mega arachnid" + desc = "Though physically imposing, it prefers to ambush its prey, and it will only engage with an already crippled opponent." + icon = 'icons/mob/simple/jungle/arachnid.dmi' + icon_state = "arachnid" + icon_living = "arachnid" + icon_dead = "arachnid_dead" + mob_biotypes = MOB_ORGANIC|MOB_BUG + melee_damage_lower = 30 + melee_damage_upper = 30 + maxHealth = 300 + health = 300 + + pixel_x = -16 + base_pixel_x = -16 + + habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + faction = list(FACTION_JUNGLE) + obj_damage = 30 + environment_smash = ENVIRONMENT_SMASH_WALLS + minimum_survivable_temperature = T0C + maximum_survivable_temperature = T0C + 450 + status_flags = NONE + lighting_cutoff_red = 5 + lighting_cutoff_green = 20 + lighting_cutoff_blue = 25 + mob_size = MOB_SIZE_LARGE + + speak_emote = list("chitters") + attack_sound = 'sound/weapons/bladeslice.ogg' + attack_vis_effect = ATTACK_EFFECT_SLASH + ai_controller = /datum/ai_controller/basic_controller/mega_arachnid + alpha = 40 + +/mob/living/basic/mega_arachnid/Initialize(mapload) + . = ..() + AddComponent(/datum/component/seethrough_mob) + var/datum/action/cooldown/spell/pointed/projectile/flesh_restraints/restrain = new(src) + var/datum/action/cooldown/mob_cooldown/secrete_acid/acid_spray = new(src) + acid_spray.Grant(src) + restrain.Grant(src) + AddElement(/datum/element/swabable, CELL_LINE_TABLE_MEGA_ARACHNID, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) + AddComponent(/datum/component/appearance_on_aggro, alpha_on_aggro = 255, alpha_on_deaggro = alpha) + AddComponent(/datum/component/tree_climber, climbing_distance = 15) + ai_controller.set_blackboard_key(BB_ARACHNID_RESTRAIN, restrain) + ai_controller.set_blackboard_key(BB_ARACHNID_SLIP, acid_spray) + +/mob/living/basic/mega_arachnid/Login() + . = ..() + if(!. || !client) + return FALSE + + animate(src, alpha = 255, time = 2 SECONDS) //make them visible diff --git a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_abilities.dm b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_abilities.dm new file mode 100644 index 00000000000..e8c4d1723e7 --- /dev/null +++ b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_abilities.dm @@ -0,0 +1,80 @@ + +/datum/action/cooldown/spell/pointed/projectile/flesh_restraints + name = "fleshy restraints" + desc = "Launch at your prey to immobilize them." + button_icon = 'icons/obj/restraints.dmi' + button_icon_state = "flesh_snare" + + cooldown_time = 6 SECONDS + spell_requirements = NONE + + active_msg = "You prepare to throw a restraint at your target!" + cast_range = 8 + projectile_type = /obj/projectile/mega_arachnid + +/obj/projectile/mega_arachnid + name = "flesh snare" + icon_state = "tentacle_end" + damage = 0 + +/obj/projectile/mega_arachnid/on_hit(atom/target, blocked = FALSE) + . = ..() + if(!iscarbon(target) || blocked >= 100) + return + var/obj/item/restraints/legcuffs/beartrap/mega_arachnid/restraint = new(get_turf(target)) + restraint.spring_trap(null, target) + +/obj/item/restraints/legcuffs/beartrap/mega_arachnid + name = "fleshy restraints" + desc = "Used by mega arachnids to immobilize their prey." + flags_1 = NONE + item_flags = DROPDEL + icon_state = "flesh_snare" + armed = TRUE + +/obj/item/restraints/legcuffs/beartrap/mega_arachnid/Initialize(mapload) + . = ..() + AddElement(/datum/element/swabable, CELL_LINE_TABLE_MEGA_ARACHNID, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) + + +/datum/action/cooldown/mob_cooldown/secrete_acid + name = "Secrete Acid" + button_icon = 'icons/effects/acid.dmi' + button_icon_state = "default" + desc = "Secrete a slippery acid!" + cooldown_time = 15 SECONDS + melee_cooldown_time = 0 SECONDS + click_to_activate = FALSE + +/datum/action/cooldown/mob_cooldown/secrete_acid/Activate(atom/target_atom) + RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(release_acid)) + addtimer(CALLBACK(src, PROC_REF(deactivate_ability)), 3 SECONDS) + StartCooldown() + return TRUE + +/datum/action/cooldown/mob_cooldown/secrete_acid/proc/release_acid() + SIGNAL_HANDLER + + var/turf/current_turf = owner.loc + if(locate(/obj/effect/slippery_acid) in current_turf.contents) + return + + new /obj/effect/slippery_acid(current_turf) + +/datum/action/cooldown/mob_cooldown/secrete_acid/proc/deactivate_ability() + UnregisterSignal(owner, COMSIG_MOVABLE_MOVED) + +/obj/effect/slippery_acid + name = "slippery acid" + icon = 'icons/effects/acid.dmi' + icon_state = "default" + layer = BELOW_MOB_LAYER + plane = GAME_PLANE + anchored = TRUE + /// how long does the acid exist for + var/duration_time = 5 SECONDS + +/obj/effect/slippery_acid/Initialize(mapload) + . = ..() + AddComponent(/datum/component/slippery, 6 SECONDS) + QDEL_IN(src, duration_time) diff --git a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_ai.dm b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_ai.dm new file mode 100644 index 00000000000..e2c67af2467 --- /dev/null +++ b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_ai.dm @@ -0,0 +1,79 @@ +/datum/ai_controller/basic_controller/mega_arachnid + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_BASIC_MOB_FLEEING = TRUE, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/targeted_mob_ability/arachnid_restrain, + /datum/ai_planning_subtree/basic_melee_attack_subtree/mega_arachnid, + /datum/ai_planning_subtree/flee_target/mega_arachnid, + /datum/ai_planning_subtree/climb_trees, + /datum/ai_planning_subtree/find_and_hunt_target/destroy_surveillance, + ) + +///destroy surveillance objects to boost our stealth +/datum/ai_planning_subtree/find_and_hunt_target/destroy_surveillance + target_key = BB_SURVEILLANCE_TARGET + finding_behavior = /datum/ai_behavior/find_hunt_target/find_active_surveillance + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target + hunt_targets = list(/obj/machinery/camera, /obj/machinery/light) + hunt_range = 7 + +/datum/ai_behavior/find_hunt_target/find_active_surveillance + +/datum/ai_behavior/find_hunt_target/find_active_camera/valid_dinner(mob/living/source, obj/machinery/dinner, radius) + if(dinner.machine_stat & BROKEN) + return FALSE + + return can_see(source, dinner, radius) + +///spray slippery acid as we flee! +/datum/ai_planning_subtree/flee_target/mega_arachnid + flee_behaviour = /datum/ai_behavior/run_away_from_target/mega_arachnid + +/datum/ai_planning_subtree/flee_target/mega_arachnid/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(!controller.blackboard[BB_BASIC_MOB_FLEEING]) + return + var/datum/action/cooldown/slip_acid = controller.blackboard[BB_ARACHNID_SLIP] + + if(!QDELETED(slip_acid) && slip_acid.IsAvailable()) + controller.queue_behavior(/datum/ai_behavior/use_mob_ability, BB_ARACHNID_SLIP) + + return ..() + +/datum/ai_behavior/run_away_from_target/mega_arachnid + clear_failed_targets = FALSE + run_distance = 5 + +///only engage in melee combat against cuffed targets, otherwise keep throwing restraints at them +/datum/ai_planning_subtree/basic_melee_attack_subtree/mega_arachnid + ///minimum health our target must be before we can attack them + var/minimum_health = 50 + +/datum/ai_planning_subtree/basic_melee_attack_subtree/mega_arachnid/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/atom/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + if(!ishuman(target)) + return ..() + + var/mob/living/carbon/human_target = target + if(!human_target.legcuffed && human_target.health > minimum_health) + return + + return ..() + +/datum/ai_planning_subtree/targeted_mob_ability/arachnid_restrain + ability_key = BB_ARACHNID_RESTRAIN + +/// only fire ability at humans if they are not cuffed +/datum/ai_planning_subtree/targeted_mob_ability/arachnid_restrain/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/target = controller.blackboard[target_key] + if(!ishuman(target)) + return + var/mob/living/carbon/human_target = target + if(human_target.legcuffed) + return + return ..() diff --git a/code/modules/mob/living/basic/lavaland/basilisk/basilisk.dm b/code/modules/mob/living/basic/lavaland/basilisk/basilisk.dm new file mode 100644 index 00000000000..c662870393c --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/basilisk/basilisk.dm @@ -0,0 +1,87 @@ +/// Watchers' ground-dwelling cousins, they shoot at you until they get into melee and absorb laser fire to power up. +/mob/living/basic/mining/basilisk + name = "basilisk" + desc = "A territorial beast, covered in a diamond shell which absorbs heat. Its stare causes victims to freeze from the inside." + icon_state = "basilisk" + icon_living = "basilisk" + icon_dead = "basilisk_dead" + speak_emote = list("chimes") + damage_coeff = list(BRUTE = 1, BURN = 0.1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) + speed = 20 + maxHealth = 200 + health = 200 + obj_damage = 60 + melee_damage_lower = 12 + melee_damage_upper = 12 + attack_verb_continuous = "bites into" + attack_verb_simple = "bite into" + throw_blocked_message = "bounces off the shell of" + attack_sound = 'sound/weapons/bladeslice.ogg' + attack_vis_effect = ATTACK_EFFECT_BITE + ai_controller = /datum/ai_controller/basic_controller/basilisk + butcher_results = list( + /obj/item/stack/sheet/bone = 1, + /obj/item/stack/ore/diamond = 2, + /obj/item/stack/sheet/sinew = 2, + ) + /// The component we use for making ranged attacks + var/datum/component/ranged_attacks/ranged_attacks + +/mob/living/basic/mining/basilisk/Initialize(mapload) + . = ..() + AddComponent(/datum/component/basic_mob_attack_telegraph) + ranged_attacks = AddComponent(/datum/component/ranged_attacks, projectile_type = /obj/projectile/temp/watcher, projectile_sound = 'sound/weapons/pierce.ogg') + RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(check_lava)) + +/mob/living/basic/mining/basilisk/Destroy() + QDEL_NULL(ranged_attacks) + return ..() + +/mob/living/basic/mining/basilisk/welder_act(mob/living/user, obj/item/tool) + . = ..() + heat_up() // Who would do this? + +/mob/living/basic/mining/basilisk/bullet_act(obj/projectile/bullet, def_zone, piercing_hit) + . = ..() + if (istype(bullet, /obj/projectile/temp)) + var/obj/projectile/temp/heat_bullet = bullet + if (heat_bullet.temperature < 0) + return + heat_up() + return + + if (bullet.damage == 0 || bullet.damage_type != BURN) + return + heat_up() + +/// Are we standing in lava? +/mob/living/basic/mining/basilisk/proc/check_lava() + SIGNAL_HANDLER + var/turf/open/lava/entered_lava = loc + if (!islava(entered_lava) || entered_lava.immunity_trait != TRAIT_LAVA_IMMUNE) + return + heat_up() + +/// We got hit by something hot, go into heat mode +/mob/living/basic/mining/basilisk/proc/heat_up() + if (stat != CONSCIOUS || has_status_effect(/datum/status_effect/basilisk_overheat)) + return + apply_status_effect(/datum/status_effect/basilisk_overheat) + +/// Change what kind of beam we fire +/mob/living/basic/mining/basilisk/proc/set_projectile_type(projectile_type) + ranged_attacks.projectile_type = projectile_type + +/datum/ai_controller/basic_controller/basilisk + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/ranged_skirmish, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) diff --git a/code/modules/mob/living/basic/lavaland/basilisk/basilisk_overheat.dm b/code/modules/mob/living/basic/lavaland/basilisk/basilisk_overheat.dm new file mode 100644 index 00000000000..c0b49fbdc61 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/basilisk/basilisk_overheat.dm @@ -0,0 +1,76 @@ +/// Status effect gained by basilisks when they touch something hot +/datum/status_effect/basilisk_overheat + id = "basilisk_overheat" + duration = 3 MINUTES + /// Things which will chill us out if we get hit by them + var/static/list/chilling_reagents = list( + /datum/reagent/medicine/cryoxadone, + /datum/reagent/firefighting_foam, + /datum/reagent/consumable/frostoil, + /datum/reagent/consumable/ice, + /datum/reagent/water, + ) + +/datum/status_effect/basilisk_overheat/on_apply() + . = ..() + if (!. || !istype(owner, /mob/living/basic/mining/basilisk) || owner.stat != CONSCIOUS) + return FALSE + var/mob/living/basic/mining/basilisk/hot_stuff = owner + hot_stuff.visible_message(span_warning("[hot_stuff] is getting fired up!")) + hot_stuff.fully_heal() + hot_stuff.icon_living = "basilisk_alert" + hot_stuff.icon_state = "basilisk_alert" + hot_stuff.update_appearance(UPDATE_ICON_STATE) + hot_stuff.add_movespeed_modifier(/datum/movespeed_modifier/basilisk_overheat) + hot_stuff.set_projectile_type(/obj/projectile/basilisk_hot) + + RegisterSignal(hot_stuff, COMSIG_LIVING_DEATH, PROC_REF(on_death)) + RegisterSignal(hot_stuff, COMSIG_ATOM_EXPOSE_REAGENTS, PROC_REF(on_splashed)) + RegisterSignal(hot_stuff, COMSIG_ATOM_BULLET_ACT, PROC_REF(on_shot)) + +/datum/status_effect/basilisk_overheat/on_remove() + . = ..() + var/mob/living/basic/mining/basilisk/hot_stuff = owner + hot_stuff.icon_living = "basilisk" + hot_stuff.icon_state = "basilisk" + hot_stuff.set_projectile_type(/obj/projectile/temp/watcher) + + hot_stuff.update_appearance(UPDATE_ICON_STATE) + hot_stuff.remove_movespeed_modifier(/datum/movespeed_modifier/basilisk_overheat) + UnregisterSignal(hot_stuff, list(COMSIG_LIVING_DEATH, COMSIG_ATOM_EXPOSE_REAGENTS, COMSIG_ATOM_BULLET_ACT)) + + if (hot_stuff.stat != CONSCIOUS) + return + hot_stuff.visible_message(span_notice("[hot_stuff] seems to have cooled down.")) + var/obj/effect/particle_effect/fluid/smoke/poof = new(get_turf(hot_stuff)) + poof.lifetime = 2 SECONDS + +/// Cool down if we die +/datum/status_effect/basilisk_overheat/proc/on_death() + SIGNAL_HANDLER + qdel(src) + +/// Cool down if splashed with water +/datum/status_effect/basilisk_overheat/proc/on_splashed(atom/source, list/reagents, datum/reagents/source_reagents, methods, volume_modifier, show_message) + SIGNAL_HANDLER + if(!(methods & (TOUCH|VAPOR))) + return + for (var/datum/reagent in reagents) + if (!is_type_in_list(reagent, chilling_reagents)) + continue + qdel(src) + return + +/// Cool down if shot with a cryo beam +/datum/status_effect/basilisk_overheat/proc/on_shot(datum/source, obj/projectile/temp/cryo_shot) + SIGNAL_HANDLER + if (!istype(cryo_shot) || cryo_shot.temperature > 0) + return + qdel(src) + +/// Projectile basilisks use when hot +/obj/projectile/basilisk_hot + name = "energy blast" + icon_state = "chronobolt" + damage = 40 + damage_type = BRUTE diff --git a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm new file mode 100644 index 00000000000..58b0e1bbbdb --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm @@ -0,0 +1,191 @@ +//An ore-devouring but easily scared creature +/mob/living/basic/mining/goldgrub + name = "goldgrub" + desc = "A worm that grows fat from eating everything in its sight. Seems to enjoy precious metals and other shiny things, hence the name." + icon = 'icons/mob/simple/lavaland/lavaland_monsters_wide.dmi' + icon_state = "goldgrub" + icon_living = "goldgrub" + icon_dead = "goldgrub_dead" + icon_gib = "syndicate_gib" + speed = 5 + pixel_x = -12 + base_pixel_x = -12 + mob_biotypes = MOB_ORGANIC|MOB_BEAST + friendly_verb_continuous = "harmlessly rolls into" + friendly_verb_simple = "harmlessly roll into" + maxHealth = 45 + health = 45 + melee_damage_lower = 0 + melee_damage_upper = 0 + attack_verb_continuous = "barrels into" + attack_verb_simple = "barrel into" + attack_sound = 'sound/weapons/punch1.ogg' + combat_mode = FALSE + speak_emote = list("screeches") + death_message = "stops moving as green liquid oozes from the carcass!" + status_flags = CANPUSH + gold_core_spawnable = HOSTILE_SPAWN + ai_controller = /datum/ai_controller/basic_controller/goldgrub + ///can this mob lay eggs + var/can_lay_eggs = TRUE + ///can we tame this mob + var/can_tame = TRUE + //pet commands when we tame the grub + var/list/pet_commands = list( + /datum/pet_command/idle, + /datum/pet_command/free, + /datum/pet_command/grub_spit, + /datum/pet_command/follow, + /datum/pet_command/point_targetting/fetch, + ) + +/mob/living/basic/mining/goldgrub/Initialize(mapload) + . = ..() + + if(mapload) + generate_loot() + else + can_lay_eggs = FALSE + + var/datum/action/cooldown/mob_cooldown/spit_ore/spit = new(src) + var/datum/action/cooldown/mob_cooldown/burrow/burrow = new(src) + spit.Grant(src) + burrow.Grant(src) + ai_controller.set_blackboard_key(BB_SPIT_ABILITY, spit) + ai_controller.set_blackboard_key(BB_BURROW_ABILITY, burrow) + AddElement(/datum/element/wall_smasher) + AddComponent(/datum/component/ai_listen_to_weather) + AddComponent(\ + /datum/component/appearance_on_aggro,\ + overlay_icon = 'icons/mob/simple/lavaland/lavaland_monsters_wide.dmi',\ + overlay_state = "goldgrub_alert",\ + ) + if(can_tame) + make_tameable() + if(can_lay_eggs) + make_egg_layer() + +/mob/living/basic/mining/goldgrub/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) + . = ..() + if(!.) + return + + if(!proximity_flag) + return + + if(istype(attack_target, /obj/item/stack/ore)) + consume_ore(attack_target) + +/mob/living/basic/mining/goldgrub/bullet_act(obj/projectile/bullet) + if(stat == DEAD) + return BULLET_ACT_FORCE_PIERCE + + visible_message(span_danger("The [bullet.name] is repelled by [src]'s girth!")) + return BULLET_ACT_BLOCK + +/mob/living/basic/mining/goldgrub/proc/barf_contents(gibbed) + playsound(src, 'sound/effects/splat.ogg', 50, TRUE) + for(var/obj/item/ore as anything in src) + ore.forceMove(loc) + if(!gibbed) + visible_message(span_danger("[src] spits out its consumed ores!")) + +/mob/living/basic/mining/goldgrub/proc/generate_loot() + var/loot_amount = rand(1,3) + var/list/weight_lootdrops = list( + /obj/item/stack/ore/silver = 4, + /obj/item/stack/ore/gold = 3, + /obj/item/stack/ore/uranium = 3, + /obj/item/stack/ore/diamond = 1, + ) + for(var/i in 1 to loot_amount) + var/picked_loot = pick_weight(weight_lootdrops) + new picked_loot(src) + +/mob/living/basic/mining/goldgrub/death(gibbed) + barf_contents(gibbed) + return ..() + +/mob/living/basic/mining/goldgrub/proc/make_tameable() + AddComponent(\ + /datum/component/tameable,\ + food_types = list(/obj/item/stack/ore),\ + tame_chance = 25,\ + bonus_tame_chance = 5,\ + after_tame = CALLBACK(src, PROC_REF(tame_grub)),\ + ) + +/mob/living/basic/mining/goldgrub/proc/tame_grub() + new /obj/effect/temp_visual/heart(src.loc) + AddElement(/datum/element/ridable, /datum/component/riding/creature/goldgrub) + AddComponent(/datum/component/obeys_commands, pet_commands) + +/mob/living/basic/mining/goldgrub/proc/make_egg_layer() + AddComponent(\ + /datum/component/egg_layer,\ + /obj/item/food/egg/green/grub_egg,\ + list(/obj/item/stack/ore/bluespace_crystal),\ + lay_messages = EGG_LAYING_MESSAGES,\ + eggs_left = 0,\ + eggs_added_from_eating = 1,\ + max_eggs_held = 1,\ + ) + +/mob/living/basic/mining/goldgrub/proc/consume_ore(obj/item/target_ore) + playsound(src,'sound/items/eatfood.ogg', rand(10,50), TRUE) + target_ore.forceMove(src) + if(!can_lay_eggs) + return + if(!istype(target_ore, /obj/item/stack/ore/bluespace_crystal) || prob(60)) + return + new /obj/item/food/egg/green/grub_egg(get_turf(src)) + +/mob/living/basic/mining/goldgrub/baby + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + name = "goldgrub baby" + icon_state = "grub_baby" + icon_living = "grub_baby" + icon_dead = "grub_baby_dead" + pixel_x = 0 + base_pixel_x = 0 + speed = 3 + maxHealth = 25 + health = 25 + gold_core_spawnable = NO_SPAWN + can_tame = FALSE + can_lay_eggs = FALSE + ai_controller = /datum/ai_controller/basic_controller/babygrub + +/mob/living/basic/mining/goldgrub/baby/Initialize(mapload) + . = ..() + AddComponent(\ + /datum/component/growth_and_differentiation,\ + growth_time = 5 MINUTES,\ + growth_path = /mob/living/basic/mining/goldgrub,\ + growth_probability = 100,\ + lower_growth_value = 0.5,\ + upper_growth_value = 1,\ + signals_to_kill_on = list(COMSIG_MOB_CLIENT_LOGIN),\ + optional_checks = CALLBACK(src, PROC_REF(ready_to_grow)),\ + ) + +/mob/living/basic/mining/goldgrub/baby/proc/ready_to_grow() + return (stat == CONSCIOUS && !is_jaunting(src)) + +/obj/item/food/egg/green/grub_egg + name = "grub egg" + desc = "Covered in disgusting fluid." + + +/obj/item/food/egg/green/grub_egg/Initialize(mapload) + . = ..() + AddComponent(\ + /datum/component/fertile_egg,\ + embryo_type = /mob/living/basic/mining/goldgrub/baby,\ + minimum_growth_rate = 1,\ + maximum_growth_rate = 2,\ + total_growth_required = 100,\ + current_growth = 0,\ + location_allowlist = typecacheof(list(/turf)),\ + ) + diff --git a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_abilities.dm b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_abilities.dm new file mode 100644 index 00000000000..fe8c8096e2c --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_abilities.dm @@ -0,0 +1,85 @@ +/datum/action/cooldown/mob_cooldown/spit_ore + name = "Spit Ore" + desc = "Vomit out all of your consumed ores." + click_to_activate = FALSE + cooldown_time = 5 SECONDS + +/datum/action/cooldown/mob_cooldown/spit_ore/IsAvailable(feedback) + if(is_jaunting(owner)) + if(feedback) + owner.balloon_alert(owner, "currently underground!") + return FALSE + + if(!length(owner.contents)) + if(feedback) + owner.balloon_alert(owner, "no ores to spit!") + return FALSE + return TRUE + +/datum/action/cooldown/mob_cooldown/spit_ore/Activate() + var/mob/living/basic/mining/goldgrub/grub_owner = owner + grub_owner.barf_contents() + StartCooldown() + return TRUE + +/datum/action/cooldown/mob_cooldown/burrow + name = "Burrow" + desc = "Burrow under soft ground, evading predators and increasing your speed." + cooldown_time = 7 SECONDS + click_to_activate = FALSE + +/datum/action/cooldown/mob_cooldown/burrow/IsAvailable(feedback) + . = ..() + if (!.) + return FALSE + var/turf/location = get_turf(owner) + + if(!isasteroidturf(location) && !ismineralturf(location)) + if(feedback) + owner.balloon_alert(owner, "available only on mining floor or wall!") + return FALSE + + return TRUE + +/datum/action/cooldown/mob_cooldown/burrow/Activate() + var/obj/effect/dummy/phased_mob/grub_burrow/holder = null + var/turf/current_loc = get_turf(owner) + + if(!do_after(owner, 3 SECONDS, target = current_loc)) + owner.balloon_alert(owner, "need to stay still!") + return + + if(get_turf(owner) != current_loc) + to_chat(owner, span_warning("Action cancelled, as you moved while reappearing.")) + return + + if(!is_jaunting(owner)) + owner.visible_message(span_danger("[owner] buries into the ground, vanishing from sight!")) + playsound(get_turf(owner), 'sound/effects/break_stone.ogg', 50, TRUE, -1) + holder = new /obj/effect/dummy/phased_mob/grub_burrow(current_loc, owner) + return TRUE + + holder = owner.loc + holder.eject_jaunter() + holder = null + owner.visible_message(span_danger("[owner] emerges from the ground!")) + + if(ismineralturf(current_loc)) + var/turf/closed/mineral/mineral_turf = current_loc + mineral_turf.gets_drilled(owner) + + playsound(current_loc, 'sound/effects/break_stone.ogg', 50, TRUE, -1) + StartCooldown() + return TRUE + +/obj/effect/dummy/phased_mob/grub_burrow + +/obj/effect/dummy/phased_mob/grub_burrow/phased_check(mob/living/user, direction) + . = ..() + + if(!.) + return + + if(!ismineralturf(.) && !isasteroidturf(.)) + to_chat(user, span_warning("You cannot dig through this floor!")) + return null diff --git a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_ai.dm b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_ai.dm new file mode 100644 index 00000000000..12e7d4c8ff1 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_ai.dm @@ -0,0 +1,209 @@ +/datum/ai_controller/basic_controller/goldgrub + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends, + BB_ORE_IGNORE_TYPES = list(/obj/item/stack/ore/iron, /obj/item/stack/ore/glass), + BB_BASIC_MOB_FLEEING = TRUE, + BB_STORM_APPROACHING = FALSE, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk/less_walking + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/pet_planning, + /datum/ai_planning_subtree/dig_away_from_danger, + /datum/ai_planning_subtree/flee_target, + /datum/ai_planning_subtree/find_and_hunt_target/consume_ores, + /datum/ai_planning_subtree/find_and_hunt_target/baby_egg, + /datum/ai_planning_subtree/grub_mine, + ) + +/datum/ai_controller/basic_controller/babygrub + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_ORE_IGNORE_TYPES = list(/obj/item/stack/ore/glass), + BB_FIND_MOM_TYPES = list(/mob/living/basic/mining/goldgrub), + BB_IGNORE_MOM_TYPES = list(/mob/living/basic/mining/goldgrub/baby), + BB_BASIC_MOB_FLEEING = TRUE, + BB_STORM_APPROACHING = FALSE, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk/less_walking + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/dig_away_from_danger, + /datum/ai_planning_subtree/find_and_hunt_target/consume_ores, + /datum/ai_planning_subtree/flee_target, + /datum/ai_planning_subtree/look_for_adult, + ) + +///consume food! +/datum/ai_planning_subtree/find_and_hunt_target/consume_ores + target_key = BB_ORE_TARGET + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/consume_ores + finding_behavior = /datum/ai_behavior/find_hunt_target/consume_ores + hunt_targets = list(/obj/item/stack/ore) + hunt_chance = 75 + hunt_range = 9 + +/datum/ai_behavior/find_hunt_target/consume_ores + +/datum/ai_behavior/find_hunt_target/consume_ores/valid_dinner(mob/living/basic/source, obj/item/stack/ore/target, radius) + var/list/forbidden_ore = source.ai_controller.blackboard[BB_ORE_IGNORE_TYPES] + + if(is_type_in_list(target, forbidden_ore)) + return FALSE + + if(target in source) + return FALSE + + var/obj/item/pet_target = source.ai_controller.blackboard[BB_CURRENT_PET_TARGET] + if(target == pet_target) //we are currently fetching this ore for master, dont eat it! + return FALSE + + return can_see(source, target, radius) + +/datum/ai_behavior/hunt_target/unarmed_attack_target/consume_ores + always_reset_target = TRUE + +///find our child's egg and pull it! +/datum/ai_planning_subtree/find_and_hunt_target/baby_egg + target_key = BB_LOW_PRIORITY_HUNTING_TARGET + hunting_behavior = /datum/ai_behavior/hunt_target/grub_egg + finding_behavior = /datum/ai_behavior/find_hunt_target + hunt_targets = list(/obj/item/food/egg/green/grub_egg) + hunt_chance = 75 + hunt_range = 9 + +/datum/ai_planning_subtree/find_and_hunt_target/baby_egg + +/datum/ai_planning_subtree/find_and_hunt_target/baby_egg/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + if(living_pawn.pulling) //we are already pulling something + return + return ..() + +/datum/ai_behavior/hunt_target/grub_egg + always_reset_target = TRUE + +/datum/ai_behavior/hunt_target/grub_egg/target_caught(mob/living/hunter, obj/item/target) + hunter.start_pulling(target) + + +///only dig away if storm is coming or if humans are around +/datum/ai_planning_subtree/dig_away_from_danger + +/datum/ai_planning_subtree/dig_away_from_danger/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/currently_underground = is_jaunting(controller.pawn) + var/storm_approaching = controller.blackboard[BB_STORM_APPROACHING] + + //dont do anything until the storm passes + if(currently_underground && storm_approaching) + return SUBTREE_RETURN_FINISH_PLANNING + + var/datum/action/cooldown/dig_ability = controller.blackboard[BB_BURROW_ABILITY] + + if(!dig_ability.IsAvailable()) + return + + var/mob/living/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + + //a storm is coming or someone is nearby, its time to escape + if(currently_underground || !currently_underground && storm_approaching || !QDELETED(target)) + controller.queue_behavior(/datum/ai_behavior/use_mob_ability/burrow, BB_BURROW_ABILITY) + return SUBTREE_RETURN_FINISH_PLANNING + +/datum/ai_behavior/use_mob_ability/burrow + behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + +///mine walls to look for food! +/datum/ai_planning_subtree/grub_mine + +/datum/ai_planning_subtree/grub_mine/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/turf/target_wall = controller.blackboard[BB_TARGET_MINERAL_WALL] + + if(QDELETED(target_wall)) + controller.queue_behavior(/datum/ai_behavior/find_mineral_wall, BB_TARGET_MINERAL_WALL) + return + + controller.queue_behavior(/datum/ai_behavior/mine_wall, BB_TARGET_MINERAL_WALL) + return SUBTREE_RETURN_FINISH_PLANNING + + +/datum/ai_behavior/find_mineral_wall + +/datum/ai_behavior/find_mineral_wall/perform(seconds_per_tick, datum/ai_controller/controller, found_wall_key) + . = ..() + + var/mob/living_pawn = controller.pawn + + for(var/turf/closed/mineral/potential_wall in oview(9, living_pawn)) + if(!check_if_mineable(living_pawn, potential_wall)) //check if its surrounded by walls + continue + controller.set_blackboard_key(found_wall_key, potential_wall) //closest wall first! + finish_action(controller, TRUE) + return + + finish_action(controller, FALSE) + +/datum/ai_behavior/find_mineral_wall/proc/check_if_mineable(mob/living/source, turf/target_wall) + var/direction_to_turf = get_dir(target_wall, source) + if(!ISDIAGONALDIR(direction_to_turf)) + return TRUE + var/list/directions_to_check = list() + for(var/direction_check in GLOB.cardinals) + if(direction_check & direction_to_turf) + directions_to_check += direction_check + + for(var/direction in directions_to_check) + var/turf/test_turf = get_step(target_wall, direction) + if(isnull(test_turf)) + continue + if(!test_turf.is_blocked_turf(ignore_atoms = list(source))) + return TRUE + return FALSE + +/datum/ai_behavior/mine_wall + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + action_cooldown = 15 SECONDS + +/datum/ai_behavior/mine_wall/setup(datum/ai_controller/controller, target_key) + . = ..() + var/turf/target = controller.blackboard[target_key] + if(isnull(target)) + return FALSE + set_movement_target(controller, target) + +/datum/ai_behavior/mine_wall/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + var/mob/living/basic/living_pawn = controller.pawn + var/turf/closed/mineral/target = controller.blackboard[target_key] + var/is_gibtonite_turf = istype(target, /turf/closed/mineral/gibtonite) + if(QDELETED(target)) + finish_action(controller, FALSE, target_key) + return + living_pawn.melee_attack(target) + if(is_gibtonite_turf) + living_pawn.manual_emote("sighs...") //accept whats about to happen to us + + finish_action(controller, TRUE, target_key) + return + +/datum/ai_behavior/mine_wall/finish_action(datum/ai_controller/controller, success, target_key) + . = ..() + controller.clear_blackboard_key(target_key) + +/datum/pet_command/grub_spit + command_name = "Spit" + command_desc = "Ask your grub pet to spit out its ores." + speech_commands = list("spit", "ores") + +/datum/pet_command/grub_spit/execute_action(datum/ai_controller/controller) + var/datum/action/cooldown/spit_ability = controller.blackboard[BB_SPIT_ABILITY] + if(QDELETED(spit_ability) || !spit_ability.IsAvailable()) + return + controller.queue_behavior(/datum/ai_behavior/use_mob_ability, BB_SPIT_ABILITY) + controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND) + return SUBTREE_RETURN_FINISH_PLANNING diff --git a/code/modules/mob/living/basic/lavaland/goliath/goliath.dm b/code/modules/mob/living/basic/lavaland/goliath/goliath.dm index db7b4785413..95df44a8326 100644 --- a/code/modules/mob/living/basic/lavaland/goliath/goliath.dm +++ b/code/modules/mob/living/basic/lavaland/goliath/goliath.dm @@ -11,7 +11,6 @@ gender = MALE // Female ones are the bipedal elites speed = 30 basic_mob_flags = IMMUNE_TO_FISTS - mob_biotypes = MOB_ORGANIC|MOB_BEAST maxHealth = 300 health = 300 friendly_verb_continuous = "wails at" @@ -44,17 +43,17 @@ /// Slight cooldown to prevent double-dipping if we use both abilities at once COOLDOWN_DECLARE(ability_animation_cooldown) /// Our base tentacles ability - var/datum/action/cooldown/goliath_tentacles/tentacles + var/datum/action/cooldown/mob_cooldown/goliath_tentacles/tentacles /// Things we want to eat off the floor (or a plate, we're not picky) var/static/list/goliath_foods = list(/obj/item/food/grown/ash_flora, /obj/item/food/bait/worm) /mob/living/basic/mining/goliath/Initialize(mapload) . = ..() - ADD_TRAIT(src, TRAIT_NO_GLIDE, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_TENTACLE_IMMUNE, INNATE_TRAIT) AddElement(/datum/element/ai_retaliate) AddElement(/datum/element/footstep, FOOTSTEP_MOB_HEAVY) AddElement(/datum/element/basic_eating, heal_amt = 10, food_types = goliath_foods) + AddComponent(/datum/component/ai_target_timer) AddComponent(/datum/component/basic_mob_attack_telegraph) AddComponentFrom(INNATE_TRAIT, /datum/component/shovel_hands) if (tameable) @@ -68,10 +67,10 @@ tentacles = new (src) tentacles.Grant(src) - var/datum/action/cooldown/tentacle_burst/melee_tentacles = new (src) + var/datum/action/cooldown/mob_cooldown/tentacle_burst/melee_tentacles = new (src) melee_tentacles.Grant(src) AddComponent(/datum/component/revenge_ability, melee_tentacles, targetting = ai_controller.blackboard[BB_TARGETTING_DATUM], max_range = 1, target_self = TRUE) - var/datum/action/cooldown/tentacle_grasp/ranged_tentacles = new (src) + var/datum/action/cooldown/mob_cooldown/tentacle_grasp/ranged_tentacles = new (src) ranged_tentacles.Grant(src) AddComponent(/datum/component/revenge_ability, ranged_tentacles, targetting = ai_controller.blackboard[BB_TARGETTING_DATUM], min_range = 2, max_range = 9) @@ -141,7 +140,7 @@ SIGNAL_HANDLER if (stat == DEAD || ability.IsAvailable()) return // We died or the action failed for some reason like being out of range - if (istype(ability, /datum/action/cooldown/goliath_tentacles)) + if (istype(ability, /datum/action/cooldown/mob_cooldown/goliath_tentacles)) if (ability.cooldown_time <= 2 SECONDS) return icon_state = icon_living @@ -168,16 +167,6 @@ . = ..() faction = new_friend.faction.Copy() -/// Goliath which sometimes replaces itself with a rare variant -/mob/living/basic/mining/goliath/random - -/mob/living/basic/mining/goliath/random/Initialize(mapload) - . = ..() - if(!prob(1)) - return - new /mob/living/basic/mining/goliath/ancient/immortal(loc) - return INITIALIZE_HINT_QDEL - /// Legacy Goliath mob with different sprites, largely the same behaviour /mob/living/basic/mining/goliath/ancient name = "ancient goliath" diff --git a/code/modules/mob/living/basic/lavaland/goliath/goliath_actions.dm b/code/modules/mob/living/basic/lavaland/goliath/goliath_actions.dm index f98d1630650..bb8adaf61c3 100644 --- a/code/modules/mob/living/basic/lavaland/goliath/goliath_actions.dm +++ b/code/modules/mob/living/basic/lavaland/goliath/goliath_actions.dm @@ -1,5 +1,5 @@ /// Place some grappling tentacles underfoot -/datum/action/cooldown/goliath_tentacles +/datum/action/cooldown/mob_cooldown/goliath_tentacles name = "Unleash Tentacles" desc = "Unleash burrowed tentacles at a targetted location, grappling targets after a delay." button_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' @@ -10,17 +10,17 @@ cooldown_time = 12 SECONDS melee_cooldown_time = 0 check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED + shared_cooldown = NONE /// Furthest range we can activate ability at var/max_range = 7 -/datum/action/cooldown/goliath_tentacles/PreActivate(atom/target) +/datum/action/cooldown/mob_cooldown/goliath_tentacles/PreActivate(atom/target) target = get_turf(target) if (get_dist(owner, target) > max_range) return FALSE return ..() -/datum/action/cooldown/goliath_tentacles/Activate(atom/target) - . = ..() +/datum/action/cooldown/mob_cooldown/goliath_tentacles/Activate(atom/target) new /obj/effect/goliath_tentacle(target) var/list/directions = GLOB.cardinals.Copy() for(var/i in 1 to 3) @@ -31,10 +31,11 @@ if (isliving(target)) owner.visible_message(span_warning("[owner] digs its tentacles under [target]!")) + StartCooldown() return TRUE /// Place grappling tentacles around you to grab attackers -/datum/action/cooldown/tentacle_burst +/datum/action/cooldown/mob_cooldown/tentacle_burst name = "Tentacle Burst" desc = "Unleash burrowed tentacles in an area around you, grappling targets after a delay." button_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' @@ -44,19 +45,21 @@ cooldown_time = 24 SECONDS melee_cooldown_time = 0 check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED + shared_cooldown = NONE + click_to_activate = FALSE -/datum/action/cooldown/tentacle_burst/Activate(atom/target) - . = ..() +/datum/action/cooldown/mob_cooldown/tentacle_burst/Activate(atom/target) var/list/directions = GLOB.alldirs.Copy() for (var/dir in directions) var/turf/adjacent_target = get_step(target, dir) if(adjacent_target) new /obj/effect/goliath_tentacle(adjacent_target) owner.visible_message(span_warning("[owner] unleashes tentacles from the ground around it!")) + StartCooldown() return TRUE /// Summon a line of tentacles towards the target -/datum/action/cooldown/tentacle_grasp +/datum/action/cooldown/mob_cooldown/tentacle_grasp name = "Tentacle Grasp" desc = "Unleash burrowed tentacles in a line towards a targetted location, grappling targets after a delay." button_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' @@ -67,12 +70,13 @@ cooldown_time = 12 SECONDS melee_cooldown_time = 0 check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED + shared_cooldown = NONE -/datum/action/cooldown/tentacle_grasp/Activate(atom/target) - . = ..() +/datum/action/cooldown/mob_cooldown/tentacle_grasp/Activate(atom/target) new /obj/effect/temp_visual/effect_trail/burrowed_tentacle(owner.loc, target) if (isliving(target)) owner.visible_message(span_warning("[owner] reaches for [target] with its tentacles!")) + StartCooldown() return TRUE /// An invisible effect which chases a target, spawning tentacles every so often. diff --git a/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm b/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm index 4000e41fdc1..83369de8862 100644 --- a/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm +++ b/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm @@ -1,3 +1,6 @@ +/// We won't use tentacles unless we have had the same target for this long +#define MIN_TIME_TO_TENTACLE 3 SECONDS + /datum/ai_controller/basic_controller/goliath blackboard = list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/allow_items/goliath, @@ -20,15 +23,19 @@ stat_attack = HARD_CRIT /datum/ai_planning_subtree/basic_melee_attack_subtree/goliath + operational_datums = list(/datum/component/ai_target_timer) melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/goliath /// Go for the tentacles if they're available /datum/ai_behavior/basic_melee_attack/goliath /datum/ai_behavior/basic_melee_attack/goliath/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key, health_ratio_key) + var/time_on_target = controller.blackboard[BB_BASIC_MOB_HAS_TARGET_TIME] || 0 + if (time_on_target < MIN_TIME_TO_TENTACLE) + return ..() var/mob/living/target = controller.blackboard[target_key] // Interrupt attack chain to use tentacles, unless the target is already tentacled - if (isliving(target) && !target.has_status_effect(/datum/status_effect/incapacitating/stun/goliath_tentacled)) + if (ismecha(target) || (isliving(target) && !target.has_status_effect(/datum/status_effect/incapacitating/stun/goliath_tentacled))) var/datum/action/cooldown/using_action = controller.blackboard[BB_GOLIATH_TENTACLES] if (using_action?.IsAvailable()) finish_action(controller, succeeded = FALSE) @@ -37,11 +44,15 @@ /datum/ai_planning_subtree/targeted_mob_ability/goliath_tentacles ability_key = BB_GOLIATH_TENTACLES + operational_datums = list(/datum/component/ai_target_timer) /datum/ai_planning_subtree/targeted_mob_ability/goliath_tentacles/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) var/mob/living/target = controller.blackboard[target_key] - if (!isliving(target) || target.has_status_effect(/datum/status_effect/incapacitating/stun/goliath_tentacled)) + if (!(isliving(target) || ismecha(target)) || (isliving(target) && target.has_status_effect(/datum/status_effect/incapacitating/stun/goliath_tentacled))) return // Target can be an item or already grabbed, we don't want to tentacle those + var/time_on_target = controller.blackboard[BB_BASIC_MOB_HAS_TARGET_TIME] || 0 + if (time_on_target < MIN_TIME_TO_TENTACLE) + return // We need to spend some time acquiring our target first return ..() /// If we got nothing better to do, find a turf we can search for tasty roots and such @@ -115,3 +126,5 @@ /datum/ai_behavior/goliath_dig/finish_action(datum/ai_controller/controller, succeeded, target_key) . = ..() controller.clear_blackboard_key(target_key) + +#undef MIN_TIME_TO_TENTACLE diff --git a/code/modules/mob/living/basic/lavaland/goliath/tentacle.dm b/code/modules/mob/living/basic/lavaland/goliath/tentacle.dm index 9647d459f28..030ae6d64b8 100644 --- a/code/modules/mob/living/basic/lavaland/goliath/tentacle.dm +++ b/code/modules/mob/living/basic/lavaland/goliath/tentacle.dm @@ -49,6 +49,8 @@ if (victim.apply_status_effect(/datum/status_effect/incapacitating/stun/goliath_tentacled, grapple_time, src)) buckle_mob(victim, TRUE) SEND_SIGNAL(victim, COMSIG_GOLIATH_TENTACLED_GRABBED) + for (var/obj/vehicle/sealed/mecha/mech in loc) + mech.take_damage(rand(min_damage, max_damage), damage_type = BRUTE, damage_flag = MELEE, sound_effect = TRUE) if (!has_buckled_mobs()) retract() return diff --git a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm index b0dfa60e49c..6463fc94979 100644 --- a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm +++ b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm @@ -6,7 +6,6 @@ icon_state = "arctic_lobstrosity" icon_living = "arctic_lobstrosity" icon_dead = "arctic_lobstrosity_dead" - mob_biotypes = MOB_ORGANIC|MOB_BEAST friendly_verb_continuous = "chitters at" friendly_verb_simple = "chitters at" speak_emote = list("chitters") @@ -64,6 +63,7 @@ /// Charge a long way, knock down for longer, and perform an instant melee attack /datum/action/cooldown/mob_cooldown/charge/basic_charge/lobster + name = "Lobster Rush" charge_distance = 8 knockdown_duration = 2.5 SECONDS diff --git a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm index 7ec1bbab7c7..dcbeb1e670c 100644 --- a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm +++ b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm @@ -66,6 +66,8 @@ /datum/ai_behavior/run_away_from_target/lobster/perform(seconds_per_tick, datum/ai_controller/controller, target_key, hiding_location_key) var/atom/target = controller.blackboard[target_key] + if(isnull(target)) + return ..() for (var/trait in controller.blackboard[BB_LOBSTROSITY_EXPLOIT_TRAITS]) if (!HAS_TRAIT(target, trait)) continue diff --git a/code/modules/mob/living/basic/lavaland/mining.dm b/code/modules/mob/living/basic/lavaland/mining.dm index cc4ca16b15b..6b1d0de5739 100644 --- a/code/modules/mob/living/basic/lavaland/mining.dm +++ b/code/modules/mob/living/basic/lavaland/mining.dm @@ -1,7 +1,9 @@ ///prototype for mining mobs /mob/living/basic/mining + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' combat_mode = TRUE mob_size = MOB_SIZE_LARGE + mob_biotypes = MOB_ORGANIC|MOB_BEAST faction = list(FACTION_MINING) unsuitable_atmos_damage = 0 minimum_survivable_temperature = 0 diff --git a/code/modules/mob/living/basic/lavaland/watcher/watcher.dm b/code/modules/mob/living/basic/lavaland/watcher/watcher.dm new file mode 100644 index 00000000000..b94ba914298 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/watcher/watcher.dm @@ -0,0 +1,110 @@ +/// A floating eyeball which keeps its distance and plays red light/green light with you. +/mob/living/basic/mining/watcher + name = "watcher" + desc = "A levitating, monocular creature held aloft by wing-like veins. A sharp spine of crystal protrudes from its body." + icon = 'icons/mob/simple/lavaland/lavaland_monsters_wide.dmi' + icon_state = "watcher" + icon_living = "watcher" + icon_dead = "watcher_dead" + health_doll_icon = "watcher" + pixel_x = -12 + base_pixel_x = -12 + speak_emote = list("chimes") + speed = 3 + maxHealth = 160 + health = 160 + attack_verb_continuous = "buffets" + attack_verb_simple = "buffet" + crusher_loot = /obj/item/crusher_trophy/watcher_wing + ai_controller = /datum/ai_controller/basic_controller/watcher + butcher_results = list( + /obj/item/stack/sheet/bone = 1, + /obj/item/stack/ore/diamond = 2, + /obj/item/stack/sheet/sinew = 2, + ) + /// How often can we shoot? + var/ranged_cooldown = 3 SECONDS + /// What kind of beams we got? + var/projectile_type = /obj/projectile/temp/watcher + /// Icon state for our eye overlay + var/eye_glow = "ice_glow" + /// Sound to play when we shoot + var/shoot_sound = 'sound/weapons/pierce.ogg' + /// Typepath of our gaze ability + var/gaze_attack = /datum/action/cooldown/mob_cooldown/watcher_gaze + // We attract and eat these things for some reason + var/list/wanted_objects = list( + /obj/item/stack/sheet/mineral/diamond, + /obj/item/stack/ore/diamond, + /obj/item/pen/survival, + ) + +/mob/living/basic/mining/watcher/Initialize(mapload) + . = ..() + AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/simple_flying) + AddElement(/datum/element/content_barfer) + AddComponent(/datum/component/ai_target_timer) + AddComponent(/datum/component/basic_ranged_ready_overlay, overlay_state = eye_glow) + AddComponent(\ + /datum/component/ranged_attacks,\ + cooldown_time = ranged_cooldown,\ + projectile_type = projectile_type,\ + projectile_sound = shoot_sound,\ + ) + AddComponent(\ + /datum/component/magnet,\ + attracted_typecache = wanted_objects,\ + on_contact = CALLBACK(src, PROC_REF(consume)),\ + ) + update_appearance(UPDATE_OVERLAYS) + + var/datum/action/cooldown/mob_cooldown/watcher_overwatch/overwatch = new(src) + overwatch.Grant(src) + overwatch.projectile_type = projectile_type + ai_controller.set_blackboard_key(BB_WATCHER_OVERWATCH, overwatch) + + var/datum/action/cooldown/mob_cooldown/watcher_gaze/gaze = new gaze_attack(src) + gaze.Grant(src) + ai_controller.set_blackboard_key(BB_WATCHER_GAZE, gaze) + +/mob/living/basic/mining/watcher/update_overlays() + . = ..() + if (stat == DEAD) + return + . += emissive_appearance(icon, "watcher_emissive", src) + +/// I love eating diamonds yum +/mob/living/basic/mining/watcher/proc/consume(atom/movable/thing) + visible_message(span_warning("[thing] seems to vanish into [src]'s body!")) + thing.forceMove(src) + +/// More durable, burning projectiles +/mob/living/basic/mining/watcher/magmawing + name = "magmawing watcher" + desc = "Presented with extreme temperatures, adaptive watchers absorb heat through their circulatory wings and repurpose it as a weapon." + icon_state = "watcher_magmawing" + icon_living = "watcher_magmawing" + icon_dead = "watcher_magmawing_dead" + eye_glow = "fire_glow" + maxHealth = 175 //Compensate for the lack of slowdown on projectiles with a bit of extra health + health = 175 + projectile_type = /obj/projectile/temp/watcher/magma_wing + gaze_attack = /datum/action/cooldown/mob_cooldown/watcher_gaze/fire + crusher_loot = /obj/item/crusher_trophy/blaster_tubes/magma_wing + crusher_drop_chance = 100 // There's only going to be one of these per round throw them a bone + +/// Less durable, freezing projectiles +/mob/living/basic/mining/watcher/icewing + name = "icewing watcher" + desc = "Watchers which fail to absorb enough heat during their development become fragile, but share their internal chill with their enemies." + icon_state = "watcher_icewing" + icon_living = "watcher_icewing" + icon_dead = "watcher_icewing_dead" + maxHealth = 130 + health = 130 + projectile_type = /obj/projectile/temp/watcher/ice_wing + gaze_attack = /datum/action/cooldown/mob_cooldown/watcher_gaze/ice + butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/bone = 1) + crusher_loot = /obj/item/crusher_trophy/watcher_wing/ice_wing + crusher_drop_chance = 100 diff --git a/code/modules/mob/living/basic/lavaland/watcher/watcher_ai.dm b/code/modules/mob/living/basic/lavaland/watcher/watcher_ai.dm new file mode 100644 index 00000000000..b08245963f4 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/watcher/watcher_ai.dm @@ -0,0 +1,56 @@ +/datum/ai_controller/basic_controller/watcher + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/use_mob_ability/gaze, + /datum/ai_planning_subtree/targeted_mob_ability/overwatch, + /datum/ai_planning_subtree/ranged_skirmish/watcher, + /datum/ai_planning_subtree/maintain_distance, + ) + +/datum/ai_planning_subtree/targeted_mob_ability/overwatch + ability_key = BB_WATCHER_OVERWATCH + operational_datums = list(/datum/component/ai_target_timer) + +/datum/ai_planning_subtree/targeted_mob_ability/overwatch/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + if (living_pawn.do_after_count()) + return // Don't interrupt our other ability + var/atom/target = controller.blackboard[target_key] + if (QDELETED(target) || HAS_TRAIT(target, TRAIT_OVERWATCH_IMMUNE)) + return // We should probably let miners move sometimes + var/time_on_target = controller.blackboard[BB_BASIC_MOB_HAS_TARGET_TIME] || 0 + if (time_on_target < 5 SECONDS) + return // We need to spend some time acquiring our target first + return ..() + +/datum/ai_planning_subtree/use_mob_ability/gaze + ability_key = BB_WATCHER_GAZE + finish_planning = TRUE + +/datum/ai_planning_subtree/use_mob_ability/gaze/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/watcher = controller.pawn + if (watcher.health > watcher.maxHealth * 0.66) // When we're a little hurt + return + var/mob/living/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + if (!isliving(target)) + return // Don't do this if there's nothing hostile around or if our target is a mech + return ..() + +/datum/ai_planning_subtree/ranged_skirmish/watcher + attack_behavior = /datum/ai_behavior/ranged_skirmish/watcher + +/datum/ai_planning_subtree/ranged_skirmish/watcher/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + if (QDELETED(target) || HAS_TRAIT(target, TRAIT_OVERWATCHED)) + return // Don't bully people who are playing red light green light + return ..() + +/datum/ai_behavior/ranged_skirmish/watcher + min_range = 0 diff --git a/code/modules/mob/living/basic/lavaland/watcher/watcher_gaze.dm b/code/modules/mob/living/basic/lavaland/watcher/watcher_gaze.dm new file mode 100644 index 00000000000..e4eb9562f53 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/watcher/watcher_gaze.dm @@ -0,0 +1,126 @@ +/** + * Do something nasty to everyone nearby if they're looking at us. + */ +/datum/action/cooldown/mob_cooldown/watcher_gaze + name = "Disorienting Gaze" + desc = "After a delay, flash everyone looking at you." + button_icon = 'icons/mob/actions/actions_animal.dmi' + button_icon_state = "gaze" + background_icon_state = "bg_demon" + overlay_icon_state = "bg_demon_border" + cooldown_time = 30 SECONDS + check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED + click_to_activate = FALSE + shared_cooldown = NONE + /// At what range do we check for vision? + var/effect_radius = 7 + /// How long does it take to play our various animation stages + var/animation_time = 0.8 SECONDS + /// How long after pressing the button do we give people to turn around? + var/wait_delay = 1.6 SECONDS + /// What are we currently displaying? + var/image/current_overlay + /// Timer until we go to the next stage + var/stage_timer + +/datum/action/cooldown/mob_cooldown/watcher_gaze/Activate(mob/living/target) + show_indicator_overlay("eye_open") + stage_timer = addtimer(CALLBACK(src, PROC_REF(show_indicator_overlay), "eye_pulse"), animation_time, TIMER_STOPPABLE) + StartCooldown(360 SECONDS, 360 SECONDS) + owner.visible_message(span_warning("[owner]'s eye glows ominously!")) + if (do_after(owner, delay = wait_delay, target = owner)) + trigger_effect() + else + deltimer(stage_timer) + clear_current_overlay() + StartCooldown() + return TRUE + +/datum/action/cooldown/mob_cooldown/watcher_gaze/Destroy() + deltimer(stage_timer) + clear_current_overlay() + return ..() + +/datum/action/cooldown/mob_cooldown/watcher_gaze/Remove(mob/removed_from) + deltimer(stage_timer) + clear_current_overlay() + return ..() + +/// Do some effects to whoever is looking at us +/datum/action/cooldown/mob_cooldown/watcher_gaze/proc/trigger_effect() + deltimer(stage_timer) + show_indicator_overlay("eye_flash") + for (var/mob/living/viewer in viewers(effect_radius, owner)) + var/view_dir = get_dir(viewer, owner) + if (!(viewer.dir & view_dir) || viewer.stat != CONSCIOUS) + continue + if (!apply_effect(viewer)) + continue + var/image/flashed_overlay = image( + icon = 'icons/effects/eldritch.dmi', + loc = viewer, + icon_state = "eye_flash", + pixel_x = -viewer.pixel_x, + pixel_y = -viewer.pixel_y, + ) + flick_overlay_global(flashed_overlay, show_to = GLOB.clients, duration = animation_time) + stage_timer = addtimer(CALLBACK(src, PROC_REF(hide_eye)), animation_time, TIMER_STOPPABLE) + var/mob/living/living_owner = owner + living_owner.Stun(1.5 SECONDS, ignore_canstun = TRUE) + +/// Do something bad to someone who was looking at us +/datum/action/cooldown/mob_cooldown/watcher_gaze/proc/apply_effect(mob/living/viewer) + if (!viewer.flash_act(intensity = 4, affect_silicon = TRUE, visual = TRUE, length = 3 SECONDS)) + return FALSE + viewer.set_confusion_if_lower(12 SECONDS) + to_chat(viewer, span_warning("You are blinded by [owner]'s piercing gaze!")) + return TRUE + +/// Animate our effect out +/datum/action/cooldown/mob_cooldown/watcher_gaze/proc/hide_eye() + show_indicator_overlay("eye_close") + stage_timer = addtimer(CALLBACK(src, PROC_REF(clear_current_overlay)), animation_time, TIMER_STOPPABLE) + +/// Display an animated overlay over our head to indicate what's going on +/datum/action/cooldown/mob_cooldown/watcher_gaze/proc/show_indicator_overlay(overlay_state) + clear_current_overlay() + current_overlay = image(icon = 'icons/effects/eldritch.dmi', loc = owner, icon_state = overlay_state, pixel_x = -owner.pixel_x, pixel_y = 28, layer = ABOVE_ALL_MOB_LAYER) + SET_PLANE_EXPLICIT(current_overlay, ABOVE_LIGHTING_PLANE, owner) + for(var/client/add_to in GLOB.clients) + add_to.images += current_overlay + +/// Hide whatever overlay we are showing +/datum/action/cooldown/mob_cooldown/watcher_gaze/proc/clear_current_overlay() + if (!isnull(current_overlay)) + remove_image_from_clients(current_overlay, GLOB.clients) + current_overlay = null + +/// Magmawing glare burns you +/datum/action/cooldown/mob_cooldown/watcher_gaze/fire + name = "Searing Glare" + desc = "After a delay, burn and stun everyone looking at you." + +/datum/action/cooldown/mob_cooldown/watcher_gaze/fire/apply_effect(mob/living/viewer) + to_chat(viewer, span_warning("[owner]'s searing glare forces you to the ground!")) + viewer.Paralyze(3 SECONDS) + viewer.adjust_fire_stacks(10) + viewer.ignite_mob() + return TRUE + +/// Icewing glare freezes you +/datum/action/cooldown/mob_cooldown/watcher_gaze/ice + name = "Cold Stare" + desc = "After a delay, freeze and repulse everyone looking at you." + /// Max distance to throw people looking at us + var/max_throw = 3 + +/datum/action/cooldown/mob_cooldown/watcher_gaze/ice/apply_effect(mob/living/viewer) + to_chat(viewer, span_warning("You are repulsed by the force of [owner]'s cold stare!")) + viewer.apply_status_effect(/datum/status_effect/freon/watcher/extended) + viewer.safe_throw_at( + target = get_edge_target_turf(owner, get_dir(owner, get_step_away(viewer, owner))), + range = max_throw, + speed = 1, + thrower = owner, + force = MOVE_FORCE_EXTREMELY_STRONG, + ) diff --git a/code/modules/mob/living/basic/lavaland/watcher/watcher_overwatch.dm b/code/modules/mob/living/basic/lavaland/watcher/watcher_overwatch.dm new file mode 100644 index 00000000000..36ad2d61b4c --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/watcher/watcher_overwatch.dm @@ -0,0 +1,163 @@ +/** + * Automatically shoot at a target if they do anything while this is active on them. + */ +/datum/action/cooldown/mob_cooldown/watcher_overwatch + name = "Overwatch" + desc = "Keep a close eye on the target's actions, automatically firing upon them if they act." + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "eye" + background_icon_state = "bg_demon" + overlay_icon_state = "bg_demon_border" + cooldown_time = 20 SECONDS + check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED + click_to_activate = TRUE + shared_cooldown = NONE + /// Furthest range we can activate ability at + var/max_range = 7 + /// Type of projectile to fire + var/projectile_type = /obj/projectile/temp/watcher + /// Sound the projectile we fire makes + var/projectile_sound = 'sound/weapons/pierce.ogg' + /// Time to watch for + var/overwatch_duration = 3 SECONDS + +/datum/action/cooldown/mob_cooldown/watcher_overwatch/New(Target, original) + . = ..() + melee_cooldown_time = overwatch_duration + +/datum/action/cooldown/mob_cooldown/watcher_overwatch/PreActivate(atom/target) + if (target == owner) + return + if (ismecha(target)) + var/obj/vehicle/sealed/mecha/mech = target + var/list/drivers = mech.return_drivers() + if (!length(drivers)) + return + target = drivers[1] + if (!isliving(target)) + return + if (get_dist(owner, target) > max_range) + return + return ..() + +/datum/action/cooldown/mob_cooldown/watcher_overwatch/Activate(mob/living/target) + var/mob/living/living_owner = owner + living_owner.face_atom(target) + living_owner.Stun(overwatch_duration, ignore_canstun = TRUE) + target.apply_status_effect(/datum/status_effect/overwatch, overwatch_duration, owner, projectile_type, projectile_sound) + owner.visible_message(span_warning("[owner]'s eye locks on to [target]!")) + StartCooldown() + return TRUE + +/// Status effect which tracks whether our overwatched mob moves or acts +/datum/status_effect/overwatch + id = "watcher_overwatch" + duration = 5 SECONDS + status_type = STATUS_EFFECT_MULTIPLE + alert_type = /atom/movable/screen/alert/status_effect/overwatch + /// Distance at which we break off the ability + var/watch_range = 9 + /// Visual effect to make the status obvious + var/datum/beam/link + /// Which watcher is watching? + var/mob/living/watcher + /// Type of projectile to fire + var/projectile_type + /// Noise to make when we shoot beam + var/projectile_sound + /// Did the overwatch ever trigger during our run? + var/overwatch_triggered = FALSE + /// Signals which trigger a hostile response + var/static/list/forbidden_actions = list( + COMSIG_MOB_ABILITY_FINISHED, + COMSIG_MOB_ATTACK_HAND, + COMSIG_MOB_DROVE_MECH, + COMSIG_MOB_FIRED_GUN, + COMSIG_MOB_ITEM_ATTACK, + COMSIG_MOB_THROW, + COMSIG_MOB_USED_MECH_EQUIPMENT, + COMSIG_MOB_USED_MECH_MELEE, + COMSIG_MOVABLE_MOVED, + ) + +/datum/status_effect/overwatch/on_creation(mob/living/new_owner, set_duration, mob/living/watcher, projectile_type, projectile_sound) + if (isnull(watcher) || isnull(projectile_type)) + return FALSE + if (HAS_TRAIT(new_owner, TRAIT_OVERWATCH_IMMUNE)) + return FALSE + src.watcher = watcher + src.projectile_type = projectile_type + src.projectile_sound = projectile_sound + if (!isnull(set_duration)) + duration = set_duration + return ..() + +/datum/status_effect/overwatch/on_apply() + . = ..() + if (!.) + return FALSE + owner.add_traits(list(TRAIT_OVERWATCHED, TRAIT_OVERWATCH_IMMUNE), TRAIT_STATUS_EFFECT(id)) + owner.do_alert_animation() + owner.Immobilize(0.25 SECONDS) // Just long enough that they don't trigger it by mistake + owner.playsound_local(owner, 'sound/machines/chime.ogg', 50, TRUE) + var/atom/beam_origin = ismecha(owner.loc) ? owner.loc : owner + link = beam_origin.Beam(watcher, icon_state = "r_beam", override_target_pixel_x = 0) + RegisterSignals(owner, forbidden_actions, PROC_REF(opportunity_attack)) + RegisterSignals(owner, list(COMSIG_QDELETING, COMSIG_LIVING_DEATH), PROC_REF(on_participant_died)) + RegisterSignals(watcher, list(COMSIG_QDELETING, COMSIG_LIVING_DEATH), PROC_REF(on_participant_died)) + +/datum/status_effect/overwatch/on_remove() + UnregisterSignal(owner, forbidden_actions + list(COMSIG_QDELETING, COMSIG_LIVING_DEATH)) + QDEL_NULL(link) + owner.remove_traits(list(TRAIT_OVERWATCHED, TRAIT_OVERWATCH_IMMUNE), TRAIT_STATUS_EFFECT(id)) + if (!QDELETED(owner)) + owner.apply_status_effect(/datum/status_effect/overwatch_immune) + return ..() + +/datum/status_effect/overwatch/Destroy() + QDEL_NULL(link) + if (!isnull(watcher)) // Side effects in Destroy? Well it turns out `on_remove` is also just called on Destroy. But only if the owner isn't deleting. + INVOKE_ASYNC(src, PROC_REF(unregister_watcher), watcher) + watcher = null + + return ..() + +/// Clean up our association with the caster of this ability. +/datum/status_effect/overwatch/proc/unregister_watcher(mob/living/former_overwatcher) + if (!overwatch_triggered) + former_overwatcher.Stun(2 SECONDS, ignore_canstun = TRUE) + UnregisterSignal(former_overwatcher, list(COMSIG_QDELETING, COMSIG_LIVING_DEATH)) + +/// Uh oh, you did something within my threat radius, now we're going to shoot you +/datum/status_effect/overwatch/proc/opportunity_attack() + SIGNAL_HANDLER + if (!can_see(watcher, owner, length = watch_range)) + qdel(src) + return + overwatch_triggered = TRUE + watcher.do_alert_animation() + INVOKE_ASYNC(watcher, TYPE_PROC_REF(/atom/, fire_projectile), projectile_type, owner, projectile_sound) + +/// Can't overwatch you if I don't exist +/datum/status_effect/overwatch/proc/on_participant_died() + SIGNAL_HANDLER + qdel(src) + +/atom/movable/screen/alert/status_effect/overwatch + name = "Overwatched" + desc = "Freeze! You are being watched!" + icon_state = "aimed" + +/// Blocks further applications of the ability for a little while +/datum/status_effect/overwatch_immune + id = "watcher_overwatch_immunity" + duration = 10 SECONDS // To stop watcher tendrils spamming the shit out of you + alert_type = null + +/datum/status_effect/overwatch_immune/on_apply() + . = ..() + ADD_TRAIT(owner, TRAIT_OVERWATCH_IMMUNE, TRAIT_STATUS_EFFECT(id)) + +/datum/status_effect/overwatch_immune/on_remove() + REMOVE_TRAIT(owner, TRAIT_OVERWATCH_IMMUNE, TRAIT_STATUS_EFFECT(id)) + return ..() diff --git a/code/modules/mob/living/basic/lavaland/watcher/watcher_projectiles.dm b/code/modules/mob/living/basic/lavaland/watcher/watcher_projectiles.dm new file mode 100644 index 00000000000..2680e9aa914 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/watcher/watcher_projectiles.dm @@ -0,0 +1,37 @@ +/// Chilling projectile, hurts and slows you down +/obj/projectile/temp/watcher + name = "chilling blast" + icon_state = "ice_2" + damage = 10 + damage_type = BURN + armor_flag = ENERGY + temperature = -50 + +/obj/projectile/temp/watcher/on_hit(mob/living/target, blocked = 0) + . = ..() + if (!isliving(target)) + return + apply_status(target) + +/// Apply an additional on-hit effect +/obj/projectile/temp/watcher/proc/apply_status(mob/living/target) + target.apply_status_effect(/datum/status_effect/freezing_blast) + +/// Lava projectile, ignites you +/obj/projectile/temp/watcher/magma_wing + name = "scorching blast" + icon_state = "lava" + damage = 5 + temperature = 200 + +/obj/projectile/temp/watcher/magma_wing/apply_status(mob/living/target) + target.adjust_fire_stacks(0.1) + target.ignite_mob() + +/// Freezing projectile, freezes you +/obj/projectile/temp/watcher/ice_wing + name = "freezing blast" + damage = 5 + +/obj/projectile/temp/watcher/ice_wing/apply_status(mob/living/target) + target.apply_status_effect(/datum/status_effect/freon/watcher) diff --git a/code/modules/mob/living/basic/pets/dog/corgi.dm b/code/modules/mob/living/basic/pets/dog/corgi.dm index fe08d9648a6..d072a1c897e 100644 --- a/code/modules/mob/living/basic/pets/dog/corgi.dm +++ b/code/modules/mob/living/basic/pets/dog/corgi.dm @@ -42,16 +42,16 @@ UnregisterSignal(src, list(COMSIG_BASICMOB_LOOK_ALIVE, COMSIG_BASICMOB_LOOK_DEAD)) return ..() -/mob/living/basic/pet/dog/corgi/handle_atom_del(atom/deleting_atom) - if(deleting_atom == inventory_head) +/mob/living/basic/pet/dog/corgi/Exited(atom/movable/gone, direction) + . = ..() + if(gone == inventory_head) inventory_head = null update_corgi_fluff() update_appearance(UPDATE_OVERLAYS) - if(deleting_atom == inventory_back) + if(gone == inventory_back) inventory_back = null update_corgi_fluff() update_appearance(UPDATE_OVERLAYS) - return ..() /mob/living/basic/pet/dog/corgi/gib() if(inventory_head) @@ -372,7 +372,7 @@ /mob/living/basic/pet/dog/corgi/ian/Destroy() LAZYREMOVE(SSticker.round_end_events, i_will_survive) //cleanup the survival callback - QDEL_NULL(i_will_survive) + i_will_survive = null return ..() /mob/living/basic/pet/dog/corgi/ian/death() diff --git a/code/modules/mob/living/basic/pets/pet.dm b/code/modules/mob/living/basic/pets/pet.dm index 6e8c87059e5..c8507454f77 100644 --- a/code/modules/mob/living/basic/pets/pet.dm +++ b/code/modules/mob/living/basic/pets/pet.dm @@ -69,10 +69,9 @@ . = ..() add_memory_in_range(src, 7, /datum/memory/pet_died, deuteragonist = src) //Protagonist is the person memorizing it -/mob/living/basic/pet/handle_atom_del(atom/deleting_atom) +/mob/living/basic/pet/Exited(atom/movable/gone, direction) . = ..() - - if(deleting_atom != collar) + if(gone != collar) return collar = null diff --git a/code/modules/mob/living/basic/ruin_defender/stickman.dm b/code/modules/mob/living/basic/ruin_defender/stickman.dm index 40be390ab1c..8d0a5ab0cde 100644 --- a/code/modules/mob/living/basic/ruin_defender/stickman.dm +++ b/code/modules/mob/living/basic/ruin_defender/stickman.dm @@ -78,7 +78,7 @@ . = ..() var/static/list/stickman_drops = list(/obj/item/gun/ballistic/automatic/pistol/stickman) AddElement(/datum/element/death_drops, stickman_drops) - AddElement(/datum/element/ranged_attacks, /obj/item/ammo_casing/c9mm, 'sound/misc/bang.ogg') + AddComponent(/datum/component/ranged_attacks, casing_type = /obj/item/ammo_casing/c9mm, projectile_sound = 'sound/misc/bang.ogg', cooldown_time = 5 SECONDS) /datum/ai_controller/basic_controller/stickman/ranged planning_subtrees = list( diff --git a/code/modules/mob/living/basic/space_fauna/demon/demon.dm b/code/modules/mob/living/basic/space_fauna/demon/demon.dm index 48868b76e46..c2d8c751cde 100644 --- a/code/modules/mob/living/basic/space_fauna/demon/demon.dm +++ b/code/modules/mob/living/basic/space_fauna/demon/demon.dm @@ -19,7 +19,7 @@ icon_state = "demon" icon_living = "demon" - mob_biotypes = MOB_UNDEAD|MOB_HUMANOID // undead is important because it means we can't be healed with sutures and the like. keep this in mind if you ever decide to change this + mob_biotypes = MOB_BEAST|MOB_HUMANOID status_flags = CANPUSH combat_mode = TRUE diff --git a/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm b/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm new file mode 100644 index 00000000000..47e43704079 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm @@ -0,0 +1,123 @@ +/mob/living/basic/eyeball + name = "eyeball" + desc = "An odd looking creature, it won't stop staring..." + icon = 'icons/mob/simple/carp.dmi' + icon_state = "eyeball" + icon_living = "eyeball" + icon_gib = "" + gender = NEUTER + gold_core_spawnable = HOSTILE_SPAWN + basic_mob_flags = DEL_ON_DEATH + gender = NEUTER + mob_biotypes = MOB_ORGANIC + + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + + maxHealth = 30 + health = 30 + obj_damage = 10 + melee_damage_lower = 8 + melee_damage_upper = 12 + + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + attack_sound = 'sound/weapons/bite.ogg' + attack_vis_effect = ATTACK_EFFECT_BITE + + faction = list(FACTION_SPOOKY) + speak_emote = list("telepathically cries") + + habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + minimum_survivable_temperature = T0C + maximum_survivable_temperature = T0C + 1500 + sight = SEE_SELF|SEE_MOBS|SEE_OBJS|SEE_TURFS + + lighting_cutoff_red = 40 + lighting_cutoff_green = 20 + lighting_cutoff_blue = 30 + + ai_controller = /datum/ai_controller/basic_controller/eyeball + ///how much we will heal eyes + var/healing_factor = 3 + /// is this eyeball crying? + var/crying = FALSE + /// the crying overlay we add when is hit + var/mutable_appearance/on_hit_overlay + + ///cooldown to heal eyes + COOLDOWN_DECLARE(eye_healing) + +/mob/living/basic/eyeball/Initialize(mapload) + . = ..() + var/datum/action/cooldown/spell/pointed/death_glare/glare = new(src) + glare.Grant(src) + ai_controller.set_blackboard_key(BB_GLARE_ABILITY, glare) + AddElement(/datum/element/simple_flying) + AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/grown/carrot), tame_chance = 100, after_tame = CALLBACK(src, PROC_REF(on_tame))) + ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) + on_hit_overlay = mutable_appearance(icon, "[icon_state]_crying") + +/mob/living/basic/eyeball/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) + . = ..() + if(!.) + return + + if(!proximity_flag) + return + + if(istype(attack_target, /obj/item/food/grown/carrot)) + adjustBruteLoss(-5) + to_chat(src, span_warning("You eat [attack_target]! It restores some health!")) + qdel(attack_target) + return TRUE + +/mob/living/basic/eyeball/attackby(obj/item/weapon, mob/living/carbon/human/user, list/modifiers) + . = ..() + if(!weapon.force && !user.combat_mode) + return + if(crying) + return + change_crying_state() + addtimer(CALLBACK(src, PROC_REF(change_crying_state)), 10 SECONDS) //cry for 10 seconds then remove + +/mob/living/basic/eyeball/proc/change_crying_state() + crying = !crying + if(crying) + add_overlay(on_hit_overlay) + return + cut_overlay(on_hit_overlay) + + +/mob/living/basic/eyeball/proc/pre_attack(mob/living/eyeball, atom/target) + SIGNAL_HANDLER + + if(!ishuman(target)) + return + + var/mob/living/carbon/human_target = target + var/obj/item/organ/internal/eyes/eyes = human_target.get_organ_slot(ORGAN_SLOT_EYES) + if(!eyes) + return + if(eyes.damage < 10) + return + heal_eye_damage(human_target, eyes) + return COMPONENT_HOSTILE_NO_ATTACK + + +/mob/living/basic/eyeball/proc/heal_eye_damage(mob/living/target, obj/item/organ/internal/eyes/eyes) + if(!COOLDOWN_FINISHED(src, eye_healing)) + return + to_chat(target, span_warning("[src] seems to be healing your [eyes.zone]!")) + eyes.apply_organ_damage(-1 * healing_factor) + new /obj/effect/temp_visual/heal(get_turf(target), COLOR_HEALING_CYAN) + befriend(target) + COOLDOWN_START(src, eye_healing, 15 SECONDS) + +/mob/living/basic/eyeball/proc/on_tame(mob/tamer) + spin(spintime = 2 SECONDS, speed = 1) + //become passive to the humens + faction |= tamer.faction diff --git a/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ability.dm b/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ability.dm new file mode 100644 index 00000000000..734c385cf72 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ability.dm @@ -0,0 +1,40 @@ +/datum/action/cooldown/spell/pointed/death_glare + name = "death glare" + desc = "give a death stare to the victim" + var/glare_outline = COLOR_DARK_RED + spell_requirements = NONE + cooldown_time = 10 SECONDS + +/datum/action/cooldown/spell/pointed/death_glare/is_valid_target(atom/cast_on) + if(!isliving(cast_on)) + to_chat(owner, span_warning("Only living things are affected by our glare!")) + return FALSE + var/mob/living/living_target = cast_on + if(living_target.has_movespeed_modifier(/datum/movespeed_modifier/glare_slowdown)) + to_chat(owner, span_warning("This target is already affected by a glare!")) + return FALSE + if(!can_see(living_target, owner, 9)) + to_chat(owner, span_warning("This target cannot see our glare!")) + return FALSE + var/direction_to_compare = get_dir(living_target, owner) + var/target_direction = living_target.dir + if(direction_to_compare != target_direction) + to_chat(owner, span_warning("This target is facing away from us!")) + return FALSE + + return TRUE + +/datum/action/cooldown/spell/pointed/death_glare/cast(mob/living/cast_on) + . = ..() + cast_on.add_filter("glare", 2, list("type" = "outline", "color" = glare_outline, "size" = 1)) + cast_on.add_movespeed_modifier(/datum/movespeed_modifier/glare_slowdown) + to_chat(cast_on, span_warning("You feel something watching you...")) + addtimer(CALLBACK(src, PROC_REF(remove_effect), cast_on), 5 SECONDS) + return TRUE + +/datum/action/cooldown/spell/pointed/death_glare/proc/remove_effect(mob/living/cast_on) + cast_on.remove_movespeed_modifier(/datum/movespeed_modifier/glare_slowdown) + cast_on.remove_filter("glare") + +/datum/movespeed_modifier/glare_slowdown + multiplicative_slowdown = 3 diff --git a/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_behavior.dm b/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_behavior.dm new file mode 100644 index 00000000000..57ea39c94dd --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_behavior.dm @@ -0,0 +1,94 @@ +/datum/ai_behavior/find_the_blind + +/datum/ai_behavior/find_the_blind/perform(seconds_per_tick, datum/ai_controller/controller, blind_key, threshold_key) + . = ..() + + var/mob/living_pawn = controller.pawn + var/list/blind_list = list() + var/eye_damage_threshold = controller.blackboard[threshold_key] + if(!eye_damage_threshold) + finish_action(controller, FALSE) + return + for(var/mob/living/carbon/blind in oview(9, living_pawn)) + var/obj/item/organ/internal/eyes/eyes = blind.get_organ_slot(ORGAN_SLOT_EYES) + if(isnull(eyes)) + continue + if(eyes.damage < eye_damage_threshold) + continue + blind_list += blind + + if(!length(blind_list)) + finish_action(controller, FALSE) + return + + controller.set_blackboard_key(blind_key, pick(blind_list)) + finish_action(controller, TRUE) + +/datum/ai_behavior/heal_eye_damage + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH + +/datum/ai_behavior/heal_eye_damage/setup(datum/ai_controller/controller, target_key) + . = ..() + var/mob/living/carbon/target = controller.blackboard[target_key] + if(QDELETED(target)) + return FALSE + set_movement_target(controller, target) + +/datum/ai_behavior/heal_eye_damage/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + + var/mob/living/carbon/target = controller.blackboard[target_key] + var/mob/living/living_pawn = controller.pawn + + if(QDELETED(target)) + finish_action(controller, FALSE, target_key) + return + var/obj/item/organ/internal/eyes/eyes = target.get_organ_slot(ORGAN_SLOT_EYES) + var/datum/callback/callback = CALLBACK(living_pawn, TYPE_PROC_REF(/mob/living/basic/eyeball, heal_eye_damage), target, eyes) + callback.Invoke() + + finish_action(controller, TRUE, target_key) + +/datum/ai_behavior/heal_eye_damage/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + controller.clear_blackboard_key(target_key) + +/datum/ai_behavior/targeted_mob_ability/glare_at_target + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT + required_distance = 0 + +/datum/ai_behavior/targeted_mob_ability/glare_at_target/setup(datum/ai_controller/controller, ability_key, target_key) + . = ..() + var/atom/target = controller.blackboard[target_key] + if (isnull(target)) + return FALSE + + var/turf/turf_to_move_towards = get_step(target, target.dir) + if(turf_to_move_towards.is_blocked_turf(ignore_atoms = list(controller.pawn))) + return FALSE + + if(isnull(turf_to_move_towards)) + return FALSE + + set_movement_target(controller, turf_to_move_towards) + +/datum/ai_behavior/targeted_mob_ability/glare_at_target/perform(seconds_per_tick, datum/ai_controller/controller, ability_key, target_key) + var/datum/action/cooldown/ability = controller.blackboard[ability_key] + var/mob/living/target = controller.blackboard[target_key] + + if(QDELETED(ability) || QDELETED(target)) + finish_action(controller, FALSE, ability_key, target_key) + return + + var/direction_to_compare = get_dir(target, controller.pawn) + var/target_direction = target.dir + if(direction_to_compare != target_direction) + finish_action(controller, FALSE, ability_key, target_key) + return + + var/result = ability.InterceptClickOn(controller.pawn, null, target) + finish_action(controller, result, ability_key, target_key) + +/datum/ai_behavior/hunt_target/unarmed_attack_target/carrot + hunt_cooldown = 2 SECONDS + always_reset_target = TRUE diff --git a/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_subtree.dm b/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_subtree.dm new file mode 100644 index 00000000000..d20873f0ce9 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_subtree.dm @@ -0,0 +1,56 @@ +/datum/ai_controller/basic_controller/eyeball + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/eyeball, + BB_EYE_DAMAGE_THRESHOLD = 10, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/targeted_mob_ability/glare, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/heal_the_blind, + /datum/ai_planning_subtree/find_and_hunt_target/carrot, + ) + +/datum/ai_planning_subtree/heal_the_blind + +/datum/ai_planning_subtree/heal_the_blind/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/carbon/target = controller.blackboard[BB_BLIND_TARGET] + + if(QDELETED(target)) + controller.queue_behavior(/datum/ai_behavior/find_the_blind, BB_BLIND_TARGET, BB_EYE_DAMAGE_THRESHOLD) + return + + controller.queue_behavior(/datum/ai_behavior/heal_eye_damage, BB_BLIND_TARGET) + return SUBTREE_RETURN_FINISH_PLANNING + +/datum/targetting_datum/basic/eyeball/can_attack(mob/living/owner, atom/target) + . = ..() + if(!.) + return FALSE + if(!ishuman(target)) + return TRUE + var/mob/living/carbon/human_target = target + if(human_target.is_blind()) + return FALSE + var/eye_damage_threshold = owner.ai_controller.blackboard[BB_EYE_DAMAGE_THRESHOLD] + if(!eye_damage_threshold) + return TRUE + var/obj/item/organ/internal/eyes/eyes = human_target.get_organ_slot(ORGAN_SLOT_EYES) + if(eyes.damage > eye_damage_threshold) //we dont attack people with bad vision + return FALSE + + return can_see(target, owner, 9) //if the target cant see us dont attack him + +/datum/ai_planning_subtree/targeted_mob_ability/glare + ability_key = BB_GLARE_ABILITY + use_ability_behaviour = /datum/ai_behavior/targeted_mob_ability/glare_at_target + finish_planning = TRUE + +/datum/ai_planning_subtree/find_and_hunt_target/carrot + target_key = BB_LOW_PRIORITY_HUNTING_TARGET + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/carrot + hunt_targets = list(/obj/item/food/grown/carrot) + hunt_range = 6 diff --git a/code/modules/mob/living/basic/space_fauna/garden_gnome.dm b/code/modules/mob/living/basic/space_fauna/garden_gnome.dm index 8e7ac0283ac..9b57eba8fe2 100644 --- a/code/modules/mob/living/basic/space_fauna/garden_gnome.dm +++ b/code/modules/mob/living/basic/space_fauna/garden_gnome.dm @@ -103,8 +103,7 @@ var/datum/callback/retaliate_callback = CALLBACK(src, PROC_REF(ai_retaliate_behaviour)) chosen_hat_colour = pick_weight(gnome_hat_colours) apply_colour() - var/static/list/death_loot = list(/obj/effect/gibspawner/generic) - AddElement(/datum/element/death_drops, death_loot) + AddElement(/datum/element/death_drops, string_list(list(/obj/effect/gibspawner/generic))) AddElement(/datum/element/footstep, FOOTSTEP_MOB_SHOE) AddComponent(/datum/component/ai_retaliate_advanced, retaliate_callback) AddComponent(/datum/component/swarming) diff --git a/code/modules/mob/living/basic/space_fauna/headslug.dm b/code/modules/mob/living/basic/space_fauna/headslug.dm index 2e66b34642a..b0fba4fadc1 100644 --- a/code/modules/mob/living/basic/space_fauna/headslug.dm +++ b/code/modules/mob/living/basic/space_fauna/headslug.dm @@ -43,6 +43,8 @@ . += span_notice("It appears to be moving around listlessly.") else . += span_warning("It's moving around intelligently!") + if (egg_lain) + . += span_notice("Its reproductive equipment appears to have withered.") /// Signal Handler proc that runs on every attack and checks to see if this is a valid target for implantation. If so, it implants the egg and starts the countdown to death. /mob/living/basic/headslug/proc/check_and_implant(mob/living/basic/attacker, atom/target) @@ -90,3 +92,7 @@ /datum/ai_controller/basic_controller/headslug ai_movement = /datum/ai_movement/basic_avoidance idle_behavior = /datum/idle_behavior/idle_random_walk + +/// Neutered version to prevent people from turning themselves into changelings with sentience potions or transformation +/mob/living/basic/headslug/beakless + egg_lain = TRUE diff --git a/code/modules/mob/living/basic/space_fauna/hivebot/_hivebot.dm b/code/modules/mob/living/basic/space_fauna/hivebot/_hivebot.dm index 83a1135ac05..db0d310a71c 100644 --- a/code/modules/mob/living/basic/space_fauna/hivebot/_hivebot.dm +++ b/code/modules/mob/living/basic/space_fauna/hivebot/_hivebot.dm @@ -34,16 +34,18 @@ ai_controller = /datum/ai_controller/basic_controller/hivebot ///does this type do range attacks? var/ranged_attacker = FALSE + /// How often can we shoot? + var/ranged_attack_cooldown = 3 SECONDS /mob/living/basic/hivebot/Initialize(mapload) . = ..() var/static/list/death_loot = list(/obj/effect/decal/cleanable/robot_debris) AddElement(/datum/element/death_drops, death_loot) - AddElement(/datum/element/appearance_on_aggro, overlay_icon = icon, overlay_state = "[initial(icon_state)]_attack") + AddComponent(/datum/component/appearance_on_aggro, overlay_icon = icon, overlay_state = "[initial(icon_state)]_attack") if(!ranged_attacker) return - AddElement(/datum/element/ranged_attacks, /obj/item/ammo_casing/hivebot) + AddComponent(/datum/component/ranged_attacks, /obj/item/ammo_casing/hivebot, cooldown_time = ranged_attack_cooldown) /mob/living/basic/hivebot/death(gibbed) do_sparks(number = 3, cardinal_only = TRUE, source = src) @@ -64,6 +66,7 @@ icon_dead = "ranged" ranged_attacker = TRUE ai_controller = /datum/ai_controller/basic_controller/hivebot/ranged/rapid + ranged_attack_cooldown = 1.5 SECONDS /mob/living/basic/hivebot/strong name = "strong hivebot" diff --git a/code/modules/mob/living/basic/space_fauna/meteor_heart/chasing_spikes.dm b/code/modules/mob/living/basic/space_fauna/meteor_heart/chasing_spikes.dm index 729352543ba..a0f9d2fb51b 100644 --- a/code/modules/mob/living/basic/space_fauna/meteor_heart/chasing_spikes.dm +++ b/code/modules/mob/living/basic/space_fauna/meteor_heart/chasing_spikes.dm @@ -1,15 +1,16 @@ /// An ability which makes spikes come out of the ground towards your target -/datum/action/cooldown/chasing_spikes +/datum/action/cooldown/mob_cooldown/chasing_spikes name = "impaling tendril" desc = "Send a spiked subterranean tendril chasing after your target." button_icon = 'icons/mob/simple/meteor_heart.dmi' button_icon_state = "spike" cooldown_time = 10 SECONDS click_to_activate = TRUE + shared_cooldown = NONE /// Lazy list of references to spike trails var/list/active_chasers -/datum/action/cooldown/chasing_spikes/Activate(atom/target) +/datum/action/cooldown/mob_cooldown/chasing_spikes/Activate(atom/target) . = ..() playsound(owner, 'sound/magic/demon_attack1.ogg', vol = 100, vary = TRUE, pressure_affected = FALSE) var/obj/effect/temp_visual/effect_trail/spike_chaser/chaser = new(get_turf(owner), target) @@ -17,12 +18,12 @@ RegisterSignal(chaser, COMSIG_QDELETING, PROC_REF(on_chaser_destroyed)) /// Remove a spike trail from our list of active trails -/datum/action/cooldown/chasing_spikes/proc/on_chaser_destroyed(atom/chaser) +/datum/action/cooldown/mob_cooldown/chasing_spikes/proc/on_chaser_destroyed(atom/chaser) SIGNAL_HANDLER LAZYREMOVE(active_chasers, WEAKREF(chaser)) // Clean up after ourselves -/datum/action/cooldown/chasing_spikes/Remove(mob/removed_from) +/datum/action/cooldown/mob_cooldown/chasing_spikes/Remove(mob/removed_from) QDEL_LIST(active_chasers) return ..() diff --git a/code/modules/mob/living/basic/space_fauna/meteor_heart/meteor_heart.dm b/code/modules/mob/living/basic/space_fauna/meteor_heart/meteor_heart.dm index d2c295c8036..5829b52e437 100644 --- a/code/modules/mob/living/basic/space_fauna/meteor_heart/meteor_heart.dm +++ b/code/modules/mob/living/basic/space_fauna/meteor_heart/meteor_heart.dm @@ -26,9 +26,9 @@ combat_mode = TRUE move_resist = INFINITY // This mob IS the floor /// Action which sends a line of spikes chasing a player - var/datum/action/cooldown/chasing_spikes/spikes + var/datum/action/cooldown/mob_cooldown/chasing_spikes/spikes /// Action which summons areas the player can't stand in - var/datum/action/cooldown/spine_traps/traps + var/datum/action/cooldown/mob_cooldown/spine_traps/traps /// Looping heartbeat sound var/datum/looping_sound/heartbeat/soundloop @@ -77,7 +77,7 @@ soundloop.set_mid_length(HEARTBEAT_NORMAL) /// Animate when using certain abilities -/mob/living/basic/meteor_heart/proc/used_ability(mob/living/owner, datum/action/cooldown/ability) +/mob/living/basic/meteor_heart/proc/used_ability(mob/living/owner, datum/action/cooldown/mob_cooldown/ability) SIGNAL_HANDLER if (ability != spikes) return diff --git a/code/modules/mob/living/basic/space_fauna/meteor_heart/spine_traps.dm b/code/modules/mob/living/basic/space_fauna/meteor_heart/spine_traps.dm index a2a3b52b835..4f7135b1deb 100644 --- a/code/modules/mob/living/basic/space_fauna/meteor_heart/spine_traps.dm +++ b/code/modules/mob/living/basic/space_fauna/meteor_heart/spine_traps.dm @@ -1,10 +1,12 @@ /// Marks several areas with thrusting spines which damage and slow people -/datum/action/cooldown/spine_traps +/datum/action/cooldown/mob_cooldown/spine_traps name = "thrusting spines" desc = "Mark several nearby areas with thrusting spines, which will spring up when disturbed." button_icon = 'icons/mob/simple/meteor_heart.dmi' button_icon_state = "spikes_stabbing" cooldown_time = 15 SECONDS + shared_cooldown = NONE + click_to_activate = FALSE /// Create zones at most this far away var/range = 3 /// Don't create zones within this radius @@ -12,7 +14,7 @@ /// Number of zones to place var/zones_to_create = 3 -/datum/action/cooldown/spine_traps/Activate(atom/target) +/datum/action/cooldown/mob_cooldown/spine_traps/Activate(atom/target) . = ..() playsound(owner, 'sound/magic/demon_consume.ogg', vol = 100, falloff_exponent = 2, vary = TRUE, pressure_affected = FALSE) @@ -31,11 +33,11 @@ created++ /// Returns true if we can place a trap at the specified location -/datum/action/cooldown/spine_traps/proc/is_valid_turf(turf/target_turf) +/datum/action/cooldown/mob_cooldown/spine_traps/proc/is_valid_turf(turf/target_turf) return !target_turf.is_blocked_turf(exclude_mobs = TRUE) && !isspaceturf(target_turf) && !isopenspaceturf(target_turf) /// Places a 3x3 area of spike traps around a central provided point, returns the list of now occupied turfs -/datum/action/cooldown/spine_traps/proc/place_zone(turf/target_turf) +/datum/action/cooldown/mob_cooldown/spine_traps/proc/place_zone(turf/target_turf) var/list/used_turfs = list() for (var/turf/zone_turf in range(1, target_turf)) if (!is_valid_turf(zone_turf)) diff --git a/code/modules/mob/living/basic/space_fauna/morph.dm b/code/modules/mob/living/basic/space_fauna/morph.dm new file mode 100644 index 00000000000..3f31f7f3735 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/morph.dm @@ -0,0 +1,213 @@ +/// The classic morph, Corpus Accipientis (or "The body of the recipient"). It's a blob that can disguise itself as other things simply put. +/mob/living/basic/morph + name = "morph" + real_name = "morph" + desc = "A revolting, pulsating pile of flesh." + speak_emote = list("gurgles") + icon = 'icons/mob/simple/animal.dmi' + icon_state = "morph" + icon_living = "morph" + icon_dead = "morph_dead" + combat_mode = TRUE + + mob_biotypes = MOB_BEAST + pass_flags = PASSTABLE + + maxHealth = 150 + health = 150 + habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + minimum_survivable_temperature = TCMB + + obj_damage = 50 + melee_damage_lower = 20 + melee_damage_upper = 20 + + // Oh you KNOW it's gonna be real green + lighting_cutoff_red = 10 + lighting_cutoff_green = 35 + lighting_cutoff_blue = 15 + + attack_verb_continuous = "glomps" + attack_verb_simple = "glomp" + attack_sound = 'sound/effects/blobattack.ogg' + attack_vis_effect = ATTACK_EFFECT_BITE //nom nom nom + butcher_results = list(/obj/item/food/meat/slab = 2) + + ai_controller = /datum/ai_controller/basic_controller/morph + + /// A weakref pointing to the form we are currently assumed as. + var/datum/weakref/form_weakref = null + /// A typepath pointing of the form we are currently assumed as. Remember, TYPEPATH!!! + var/atom/movable/form_typepath = null + /// The ability that allows us to disguise ourselves. + var/datum/action/cooldown/mob_cooldown/assume_form/disguise_ability = null + + /// How much damage are we doing while disguised? + var/melee_damage_disguised = 0 + /// Can we eat while disguised? + var/eat_while_disguised = FALSE + +/mob/living/basic/morph/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) + RegisterSignal(src, COMSIG_CLICK_SHIFT, PROC_REF(trigger_ability)) + RegisterSignal(src, COMSIG_ACTION_DISGUISED_APPEARANCE, PROC_REF(on_disguise)) + RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_DISGUISED), PROC_REF(on_undisguise)) + + AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/content_barfer) + + disguise_ability = new(src) + disguise_ability.Grant(src) + +/mob/living/basic/morph/examine(mob/user) + if(!HAS_TRAIT(src, TRAIT_DISGUISED)) + return ..() + + var/atom/movable/form_reference = form_weakref.resolve() + if(!isnull(form_reference)) + . = form_reference.examine(user) + + if(get_dist(user, src) <= 3) // always add this because if the form_reference somehow nulls out we still want to have something look "weird" about an item when someone is close + . += span_warning("It doesn't look quite right...") + +/mob/living/basic/morph/med_hud_set_health() + if(isliving(form_typepath)) + return ..() + + //we hide medical hud while in regular state or an item + var/image/holder = hud_list[HEALTH_HUD] + holder.icon_state = null + +/mob/living/basic/morph/med_hud_set_status() + if(isliving(form_typepath)) + return ..() + + //we hide medical hud while in regular state or an item + var/image/holder = hud_list[STATUS_HUD] + holder.icon_state = null + +/mob/living/basic/morph/death(gibbed) + if(HAS_TRAIT(src, TRAIT_DISGUISED)) + visible_message( + span_warning("[src] twists and dissolves into a pile of green flesh!"), + span_userdanger("Your skin ruptures! Your flesh breaks apart! No disguise can ward off de--"), + ) + + return ..() + +/mob/living/basic/morph/can_track(mob/living/user) + if(!HAS_TRAIT(src, TRAIT_DISGUISED)) + return FALSE + return ..() + +/// Do some more logic for the morph when we disguise through the action. +/mob/living/basic/morph/proc/on_disguise(mob/living/basic/user, atom/movable/target) + SIGNAL_HANDLER + // We are now weaker + melee_damage_lower = melee_damage_disguised + melee_damage_upper = melee_damage_disguised + add_movespeed_modifier(/datum/movespeed_modifier/morph_disguised) + + med_hud_set_health() + med_hud_set_status() //we're an object honest + + visible_message( + span_warning("[src] suddenly twists and changes shape, becoming a copy of [target]!"), + span_notice("You twist your body and assume the form of [target]."), + ) + + form_weakref = WEAKREF(target) + form_typepath = target.type + +/// Do some more logic for the morph when we undisguise through the action. +/mob/living/basic/morph/proc/on_undisguise() + SIGNAL_HANDLER + visible_message( + span_warning("[src] suddenly collapses in on itself, dissolving into a pile of green flesh!"), + span_notice("You reform to your normal body."), + ) + + //Baseline stats + melee_damage_lower = initial(melee_damage_lower) + melee_damage_upper = initial(melee_damage_upper) + remove_movespeed_modifier(/datum/movespeed_modifier/morph_disguised) + + med_hud_set_health() + med_hud_set_status() //we are no longer an object + + form_weakref = null + form_typepath = null + +/// Alias for the disguise ability to be used as a keybind. +/mob/living/basic/morph/proc/trigger_ability(mob/living/basic/source, atom/target) + SIGNAL_HANDLER + + // linters hate this if it's not async for some reason even though nothing blocks + INVOKE_ASYNC(disguise_ability, TYPE_PROC_REF(/datum/action/cooldown, InterceptClickOn), caller = source, target = target) + return COMSIG_MOB_CANCEL_CLICKON + +/// Handles the logic for attacking anything. +/mob/living/basic/morph/proc/pre_attack(mob/living/basic/source, atom/target) + SIGNAL_HANDLER + + if(HAS_TRAIT(src, TRAIT_DISGUISED) && (melee_damage_disguised <= 0)) + balloon_alert(src, "can't attack while disguised!") + return COMPONENT_HOSTILE_NO_ATTACK + + if(isliving(target)) //Eat Corpses to regen health + var/mob/living/living_target = target + if(living_target.stat != DEAD) + return + + INVOKE_ASYNC(source, PROC_REF(eat), eatable = living_target, delay = 3 SECONDS, update_health = -50) + return COMPONENT_HOSTILE_NO_ATTACK + + if(isitem(target)) //Eat items just to be annoying + var/obj/item/item_target = target + if(item_target.anchored) + return + + INVOKE_ASYNC(source, PROC_REF(eat), eatable = item_target, delay = 2 SECONDS) + return COMPONENT_HOSTILE_NO_ATTACK + +/// Eat stuff. Delicious. Return TRUE if we ate something, FALSE otherwise. +/// Required: `eatable` is the thing (item or mob) that we are going to eat. +/// Optional: `delay` is the applicable time-based delay to pass into `do_after()` before the logic is ran. +/// Optional: `update_health` is an integer that will be added (or maybe subtracted if you're cruel) to our health after we eat something. Passed into `adjust_health()` so make sure what you pass in is accurate. +/mob/living/basic/morph/proc/eat(atom/movable/eatable, delay = 0 SECONDS, update_health = 0) + if(QDELETED(eatable) || eatable.loc == src) + return FALSE + + if(HAS_TRAIT(src, TRAIT_DISGUISED) && !eat_while_disguised) + balloon_alert(src, "can't eat while disguised!") + return FALSE + + balloon_alert(src, "eating...") + if((delay > 0 SECONDS) && !do_after(src, delay, target = eatable)) + return FALSE + + visible_message(span_warning("[src] swallows [eatable] whole!")) + eatable.forceMove(src) + if(update_health != 0) + adjust_health(update_health) + + return TRUE + +/// No fleshed out AI implementation, just something that make these fellers seem lively if they're just dropped into a station. +/// Only real human-powered intelligence is capable of playing prop hunt in SS13 (until further notice). +/datum/ai_controller/basic_controller/morph + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) diff --git a/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat.dm b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat.dm new file mode 100644 index 00000000000..85369b72eb8 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat.dm @@ -0,0 +1,277 @@ +#define REGALRAT_INTERACTION "regalrat" + +/// The cheesiest, most crowned rat of them all. Regent superior of all rats in maintenance... at least until someone else tries to encroach on their claim. +/mob/living/basic/regal_rat + name = "feral regal rat" + desc = "An evolved rat, created through some strange science. They lead nearby rats with deadly efficiency to protect their kingdom." + icon_state = "regalrat" + icon_living = "regalrat" + icon_dead = "regalrat_dead" + gender = MALE + + maxHealth = 70 + health = 70 + + butcher_results = list(/obj/item/food/meat/slab/mouse = 2, /obj/item/clothing/head/costume/crown = 1) + + response_help_continuous = "glares at" + response_help_simple = "glare at" + response_disarm_continuous = "skoffs at" + response_disarm_simple = "skoff at" + response_harm_continuous = "slashes" + response_harm_simple = "slash" + + obj_damage = 10 + melee_damage_lower = 13 + melee_damage_upper = 15 + attack_verb_continuous = "slashes" + attack_verb_simple = "slash" + attack_sound = 'sound/weapons/bladeslice.ogg' + + // Slightly brown red, for the eyes + lighting_cutoff_red = 22 + lighting_cutoff_green = 8 + lighting_cutoff_blue = 5 + + attack_vis_effect = ATTACK_EFFECT_CLAW + unique_name = TRUE + faction = list(FACTION_RAT, FACTION_MAINT_CREATURES) + + ai_controller = /datum/ai_controller/basic_controller/regal_rat + + ///Should we request a mind immediately upon spawning? + var/poll_ghosts = FALSE + /// String tied to our special moniker for examination. Contains a nice message tied to the potential funny regal name we have. + var/special_moniker = "" + +/mob/living/basic/regal_rat/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) + RegisterSignal(src, COMSIG_MOB_LOGIN, PROC_REF(on_login)) + + AddElement(/datum/element/waddling) + AddElement(/datum/element/ai_retaliate) + AddComponent(\ + /datum/component/ghost_direct_control,\ + poll_candidates = poll_ghosts,\ + role_name = "the Regal Rat, cheesy be their crown",\ + poll_ignore_key = POLL_IGNORE_REGAL_RAT,\ + assumed_control_message = "You are an independent, invasive force on the station! Hoard coins, trash, cheese, and the like from the safety of darkness!",\ + after_assumed_control = CALLBACK(src, PROC_REF(became_player_controlled)),\ + ) + + var/datum/action/cooldown/mob_cooldown/domain/domain = new(src) + domain.Grant(src) + ai_controller.set_blackboard_key(BB_DOMAIN_ABILITY, domain) + + var/datum/action/cooldown/mob_cooldown/riot/riot = new(src) + riot.Grant(src) + ai_controller.set_blackboard_key(BB_RAISE_HORDE_ABILITY, riot) + +/mob/living/basic/regal_rat/examine(mob/user) + . = ..() + if(user == src) + return + + if(isregalrat(user)) + . += span_warning("Who is this foolish false king? This will not stand!") + return + + if(ismouse(user)) + if(user.faction_check_mob(src, exact_match = TRUE)) + . += span_notice("This is your king. Long live [p_their()] majesty!") + else + . += span_warning("This is a false king! Strike [p_them()] down!") + return + + . += special_moniker + +/mob/living/basic/regal_rat/handle_environment(datum/gas_mixture/environment) + . = ..() + if(stat == DEAD || isnull(environment) || isnull(environment.gases[/datum/gas/miasma])) + return + var/miasma_percentage = environment.gases[/datum/gas/miasma][MOLES] / environment.total_moles() + if(miasma_percentage >= 0.25) + heal_bodypart_damage(1) + +/// Triggers an alert to all ghosts that the rat has become player controlled. +/mob/living/basic/regal_rat/proc/became_player_controlled() + notify_ghosts( + "All rise for [name], ascendant to the throne in \the [get_area(src)].", + source = src, + action = NOTIFY_ORBIT, + flashwindow = FALSE, + header = "Sentient Rat Created", + ) + +/// Supplementary work we do when we login. Done this way so we synchronize with the ai controller shutting off and all that jazz as well as allowing more shit to be passed in if need be in future. +/mob/living/basic/regal_rat/proc/on_login() + SIGNAL_HANDLER + if(!special_moniker) + grant_titles() // all players are special :) + +/// Grants the rat a special name. +/mob/living/basic/regal_rat/proc/grant_titles() + // The title conveyed upon us thanks to our position. + var/static/list/titles = list( + "Bojar", + "Emperor", + "King", + "Lord", + "Master", + "Overlord", + "Prince", + "Shogun", + "Supreme", + "Tsar", + ) + + // The domain which we have conquered by inheritance or sheer force. + var/static/list/kingdoms = list( + "Cheese", + "Garbage", + "Maintenance", + "Miasma", + "Plague", + "Trash", + "Vermin", + ) + + // The descriptor of our character. + var/static/list/descriptors = list( + "Big Cheese", + "Brute", + "Champion of All Mislaid Creatures", + "Foul", + "Great", + "Grey", + "Horrible", + "Populator", + "Powerful", + "Quiet", + "Vain", + ) + + var/selected_title = pick(titles) + var/selected_kingdom = pick(kingdoms) + + name = "[selected_title] [selected_kingdom], the [pick(descriptors)]" // ex "Tsar Maintenance, the Brute" + special_moniker = "You better not screw with [p_their()] [selected_kingdom]... How do you become a [selected_title] of that anyways?" + +/// Checks if we are able to attack this object, as well as send out the signal to see if we get any special regal rat interactions. +/mob/living/basic/regal_rat/proc/pre_attack(mob/living/source, atom/target) + SIGNAL_HANDLER + + if(DOING_INTERACTION(src, REGALRAT_INTERACTION) || !allowed_to_attack(target)) + return COMPONENT_HOSTILE_NO_ATTACK + + if(SEND_SIGNAL(target, COMSIG_RAT_INTERACT, src) & COMPONENT_RAT_INTERACTED) + return COMPONENT_HOSTILE_NO_ATTACK + + if(isnull(mind)) + return + + if(istype(target, /obj/machinery/door/airlock)) + INVOKE_ASYNC(src, PROC_REF(pry_door), target) + return COMPONENT_HOSTILE_NO_ATTACK + + if(!combat_mode) + INVOKE_ASYNC(src, PROC_REF(poison_target), target) + return COMPONENT_HOSTILE_NO_ATTACK + +/// Checks if we are allowed to attack this mob. Will return TRUE if we are potentially allowed to attack, but if we end up in a case where we should NOT attack, return FALSE. +/mob/living/basic/regal_rat/proc/allowed_to_attack(atom/the_target) + if(QDELETED(the_target)) + return FALSE //wat + + if(!isliving(the_target)) + return TRUE // it might be possible to attack this? we'll find out soon enough + + var/mob/living/living_target = the_target + if (HAS_TRAIT(living_target, TRAIT_FAKEDEATH) || living_target.stat == DEAD) + balloon_alert(src, "already dead!") + return FALSE + + if(living_target.faction_check_mob(src, exact_match = TRUE)) + balloon_alert(src, "one of your soldiers!") + return FALSE + + return TRUE + +/// Attempts to add rat spit to a target, effectively poisoning it to whoever eats it. Yuckers. +/mob/living/basic/regal_rat/proc/poison_target(atom/target) + if(isnull(target.reagents) || !target.is_injectable(src, allowmobs = TRUE)) + return + + visible_message( + span_warning("[src] starts licking [target] passionately!"), + span_notice("You start licking [target]..."), + span_warning("You hear a disgusting slurping sound..."), + ) + + if (!do_after(src, 2 SECONDS, target, interaction_key = REGALRAT_INTERACTION)) + return + + target.reagents.add_reagent(/datum/reagent/rat_spit, rand(1,3), no_react = TRUE) + balloon_alert(src, "licked") + +/** + * Conditionally "eat" cheese object and heal, if injured. + * + * A private proc for sending a message to the mob's chat about them + * eating some sort of cheese, then healing them, then deleting the cheese. + * The "eating" is only conditional on the mob being injured in the first + * place. + */ +/mob/living/basic/regal_rat/proc/cheese_heal(obj/item/target, amount, message) + if(health >= maxHealth) + balloon_alert(src, "you feel full!") + return + + to_chat(src, message) + heal_bodypart_damage(amount) + qdel(target) + +/** + * Allows rat king to pry open an airlock if it isn't locked. + * + * A proc used for letting the rat king pry open airlocks instead of just attacking them. + * This allows the rat king to traverse the station when there is a lack of vents or + * accessible doors, something which is common in certain rat king spawn points. + * + * Returns TRUE if the door opens, FALSE otherwise. + */ +/mob/living/basic/regal_rat/proc/pry_door(target) + if(DOING_INTERACTION(src, REGALRAT_INTERACTION)) + return FALSE + + var/obj/machinery/door/airlock/prying_door = target + if(!prying_door.density || prying_door.locked || prying_door.welded || prying_door.seal) + return FALSE + + visible_message( + span_warning("[src] begins prying open the airlock..."), + span_notice("You begin digging your claws into the airlock..."), + span_warning("You hear groaning metal..."), + ) + var/time_to_open = 0.5 SECONDS + + if(prying_door.hasPower()) + time_to_open = 5 SECONDS + playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, vary = TRUE) + + if(!do_after(src, time_to_open, prying_door, interaction_key = REGALRAT_INTERACTION)) + return FALSE + + if(!prying_door.open(BYPASS_DOOR_CHECKS)) + balloon_alert(src, "failed to open!") + return FALSE + + return TRUE + +/mob/living/basic/regal_rat/controlled + poll_ghosts = TRUE + +#undef REGALRAT_INTERACTION diff --git a/code/modules/mob/living/simple_animal/hostile/regalrat.dm b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_actions.dm similarity index 52% rename from code/modules/mob/living/simple_animal/hostile/regalrat.dm rename to code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_actions.dm index 4e47f29337f..609d80fc4df 100644 --- a/code/modules/mob/living/simple_animal/hostile/regalrat.dm +++ b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_actions.dm @@ -1,190 +1,8 @@ -/mob/living/simple_animal/hostile/regalrat - name = "feral regal rat" - desc = "An evolved rat, created through some strange science. They lead nearby rats with deadly efficiency to protect their kingdom. Not technically a king." - icon_state = "regalrat" - icon_living = "regalrat" - icon_dead = "regalrat_dead" - speak_chance = 0 - turns_per_move = 5 - maxHealth = 70 - health = 70 - // Slightly brown red, for the eyes - // Might be a bit too dim - lighting_cutoff_red = 22 - lighting_cutoff_green = 8 - lighting_cutoff_blue = 5 - obj_damage = 10 - butcher_results = list(/obj/item/food/meat/slab/mouse = 2, /obj/item/clothing/head/costume/crown = 1) - response_help_continuous = "glares at" - response_help_simple = "glare at" - response_disarm_continuous = "skoffs at" - response_disarm_simple = "skoff at" - response_harm_continuous = "slashes" - response_harm_simple = "slash" - melee_damage_lower = 13 - melee_damage_upper = 15 - attack_verb_continuous = "slashes" - attack_verb_simple = "slash" - attack_sound = 'sound/weapons/bladeslice.ogg' - attack_vis_effect = ATTACK_EFFECT_CLAW - unique_name = TRUE - faction = list(FACTION_RAT, FACTION_MAINT_CREATURES) - ///Whether or not the regal rat is already opening an airlock - var/opening_airlock = FALSE - ///The spell that the rat uses to generate miasma - var/datum/action/cooldown/domain/domain - ///The Spell that the rat uses to recruit/convert more rats. - var/datum/action/cooldown/riot/riot - ///Should we request a mind immediately upon spawning? - var/poll_ghosts = FALSE - -/mob/living/simple_animal/hostile/regalrat/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - AddElement(/datum/element/waddling) - AddComponent(\ - /datum/component/ghost_direct_control,\ - poll_candidates = poll_ghosts,\ - role_name = "the Regal Rat, cheesy be their crown",\ - poll_ignore_key = POLL_IGNORE_REGAL_RAT,\ - assumed_control_message = "You are an independent, invasive force on the station! Hoard coins, trash, cheese, and the like from the safety of darkness!",\ - after_assumed_control = CALLBACK(src, PROC_REF(became_player_controlled)),\ - ) - domain = new(src) - riot = new(src) - domain.Grant(src) - riot.Grant(src) - -/mob/living/simple_animal/hostile/regalrat/Destroy() - QDEL_NULL(domain) - QDEL_NULL(riot) - return ..() - -/mob/living/simple_animal/hostile/regalrat/proc/became_player_controlled() - notify_ghosts( - "All rise for the rat king, ascendant to the throne in \the [get_area(src)].", - source = src, - action = NOTIFY_ORBIT, - flashwindow = FALSE, - header = "Sentient Rat Created", - ) - -/mob/living/simple_animal/hostile/regalrat/handle_automated_action() - if(prob(20)) - riot.Trigger() - else if(prob(50)) - domain.Trigger() - return ..() - -/mob/living/simple_animal/hostile/regalrat/CanAttack(atom/the_target) - if(isliving(the_target)) - var/mob/living/living_target = the_target - if (living_target.stat != DEAD) - return !living_target.faction_check_mob(src, exact_match = TRUE) - - return ..() - -/mob/living/simple_animal/hostile/regalrat/examine(mob/user) - . = ..() - - if(ismouse(user)) - if(user.faction_check_mob(src, TRUE)) - . += span_notice("This is your king. Long live [p_their()] majesty!") - else - . += span_warning("This is a false king! Strike [p_them()] down!") - - else if(user != src && isregalrat(user)) - . += span_warning("Who is this foolish false king? This will not stand!") - -/mob/living/simple_animal/hostile/regalrat/handle_environment(datum/gas_mixture/environment) - . = ..() - if(stat == DEAD || !environment || !environment.gases[/datum/gas/miasma]) - return - var/miasma_percentage = environment.gases[/datum/gas/miasma][MOLES] / environment.total_moles() - if(miasma_percentage >= 0.25) - heal_bodypart_damage(1) - -#define REGALRAT_INTERACTION "regalrat" - -/mob/living/simple_animal/hostile/regalrat/AttackingTarget() - if (DOING_INTERACTION(src, REGALRAT_INTERACTION) || QDELETED(target)) - return - if(istype(target, /obj/machinery/door/airlock) && !opening_airlock) - pry_door(target) - return - if (src.mind && !src.combat_mode && target.reagents && target.is_injectable(src, allowmobs = TRUE) && !istype(target, /obj/item/food/cheese)) - src.visible_message(span_warning("[src] starts licking [target] passionately!"),span_notice("You start licking [target]...")) - if (do_after(src, 2 SECONDS, target, interaction_key = REGALRAT_INTERACTION)) - target.reagents.add_reagent(/datum/reagent/rat_spit,rand(1,3),no_react = TRUE) - to_chat(src, span_notice("You finish licking [target].")) - return - else - SEND_SIGNAL(target, COMSIG_RAT_INTERACT, src) - return ..() - -#undef REGALRAT_INTERACTION - -/** - * Conditionally "eat" cheese object and heal, if injured. - * - * A private proc for sending a message to the mob's chat about them - * eating some sort of cheese, then healing them, then deleting the cheese. - * The "eating" is only conditional on the mob being injured in the first - * place. - */ -/mob/living/simple_animal/hostile/regalrat/proc/cheese_heal(obj/item/target, amount, message) - if(health < maxHealth) - to_chat(src, message) - heal_bodypart_damage(amount) - qdel(target) - else - to_chat(src, span_warning("You feel fine, no need to eat anything!")) - -/** - * Allows rat king to pry open an airlock if it isn't locked. - * - * A proc used for letting the rat king pry open airlocks instead of just attacking them. - * This allows the rat king to traverse the station when there is a lack of vents or - * accessible doors, something which is common in certain rat king spawn points. - */ -/mob/living/simple_animal/hostile/regalrat/proc/pry_door(target) - var/obj/machinery/door/airlock/prying_door = target - if(!prying_door.density || prying_door.locked || prying_door.welded || prying_door.seal) - return FALSE - opening_airlock = TRUE - visible_message( - span_warning("[src] begins prying open the airlock..."), - span_notice("You begin digging your claws into the airlock..."), - span_warning("You hear groaning metal..."), - ) - var/time_to_open = 0.5 SECONDS - if(prying_door.hasPower()) - time_to_open = 5 SECONDS - playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, vary = TRUE) - if(do_after(src, time_to_open, prying_door)) - opening_airlock = FALSE - if(prying_door.density && !prying_door.open(BYPASS_DOOR_CHECKS)) - to_chat(src, span_warning("Despite your efforts, the airlock managed to resist your attempts to open it!")) - return FALSE - prying_door.open() - return FALSE - opening_airlock = FALSE - -/mob/living/simple_animal/hostile/regalrat/controlled - poll_ghosts = TRUE - -/mob/living/simple_animal/hostile/regalrat/controlled/Initialize(mapload) - . = ..() - var/kingdom = pick("Plague","Miasma","Maintenance","Trash","Garbage","Rat","Vermin","Cheese") - var/title = pick("King","Lord","Prince","Emperor","Supreme","Overlord","Master","Shogun","Bojar","Tsar") - name = "[kingdom] [title]" - - /** *Increase the rat king's domain */ -/datum/action/cooldown/domain +/datum/action/cooldown/mob_cooldown/domain name = "Rat King's Domain" desc = "Corrupts this area to be more suitable for your rat army." check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_INCAPACITATED @@ -194,22 +12,23 @@ background_icon_state = "bg_clock" overlay_icon_state = "bg_clock_border" button_icon_state = "coffer" + shared_cooldown = NONE -/datum/action/cooldown/domain/proc/domain() - var/turf/T = get_turf(owner) - T.atmos_spawn_air("[GAS_MIASMA]=4;[TURF_TEMPERATURE(T20C)]") +/datum/action/cooldown/mob_cooldown/domain/proc/domain() + var/turf/location = get_turf(owner) + location.atmos_spawn_air("[GAS_MIASMA]=4;[TURF_TEMPERATURE(T20C)]") switch (rand(1,10)) if (8) - new /obj/effect/decal/cleanable/vomit(T) + new /obj/effect/decal/cleanable/vomit(location) if (9) - new /obj/effect/decal/cleanable/vomit/old(T) + new /obj/effect/decal/cleanable/vomit/old(location) if (10) - new /obj/effect/decal/cleanable/oil/slippery(T) + new /obj/effect/decal/cleanable/oil/slippery(location) else - new /obj/effect/decal/cleanable/dirt(T) + new /obj/effect/decal/cleanable/dirt(location) StartCooldown() -/datum/action/cooldown/domain/Activate(atom/target) +/datum/action/cooldown/mob_cooldown/domain/Activate(atom/target) StartCooldown(10 SECONDS) domain() StartCooldown() @@ -218,7 +37,7 @@ * This action checks some nearby maintenance animals and makes them your minions. * If none are nearby, creates a new mouse. */ -/datum/action/cooldown/riot +/datum/action/cooldown/mob_cooldown/riot name = "Raise Army" desc = "Raise an army out of the hordes of mice and pests crawling around the maintenance shafts." check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_INCAPACITATED @@ -228,12 +47,14 @@ overlay_icon_state = "bg_clock_border" cooldown_time = 8 SECONDS melee_cooldown_time = 0 SECONDS + shared_cooldown = NONE /// How close does something need to be for us to recruit it? var/range = 5 /// Commands you can give to your mouse army var/static/list/mouse_commands = list( /datum/pet_command/idle, /datum/pet_command/free, + /datum/pet_command/protect_owner, /datum/pet_command/follow, /datum/pet_command/point_targetting/attack/mouse ) @@ -241,11 +62,12 @@ var/static/list/glockroach_commands = list( /datum/pet_command/idle, /datum/pet_command/free, + /datum/pet_command/protect_owner/glockroach, /datum/pet_command/follow, /datum/pet_command/point_targetting/attack/glockroach ) -/datum/action/cooldown/riot/Activate(atom/target) +/datum/action/cooldown/mob_cooldown/riot/Activate(atom/target) StartCooldown(10 SECONDS) riot() StartCooldown() @@ -257,7 +79,7 @@ * * Convert nearby frogs into aggressive frogs. * * Spawn a single mouse if below the mouse cap. */ -/datum/action/cooldown/riot/proc/riot() +/datum/action/cooldown/mob_cooldown/riot/proc/riot() var/uplifted_mice = FALSE for (var/mob/living/basic/mouse/nearby_mouse in oview(owner, range)) uplifted_mice = convert_mouse(nearby_mouse) || uplifted_mice @@ -285,10 +107,10 @@ to_chat(owner,span_warning("There's too many mice on this station to beckon a new one! Find them first!")) return new /mob/living/basic/mouse(owner.loc) - owner.visible_message(span_warning("[owner] commands a rat to their side!")) + owner.visible_message(span_warning("[owner] commands a mouse to their side!")) /// Makes a passed mob into our minion -/datum/action/cooldown/riot/proc/make_minion(mob/living/new_minion, minion_desc, list/command_list = mouse_commands) +/datum/action/cooldown/mob_cooldown/riot/proc/make_minion(mob/living/new_minion, minion_desc, list/command_list = mouse_commands) if (isbasicmob(new_minion)) new_minion.AddComponent(/datum/component/obeys_commands, command_list) qdel(new_minion.GetComponent(/datum/component/tameable)) // Rats don't share @@ -299,7 +121,7 @@ new_minion.balloon_alert_to_viewers("squeak") /// Turns a mouse into an angry mouse -/datum/action/cooldown/riot/proc/convert_mouse(mob/living/basic/mouse/nearby_mouse) +/datum/action/cooldown/mob_cooldown/riot/proc/convert_mouse(mob/living/basic/mouse/nearby_mouse) // This mouse is already rat controlled, let's not bother with it. if (istype(nearby_mouse.ai_controller, /datum/ai_controller/basic_controller/mouse/rat)) return FALSE @@ -320,7 +142,7 @@ return TRUE /// Turns a roach into an angry roach -/datum/action/cooldown/riot/proc/convert_roach(mob/living/basic/cockroach/nearby_roach, list/converted_check_list) +/datum/action/cooldown/mob_cooldown/riot/proc/convert_roach(mob/living/basic/cockroach/nearby_roach, list/converted_check_list) // No need to convert when not on the same team. if (faction_check(nearby_roach.faction, converted_check_list)) return FALSE @@ -347,7 +169,7 @@ return TRUE /// Turns a frog into a crazy frog. This doesn't do anything interesting and should when it becomes a basic mob. -/datum/action/cooldown/riot/proc/convert_frog(mob/living/basic/frog/nearby_frog, list/converted_check_list) +/datum/action/cooldown/mob_cooldown/riot/proc/convert_frog(mob/living/basic/frog/nearby_frog, list/converted_check_list) // No need to convert when not on the same team. if(faction_check(nearby_frog.faction, converted_check_list) || nearby_frog.stat == DEAD) return FALSE @@ -422,4 +244,7 @@ C.adjust_disgust(5) else if(prob(5)) C.vomit() - ..() + return ..() + +/datum/pet_command/protect_owner/glockroach + protect_behavior = /datum/ai_planning_subtree/basic_ranged_attack_subtree/glockroach diff --git a/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_ai.dm b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_ai.dm new file mode 100644 index 00000000000..ef92c7b3b76 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_ai.dm @@ -0,0 +1,28 @@ +/datum/ai_controller/basic_controller/regal_rat + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_BASIC_MOB_FLEEING = TRUE, + BB_FLEE_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + + // we pretty much do cheesy things (make the station worse) and don't deal with peasants (crew) unless they start to get in the way + // summon the horde if we get into a fight and then let the horde take care of it while we skedaddle + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate/to_flee, + /datum/ai_planning_subtree/targeted_mob_ability/riot, + /datum/ai_planning_subtree/flee_target/from_flee_key, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/use_mob_ability/domain, + ) + +/datum/ai_planning_subtree/targeted_mob_ability/riot + target_key = BB_BASIC_MOB_FLEE_TARGET // we only want to trigger this when provoked, manpower is low nowadays + ability_key = BB_RAISE_HORDE_ABILITY + finish_planning = FALSE + +/datum/ai_planning_subtree/use_mob_ability/domain + ability_key = BB_DOMAIN_ABILITY diff --git a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider.dm b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider.dm deleted file mode 100644 index b7339787bd3..00000000000 --- a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider.dm +++ /dev/null @@ -1,107 +0,0 @@ -/** - * # Giant Spider - * - * A mob which can be created by dynamic event, botany, or xenobiology. - * The basic type is the guard, which is slow but sturdy and outputs good damage. - * All spiders can produce webbing. - */ -/mob/living/basic/giant_spider - name = "giant spider" - desc = "Furry and black, it makes you shudder to look at it. This one has deep red eyes." - icon = 'icons/mob/simple/arachnoid.dmi' - icon_state = "guard" - icon_living = "guard" - icon_dead = "guard_dead" - mob_biotypes = MOB_ORGANIC|MOB_BUG - speak_emote = list("chitters") - butcher_results = list(/obj/item/food/meat/slab/spider = 2, /obj/item/food/spiderleg = 8) - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "gently pushes aside" - response_disarm_simple = "gently push aside" - initial_language_holder = /datum/language_holder/spider - speed = 5 - maxHealth = 125 - health = 125 - damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1) - basic_mob_flags = FLAMMABLE_MOB - status_flags = NONE - unsuitable_cold_damage = 4 - unsuitable_heat_damage = 4 - obj_damage = 30 - melee_damage_lower = 20 - melee_damage_upper = 25 - combat_mode = TRUE - faction = list(FACTION_SPIDER) - pass_flags = PASSTABLE - attack_verb_continuous = "bites" - attack_verb_simple = "bite" - attack_sound = 'sound/weapons/bite.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE - unique_name = TRUE - gold_core_spawnable = HOSTILE_SPAWN - // VERY red, to fit the eyes - lighting_cutoff_red = 22 - lighting_cutoff_green = 5 - lighting_cutoff_blue = 5 - ai_controller = /datum/ai_controller/basic_controller/giant_spider - /// Speed modifier to apply if controlled by a human player - var/player_speed_modifier = -4 - /// What reagent the mob injects targets with - var/poison_type = /datum/reagent/toxin/hunterspider - /// How much of a reagent the mob injects on attack - var/poison_per_bite = 0 - /// Multiplier to apply to web laying speed. Fractional numbers make it faster, because it's a multiplier. - var/web_speed = 1 - /// Type of webbing ability to learn. - var/web_type = /datum/action/cooldown/lay_web - /// The message that the mother spider left for this spider when the egg was layed. - var/directive = "" - /// Short description of what this mob is capable of, for radial menu uses - var/menu_description = "Tanky and strong for the defense of the nest and other spiders." - /// If true then you shouldn't be told that you're a spider antagonist as soon as you are placed into this mob - var/apply_spider_antag = TRUE - -/mob/living/basic/giant_spider/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_WEB_SURFER, INNATE_TRAIT) - AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW) - AddElement(/datum/element/nerfed_pulling, GLOB.typecache_general_bad_things_to_easily_move) - AddElement(/datum/element/prevent_attacking_of_types, GLOB.typecache_general_bad_hostile_attack_targets, "this tastes awful!") - AddElement(/datum/element/cliff_walking) - - if(poison_per_bite) - AddElement(/datum/element/venomous, poison_type, poison_per_bite) - - var/datum/action/cooldown/lay_web/webbing = new web_type(src) - webbing.webbing_time *= web_speed - webbing.Grant(src) - ai_controller.set_blackboard_key(BB_SPIDER_WEB_ACTION, webbing) - -/mob/living/basic/giant_spider/Login() - . = ..() - if(!. || !client) - return FALSE - GLOB.spidermobs[src] = TRUE - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/player_spider_modifier, multiplicative_slowdown = player_speed_modifier) - if (apply_spider_antag) - var/datum/antagonist/spider/spider_antag = new(directive) - mind.add_antag_datum(spider_antag) - -/mob/living/basic/giant_spider/Logout() - . = ..() - remove_movespeed_modifier(/datum/movespeed_modifier/player_spider_modifier) - -/mob/living/basic/giant_spider/Destroy() - GLOB.spidermobs -= src - return ..() - -/mob/living/basic/giant_spider/mob_negates_gravity() - if(locate(/obj/structure/spider/stickyweb) in loc) - return TRUE - return ..() - -/mob/living/basic/giant_spider/expose_reagents(list/reagents, datum/reagents/source, methods=TOUCH, volume_modifier=1, show_message=TRUE) - . = ..() - for(var/datum/reagent/toxin/pestkiller/current_reagent in reagents) - apply_damage(50 * volume_modifier, STAMINA, BODY_ZONE_CHEST) diff --git a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_variants.dm b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spiders.dm similarity index 77% rename from code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_variants.dm rename to code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spiders.dm index 648174bd603..6df2eb427f4 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_variants.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spiders.dm @@ -1,9 +1,32 @@ /** - * ### Spider Ambush + * # Giant Spider + * + * A mob which can be created by dynamic event, botany, or xenobiology. + * The basic type is the guard, which is slow but sturdy and outputs good damage. + * All spiders can produce webbing. + */ +/mob/living/basic/spider/giant + name = "giant spider" + desc = "Furry and black, it makes you shudder to look at it. This one has deep red eyes." + icon_state = "guard" + icon_living = "guard" + icon_dead = "guard_dead" + speed = 5 + maxHealth = 125 + health = 125 + obj_damage = 30 + melee_damage_lower = 20 + melee_damage_upper = 25 + gold_core_spawnable = HOSTILE_SPAWN + ai_controller = /datum/ai_controller/basic_controller/giant_spider + + +/** + * ### Ambush Spider * A subtype of the giant spider which is slower, stronger and able to sneak into its surroundings to pull pray aggressively. * This spider is only slightly slower than a human. */ -/mob/living/basic/giant_spider/ambush +/mob/living/basic/spider/giant/ambush name = "ambush spider" desc = "Furry and white, it makes you shudder to look at it. This one has sparkling pink eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -20,21 +43,21 @@ player_speed_modifier = -3.1 menu_description = "Slow spider variant specializing in stalking and ambushing prey, above avarage health and damage with a strong grip." -/mob/living/basic/giant_spider/ambush/Initialize(mapload) +/mob/living/basic/spider/giant/ambush/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_STRONG_GRABBER, INNATE_TRAIT) AddElement(/datum/element/web_walker, /datum/movespeed_modifier/slow_web) - var/datum/action/cooldown/sneak/spider/sneak_web = new(src) + var/datum/action/cooldown/mob_cooldown/sneak/spider/sneak_web = new(src) sneak_web.Grant(src) /** - * ### Spider Guard + * ### Guard Spider * A subtype of the giant spider which is similar on every single way, * This spider is only slightly slower than a human. */ -/mob/living/basic/giant_spider/guard +/mob/living/basic/spider/giant/guard name = "guard spider" desc = "Furry and black, it makes you shudder to look at it. This one has deep red eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -51,19 +74,19 @@ player_speed_modifier = -4 menu_description = "Tanky and strong for the defense of the nest and other spiders." -/mob/living/basic/giant_spider/guard/Initialize(mapload) +/mob/living/basic/spider/giant/guard/Initialize(mapload) . = ..() AddElement(/datum/element/web_walker, /datum/movespeed_modifier/average_web) - var/datum/action/cooldown/web_effigy/shed = new(src) + var/datum/action/cooldown/mob_cooldown/web_effigy/shed = new(src) shed.Grant(src) /** - * ### Spider Hunter + * ### Hunter Spider * A subtype of the giant spider which is faster, has toxin injection, but less health and damage. * This spider is only slightly slower than a human. */ -/mob/living/basic/giant_spider/hunter +/mob/living/basic/spider/giant/hunter name = "hunter spider" desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -79,17 +102,17 @@ player_speed_modifier = -3.1 menu_description = "Fast spider variant specializing in catching running prey and toxin injection, but has less health and damage." -/mob/living/basic/giant_spider/hunter/Initialize(mapload) +/mob/living/basic/spider/giant/hunter/Initialize(mapload) . = ..() AddElement(/datum/element/web_walker, /datum/movespeed_modifier/fast_web) /** - * ### Spider Scout + * ### Scout Spider * A subtype of the giant spider which is faster, has thermal vision, but less health and damage. * This spider is only slightly faster than a human. */ -/mob/living/basic/giant_spider/scout +/mob/living/basic/spider/giant/scout name = "scout spider" desc = "Furry and blueish black, it makes you shudder to look at it. This one has sparkling blue eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -108,21 +131,21 @@ sight = SEE_SELF|SEE_MOBS menu_description = "Fast spider variant specializing in scouting and alerting of prey, with the ability to travel in vents." -/mob/living/basic/giant_spider/scout/Initialize(mapload) +/mob/living/basic/spider/giant/scout/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - var/datum/action/command_spiders/communication_spiders/spiders_communication = new(src) + var/datum/action/cooldown/mob_cooldown/command_spiders/communication_spiders/spiders_communication = new(src) spiders_communication.Grant(src) /** - * ### Spider Nurse + * ### Nurse Spider * * A subtype of the giant spider which specializes in support skills. * Nurses can place down webbing in a quarter of the time that other species can and can wrap other spiders' wounds, healing them. * Note that it cannot heal itself. */ -/mob/living/basic/giant_spider/nurse +/mob/living/basic/spider/giant/nurse name = "nurse spider" desc = "Furry and black, it makes you shudder to look at it. This one has brilliant green eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -138,12 +161,12 @@ speed = 4 player_speed_modifier = -3.1 web_speed = 0.25 - web_type = /datum/action/cooldown/lay_web/sealer + web_type = /datum/action/cooldown/mob_cooldown/lay_web/sealer menu_description = "Support spider variant specializing in healing their brethren and placing webbings very swiftly, but has very low amount of health and deals low damage." ///The health HUD applied to the mob. var/health_hud = DATA_HUD_MEDICAL_ADVANCED -/mob/living/basic/giant_spider/nurse/Initialize(mapload) +/mob/living/basic/spider/giant/nurse/Initialize(mapload) . = ..() var/datum/atom_hud/datahud = GLOB.huds[health_hud] datahud.show_to(src) @@ -152,7 +175,7 @@ heal_brute = 25,\ heal_burn = 25,\ interaction_key = DOAFTER_SOURCE_SPIDER,\ - valid_targets_typecache = typecacheof(list(/mob/living/basic/giant_spider)),\ + valid_targets_typecache = typecacheof(list(/mob/living/basic/spider/giant)),\ action_text = "%SOURCE% begins wrapping the wounds of %TARGET%.",\ complete_text = "%SOURCE% wraps the wounds of %TARGET%.",\ ) @@ -166,7 +189,7 @@ * Tangle spiders can place down webbing in a quarter of the time that other species plus has an expanded arsenal of traps and web structures to place to benefit the nest. * Note that it can heal itself. */ -/mob/living/basic/giant_spider/tangle +/mob/living/basic/spider/giant/tangle name = "tangle spider" desc = "Furry and brown, it makes you shudder to look at it. This one has dim brown eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -179,27 +202,27 @@ health = 55 melee_damage_lower = 1 melee_damage_upper = 1 - poison_per_bite = 5 + poison_per_bite = 2.5 poison_type = /datum/reagent/toxin/acid obj_damage = 40 web_speed = 0.25 speed = 4 player_speed_modifier = -3.1 - web_type = /datum/action/cooldown/lay_web/sealer + web_type = /datum/action/cooldown/mob_cooldown/lay_web/sealer menu_description = "Support spider variant specializing in contruction to protect their brethren, but has very low amount of health and deals low damage." -/mob/living/basic/giant_spider/tangle/Initialize(mapload) +/mob/living/basic/spider/giant/tangle/Initialize(mapload) . = ..() - var/datum/action/cooldown/lay_web/solid_web/web_solid = new(src) + var/datum/action/cooldown/mob_cooldown/lay_web/solid_web/web_solid = new(src) web_solid.Grant(src) - var/datum/action/cooldown/lay_web/web_passage/passage_web = new(src) + var/datum/action/cooldown/mob_cooldown/lay_web/web_passage/passage_web = new(src) passage_web.Grant(src) - var/datum/action/cooldown/lay_web/web_spikes/spikes_web = new(src) + var/datum/action/cooldown/mob_cooldown/lay_web/web_spikes/spikes_web = new(src) spikes_web.Grant(src) - var/datum/action/cooldown/lay_web/sticky_web/web_sticky = new(src) + var/datum/action/cooldown/mob_cooldown/lay_web/sticky_web/web_sticky = new(src) web_sticky.Grant(src) AddElement(/datum/element/web_walker, /datum/movespeed_modifier/average_web) @@ -210,14 +233,14 @@ heal_time = 3 SECONDS,\ self_targetting = HEALING_TOUCH_SELF_ONLY,\ interaction_key = DOAFTER_SOURCE_SPIDER,\ - valid_targets_typecache = typecacheof(list(/mob/living/basic/giant_spider/tangle)),\ + valid_targets_typecache = typecacheof(list(/mob/living/basic/spider/growing/young/tangle, /mob/living/basic/spider/giant/tangle)),\ extra_checks = CALLBACK(src, PROC_REF(can_mend)),\ action_text = "%SOURCE% begins mending themselves...",\ complete_text = "%SOURCE%'s wounds mend together.",\ ) /// Prevent you from healing other tangle spiders, or healing when on fire -/mob/living/basic/giant_spider/tangle/proc/can_mend(mob/living/source, mob/living/target) +/mob/living/basic/spider/giant/tangle/proc/can_mend(mob/living/source, mob/living/target) if (on_fire) balloon_alert(src, "on fire!") return FALSE @@ -229,7 +252,7 @@ * A subtype of the giant spider which specializes in pure strength and staying power. * Is slowed down when not on webbing, but can lunge to throw off attackers and possibly to stun them. */ -/mob/living/basic/giant_spider/tarantula +/mob/living/basic/spider/giant/tarantula name = "tarantula" desc = "Furry and black, it makes you shudder to look at it. This one has abyssal red eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -247,17 +270,17 @@ mob_size = MOB_SIZE_LARGE gold_core_spawnable = NO_SPAWN web_speed = 0.7 - web_type = /datum/action/cooldown/lay_web/sealer + web_type = /datum/action/cooldown/mob_cooldown/lay_web/sealer menu_description = "Tank spider variant with an enormous amount of health and damage, but is very slow when not on webbing. It also has a charge ability to close distance with a target after a small windup." /// Charging ability var/datum/action/cooldown/mob_cooldown/charge/basic_charge/charge -/mob/living/basic/giant_spider/tarantula/Initialize(mapload) +/mob/living/basic/spider/giant/tarantula/Initialize(mapload) . = ..() - var/datum/action/cooldown/lay_web/solid_web/web_solid = new(src) + var/datum/action/cooldown/mob_cooldown/lay_web/solid_web/web_solid = new(src) web_solid.Grant(src) - var/datum/action/cooldown/lay_web/web_passage/passage_web = new(src) + var/datum/action/cooldown/mob_cooldown/lay_web/web_passage/passage_web = new(src) passage_web.Grant(src) charge = new /datum/action/cooldown/mob_cooldown/charge/basic_charge() @@ -266,12 +289,12 @@ AddElement(/datum/element/tear_wall) AddElement(/datum/element/web_walker, /datum/movespeed_modifier/slow_web) -/mob/living/basic/giant_spider/tarantula/Destroy() +/mob/living/basic/spider/giant/tarantula/Destroy() QDEL_NULL(charge) return ..() /// Lunge if you click something at range -/mob/living/basic/giant_spider/tarantula/ranged_secondary_attack(atom/atom_target, modifiers) +/mob/living/basic/spider/giant/tarantula/ranged_secondary_attack(atom/atom_target, modifiers) charge.Trigger(target = atom_target) /** @@ -280,7 +303,7 @@ * A subtype of the giant spider which specializes in speed and poison. * Injects a deadlier toxin than other spiders, moves extremely fast, but has a limited amount of health. */ -/mob/living/basic/giant_spider/viper +/mob/living/basic/spider/giant/viper name = "viper spider" desc = "Furry and black, it makes you shudder to look at it. This one has effervescent purple eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -298,7 +321,7 @@ gold_core_spawnable = NO_SPAWN menu_description = "Assassin spider variant with an unmatched speed and very deadly poison, but has very low amount of health and damage." -/mob/living/basic/giant_spider/viper/Initialize(mapload) +/mob/living/basic/spider/giant/viper/Initialize(mapload) . = ..() AddElement(/datum/element/bonus_damage) @@ -314,7 +337,7 @@ * After consuming human bodies can lay specialised eggs including more broodmothers. * They are also capable of sending messages to all living spiders and setting directives for their children. */ -/mob/living/basic/giant_spider/midwife +/mob/living/basic/spider/giant/midwife name = "broodmother spider" desc = "Furry and black, it makes you shudder to look at it. This one has scintillating green eyes. Might also be hiding a real knife somewhere." gender = FEMALE @@ -330,36 +353,36 @@ player_speed_modifier = -3.1 gold_core_spawnable = NO_SPAWN web_speed = 0.5 - web_type = /datum/action/cooldown/lay_web/sealer + web_type = /datum/action/cooldown/mob_cooldown/lay_web/sealer menu_description = "Royal spider variant specializing in reproduction and leadership, deals low damage." -/mob/living/basic/giant_spider/midwife/Initialize(mapload) +/mob/living/basic/spider/giant/midwife/Initialize(mapload) . = ..() - var/datum/action/cooldown/lay_web/solid_web/web_solid = new(src) + var/datum/action/cooldown/mob_cooldown/lay_web/solid_web/web_solid = new(src) web_solid.Grant(src) - var/datum/action/cooldown/lay_web/web_passage/passage_web = new(src) + var/datum/action/cooldown/mob_cooldown/lay_web/web_passage/passage_web = new(src) passage_web.Grant(src) - var/datum/action/cooldown/lay_web/web_spikes/spikes_web = new(src) + var/datum/action/cooldown/mob_cooldown/lay_web/web_spikes/spikes_web = new(src) spikes_web.Grant(src) - var/datum/action/cooldown/lay_web/sticky_web/web_sticky = new(src) + var/datum/action/cooldown/mob_cooldown/lay_web/sticky_web/web_sticky = new(src) web_sticky.Grant(src) - var/datum/action/cooldown/wrap/wrapping = new(src) + var/datum/action/cooldown/mob_cooldown/wrap/wrapping = new(src) wrapping.Grant(src) - var/datum/action/lay_eggs/make_eggs = new(src) + var/datum/action/cooldown/mob_cooldown/lay_eggs/make_eggs = new(src) make_eggs.Grant(src) - var/datum/action/lay_eggs/enriched/make_better_eggs = new(src) + var/datum/action/cooldown/mob_cooldown/lay_eggs/enriched/make_better_eggs = new(src) make_better_eggs.Grant(src) - var/datum/action/set_spider_directive/give_orders = new(src) + var/datum/action/cooldown/mob_cooldown/set_spider_directive/give_orders = new(src) give_orders.Grant(src) - var/datum/action/command_spiders/not_hivemind_talk = new(src) + var/datum/action/cooldown/mob_cooldown/command_spiders/not_hivemind_talk = new(src) not_hivemind_talk.Grant(src) AddElement(/datum/element/web_walker, /datum/movespeed_modifier/average_web) @@ -370,7 +393,7 @@ * A subtype of the giant spider which is immune to temperature damage, unlike its normal counterpart. * Currently unused in the game unless spawned by admins. */ -/mob/living/basic/giant_spider/ice +/mob/living/basic/spider/giant/ice name = "giant ice spider" habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minimum_survivable_temperature = 0 @@ -384,7 +407,7 @@ * * A temperature-proof nurse spider. Also unused. */ -/mob/living/basic/giant_spider/nurse/ice +/mob/living/basic/spider/giant/nurse/ice name = "giant ice spider" habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minimum_survivable_temperature = 0 @@ -398,7 +421,7 @@ * * A temperature-proof hunter with chilling venom. Also unused. */ -/mob/living/basic/giant_spider/hunter/ice +/mob/living/basic/spider/giant/hunter/ice name = "giant ice spider" habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minimum_survivable_temperature = 0 @@ -414,7 +437,7 @@ * A hunter spider that trades damage for health, unable to smash enviroments. * Used as a minor threat in abandoned places, such as areas in maintenance or a ruin. */ -/mob/living/basic/giant_spider/hunter/scrawny +/mob/living/basic/spider/giant/hunter/scrawny name = "scrawny spider" health = 60 maxHealth = 60 @@ -430,7 +453,7 @@ * A weaker version of the Tarantula, unable to smash enviroments. * Used as a moderately strong but slow threat in abandoned places, such as areas in maintenance or a ruin. */ -/mob/living/basic/giant_spider/tarantula/scrawny +/mob/living/basic/spider/giant/tarantula/scrawny name = "scrawny tarantula" health = 150 maxHealth = 150 @@ -447,7 +470,7 @@ * Mainly used as a weak threat in abandoned places, such as areas in maintenance or a ruin. * In the future we should give this AI so that it actually heals its teammates. */ -/mob/living/basic/giant_spider/nurse/scrawny +/mob/living/basic/spider/giant/nurse/scrawny name = "scrawny nurse spider" health = 30 maxHealth = 30 @@ -462,7 +485,7 @@ * Has the base stats of a hunter, but they can heal themselves and spin webs faster. * They also occasionally leave puddles of blood when they walk around. Flavorful! */ -/mob/living/basic/giant_spider/hunter/flesh +/mob/living/basic/spider/giant/hunter/flesh name = "flesh spider" desc = "A odd fleshy creature in the shape of a spider. Its eyes are pitch black and soulless." icon = 'icons/mob/simple/arachnoid.dmi' @@ -474,7 +497,7 @@ health = 90 menu_description = "Self-sufficient spider variant capable of healing themselves and producing webbbing fast." -/mob/living/basic/giant_spider/hunter/flesh/Initialize(mapload) +/mob/living/basic/spider/giant/hunter/flesh/Initialize(mapload) . = ..() AddComponent(/datum/component/blood_walk, \ blood_type = /obj/effect/decal/cleanable/blood/bubblegum, \ @@ -485,20 +508,20 @@ heal_burn = 45,\ self_targetting = HEALING_TOUCH_SELF_ONLY,\ interaction_key = DOAFTER_SOURCE_SPIDER,\ - valid_targets_typecache = typecacheof(list(/mob/living/basic/giant_spider/hunter/flesh)),\ + valid_targets_typecache = typecacheof(list(/mob/living/basic/spider/giant/hunter/flesh)),\ extra_checks = CALLBACK(src, PROC_REF(can_mend)),\ action_text = "%SOURCE% begins mending themselves...",\ complete_text = "%SOURCE%'s wounds mend together.",\ ) - var/datum/action/cooldown/lay_web/web_spikes/spikes_web = new(src) + var/datum/action/cooldown/mob_cooldown/lay_web/web_spikes/spikes_web = new(src) spikes_web.Grant(src) - var/datum/action/cooldown/lay_web/sticky_web/web_sticky = new(src) + var/datum/action/cooldown/mob_cooldown/lay_web/sticky_web/web_sticky = new(src) web_sticky.Grant(src) /// Prevent you from healing other flesh spiders, or healing when on fire -/mob/living/basic/giant_spider/hunter/flesh/proc/can_mend(mob/living/source, mob/living/target) +/mob/living/basic/spider/giant/hunter/flesh/proc/can_mend(mob/living/source, mob/living/target) if (on_fire) balloon_alert(src, "on fire!") return FALSE @@ -509,7 +532,7 @@ * * A spider form for wizards. Has the viper spider's extreme speed and strong venom, with additional health and vent crawling abilities. */ -/mob/living/basic/giant_spider/viper/wizard +/mob/living/basic/spider/giant/viper/wizard name = "water spider" desc = "Furry and black, it makes you shudder to look at it. This one has effervescent orange eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -525,14 +548,14 @@ menu_description = "Stronger assassin spider variant with an unmatched speed, high amount of health and very deadly poison, but deals very low amount of damage. It also has ability to ventcrawl." apply_spider_antag = FALSE -/mob/living/basic/giant_spider/viper/wizard/Initialize(mapload) +/mob/living/basic/spider/giant/viper/wizard/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - var/datum/action/cooldown/lay_web/web_spikes/spikes_web = new(src) + var/datum/action/cooldown/mob_cooldown/lay_web/web_spikes/spikes_web = new(src) spikes_web.Grant(src) - var/datum/action/cooldown/lay_web/sticky_web/web_sticky = new(src) + var/datum/action/cooldown/mob_cooldown/lay_web/sticky_web/web_sticky = new(src) web_sticky.Grant(src) @@ -541,7 +564,7 @@ * * This friendly arachnid hangs out in the HoS office on some space stations. Better trained than an average officer and does not attack except in self-defence. */ -/mob/living/basic/giant_spider/sgt_araneus +/mob/living/basic/spider/giant/sgt_araneus name = "Sergeant Araneus" real_name = "Sergeant Araneus" desc = "A fierce companion of the Head of Security, this spider has been carefully trained by Nanotrasen specialists. Its beady, staring eyes send shivers down your spine." @@ -554,48 +577,8 @@ ai_controller = /datum/ai_controller/basic_controller/giant_spider/retaliate apply_spider_antag = FALSE -/mob/living/basic/giant_spider/sgt_araneus/Initialize(mapload) +/mob/living/basic/spider/giant/sgt_araneus/Initialize(mapload) . = ..() AddElement(/datum/element/pet_bonus, "chitters proudly!") AddElement(/datum/element/ai_retaliate) ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - -/** - * ### Duct Spider - * - * A less giant spider which lives in the maintenance ducts and makes them annoying to traverse. - */ -/mob/living/basic/giant_spider/maintenance - name = "duct spider" - desc = "Nanotrasen's imported solution to mice, comes with its own problems." - icon = 'icons/mob/simple/arachnoid.dmi' - icon_state = "maint_spider" - icon_living = "maint_spider" - icon_dead = "maint_spider_dead" - can_be_held = TRUE - mob_size = MOB_SIZE_TINY - held_w_class = WEIGHT_CLASS_TINY - worn_slot_flags = ITEM_SLOT_HEAD - head_icon = 'icons/mob/clothing/head/pets_head.dmi' - density = FALSE - pass_flags = PASSTABLE|PASSGRILLE|PASSMOB - gold_core_spawnable = FRIENDLY_SPAWN - maxHealth = 10 - health = 10 - melee_damage_lower = 1 - melee_damage_upper = 1 - speed = 0 - player_speed_modifier = 0 - web_speed = 0.25 - menu_description = "Fragile spider variant which is not good for much other than laying webs." - response_harm_continuous = "splats" - response_harm_simple = "splat" - ai_controller = /datum/ai_controller/basic_controller/giant_spider/pest - apply_spider_antag = FALSE - -/mob/living/basic/giant_spider/maintenance/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - AddElement(/datum/element/web_walker, /datum/movespeed_modifier/average_web) - AddElement(/datum/element/ai_retaliate) - AddElement(/datum/element/tiny_mob_hunter) diff --git a/code/modules/mob/living/basic/space_fauna/spider/spider.dm b/code/modules/mob/living/basic/space_fauna/spider/spider.dm new file mode 100644 index 00000000000..e96482439f9 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/spider/spider.dm @@ -0,0 +1,176 @@ +/** + * Base type of various spider life stages + */ +/mob/living/basic/spider + name = "abstract spider" + desc = "Furry and abstract, it makes you shudder to look at it. This one should not exist." + icon = 'icons/mob/simple/arachnoid.dmi' + mob_biotypes = MOB_ORGANIC|MOB_BUG + speak_emote = list("chitters") + butcher_results = list(/obj/item/food/meat/slab/spider = 2, /obj/item/food/spiderleg = 8) + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + initial_language_holder = /datum/language_holder/spider + damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1) + basic_mob_flags = FLAMMABLE_MOB + status_flags = NONE + unsuitable_cold_damage = 4 + unsuitable_heat_damage = 4 + combat_mode = TRUE + faction = list(FACTION_SPIDER) + pass_flags = PASSTABLE + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + attack_sound = 'sound/weapons/bite.ogg' + attack_vis_effect = ATTACK_EFFECT_BITE + unique_name = TRUE + lighting_cutoff_red = 22 + lighting_cutoff_green = 5 + lighting_cutoff_blue = 5 + /// Speed modifier to apply if controlled by a human player + var/player_speed_modifier = -4 + /// What reagent the mob injects targets with + var/poison_type = /datum/reagent/toxin/hunterspider + /// How much of a reagent the mob injects on attack + var/poison_per_bite = 0 + /// Multiplier to apply to web laying speed. Fractional numbers make it faster, because it's a multiplier. + var/web_speed = 1 + /// Type of webbing ability to learn. + var/web_type = /datum/action/cooldown/mob_cooldown/lay_web + /// The message that the mother spider left for this spider when the egg was layed. + var/directive = "" + /// Short description of what this mob is capable of, for radial menu uses + var/menu_description = "Tanky and strong for the defense of the nest and other spiders." + /// If true then you shouldn't be told that you're a spider antagonist as soon as you are placed into this mob + var/apply_spider_antag = TRUE + +/mob/living/basic/spider/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_WEB_SURFER, INNATE_TRAIT) + AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW) + AddElement(/datum/element/nerfed_pulling, GLOB.typecache_general_bad_things_to_easily_move) + AddElement(/datum/element/prevent_attacking_of_types, GLOB.typecache_general_bad_hostile_attack_targets, "this tastes awful!") + AddElement(/datum/element/cliff_walking) + + if(poison_per_bite) + AddElement(/datum/element/venomous, poison_type, poison_per_bite) + + var/datum/action/cooldown/mob_cooldown/lay_web/webbing = new web_type(src) + webbing.webbing_time *= web_speed + webbing.Grant(src) + ai_controller?.set_blackboard_key(BB_SPIDER_WEB_ACTION, webbing) + +/mob/living/basic/spider/Login() + . = ..() + if(!. || !client) + return FALSE + GLOB.spidermobs[src] = TRUE + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/player_spider_modifier, multiplicative_slowdown = player_speed_modifier) + +/mob/living/basic/spider/Logout() + . = ..() + remove_movespeed_modifier(/datum/movespeed_modifier/player_spider_modifier) + +/mob/living/basic/spider/Destroy() + GLOB.spidermobs -= src + return ..() + +/mob/living/basic/spider/mob_negates_gravity() + if(locate(/obj/structure/spider/stickyweb) in loc) + return TRUE + return ..() + +/mob/living/basic/spider/expose_reagents(list/reagents, datum/reagents/source, methods=TOUCH, volume_modifier=1, show_message=TRUE) + . = ..() + for(var/datum/reagent/toxin/pestkiller/current_reagent in reagents) + apply_damage(50 * volume_modifier, STAMINA, BODY_ZONE_CHEST) + +/// Spider which turns into another spider over time +/mob/living/basic/spider/growing + /// The mob type we will grow into. + var/mob/living/basic/spider/grow_as = null + /// The time it takes for the spider to grow into the next stage + var/spider_growth_time = 1 MINUTES + +/mob/living/basic/spider/growing/Initialize(mapload) + . = ..() + AddComponent(\ + /datum/component/growth_and_differentiation,\ + growth_time = spider_growth_time,\ + growth_path = grow_as,\ + growth_probability = 25,\ + lower_growth_value = 1,\ + upper_growth_value = 2,\ + optional_checks = CALLBACK(src, PROC_REF(ready_to_grow)),\ + optional_grow_behavior = CALLBACK(src, PROC_REF(grow_up))\ + ) + +/** + * Checks to see if we're ready to grow, primarily if we are on solid ground and not in a vent or something. + * The component will automagically grow us when we return TRUE and that threshold has been met. + */ +/mob/living/basic/spider/growing/proc/ready_to_grow() + if(isturf(loc)) + return TRUE + + return FALSE + +/// Actually grows the young spider into a giant spider. We have to do a bunch of unique behavior that really can't be genericized, so we have to override the component in this manner. +/** + * Actually move to our next stage of life. + */ +/mob/living/basic/spider/growing/proc/grow_up() + if(isnull(grow_as)) + if(prob(3)) + grow_as = pick(/mob/living/basic/spider/giant/tarantula, /mob/living/basic/spider/giant/viper, /mob/living/basic/spider/giant/midwife) + else + grow_as = pick(/mob/living/basic/spider/giant/guard, /mob/living/basic/spider/giant/ambush, /mob/living/basic/spider/giant/hunter, /mob/living/basic/spider/giant/scout, /mob/living/basic/spider/giant/nurse, /mob/living/basic/spider/giant/tangle) + + var/mob/living/basic/spider/giant/grown = change_mob_type(grow_as, get_turf(src), initial(grow_as.name)) + ADD_TRAIT(grown, TRAIT_WAS_EVOLVED, REF(src)) + grown.faction = faction.Copy() + grown.directive = directive + grown.set_name() + grown.setBruteLoss(getBruteLoss()) + grown.setFireLoss(getFireLoss()) + qdel(src) + +/** + * ### Duct Spider + * A less than giant spider which lives in the maintenance ducts and makes them annoying to traverse. + */ +/mob/living/basic/spider/maintenance + name = "duct spider" + desc = "Nanotrasen's imported solution to mice, comes with its own problems." + icon_state = "maint_spider" + icon_living = "maint_spider" + icon_dead = "maint_spider_dead" + can_be_held = TRUE + mob_size = MOB_SIZE_TINY + held_w_class = WEIGHT_CLASS_TINY + worn_slot_flags = ITEM_SLOT_HEAD + head_icon = 'icons/mob/clothing/head/pets_head.dmi' + density = FALSE + pass_flags = PASSTABLE|PASSGRILLE|PASSMOB + gold_core_spawnable = FRIENDLY_SPAWN + maxHealth = 10 + health = 10 + melee_damage_lower = 1 + melee_damage_upper = 1 + speed = 0 + player_speed_modifier = 0 + web_speed = 0.25 + menu_description = "Fragile spider variant which is not good for much other than laying webs." + response_harm_continuous = "splats" + response_harm_simple = "splat" + ai_controller = /datum/ai_controller/basic_controller/giant_spider/pest + apply_spider_antag = FALSE + +/mob/living/basic/spider/maintenance/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + AddElement(/datum/element/web_walker, /datum/movespeed_modifier/average_web) + AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/tiny_mob_hunter) diff --git a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/hivemind.dm b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/hivemind.dm index 77ee38ed7c3..bbeb2b28bb5 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/hivemind.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/hivemind.dm @@ -2,7 +2,7 @@ * Sets a directive to be given to all future spiders created by the user. * This will be overwritten if used again. */ -/datum/action/set_spider_directive +/datum/action/cooldown/mob_cooldown/set_spider_directive name = "Set Directive" desc = "Set a directive for your future children to follow." button_icon = 'icons/mob/actions/actions_animal.dmi' @@ -10,26 +10,27 @@ background_icon_state = "bg_alien" overlay_icon_state = "bg_alien_border" check_flags = AB_CHECK_CONSCIOUS + cooldown_time = 0 + melee_cooldown_time = 0 + shared_cooldown = NONE + click_to_activate = FALSE /// Current directive to apply var/current_directive = "" -/datum/action/set_spider_directive/Trigger(trigger_flags) - . = ..() - if(!.) - return +/datum/action/cooldown/mob_cooldown/set_spider_directive/Activate(atom/target) var/new_directive = tgui_input_text(owner, "Enter the new directive", "Create directive", "[current_directive]") if(isnull(new_directive) || QDELETED(src) || QDELETED(owner) || !IsAvailable(feedback = TRUE)) - return FALSE + return current_directive = new_directive message_admins("[ADMIN_LOOKUPFLW(owner)] set its directive to: '[current_directive]'.") owner.log_message("set its directive to: '[current_directive]'.", LOG_GAME) - return TRUE + StartCooldown() /** * Sends a message to all currently living spiders. */ -/datum/action/command_spiders +/datum/action/cooldown/mob_cooldown/command_spiders name = "Command" desc = "Send a command to all living spiders." button_icon = 'icons/mob/actions/actions_animal.dmi' @@ -37,18 +38,17 @@ background_icon_state = "bg_alien" overlay_icon_state = "bg_alien_border" check_flags = AB_CHECK_CONSCIOUS + cooldown_time = 0 + melee_cooldown_time = 0 + shared_cooldown = NONE + click_to_activate = FALSE -/datum/action/command_spiders/Trigger(trigger_flags) - . = ..() - if(!.) - return - +/datum/action/cooldown/mob_cooldown/command_spiders/Activate(trigger_flags) var/input = tgui_input_text(owner, "Input a command for your legions to follow.", "Command") if(!input || QDELETED(src) || QDELETED(owner) || !IsAvailable(feedback = TRUE)) - return FALSE - + return spider_command(owner, input) - return TRUE + StartCooldown() /** * Sends a big message to all spiders from the target. @@ -58,9 +58,7 @@ * * user - The spider sending the message * * message - The message to be sent */ -/datum/action/command_spiders/proc/spider_command(mob/living/user, message) - if(!message) - return +/datum/action/cooldown/mob_cooldown/command_spiders/proc/spider_command(mob/living/user, message) var/my_message = format_message(user,message) for(var/mob/living/basic/spider as anything in GLOB.spidermobs) to_chat(spider, my_message) @@ -72,17 +70,17 @@ /** * Formats the string to have an appropiate size and text color */ -/datum/action/command_spiders/proc/format_message(mob/living/user, message) +/datum/action/cooldown/mob_cooldown/command_spiders/proc/format_message(mob/living/user, message) return span_spiderbroodmother("Command from [user]: [message]") /** * Sends a small message to all currently living spiders. */ -/datum/action/command_spiders/communication_spiders +/datum/action/cooldown/mob_cooldown/command_spiders/communication_spiders name = "Communication" desc = "Send a report to all living spiders." button_icon = 'icons/mob/actions/actions_animal.dmi' button_icon_state = "message" -/datum/action/command_spiders/communication_spiders/format_message(mob/living/user, message) +/datum/action/cooldown/mob_cooldown/command_spiders/communication_spiders/format_message(mob/living/user, message) return span_spiderscout("Report from [user]: [message]") diff --git a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/lay_eggs.dm b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/lay_eggs.dm index cd86a93f75d..28a543be3ac 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/lay_eggs.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/lay_eggs.dm @@ -1,4 +1,4 @@ -/datum/action/lay_eggs +/datum/action/cooldown/mob_cooldown/lay_eggs name = "Lay Eggs" desc = "Lay a cluster of eggs, which will soon grow into a normal spider." button_icon = 'icons/mob/actions/actions_animal.dmi' @@ -6,22 +6,26 @@ background_icon_state = "bg_alien" overlay_icon_state = "bg_alien_border" check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED + cooldown_time = 0 + melee_cooldown_time = 0 + shared_cooldown = NONE + click_to_activate = FALSE ///How long it takes for a broodmother to lay eggs. var/egg_lay_time = 4 SECONDS ///The type of egg we create var/egg_type = /obj/effect/mob_spawn/ghost_role/spider -/datum/action/lay_eggs/Grant(mob/grant_to) +/datum/action/cooldown/mob_cooldown/lay_eggs/Grant(mob/grant_to) . = ..() if (!owner) return RegisterSignals(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_DO_AFTER_BEGAN, COMSIG_DO_AFTER_ENDED), PROC_REF(update_status_on_signal)) -/datum/action/lay_eggs/Remove(mob/removed_from) +/datum/action/cooldown/mob_cooldown/lay_eggs/Remove(mob/removed_from) . = ..() UnregisterSignal(removed_from, list(COMSIG_MOVABLE_MOVED, COMSIG_DO_AFTER_BEGAN, COMSIG_DO_AFTER_ENDED)) -/datum/action/lay_eggs/IsAvailable(feedback = FALSE) +/datum/action/cooldown/mob_cooldown/lay_eggs/IsAvailable(feedback = FALSE) . = ..() if(!.) return FALSE @@ -36,30 +40,28 @@ return FALSE return TRUE -/datum/action/lay_eggs/Trigger(trigger_flags) - . = ..() - if (!.) - return - +/datum/action/cooldown/mob_cooldown/lay_eggs/Activate(atom/target) owner.balloon_alert_to_viewers("laying eggs...") - if(do_after(owner, egg_lay_time, target = get_turf(owner), interaction_key = DOAFTER_SOURCE_SPIDER)) - var/obj/structure/spider/eggcluster/eggs = locate() in get_turf(owner) - if(eggs) - owner.balloon_alert(owner, "already eggs here!") - else - lay_egg() - else + StartCooldown(360 SECONDS, 360 SECONDS) + if(!do_after(owner, egg_lay_time, target = get_turf(owner), interaction_key = DOAFTER_SOURCE_SPIDER)) owner.balloon_alert(owner, "interrupted!") - build_all_button_icons(UPDATE_BUTTON_STATUS) + StartCooldown(0 SECONDS) + return + var/obj/structure/spider/eggcluster/eggs = locate() in get_turf(owner) + if(eggs) + owner.balloon_alert(owner, "already eggs here!") + else + lay_egg() + StartCooldown() -/datum/action/lay_eggs/proc/lay_egg() +/datum/action/cooldown/mob_cooldown/lay_eggs/proc/lay_egg() var/obj/effect/mob_spawn/ghost_role/spider/new_eggs = new egg_type(get_turf(owner)) new_eggs.faction = owner.faction - var/datum/action/set_spider_directive/spider_directive = locate() in owner.actions + var/datum/action/cooldown/mob_cooldown/set_spider_directive/spider_directive = locate() in owner.actions if (spider_directive) new_eggs.directive = spider_directive.current_directive -/datum/action/lay_eggs/enriched +/datum/action/cooldown/mob_cooldown/lay_eggs/enriched name = "Lay Enriched Eggs" desc = "Lay a cluster of eggs, which will soon grow into a greater spider. Requires you drain a human per cluster of these eggs." button_icon_state = "lay_enriched_eggs" @@ -67,7 +69,7 @@ /// How many charges we have to make eggs var/charges = 0 -/datum/action/lay_eggs/enriched/IsAvailable(feedback = FALSE) +/datum/action/cooldown/mob_cooldown/lay_eggs/enriched/IsAvailable(feedback = FALSE) . = ..() if (!.) return FALSE @@ -77,6 +79,6 @@ return FALSE return TRUE -/datum/action/lay_eggs/enriched/lay_egg() +/datum/action/cooldown/mob_cooldown/lay_eggs/enriched/lay_egg() charges-- return ..() diff --git a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/web.dm b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/web.dm index 8c061f02907..b7062a2dc17 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/web.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/web.dm @@ -1,5 +1,5 @@ /// Make a sticky web under yourself for area fortification -/datum/action/cooldown/lay_web +/datum/action/cooldown/mob_cooldown/lay_web name = "Spin Web" desc = "Spin a web to slow down potential prey." button_icon = 'icons/mob/actions/actions_animal.dmi' @@ -9,20 +9,22 @@ check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED cooldown_time = 0 SECONDS melee_cooldown_time = 0 + shared_cooldown = NONE + click_to_activate = FALSE /// How long it takes to lay a web var/webbing_time = 4 SECONDS -/datum/action/cooldown/lay_web/Grant(mob/grant_to) +/datum/action/cooldown/mob_cooldown/lay_web/Grant(mob/grant_to) . = ..() if (!owner) return RegisterSignals(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_DO_AFTER_BEGAN, COMSIG_DO_AFTER_ENDED), PROC_REF(update_status_on_signal)) -/datum/action/cooldown/lay_web/Remove(mob/removed_from) +/datum/action/cooldown/mob_cooldown/lay_web/Remove(mob/removed_from) . = ..() UnregisterSignal(removed_from, list(COMSIG_MOVABLE_MOVED, COMSIG_DO_AFTER_BEGAN, COMSIG_DO_AFTER_ENDED)) -/datum/action/cooldown/lay_web/IsAvailable(feedback = FALSE) +/datum/action/cooldown/mob_cooldown/lay_web/IsAvailable(feedback = FALSE) . = ..() if(!.) return FALSE @@ -45,10 +47,10 @@ return TRUE /// Returns true if there's a web we can't put stuff on in our turf -/datum/action/cooldown/lay_web/proc/obstructed_by_other_web() +/datum/action/cooldown/mob_cooldown/lay_web/proc/obstructed_by_other_web() return !!(locate(/obj/structure/spider/stickyweb) in get_turf(owner)) -/datum/action/cooldown/lay_web/Activate() +/datum/action/cooldown/mob_cooldown/lay_web/Activate() . = ..() var/turf/spider_turf = get_turf(owner) var/obj/structure/spider/stickyweb/web = locate() in spider_turf @@ -65,86 +67,86 @@ build_all_button_icons() /// Creates a web in the current turf -/datum/action/cooldown/lay_web/proc/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) +/datum/action/cooldown/mob_cooldown/lay_web/proc/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) new /obj/structure/spider/stickyweb(target_turf) /// Variant for genetics, created webs only allow the creator passage -/datum/action/cooldown/lay_web/genetic +/datum/action/cooldown/mob_cooldown/lay_web/genetic desc = "Spin a web. Only you will be able to traverse your web easily." cooldown_time = 4 SECONDS //the same time to lay a web -/datum/action/cooldown/lay_web/genetic/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) +/datum/action/cooldown/mob_cooldown/lay_web/genetic/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) new /obj/structure/spider/stickyweb/genetic(target_turf, owner) /// Variant which allows webs to be stacked into walls -/datum/action/cooldown/lay_web/sealer +/datum/action/cooldown/mob_cooldown/lay_web/sealer desc = "Spin a web to slow down potential prey. Webs can be stacked to make solid structures." -/datum/action/cooldown/lay_web/sealer/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) +/datum/action/cooldown/mob_cooldown/lay_web/sealer/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) if (existing_web) qdel(existing_web) new /obj/structure/spider/stickyweb/sealed(target_turf) return new /obj/structure/spider/stickyweb(target_turf) -/datum/action/cooldown/lay_web/sealer/obstructed_by_other_web() +/datum/action/cooldown/mob_cooldown/lay_web/sealer/obstructed_by_other_web() return !!(locate(/obj/structure/spider/stickyweb/sealed) in get_turf(owner)) -/datum/action/cooldown/lay_web/solid_web +/datum/action/cooldown/mob_cooldown/lay_web/solid_web name = "Spin Solid Web" desc = "Spin a web to obstruct potential prey." button_icon_state = "lay_solid_web" cooldown_time = 0 SECONDS webbing_time = 5 SECONDS -/datum/action/cooldown/lay_web/solid_web/obstructed_by_other_web() +/datum/action/cooldown/mob_cooldown/lay_web/solid_web/obstructed_by_other_web() return !!(locate(/obj/structure/spider/solid) in get_turf(owner)) -/datum/action/cooldown/lay_web/solid_web/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) +/datum/action/cooldown/mob_cooldown/lay_web/solid_web/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) new /obj/structure/spider/solid(target_turf) -/datum/action/cooldown/lay_web/web_passage +/datum/action/cooldown/mob_cooldown/lay_web/web_passage name = "Spin Web Passage" desc = "Spin a web passage to hide the nest from prey view." button_icon_state = "lay_web_passage" cooldown_time = 0 SECONDS webbing_time = 4 SECONDS -/datum/action/cooldown/lay_web/web_passage/obstructed_by_other_web() +/datum/action/cooldown/mob_cooldown/lay_web/web_passage/obstructed_by_other_web() return !!(locate(/obj/structure/spider/passage) in get_turf(owner)) -/datum/action/cooldown/lay_web/web_passage/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) +/datum/action/cooldown/mob_cooldown/lay_web/web_passage/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) new /obj/structure/spider/passage(target_turf) -/datum/action/cooldown/lay_web/sticky_web +/datum/action/cooldown/mob_cooldown/lay_web/sticky_web name = "Spin Sticky Web" desc = "Spin a sticky web to trap intruders." button_icon_state = "lay_sticky_web" cooldown_time = 20 SECONDS webbing_time = 3 SECONDS -/datum/action/cooldown/lay_web/sticky_web/obstructed_by_other_web() +/datum/action/cooldown/mob_cooldown/lay_web/sticky_web/obstructed_by_other_web() return !!(locate(/obj/structure/spider/sticky) in get_turf(owner)) -/datum/action/cooldown/lay_web/sticky_web/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) +/datum/action/cooldown/mob_cooldown/lay_web/sticky_web/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) new /obj/structure/spider/sticky(target_turf) -/datum/action/cooldown/lay_web/web_spikes +/datum/action/cooldown/mob_cooldown/lay_web/web_spikes name = "Spin Web Spikes" desc = "Extrude silk spikes to dissuade invaders." button_icon_state = "lay_web_spikes" cooldown_time = 40 SECONDS webbing_time = 3 SECONDS -/datum/action/cooldown/lay_web/web_spikes/obstructed_by_other_web() +/datum/action/cooldown/mob_cooldown/lay_web/web_spikes/obstructed_by_other_web() return !!(locate(/obj/structure/spider/spikes) in get_turf(owner)) -/datum/action/cooldown/lay_web/web_spikes/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) +/datum/action/cooldown/mob_cooldown/lay_web/web_spikes/plant_web(turf/target_turf, obj/structure/spider/stickyweb/existing_web) new /obj/structure/spider/spikes(target_turf) /// Makes a solid statue which you can use as cover -/datum/action/cooldown/web_effigy +/datum/action/cooldown/mob_cooldown/web_effigy name = "Web Effigy" desc = "Shed durable webbing in the shape of your body. It is intimidating and can obstruct attackers. \ It will decay after some time." @@ -154,8 +156,10 @@ overlay_icon_state = "bg_alien_border" cooldown_time = 60 SECONDS melee_cooldown_time = 0 + shared_cooldown = NONE + click_to_activate = FALSE -/datum/action/cooldown/web_effigy/IsAvailable(feedback = FALSE) +/datum/action/cooldown/mob_cooldown/web_effigy/IsAvailable(feedback = FALSE) . = ..() if(!.) return FALSE @@ -165,6 +169,6 @@ return FALSE return TRUE -/datum/action/cooldown/web_effigy/Activate() +/datum/action/cooldown/mob_cooldown/web_effigy/Activate() new /obj/structure/spider/effigy(get_turf(owner)) return ..() diff --git a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/web_sneak.dm b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/web_sneak.dm index adee0bb0ca0..a70a2c2c5d8 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/web_sneak.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/web_sneak.dm @@ -1,5 +1,5 @@ -/datum/action/cooldown/sneak/spider - name = "Sneak" +/datum/action/cooldown/mob_cooldown/sneak/spider + name = "Ambush Spider Sneak" desc = "Blend into the webs to stalk your prey." button_icon = 'icons/mob/actions/actions_animal.dmi' button_icon_state = "web_sneak" diff --git a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/wrap.dm b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/wrap.dm index 2c49f5747c7..536f09cef8d 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/wrap.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/wrap.dm @@ -1,4 +1,4 @@ -/datum/action/cooldown/wrap +/datum/action/cooldown/mob_cooldown/wrap name = "Wrap" desc = "Wrap something or someone in a cocoon. \ If it's a human or similar species, you'll also consume them. \ @@ -11,20 +11,21 @@ check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED click_to_activate = TRUE ranged_mousepointer = 'icons/effects/mouse_pointers/wrap_target.dmi' + shared_cooldown = NONE /// The time it takes to wrap something. var/wrap_time = 5 SECONDS -/datum/action/cooldown/wrap/Grant(mob/grant_to) +/datum/action/cooldown/mob_cooldown/wrap/Grant(mob/grant_to) . = ..() if (!owner) return RegisterSignals(owner, list(COMSIG_DO_AFTER_BEGAN, COMSIG_DO_AFTER_ENDED), PROC_REF(update_status_on_signal)) -/datum/action/cooldown/wrap/Remove(mob/removed_from) +/datum/action/cooldown/mob_cooldown/wrap/Remove(mob/removed_from) . = ..() UnregisterSignal(removed_from, list(COMSIG_DO_AFTER_BEGAN, COMSIG_DO_AFTER_ENDED)) -/datum/action/cooldown/wrap/IsAvailable(feedback = FALSE) +/datum/action/cooldown/mob_cooldown/wrap/IsAvailable(feedback = FALSE) . = ..() if(!. || owner.incapacitated()) return FALSE @@ -34,7 +35,7 @@ return FALSE return TRUE -/datum/action/cooldown/wrap/set_click_ability(mob/on_who) +/datum/action/cooldown/mob_cooldown/wrap/set_click_ability(mob/on_who) . = ..() if(!.) return @@ -43,7 +44,7 @@ button_icon_state = "wrap_1" build_all_button_icons() -/datum/action/cooldown/wrap/unset_click_ability(mob/on_who, refund_cooldown = TRUE) +/datum/action/cooldown/mob_cooldown/wrap/unset_click_ability(mob/on_who, refund_cooldown = TRUE) . = ..() if(!.) return @@ -53,7 +54,7 @@ button_icon_state = "wrap_0" build_all_button_icons() -/datum/action/cooldown/wrap/Activate(atom/to_wrap) +/datum/action/cooldown/mob_cooldown/wrap/Activate(atom/to_wrap) if(!owner.Adjacent(to_wrap)) owner.balloon_alert(owner, "must be closer!") return FALSE @@ -73,7 +74,7 @@ INVOKE_ASYNC(src, PROC_REF(cocoon), to_wrap) return TRUE -/datum/action/cooldown/wrap/proc/cocoon(atom/movable/to_wrap) +/datum/action/cooldown/mob_cooldown/wrap/proc/cocoon(atom/movable/to_wrap) owner.visible_message( span_notice("[owner] begins to secrete a sticky substance around [to_wrap]."), span_notice("You begin wrapping [to_wrap] into a cocoon."), @@ -83,14 +84,14 @@ else owner.balloon_alert(owner, "interrupted!") -/datum/action/cooldown/wrap/proc/wrap_target(atom/movable/to_wrap) +/datum/action/cooldown/mob_cooldown/wrap/proc/wrap_target(atom/movable/to_wrap) var/obj/structure/spider/cocoon/casing = new(to_wrap.loc) if(isliving(to_wrap)) var/mob/living/living_wrapped = to_wrap // You get a point every time you consume a living player, even if they've been consumed before. // You only get a point for any individual corpse once, so you can't keep breaking it out and eating it again. if(ishuman(living_wrapped) && (living_wrapped.stat != DEAD || !HAS_TRAIT(living_wrapped, TRAIT_SPIDER_CONSUMED))) - var/datum/action/lay_eggs/enriched/egg_power = locate() in owner.actions + var/datum/action/cooldown/mob_cooldown/lay_eggs/enriched/egg_power = locate() in owner.actions if(egg_power) egg_power.charges++ egg_power.build_all_button_icons() diff --git a/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling.dm b/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling.dm index b8829015980..7108983c310 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling.dm @@ -5,50 +5,28 @@ * Able to vent-crawl and eventually grow into a full fledged giant spider. * */ -/mob/living/basic/spiderling +/mob/living/basic/spider/growing/spiderling name = "spiderling" desc = "It never stays still for long." - icon = 'icons/mob/simple/arachnoid.dmi' icon_state = "spiderling" icon_dead = "spiderling_dead" density = FALSE - faction = list(FACTION_SPIDER) speed = -0.75 move_resist = INFINITY // YOU CAN'T HANDLE ME LET ME BE FREE LET ME BE FREE LET ME BE FREE speak_emote = list("hisses") initial_language_holder = /datum/language_holder/spider basic_mob_flags = FLAMMABLE_MOB | DEL_ON_DEATH mob_size = MOB_SIZE_TINY - - unique_name = TRUE - - // we have _some_ bite melee_damage_lower = 1 melee_damage_upper = 2 - - health = 5 // very low. + health = 5 maxHealth = 5 - unsuitable_cold_damage = 4 - unsuitable_heat_damage = 4 death_message = "lets out a final hiss..." - + player_speed_modifier = 0 + spider_growth_time = 40 SECONDS ai_controller = /datum/ai_controller/basic_controller/spiderling - // VERY red, to fit the eyes - lighting_cutoff_red = 22 - lighting_cutoff_green = 5 - lighting_cutoff_blue = 5 - - /// The mob we will grow into. - var/mob/living/basic/young_spider/grow_as = null - /// The message that the mother left for our big strong selves. - var/directive = "" - /// Simple boolean that determines if we should apply the spider antag to the player if they possess this mob. TRUE by default since we're always going to evolve into a spider that will have an antagonistic role. - var/apply_spider_antag = TRUE - /// The time it takes for the spider to grow into the next stage - var/spider_growth_time = 40 SECONDS - -/mob/living/basic/spiderling/Initialize(mapload) +/mob/living/basic/spider/growing/spiderling/Initialize(mapload) . = ..() // random placement since we're pretty small and to make the swarming component actually look like it's doing something when we have a buncha these fuckers pixel_x = rand(6,-6) @@ -56,24 +34,11 @@ add_overlay(image(icon = src.icon, icon_state = "spiderling_click_underlay", layer = BELOW_MOB_LAYER)) - // the proc that handles passtable is nice but we should always be able to pass through table since we're so small so we can eschew adding that here - pass_flags |= PASSTABLE - add_traits(list(TRAIT_PASSTABLE, TRAIT_VENTCRAWLER_ALWAYS, TRAIT_WEB_SURFER), INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) AddComponent(/datum/component/swarming) AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW, volume = 0.2) // they're small but you can hear 'em AddElement(/datum/element/web_walker, /datum/movespeed_modifier/spiderling_web) - - // it's A-OKAY for grow_as to be null for the purposes of this component since we override that behavior anyhow. - AddComponent(\ - /datum/component/growth_and_differentiation,\ - growth_time = spider_growth_time,\ - growth_path = grow_as,\ - growth_probability = 25,\ - lower_growth_value = 1,\ - upper_growth_value = 2,\ - optional_checks = CALLBACK(src, PROC_REF(ready_to_grow)),\ - optional_grow_behavior = CALLBACK(src, PROC_REF(grow_into_young_spider))\ - ) + AddElement(/datum/element/ai_retaliate) // keep in mind we have infinite range (the entire pipenet is our playground, it's just a matter of random choice as to where we end up) so lower and upper both have their gives and takes. // but, also remember the more time we aren't in a vent, the more susceptible we are to dying to anything and everything. @@ -81,11 +46,7 @@ ai_controller.set_blackboard_key(BB_LOWER_VENT_TIME_LIMIT, rand(9, 11) SECONDS) ai_controller.set_blackboard_key(BB_UPPER_VENT_TIME_LIMIT, rand(12, 14) SECONDS) -/mob/living/basic/spiderling/Destroy() - GLOB.spidermobs -= src - return ..() - -/mob/living/basic/spiderling/death(gibbed) +/mob/living/basic/spider/growing/spiderling/death(gibbed) if(isturf(get_turf(loc)) && (basic_mob_flags & DEL_ON_DEATH || gibbed)) var/obj/item/food/spiderling/dead_spider = new(loc) // mmm yummy dead_spider.name = name @@ -93,48 +54,9 @@ return ..() -/mob/living/basic/spiderling/Login() // this is only really here for admins dragging and dropping players into spiderlings, player control of spiderlings is otherwise unimplemented - . = ..() - if(!. || isnull(client)) - return FALSE - basic_mob_flags &= ~DEL_ON_DEATH // we don't want to be deleted if we die while player controlled in case there's some revive schenanigans going on that can bring us back - GLOB.spidermobs[src] = TRUE - if (apply_spider_antag) - var/datum/antagonist/spider/spider_antag = new(directive) - mind.add_antag_datum(spider_antag) - -/mob/living/basic/spiderling/mob_negates_gravity() // in case our sisters want to give us a helping hand - if(locate(/obj/structure/spider/stickyweb) in loc) - return TRUE - return ..() - -/mob/living/basic/spiderling/start_pulling(atom/movable/pulled_atom, state, force = move_force, supress_message = FALSE) // we're TOO FUCKING SMALL +/mob/living/basic/spider/growing/spiderling/start_pulling(atom/movable/pulled_atom, state, force = move_force, supress_message = FALSE) // we're TOO FUCKING SMALL return -/// Checks to see if we're ready to grow, primarily if we are on solid ground and not in a vent or something. -/// The component will automagically grow us when we return TRUE and that threshold has been met. -/mob/living/basic/spiderling/proc/ready_to_grow() - if(isturf(loc)) - return TRUE - - return FALSE - -/// Actually grows the spiderling into a young spider. We have to do a bunch of unique behavior that really can't be genericized, so we have to override the component in this manner. -/mob/living/basic/spiderling/proc/grow_into_young_spider() - if(isnull(grow_as)) - if(prob(3)) - grow_as = pick(/mob/living/basic/young_spider/tarantula, /mob/living/basic/young_spider/viper, /mob/living/basic/young_spider/midwife) - else - grow_as = pick(/mob/living/basic/young_spider/guard, /mob/living/basic/young_spider/ambush, /mob/living/basic/young_spider/hunter, /mob/living/basic/young_spider/scout, /mob/living/basic/young_spider/nurse, /mob/living/basic/young_spider/tangle) - - var/mob/living/basic/young_spider/grown = change_mob_type(grow_as, get_turf(src), initial(grow_as.name)) - ADD_TRAIT(grown, TRAIT_WAS_EVOLVED, REF(src)) - grown.faction = faction.Copy() - grown.directive = directive - grown.set_name() - - qdel(src) - /// Opportunistically hops in and out of vents, if it can find one. We aren't interested in attacking due to how weak we are, we gotta be quick and hidey. /datum/ai_controller/basic_controller/spiderling blackboard = list( diff --git a/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling_subtypes.dm b/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling_subtypes.dm index 866a572453c..5d42ca5cb61 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling_subtypes.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling_subtypes.dm @@ -1,14 +1,14 @@ // This whole file is just a container for the spiderling subtypes that actually differentiate into different young spiders. None of them are particularly special as of now. /// Will differentiate into the base young spider (known colloquially as the "guard" spider). -/mob/living/basic/spiderling/guard - grow_as = /mob/living/basic/young_spider/guard +/mob/living/basic/spider/growing/spiderling/guard + grow_as = /mob/living/basic/spider/growing/young/guard name = "guard spiderling" desc = "Furry and brown, it looks defenseless. This one has sparkling red eyes." /// Will differentiate into the "ambush" young spider. -/mob/living/basic/spiderling/ambush - grow_as = /mob/living/basic/young_spider/ambush +/mob/living/basic/spider/growing/spiderling/ambush + grow_as = /mob/living/basic/spider/growing/young/ambush name = "ambush spiderling" desc = "Furry and white, it looks defenseless. This one has sparkling pink eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -16,8 +16,8 @@ icon_dead = "ambush_spiderling_dead" /// Will differentiate into the "scout" young spider. -/mob/living/basic/spiderling/scout - grow_as = /mob/living/basic/young_spider/scout +/mob/living/basic/spider/growing/spiderling/scout + grow_as = /mob/living/basic/spider/growing/young/scout name = "scout spiderling" desc = "Furry and black, it looks defenseless. This one has sparkling blue eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -26,8 +26,8 @@ sight = SEE_SELF|SEE_MOBS /// Will differentiate into the "hunter" young spider. -/mob/living/basic/spiderling/hunter - grow_as = /mob/living/basic/young_spider/hunter +/mob/living/basic/spider/growing/spiderling/hunter + grow_as = /mob/living/basic/spider/growing/young/hunter name = "hunter spiderling" desc = "Furry and black, it looks defenseless. This one has sparkling purple eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -35,8 +35,8 @@ icon_dead = "hunter_spiderling_dead" /// Will differentiate into the "nurse" young spider. -/mob/living/basic/spiderling/nurse - grow_as = /mob/living/basic/young_spider/nurse +/mob/living/basic/spider/growing/spiderling/nurse + grow_as = /mob/living/basic/spider/growing/young/nurse name = "nurse spiderling" desc = "Furry and black, it looks defenseless. This one has sparkling green eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -44,8 +44,8 @@ icon_dead = "nurse_spiderling_dead" /// Will differentiate into the "tangle" young spider. -/mob/living/basic/spiderling/tangle - grow_as = /mob/living/basic/young_spider/tangle +/mob/living/basic/spider/growing/spiderling/tangle + grow_as = /mob/living/basic/spider/growing/young/tangle name = "tangle spiderling" desc = "Furry and brown, it looks defenseless. This one has dim brown eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -53,8 +53,8 @@ icon_dead = "tangle_spiderling_dead" /// Will differentiate into the "midwife" young spider. -/mob/living/basic/spiderling/midwife - grow_as = /mob/living/basic/young_spider/midwife +/mob/living/basic/spider/growing/spiderling/midwife + grow_as = /mob/living/basic/spider/growing/young/midwife name = "broodmother spiderling" desc = "Furry and black, it looks defenseless. This one has scintillating green eyes. Might also be hiding a real knife somewhere." icon = 'icons/mob/simple/arachnoid.dmi' @@ -62,8 +62,8 @@ icon_dead = "midwife_spiderling_dead" /// Will differentiate into the "viper" young spider. -/mob/living/basic/spiderling/viper - grow_as = /mob/living/basic/young_spider/viper +/mob/living/basic/spider/growing/spiderling/viper + grow_as = /mob/living/basic/spider/growing/young/viper name = "viper spiderling" desc = "Furry and black, it looks defenseless. This one has sparkling magenta eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -71,20 +71,10 @@ icon_dead = "viper_spiderling_dead" /// Will differentiate into the "tarantula" young spider. -/mob/living/basic/spiderling/tarantula - grow_as = /mob/living/basic/young_spider/tarantula +/mob/living/basic/spider/growing/spiderling/tarantula + grow_as = /mob/living/basic/spider/growing/young/tarantula name = "tarantula spiderling" desc = "Furry and black, it looks defenseless. This one has abyssal red eyes." icon = 'icons/mob/simple/arachnoid.dmi' icon_state = "tarantula_spiderling" icon_dead = "tarantula_spiderling_dead" - -/// Will differentiate into the "flesh" young spider. -/mob/living/basic/spiderling/hunter/flesh - grow_as = /mob/living/basic/young_spider/hunter/flesh - name = "flesh spiderling" - desc = "Fleshy and red, it looks defenseless. This one has sparkling grey eyes." - icon = 'icons/mob/simple/arachnoid.dmi' - icon_state = "flesh_spiderling" - icon_dead = "flesh_spiderling_dead" - spider_growth_time = 20 SECONDS diff --git a/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider.dm b/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider.dm index 340ff11c7c2..57b9da542b7 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider.dm @@ -5,149 +5,26 @@ * The basic type is the guard, which is slow but sturdy and outputs good damage. * All spiders can produce webbing. */ -/mob/living/basic/young_spider +/mob/living/basic/spider/growing/young name = "young spider" desc = "Furry and black, it makes you shudder to look at it. This one has deep red eyes." - icon = 'icons/mob/simple/arachnoid.dmi' icon_state = "young_guard" icon_living = "young_guard" icon_dead = "young_guard_dead" - mob_biotypes = MOB_ORGANIC|MOB_BUG - speak_emote = list("chitters") butcher_results = list(/obj/item/food/meat/slab/spider = 1) - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "gently pushes aside" - response_disarm_simple = "gently push aside" - initial_language_holder = /datum/language_holder/spider speed = 1 maxHealth = 60 health = 60 - damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1) - basic_mob_flags = FLAMMABLE_MOB - status_flags = NONE - unsuitable_cold_damage = 4 - unsuitable_heat_damage = 4 obj_damage = 10 melee_damage_lower = 8 melee_damage_upper = 12 - combat_mode = TRUE - faction = list(FACTION_SPIDER) - pass_flags = PASSTABLE - attack_verb_continuous = "bites" - attack_verb_simple = "bite" - attack_sound = 'sound/weapons/bite.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE - unique_name = TRUE - // VERY red, to fit the eyes - lighting_cutoff_red = 22 - lighting_cutoff_green = 5 - lighting_cutoff_blue = 5 ai_controller = /datum/ai_controller/basic_controller/young_spider - /// The mob we will grow into. - var/mob/living/basic/giant_spider/grow_as = null - /// Speed modifier to apply if controlled by a human player - var/player_speed_modifier = -1 - /// What reagent the mob injects targets with - var/poison_type = /datum/reagent/toxin/hunterspider - /// How much of a reagent the mob injects on attack - var/poison_per_bite = 0 - /// Multiplier to apply to web laying speed. Fractional numbers make it faster, because it's a multiplier. - var/web_speed = 1 - /// Type of webbing ability to learn. - var/web_type = /datum/action/cooldown/lay_web - /// The message that the mother spider left for this spider when the egg was layed. - var/directive = "" - /// Short description of what this mob is capable of, for radial menu uses - var/menu_description = "Tanky and strong for the defense of the nest and other spiders." - /// If true then you shouldn't be told that you're a spider antagonist as soon as you are placed into this mob - var/apply_spider_antag = TRUE - /// The time it takes for the spider to grow into the next stage - var/spider_growth_time = 1 MINUTES + player_speed_modifier = -1 -/mob/living/basic/young_spider/Initialize(mapload) +/mob/living/basic/spider/growing/young/Initialize(mapload) . = ..() - ADD_TRAIT(src, TRAIT_WEB_SURFER, INNATE_TRAIT) AddElement(/datum/element/ai_retaliate) AddElement(/datum/element/ai_flee_while_injured) - AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW) - AddElement(/datum/element/nerfed_pulling, GLOB.typecache_general_bad_things_to_easily_move) - AddElement(/datum/element/prevent_attacking_of_types, GLOB.typecache_general_bad_hostile_attack_targets, "this tastes awful!") - AddElement(/datum/element/web_walker, /datum/movespeed_modifier/young_web) - - if(poison_per_bite) - AddElement(/datum/element/venomous, poison_type, poison_per_bite) - - var/datum/action/cooldown/lay_web/webbing = new web_type(src) - webbing.webbing_time *= web_speed - webbing.Grant(src) - ai_controller.set_blackboard_key(BB_SPIDER_WEB_ACTION, webbing) - AddComponent(\ - /datum/component/growth_and_differentiation,\ - growth_time = spider_growth_time,\ - growth_path = grow_as,\ - growth_probability = 25,\ - lower_growth_value = 1,\ - upper_growth_value = 2,\ - optional_checks = CALLBACK(src, PROC_REF(ready_to_grow)),\ - optional_grow_behavior = CALLBACK(src, PROC_REF(grow_into_giant_spider))\ - ) - -/mob/living/basic/young_spider/Login() - . = ..() - if(!. || !client) - return FALSE - GLOB.spidermobs[src] = TRUE - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/player_spider_modifier, multiplicative_slowdown = player_speed_modifier) - if (apply_spider_antag) - var/datum/antagonist/spider/spider_antag = new(directive) - mind.add_antag_datum(spider_antag) - -/mob/living/basic/young_spider/Logout() - . = ..() - remove_movespeed_modifier(/datum/movespeed_modifier/player_spider_modifier) - -/mob/living/basic/young_spider/Destroy() - GLOB.spidermobs -= src - return ..() - -/mob/living/basic/young_spider/mob_negates_gravity() - if(locate(/obj/structure/spider/stickyweb) in loc) - return TRUE - return ..() - -/mob/living/basic/young_spider/expose_reagents(list/reagents, datum/reagents/source, methods=TOUCH, volume_modifier=1, show_message=TRUE) - . = ..() - for(var/datum/reagent/toxin/pestkiller/current_reagent in reagents) - apply_damage(50 * volume_modifier, STAMINA, BODY_ZONE_CHEST) - -/// Checks to see if we're ready to grow, primarily if we are on solid ground and not in a vent or something. -/// The component will automagically grow us when we return TRUE and that threshold has been met. -/mob/living/basic/young_spider/proc/ready_to_grow() - if(isturf(loc)) - return TRUE - - return FALSE - -/// Actually grows the young spider into a giant spider. We have to do a bunch of unique behavior that really can't be genericized, so we have to override the component in this manner. -/mob/living/basic/young_spider/proc/grow_into_giant_spider() - if(isnull(grow_as)) - if(prob(3)) - grow_as = pick(/mob/living/basic/giant_spider/tarantula, /mob/living/basic/giant_spider/viper, /mob/living/basic/giant_spider/midwife) - else - grow_as = pick(/mob/living/basic/giant_spider/guard, /mob/living/basic/giant_spider/ambush, /mob/living/basic/giant_spider/hunter, /mob/living/basic/giant_spider/scout, /mob/living/basic/giant_spider/nurse, /mob/living/basic/giant_spider/tangle) - - var/mob/living/basic/giant_spider/grown = change_mob_type(grow_as, get_turf(src), initial(grow_as.name)) - ADD_TRAIT(grown, TRAIT_WAS_EVOLVED, REF(src)) - grown.faction = faction.Copy() - grown.directive = directive - grown.set_name() - if(getBruteLoss() - 5 > 0) - grown.setBruteLoss(getBruteLoss() - 5) - if(getFireLoss() - 5 > 0) - grown.setFireLoss(getFireLoss() - 5) - - qdel(src) /// Used by all young spiders if they ever appear. /datum/ai_controller/basic_controller/young_spider diff --git a/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider_subtypes.dm b/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider_subtypes.dm index 697ee5d0808..f5d128e41b7 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider_subtypes.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider_subtypes.dm @@ -1,8 +1,8 @@ // This whole file is just a container for the young spider subtypes that actually differentiate into different giant spiders. None of them are particularly special as of now. /// Will differentiate into the base giant spider (known colloquially as the "guard" spider). -/mob/living/basic/young_spider/guard - grow_as = /mob/living/basic/giant_spider/guard +/mob/living/basic/spider/growing/young/guard + grow_as = /mob/living/basic/spider/giant/guard name = "young guard spider" desc = "Furry and brown, it looks defenseless. This one has sparkling red eyes." maxHealth = 70 @@ -12,8 +12,8 @@ speed = 0.7 /// Will differentiate into the "ambush" giant spider. -/mob/living/basic/young_spider/ambush - grow_as = /mob/living/basic/giant_spider/ambush +/mob/living/basic/spider/growing/young/ambush + grow_as = /mob/living/basic/spider/giant/ambush name = "young ambush spider" desc = "Furry and white, it looks defenseless. This one has sparkling pink eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -25,14 +25,14 @@ melee_damage_upper = 18 speed = 1 -/mob/living/basic/young_spider/ambush/Initialize(mapload) +/mob/living/basic/spider/growing/young/ambush/Initialize(mapload) . = ..() - var/datum/action/cooldown/sneak/spider/sneak_web = new(src) + var/datum/action/cooldown/mob_cooldown/sneak/spider/sneak_web = new(src) sneak_web.Grant(src) /// Will differentiate into the "scout" giant spider. -/mob/living/basic/young_spider/scout - grow_as = /mob/living/basic/giant_spider/scout +/mob/living/basic/spider/growing/young/scout + grow_as = /mob/living/basic/spider/giant/scout name = "young scout spider" desc = "Furry and black, it looks defenseless. This one has sparkling blue eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -47,13 +47,13 @@ poison_type = /datum/reagent/peaceborg/confuse sight = SEE_SELF|SEE_MOBS -/mob/living/basic/young_spider/scout/Initialize(mapload) +/mob/living/basic/spider/growing/young/scout/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) /// Will differentiate into the "hunter" giant spider. -/mob/living/basic/young_spider/hunter - grow_as = /mob/living/basic/giant_spider/hunter +/mob/living/basic/spider/growing/young/hunter + grow_as = /mob/living/basic/spider/giant/hunter name = "young hunter spider" desc = "Furry and black, it looks defenseless. This one has sparkling purple eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -67,8 +67,8 @@ poison_per_bite = 2 /// Will differentiate into the "nurse" giant spider. -/mob/living/basic/young_spider/nurse - grow_as = /mob/living/basic/giant_spider/nurse +/mob/living/basic/spider/growing/young/nurse + grow_as = /mob/living/basic/spider/giant/nurse name = "young nurse spider" desc = "Furry and black, it looks defenseless. This one has sparkling green eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -80,11 +80,11 @@ melee_damage_upper = 4 speed = 0.7 web_speed = 0.5 - web_type = /datum/action/cooldown/lay_web/sealer + web_type = /datum/action/cooldown/mob_cooldown/lay_web/sealer ///The health HUD applied to the mob. var/health_hud = DATA_HUD_MEDICAL_ADVANCED -/mob/living/basic/young_spider/nurse/Initialize(mapload) +/mob/living/basic/spider/growing/young/nurse/Initialize(mapload) . = ..() var/datum/atom_hud/datahud = GLOB.huds[health_hud] datahud.show_to(src) @@ -93,14 +93,14 @@ heal_brute = 15,\ heal_burn = 15,\ interaction_key = DOAFTER_SOURCE_SPIDER,\ - valid_targets_typecache = typecacheof(list(/mob/living/basic/giant_spider)),\ + valid_targets_typecache = typecacheof(list(/mob/living/basic/spider/giant)),\ action_text = "%SOURCE% begins wrapping the wounds of %TARGET%.",\ complete_text = "%SOURCE% wraps the wounds of %TARGET%.",\ ) /// Will differentiate into the "tangle" giant spider. -/mob/living/basic/young_spider/tangle - grow_as = /mob/living/basic/giant_spider/tangle +/mob/living/basic/spider/growing/young/tangle + grow_as = /mob/living/basic/spider/giant/tangle name = "young tangle spider" desc = "Furry and brown, it looks defenseless. This one has dim brown eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -112,11 +112,11 @@ melee_damage_upper = 1 speed = 0.7 web_speed = 0.25 - web_type = /datum/action/cooldown/lay_web/sealer + web_type = /datum/action/cooldown/mob_cooldown/lay_web/sealer poison_per_bite = 2 poison_type = /datum/reagent/toxin/acid -/mob/living/basic/young_spider/tangle/Initialize(mapload) +/mob/living/basic/spider/growing/young/tangle/Initialize(mapload) . = ..() AddComponent(/datum/component/healing_touch,\ heal_brute = 10,\ @@ -124,22 +124,22 @@ heal_time = 3 SECONDS,\ self_targetting = HEALING_TOUCH_SELF_ONLY,\ interaction_key = DOAFTER_SOURCE_SPIDER,\ - valid_targets_typecache = typecacheof(list(/mob/living/basic/giant_spider/tangle)),\ + valid_targets_typecache = typecacheof(list(/mob/living/basic/spider/growing/young/tangle, /mob/living/basic/spider/giant/tangle)),\ extra_checks = CALLBACK(src, PROC_REF(can_mend)),\ action_text = "%SOURCE% begins mending themselves...",\ complete_text = "%SOURCE%'s wounds mend together.",\ ) /// Prevent you from healing other tangle spiders, or healing when on fire -/mob/living/basic/young_spider/tangle/proc/can_mend(mob/living/source, mob/living/target) +/mob/living/basic/spider/growing/young/tangle/proc/can_mend(mob/living/source, mob/living/target) if (on_fire) balloon_alert(src, "on fire!") return FALSE return TRUE /// Will differentiate into the "midwife" giant spider. -/mob/living/basic/young_spider/midwife - grow_as = /mob/living/basic/giant_spider/midwife +/mob/living/basic/spider/growing/young/midwife + grow_as = /mob/living/basic/spider/giant/midwife name = "young broodmother spider" desc = "Furry and black, it looks defenseless. This one has scintillating green eyes. Might also be hiding a real knife somewhere." icon = 'icons/mob/simple/arachnoid.dmi' @@ -151,11 +151,11 @@ melee_damage_upper = 10 speed = 0.7 web_speed = 0.5 - web_type = /datum/action/cooldown/lay_web/sealer + web_type = /datum/action/cooldown/mob_cooldown/lay_web/sealer /// Will differentiate into the "viper" giant spider. -/mob/living/basic/young_spider/viper - grow_as = /mob/living/basic/giant_spider/viper +/mob/living/basic/spider/growing/young/viper + grow_as = /mob/living/basic/spider/giant/viper name = "young viper spider" desc = "Furry and black, it looks defenseless. This one has sparkling magenta eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -170,8 +170,8 @@ poison_per_bite = 2 /// Will differentiate into the "tarantula" giant spider. -/mob/living/basic/young_spider/tarantula - grow_as = /mob/living/basic/giant_spider/tarantula +/mob/living/basic/spider/growing/young/tarantula + grow_as = /mob/living/basic/spider/giant/tarantula name = "young tarantula spider" desc = "Furry and black, it looks defenseless. This one has abyssal red eyes." icon = 'icons/mob/simple/arachnoid.dmi' @@ -183,40 +183,3 @@ melee_damage_upper = 25 speed = 1 obj_damage = 40 - -/// Will differentiate into the "flesh" giant spider. -/mob/living/basic/young_spider/hunter/flesh - grow_as = /mob/living/basic/giant_spider/hunter/flesh - name = "young flesh spider" - desc = "Furry and red, it looks defenseless. This one has sparkling grey eyes." - icon = 'icons/mob/simple/arachnoid.dmi' - icon_state = "young_flesh" - icon_dead = "young_flesh_dead" - maxHealth = 55 - health = 55 - web_speed = 0.7 - spider_growth_time = 30 SECONDS - -/mob/living/basic/young_spider/hunter/flesh/Initialize(mapload) - . = ..() - AddComponent(/datum/component/blood_walk, \ - blood_type = /obj/effect/decal/cleanable/blood/bubblegum, \ - blood_spawn_chance = 3) - // It might be easier and more fitting to just replace this with Regenerator - AddComponent(/datum/component/healing_touch,\ - heal_brute = 25,\ - heal_burn = 25,\ - self_targetting = HEALING_TOUCH_SELF_ONLY,\ - interaction_key = DOAFTER_SOURCE_SPIDER,\ - valid_targets_typecache = typecacheof(list(/mob/living/basic/giant_spider/hunter/flesh)),\ - extra_checks = CALLBACK(src, PROC_REF(can_mend)),\ - action_text = "%SOURCE% begins mending themselves...",\ - complete_text = "%SOURCE%'s wounds mend together.",\ - ) - -/// Prevent you from healing other flesh spiders, or healing when on fire -/mob/living/basic/young_spider/hunter/flesh/proc/can_mend(mob/living/source, mob/living/target) - if (on_fire) - balloon_alert(src, "on fire!") - return FALSE - return TRUE diff --git a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/fugu_gland.dm b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/fugu_gland.dm index 485343c0a49..63eb39c74e6 100644 --- a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/fugu_gland.dm +++ b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/fugu_gland.dm @@ -32,6 +32,7 @@ return ADD_TRAIT(animal, TRAIT_FUGU_GLANDED, type) + animal.AddComponent(/datum/component/seethrough_mob) animal.maxHealth *= 1.5 animal.health = min(animal.maxHealth, animal.health * 1.5) animal.melee_damage_lower = max((animal.melee_damage_lower * 2), 10) diff --git a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/wumborian_fugu.dm b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/wumborian_fugu.dm index cb365f2e871..e13bef35482 100644 --- a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/wumborian_fugu.dm +++ b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/wumborian_fugu.dm @@ -49,6 +49,7 @@ /mob/living/basic/wumborian_fugu/Initialize(mapload) . = ..() + AddComponent(/datum/component/seethrough_mob) var/static/list/death_loot = list(/obj/item/fugu_gland) AddElement(/datum/element/death_drops, death_loot) add_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_ASHSTORM_IMMUNE), ROUNDSTART_TRAIT) diff --git a/code/modules/mob/living/basic/syndicate/russian.dm b/code/modules/mob/living/basic/syndicate/russian.dm index de6c91a4dae..2de74b9b4d5 100644 --- a/code/modules/mob/living/basic/syndicate/russian.dm +++ b/code/modules/mob/living/basic/syndicate/russian.dm @@ -32,7 +32,7 @@ /mob/living/basic/syndicate/russian/ranged/Initialize(mapload) . = ..() - AddElement(/datum/element/ranged_attacks, casingtype, projectilesound) + AddComponent(/datum/component/ranged_attacks, casing_type = casingtype, projectile_sound = projectilesound, cooldown_time = 1 SECONDS) /mob/living/basic/syndicate/russian/ranged/lootless loot = list() diff --git a/code/modules/mob/living/basic/syndicate/syndicate.dm b/code/modules/mob/living/basic/syndicate/syndicate.dm index 25124d87da4..549dbf476d0 100644 --- a/code/modules/mob/living/basic/syndicate/syndicate.dm +++ b/code/modules/mob/living/basic/syndicate/syndicate.dm @@ -134,12 +134,16 @@ loot = list(/obj/effect/gibspawner/human) ai_controller = /datum/ai_controller/basic_controller/syndicate/ranged r_hand = /obj/item/gun/ballistic/automatic/pistol + /// Type of bullet we use var/casingtype = /obj/item/ammo_casing/c9mm + /// Sound to play when firing weapon var/projectilesound = 'sound/weapons/gun/pistol/shot.ogg' + /// Time between taking shots + var/ranged_cooldown = 1 SECONDS /mob/living/basic/syndicate/ranged/Initialize(mapload) . = ..() - AddElement(/datum/element/ranged_attacks, casingtype, projectilesound) + AddComponent(/datum/component/ranged_attacks, casing_type = casingtype, projectile_sound = projectilesound, cooldown_time = ranged_cooldown) /mob/living/basic/syndicate/ranged/infiltrator //shuttle loan event projectilesound = 'sound/weapons/gun/smg/shot_suppressed.ogg' @@ -168,6 +172,7 @@ casingtype = /obj/item/ammo_casing/c45 projectilesound = 'sound/weapons/gun/smg/shot.ogg' ai_controller = /datum/ai_controller/basic_controller/syndicate/ranged/burst + ranged_cooldown = 3 SECONDS r_hand = /obj/item/gun/ballistic/automatic/c20r /mob/living/basic/syndicate/ranged/smg/pilot //caravan ambush ruin @@ -197,6 +202,7 @@ /mob/living/basic/syndicate/ranged/shotgun casingtype = /obj/item/ammo_casing/shotgun/buckshot //buckshot (up to 72.5 brute) fired in a two-round burst ai_controller = /datum/ai_controller/basic_controller/syndicate/ranged/shotgunner + ranged_cooldown = 3 SECONDS r_hand = /obj/item/gun/ballistic/shotgun/bulldog /mob/living/basic/syndicate/ranged/shotgun/space diff --git a/code/modules/mob/living/basic/tree.dm b/code/modules/mob/living/basic/tree.dm index 7e9bd353337..f93ab14a37f 100644 --- a/code/modules/mob/living/basic/tree.dm +++ b/code/modules/mob/living/basic/tree.dm @@ -54,6 +54,7 @@ /mob/living/basic/tree/Initialize(mapload) . = ..() + AddComponent(/datum/component/seethrough_mob) AddElement(/datum/element/swabable, CELL_LINE_TABLE_PINE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) var/static/list/death_loot = list(/obj/item/stack/sheet/mineral/wood) AddElement(/datum/element/death_drops, death_loot) diff --git a/code/modules/mob/living/basic/vermin/cockroach.dm b/code/modules/mob/living/basic/vermin/cockroach.dm index d7b2d8aade5..90e5bd53d2d 100644 --- a/code/modules/mob/living/basic/vermin/cockroach.dm +++ b/code/modules/mob/living/basic/vermin/cockroach.dm @@ -96,7 +96,7 @@ /mob/living/basic/cockroach/glockroach/Initialize(mapload) . = ..() - AddElement(/datum/element/ranged_attacks, /obj/item/ammo_casing/glockroach) + AddComponent(/datum/component/ranged_attacks, casing_type = /obj/item/ammo_casing/glockroach, cooldown_time = 1 SECONDS) /datum/ai_controller/basic_controller/cockroach/glockroach planning_subtrees = list( diff --git a/code/modules/mob/living/basic/vermin/mouse.dm b/code/modules/mob/living/basic/vermin/mouse.dm index 3dbbaec2dd4..d70b24f048d 100644 --- a/code/modules/mob/living/basic/vermin/mouse.dm +++ b/code/modules/mob/living/basic/vermin/mouse.dm @@ -192,7 +192,7 @@ /// Evolves this rat into a regal rat /mob/living/basic/mouse/proc/evolve_into_regal_rat() - var/mob/living/simple_animal/hostile/regalrat/controlled/regalrat = new(loc) + var/mob/living/basic/regal_rat/controlled/regalrat = new(loc) mind?.transfer_to(regalrat) INVOKE_ASYNC(regalrat, TYPE_PROC_REF(/atom/movable, say), "RISE, MY SUBJECTS! SCREEEEEEE!") qdel(src) diff --git a/code/modules/mob/living/carbon/alien/adult/alien_powers.dm b/code/modules/mob/living/carbon/alien/adult/alien_powers.dm index 133f9c394f8..e686c920b58 100644 --- a/code/modules/mob/living/carbon/alien/adult/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/adult/alien_powers.dm @@ -343,10 +343,11 @@ Doesn't work on other aliens/AI.*/ new choice_path(owner.loc) return TRUE -/datum/action/cooldown/sneak/alien - name = "Sneak" +/datum/action/cooldown/mob_cooldown/sneak/alien + name = "Alien Sentinel Sneak" panel = "Alien" desc = "Blend into the shadows to stalk your prey." + button_icon = 'icons/mob/actions/actions_xeno.dmi' button_icon_state = "alien_sneak" background_icon_state = "bg_alien" overlay_icon_state = "bg_alien_border" diff --git a/code/modules/mob/living/carbon/alien/adult/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/adult/caste/sentinel.dm index 6b6f370388a..7fffdf35522 100644 --- a/code/modules/mob/living/carbon/alien/adult/caste/sentinel.dm +++ b/code/modules/mob/living/carbon/alien/adult/caste/sentinel.dm @@ -7,7 +7,7 @@ alien_speed = 0.2 /mob/living/carbon/alien/adult/sentinel/Initialize(mapload) - var/datum/action/cooldown/sneak/alien/sneaky_beaky = new(src) + var/datum/action/cooldown/mob_cooldown/sneak/alien/sneaky_beaky = new(src) sneaky_beaky.Grant(src) return ..() diff --git a/code/modules/mob/living/carbon/alien/adult/queen.dm b/code/modules/mob/living/carbon/alien/adult/queen.dm index cb0f6119a2d..dd8e61b6699 100644 --- a/code/modules/mob/living/carbon/alien/adult/queen.dm +++ b/code/modules/mob/living/carbon/alien/adult/queen.dm @@ -19,6 +19,7 @@ . = ..() // as a wise man once wrote: "pull over that ass too fat" REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + AddComponent(/datum/component/seethrough_mob) /mob/living/carbon/alien/adult/royal/on_lying_down(new_lying_angle) . = ..() @@ -57,9 +58,6 @@ var/datum/action/cooldown/spell/aoe/repulse/xeno/tail_whip = new(src) tail_whip.Grant(src) - var/datum/action/small_sprite/queen/smallsprite = new(src) - smallsprite.Grant(src) - var/datum/action/cooldown/alien/promote/promotion = new(src) promotion.Grant(src) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 6ce840d846e..f3bde576695 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -218,7 +218,7 @@ /mob/living/carbon/Topic(href, href_list) ..() - if(href_list["embedded_object"] && usr.can_perform_action(src, NEED_DEXTERITY)) + if(href_list["embedded_object"]) var/obj/item/bodypart/L = locate(href_list["embedded_limb"]) in bodyparts if(!L) return @@ -607,9 +607,6 @@ if(HAS_TRAIT(src, TRAIT_XRAY_VISION)) new_sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS - if(see_override) - set_invis_see(see_override) - if(SSmapping.level_trait(z, ZTRAIT_NOXRAY)) new_sight = NONE diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm index b54559333c7..82bda7c7cd4 100644 --- a/code/modules/mob/living/carbon/carbon_movement.dm +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -13,7 +13,7 @@ set_nutrition(NUTRITION_LEVEL_FED - 1) //just less than feeling vigorous else if(nutrition && stat != DEAD) adjust_nutrition(-(HUNGER_FACTOR/10)) - if(m_intent == MOVE_INTENT_RUN) + if(move_intent == MOVE_INTENT_RUN) adjust_nutrition(-(HUNGER_FACTOR/10)) diff --git a/code/modules/mob/living/carbon/carbon_update_icons.dm b/code/modules/mob/living/carbon/carbon_update_icons.dm index 104480d502f..31429c28aaa 100644 --- a/code/modules/mob/living/carbon/carbon_update_icons.dm +++ b/code/modules/mob/living/carbon/carbon_update_icons.dm @@ -75,12 +75,14 @@ /mob/living/carbon/proc/apply_overlay(cache_index) if((. = overlays_standing[cache_index])) add_overlay(.) + SEND_SIGNAL(src, COMSIG_CARBON_APPLY_OVERLAY, cache_index, .) /mob/living/carbon/proc/remove_overlay(cache_index) var/I = overlays_standing[cache_index] if(I) cut_overlay(I) overlays_standing[cache_index] = null + SEND_SIGNAL(src, COMSIG_CARBON_REMOVE_OVERLAY, cache_index, I) //used when putting/removing clothes that hide certain mutant body parts to just update those and not update the whole body. /mob/living/carbon/human/proc/update_mutant_bodyparts(force_update = FALSE) // SKYRAT EDIT CHANGE diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 8f720c221db..676a6dfc01f 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -1124,7 +1124,7 @@ GLOBAL_LIST_EMPTY(features_by_species) if(attacker_style?.help_act(user, target) == MARTIAL_ATTACK_SUCCESS) return TRUE - if(target.body_position == STANDING_UP || target.appears_alive()) + if(target.body_position == STANDING_UP || (target.appears_alive() && target.stat != SOFT_CRIT && target.stat != HARD_CRIT)) target.help_shake_act(user) if(target != user) log_combat(user, target, "shaken") @@ -1208,6 +1208,7 @@ GLOBAL_LIST_EMPTY(features_by_species) var/attack_direction = get_dir(user, target) var/attack_type = attacking_bodypart.attack_type + var/unarmed_sharpness = attacking_bodypart.unarmed_sharpness //SKYRAT EDIT - If unarmed damage sharpness needs to be taken into account. if(atk_effect == ATTACK_EFFECT_KICK)//kicks deal 1.5x raw damage if(damage >= 9) target.force_say() @@ -1215,7 +1216,7 @@ GLOBAL_LIST_EMPTY(features_by_species) target.apply_damage(damage * PUNCH_STAMINA_MULTIPLIER, STAMINA, affecting, armor_block) //SKYRAT EDIT ADDITION target.apply_damage(damage, attack_type, affecting, armor_block, attack_direction = attack_direction) else//other attacks deal full raw damage + 1.5x in stamina damage - target.apply_damage(damage, attack_type, affecting, armor_block, attack_direction = attack_direction) + target.apply_damage(damage, attack_type, affecting, armor_block, attack_direction = attack_direction, sharpness = unarmed_sharpness) //SKYRAT EDIT - Applies sharpness if it does - ORIGINAL: target.apply_damage(damage, attack_type, affecting, armor_block, attack_direction = attack_direction) target.apply_damage(damage * PUNCH_STAMINA_MULTIPLIER, STAMINA, affecting, armor_block) //SKYRAT EDIT CHANGE: target.apply_damage(damage*1.5, STAMINA, affecting, armor_block) if(damage >= 9) target.force_say() diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index de6280b0050..90cee5fce9b 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -20,7 +20,7 @@ key = "dap" key_third_person = "daps" message = "sadly can't find anybody to give daps to, and daps themself. Shameful." - message_param = "give daps to %t." + message_param = "gives daps to %t." hands_use_check = TRUE /datum/emote/living/carbon/human/eyebrow diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index ee07abc6bcc..2601aed8731 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -491,7 +491,7 @@ var/datum/sprite_accessory/genital/G = GLOB.sprite_accessories[genital][dna.species.mutant_bodyparts[genital][MUTANT_INDEX_NAME]] if(G) if(!(G.is_hidden(src))) - . += "[t_He] has exposed genitals... Look closer..." + . += "[t_He] [t_has] exposed genitals... Look closer..." break var/flavor_text_link diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 2655d342e99..fb015a237d0 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -14,8 +14,8 @@ can_be_shoved_into = TRUE initial_language_holder = /datum/language_holder/empty // We get stuff from our species - maxHealth = 100 * HUMAN_HEALTH_MODIFIER //SKYRAT EDIT ADDITION - health = 100 * HUMAN_HEALTH_MODIFIER //SKYRAT EDIT ADDITION + maxHealth = HUMAN_MAXHEALTH //SKYRAT EDIT ADDITION + health = HUMAN_MAXHEALTH //SKYRAT EDIT ADDITION //Hair colour and style var/hair_color = "#000000" 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 dc5da12b26c..5f59efc6c3a 100644 --- a/code/modules/mob/living/carbon/human/species_types/felinid.dm +++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm @@ -23,6 +23,8 @@ family_heirlooms = list(/obj/item/toy/cattoy) /// When false, this is a felinid created by mass-purrbation var/original_felinid = TRUE + /// Brain size for scaling + var/brain_size = 0.8 // Prevents felinids from taking toxin damage from carpotoxin /datum/species/human/felinid/handle_chemical(datum/reagent/chem, mob/living/carbon/human/affected, seconds_per_tick, times_fired) @@ -45,6 +47,16 @@ ears.Insert(target_human, drop_if_replaced = FALSE) else mutantears = /obj/item/organ/internal/ears + var/obj/item/organ/internal/brain/current_brain = target_human.get_organ_by_type(/obj/item/organ/internal/brain) + if(current_brain) + current_brain.transform = current_brain.transform.Scale(brain_size) //smaller brain + return ..() + +/datum/species/human/felinid/on_species_loss(mob/living/carbon/former_feline, datum/species/old_species, pref_load) + if(iscarbon(former_feline)) + var/obj/item/organ/internal/brain/current_brain = former_feline.get_organ_by_type(/obj/item/organ/internal/brain) + if(current_brain) + current_brain.transform = current_brain.transform.Scale(1 / brain_size) //bigger brain return ..() /datum/species/human/felinid/randomize_features(mob/living/carbon/human/human_mob) diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index f3f6e131255..31d42874b82 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -11,6 +11,7 @@ plural_form = "Jellypeople" id = SPECIES_JELLYPERSON examine_limb_id = SPECIES_JELLYPERSON + inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_SLIME inherent_traits = list( TRAIT_MUTANT_COLORS, TRAIT_TOXINLOVER, diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index b66627d5a0a..53a8d259393 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -82,7 +82,7 @@ set_stat(DEAD) unset_machine() timeofdeath = world.time - tod = station_time_timestamp() + station_timestamp_timeofdeath = station_time_timestamp() var/turf/death_turf = get_turf(src) var/area/death_area = get_area(src) // Display a death message if the mob is a player mob (has an active mind) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index bfb2812dc4d..fcad88fdf4d 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -91,7 +91,7 @@ //Called when we bump onto a mob /mob/living/proc/MobBump(mob/M) //No bumping/swapping/pushing others if you are on walk intent - if(m_intent == MOVE_INTENT_WALK) + if(move_intent == MOVE_INTENT_WALK) return TRUE SEND_SIGNAL(src, COMSIG_LIVING_MOB_BUMP, M) @@ -1282,12 +1282,8 @@ loc_temp = ((1 - occupied_space.contents_thermal_insulation) * loc_temp) + (occupied_space.contents_thermal_insulation * bodytemperature) return loc_temp -/mob/living/cancel_camera() - ..() - cameraFollow = null - /// Checks if this mob can be actively tracked by cameras / AI. -/// Can optionally be passed a user, which is the mob tracking. +/// Can optionally be passed a user, which is the mob who is tracking src. /mob/living/proc/can_track(mob/living/user) //basic fast checks go first. When overriding this proc, I recommend calling ..() at the end. if(SEND_SIGNAL(src, COMSIG_LIVING_CAN_TRACK, user) & COMPONENT_CANT_TRACK) @@ -1306,7 +1302,7 @@ if(invisibility || alpha == 0)//cloaked return FALSE // Now, are they viewable by a camera? (This is last because it's the most intensive check) - if(!near_camera(src)) + if(!GLOB.cameranet.checkCameraVis(src)) return FALSE return TRUE @@ -1494,26 +1490,26 @@ /mob/living/basic/chicken, /mob/living/basic/cow, /mob/living/basic/crab, - /mob/living/basic/giant_spider, - /mob/living/basic/giant_spider/hunter, - /mob/living/basic/mining/goliath, /mob/living/basic/headslug, /mob/living/basic/killer_tomato, /mob/living/basic/lizard, + /mob/living/basic/mining/goliath, + /mob/living/basic/mining/watcher, + /mob/living/basic/morph, /mob/living/basic/mouse, /mob/living/basic/mushroom, /mob/living/basic/pet/dog/breaddog, /mob/living/basic/pet/dog/corgi, /mob/living/basic/pet/dog/pug, /mob/living/basic/pet/fox, + /mob/living/basic/spider/giant, + /mob/living/basic/spider/giant/hunter, /mob/living/basic/statue, /mob/living/basic/stickman, /mob/living/basic/stickman/dog, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher, /mob/living/simple_animal/hostile/blob/blobbernaut/independent, /mob/living/simple_animal/hostile/gorilla, /mob/living/simple_animal/hostile/megafauna/dragon/lesser, - /mob/living/simple_animal/hostile/morph, /mob/living/simple_animal/hostile/retaliate/goat, /mob/living/simple_animal/parrot, /mob/living/simple_animal/pet/cat, @@ -1565,6 +1561,12 @@ // actions that should be done before we delete the original mob. on_wabbajacked(new_mob) + // Valid polymorph types unlock the Lepton. + if((change_flags & (WABBAJACK|MIRROR_MAGIC|MIRROR_PRIDE|RACE_SWAP)) && (SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_WABBAJACK] != TRUE)) + to_chat(new_mob, span_revennotice("You have the strangest feeling, for a moment. A fragile, dizzying memory wanders into your mind.. all you can make out is-")) + to_chat(new_mob, span_hypnophrase("You sleep so it may wake. You wake so it may sleep. It wakes. Do not sleep.")) + SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_WABBAJACK] = TRUE + qdel(src) return new_mob @@ -2559,8 +2561,14 @@ GLOBAL_LIST_EMPTY(fire_appearances) revive(HEAL_ALL) befriend(reviver) faction = (malfunctioning) ? list("[REF(reviver)]") : list(FACTION_NEUTRAL) + var/lazarus_policy = get_policy(ROLE_LAZARUS_GOOD) || "The lazarus injector has brought you back to life! You are now friendly to everyone." if (malfunctioning) reviver.log_message("has revived mob [key_name(src)] with a malfunctioning lazarus injector.", LOG_GAME) + if(!isnull(src.mind)) + src.mind.enslave_mind_to_creator(reviver) + to_chat(src, span_userdanger("Serve [reviver.real_name], and assist [reviver.p_them()] in completing [reviver.p_their()] goals at any cost.")) + lazarus_policy = get_policy(ROLE_LAZARUS_BAD) || "You have been revived by a malfunctioning lazarus injector! You are now enslaved by whoever revived you." + to_chat(src, span_boldnotice(lazarus_policy)) /// Proc for giving a mob a new 'friend', generally used for AI control and targetting. Returns false if already friends. /mob/living/proc/befriend(mob/living/new_friend) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index d5e1c03be4a..766a7ef89a8 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -33,6 +33,9 @@ ///Damage caused by being cloned or ejected from the cloner early. slimes also deal cloneloss damage to victims var/cloneloss = 0 + /// The movement intent of the mob (run/wal) + var/move_intent = MOVE_INTENT_RUN + /// Rate at which fire stacks should decay from this mob var/fire_stack_decay_rate = -0.05 @@ -65,7 +68,6 @@ var/rotate_on_lying = FALSE ///Used by the resist verb, likely used to prevent players from bypassing next_move by logging in/out. var/last_special = 0 - var/timeofdeath = 0 ///A message sent when the mob dies, with the *deathgasp emote var/death_message = "" @@ -93,10 +95,10 @@ /// Used by [living/Bump()][/mob/living/proc/Bump] and [living/PushAM()][/mob/living/proc/PushAM] to prevent potential infinite loop. var/now_pushing = null - var/cameraFollow = null - - /// Time of death - var/tod = null + ///The mob's latest time-of-death + var/timeofdeath = 0 + ///The mob's latest time-of-death, as a station timestamp instead of world.time + var/station_timestamp_timeofdeath /// Sets AI behavior that allows mobs to target and dismember limbs with their basic attack. var/limb_destroyer = 0 @@ -153,15 +155,9 @@ ///effectiveness prob. is modified negatively by this amount; positive numbers make it more difficult, negative ones make it easier var/butcher_difficulty = 0 - ///converted to a list of stun absorption sources this mob has when one is added - var/stun_absorption = null - ///how much blood the mob has var/blood_volume = 0 - ///0 for no override, sets see_invisible = see_override in silicon & carbon life process via update_sight() - var/see_override = 0 - ///a list of all status effects the mob has var/list/status_effects var/list/implants = null diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index b6ab339dcf5..f694e685cf0 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -67,16 +67,12 @@ return TRUE return !mover.density || body_position == LYING_DOWN -/mob/living/toggle_move_intent() - . = ..() - update_move_intent_slowdown() - /mob/living/update_config_movespeed() update_move_intent_slowdown() return ..() /mob/living/proc/update_move_intent_slowdown() - add_movespeed_modifier((m_intent == MOVE_INTENT_WALK)? /datum/movespeed_modifier/config_walk_run/walk : /datum/movespeed_modifier/config_walk_run/run) + add_movespeed_modifier((move_intent == MOVE_INTENT_WALK)? /datum/movespeed_modifier/config_walk_run/walk : /datum/movespeed_modifier/config_walk_run/run) /mob/living/proc/update_turf_movespeed(turf/open/turf) if(isopenturf(turf) && !HAS_TRAIT(turf, TRAIT_TURF_IGNORE_SLOWDOWN)) diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm index faf8aeabe70..52f0d65eac1 100644 --- a/code/modules/mob/living/living_say.dm +++ b/code/modules/mob/living/living_say.dm @@ -359,14 +359,10 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( if(player_mob.stat != DEAD) //not dead, not important continue if(player_mob.z != z || get_dist(player_mob, src) > 7) //they're out of range of normal hearing - if(player_mob.client && !player_mob.client?.prefs) - stack_trace("[player_mob] ([player_mob.ckey]) had null prefs, which shouldn't be possible!") - continue - if(is_speaker_whispering) - if(!(player_mob.client?.prefs.chat_toggles & CHAT_GHOSTWHISPER)) //they're whispering and we have hearing whispers at any range off + if(!(get_chat_toggles(player_mob.client) & CHAT_GHOSTWHISPER)) //they're whispering and we have hearing whispers at any range off continue - else if(!(player_mob.client?.prefs.chat_toggles & CHAT_GHOSTEARS)) //they're talking normally and we have hearing at any range off + else if(!(get_chat_toggles(player_mob.client) & CHAT_GHOSTEARS)) //they're talking normally and we have hearing at any range off continue listening |= player_mob diff --git a/code/modules/mob/living/living_update_icons.dm b/code/modules/mob/living/living_update_icons.dm index 9239a64801a..a9e1a136800 100644 --- a/code/modules/mob/living/living_update_icons.dm +++ b/code/modules/mob/living/living_update_icons.dm @@ -5,17 +5,40 @@ /mob/living/proc/update_transform(resize = RESIZE_DEFAULT_SIZE) var/matrix/ntransform = matrix(transform) //aka transform.Copy() var/final_pixel_y = base_pixel_y + body_position_pixel_y_offset + /** + * pixel x/y/w/z all discard values after the decimal separator. + * That, coupled with the rendered interpolation, may make the + * icons look awfuller than they already are, or not, whatever. + * The solution to this nit is translating the missing decimals. + * also flooring increases the distance from 0 for negative numbers. + */ + var/abs_pixel_y_offset = 0 + var/translate = 0 + if(current_size != RESIZE_DEFAULT_SIZE) + var/standing_offset = get_pixel_y_offset_standing(current_size) + abs_pixel_y_offset = abs(standing_offset) + translate = (abs_pixel_y_offset - round(abs_pixel_y_offset)) * SIGN(standing_offset) var/final_dir = dir var/changed = FALSE if(lying_angle != lying_prev && rotate_on_lying) changed = TRUE + if(lying_angle && lying_prev == 0) + if(translate) + ntransform.Translate(0, -translate) + if(dir & (EAST|WEST)) //Standing to lying and facing east or west + final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass + else if(translate && !lying_angle && lying_prev != 0) + ntransform.Translate(translate * (lying_prev == 270 ? -1 : 1), 0) + ///Done last, as it can mess with the translation. ntransform.TurnTo(lying_prev, lying_angle) - if(lying_angle && lying_prev == 0 && dir & (EAST|WEST)) //Standing to lying and facing east or west - final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass if(resize != RESIZE_DEFAULT_SIZE) changed = TRUE + var/is_vertical = !lying_angle || !rotate_on_lying + ///scaling also affects translation, so we've to undo the old translate beforehand. + if(translate && is_vertical) + ntransform.Translate(0, -translate) ntransform.Scale(resize) current_size *= resize //Update the height of the maptext according to the size of the mob so they don't overlap. @@ -23,9 +46,13 @@ body_maptext_height_offset = initial(maptext_height) * (current_size - 1) * 0.5 maptext_height += body_maptext_height_offset - old_maptext_offset //Update final_pixel_y so our mob doesn't go out of the southern bounds of the tile when standing - if(!lying_angle || !rotate_on_lying) //But not if the mob has been rotated. + if(is_vertical) //But not if the mob has been rotated. //Make sure the body position y offset is also updated body_position_pixel_y_offset = get_pixel_y_offset_standing(current_size) + abs_pixel_y_offset = abs(body_position_pixel_y_offset) + var/new_translate = (abs_pixel_y_offset - round(abs_pixel_y_offset)) * SIGN(body_position_pixel_y_offset) + if(new_translate) + ntransform.Translate(0, new_translate) final_pixel_y = base_pixel_y + body_position_pixel_y_offset if(!changed) //Nothing has been changed, nothing has to be done. diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index e57024b952b..6c3f397f6ba 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -44,7 +44,6 @@ var/obj/item/multitool/aiMulti ///Weakref to the bot the ai's commanding right now var/datum/weakref/bot_ref - var/tracking = FALSE //this is 1 if the AI is currently tracking somebody, but the track has not yet been completed. var/datum/effect_system/spark_spread/spark_system //So they can initialize sparks whenever //MALFUNCTION @@ -53,7 +52,6 @@ var/can_dominate_mechs = FALSE var/shunted = FALSE //1 if the AI is currently shunted. Used to differentiate between shunted and ghosted/braindead var/obj/machinery/ai_voicechanger/ai_voicechanger = null // reference to machine that holds the voicechanger - var/control_disabled = FALSE // Set to 1 to stop AI from interacting via Click() var/malfhacking = FALSE // More or less a copy of the above var, so that malf AIs can hack and still get new cyborgs -- NeoFite var/malf_cooldown = 0 //Cooldown var for malf modules, stores a worldtime + cooldown @@ -64,7 +62,8 @@ var/camera_light_on = FALSE var/list/obj/machinery/camera/lit_cameras = list() - var/datum/trackable/track = new + ///The internal tool used to track players visible through cameras. + var/datum/trackable/ai_tracking_tool var/last_tablet_note_seen = null var/can_shunt = TRUE @@ -79,7 +78,7 @@ var/mob/camera/ai_eye/eyeobj var/sprint = 10 var/cooldown = 0 - var/acceleration = 1 + var/acceleration = TRUE var/obj/structure/ai_core/deactivated/linked_core //For exosuit control var/mob/living/silicon/robot/deployed_shell = null //For shell control @@ -191,19 +190,33 @@ builtInCamera = new (src) builtInCamera.network = list("ss13") + ai_tracking_tool = new(src) + RegisterSignal(src, COMSIG_TRACKABLE_TRACKING_TARGET, PROC_REF(on_track_target)) + add_traits(list(TRAIT_PULL_BLOCKED, TRAIT_HANDS_BLOCKED), ROUNDSTART_TRAIT) alert_control = new(src, list(ALARM_ATMOS, ALARM_FIRE, ALARM_POWER, ALARM_CAMERA, ALARM_BURGLAR, ALARM_MOTION), list(z), camera_view = TRUE) RegisterSignal(alert_control.listener, COMSIG_ALARM_LISTENER_TRIGGERED, PROC_REF(alarm_triggered)) RegisterSignal(alert_control.listener, COMSIG_ALARM_LISTENER_CLEARED, PROC_REF(alarm_cleared)) +/mob/living/silicon/ai/weak_syndie + radio = /obj/item/radio/headset/silicon/ai/evil + radio_enabled = TRUE + interaction_range = 1 + sprint = 5 + +/mob/living/silicon/ai/weak_syndie/Initialize(mapload, datum/ai_laws/L, mob/target_ai) + . = ..() + laws = new /datum/ai_laws/syndicate_override + /mob/living/silicon/ai/key_down(_key, client/user) if(findtext(_key, "numpad")) //if it's a numpad number, we can convert it to just the number _key = _key[7] //strings, lists, same thing really switch(_key) if("`", "0") if(cam_prev) - cameraFollow = null //stop following something, we want to jump away. + if(ai_tracking_tool.tracking) + ai_tracking_tool.set_tracking(FALSE) eyeobj.setLoc(cam_prev) return if("1", "2", "3", "4", "5", "6", "7", "8", "9") @@ -214,7 +227,8 @@ return if(cam_hotkeys[_key]) //if this is false, no hotkey for this slot exists. cam_prev = eyeobj.loc - cameraFollow = null //stop following something, we want to jump away. + if(ai_tracking_tool.tracking) + ai_tracking_tool.set_tracking(FALSE) eyeobj.setLoc(cam_hotkeys[_key]) return return ..() @@ -230,6 +244,7 @@ QDEL_NULL(robot_control) QDEL_NULL(aiMulti) QDEL_NULL(alert_control) + QDEL_NULL(ai_tracking_tool) malfhack = null current = null bot_ref = null @@ -239,6 +254,7 @@ if(ai_voicechanger) ai_voicechanger.owner = null ai_voicechanger = null + UnregisterSignal(src, COMSIG_TRACKABLE_TRACKING_TARGET) return ..() /// Removes all malfunction-related abilities from the AI @@ -385,6 +401,20 @@ /mob/living/silicon/ai/cancel_camera() view_core() +/mob/living/silicon/ai/verb/ai_camera_track() + set name = "track" + set hidden = TRUE //Don't display it on the verb lists. This verb exists purely so you can type "track Oldman Robustin" and follow his ass + + ai_tracking_tool.set_tracked_mob(src) + +///Called when an AI finds their tracking target. +/mob/living/silicon/ai/proc/on_track_target(datum/trackable/source, mob/living/target) + SIGNAL_HANDLER + if(eyeobj) + eyeobj.setLoc(get_turf(target)) + else + view_core() + /mob/living/silicon/ai/verb/toggle_anchor() set category = "AI Commands" set name = "Toggle Floor Bolts" @@ -504,24 +534,7 @@ else to_chat(src, span_notice("Unable to project to the holopad.")) if(href_list["track"]) - var/string = href_list["track"] - trackable_mobs() - var/list/trackeable = list() - trackeable += track.humans + track.others - var/list/target = list() - for(var/I in trackeable) - var/datum/weakref/to_resolve = trackeable[I] - var/mob/to_track = to_resolve.resolve() - if(!to_track || to_track.name != string) - continue - target += to_track - if(name == string) - target += src - if(length(target)) - cam_prev = get_turf(eyeobj) - ai_actual_track(pick(target)) - else - to_chat(src, "Target is not on or near any active cameras on the station.") + ai_tracking_tool.set_tracked_mob(src, href_list["track"]) return if (href_list["ai_take_control"]) //Mech domination var/obj/vehicle/sealed/mecha/M = locate(href_list["ai_take_control"]) in GLOB.mechas_list @@ -560,12 +573,13 @@ if(QDELETED(C)) return FALSE - if(!tracking) - cameraFollow = null - if(QDELETED(eyeobj)) view_core() return + + if(ai_tracking_tool.tracking) + ai_tracking_tool.set_tracking(FALSE) + // ok, we're alive, camera is good and in our network... eyeobj.setLoc(get_turf(C)) return TRUE @@ -634,7 +648,8 @@ set category = "AI Commands" set name = "Jump To Network" unset_machine() - cameraFollow = null + if(ai_tracking_tool.tracking) + ai_tracking_tool.set_tracking(FALSE) var/cameralist[0] if(incapacitated()) @@ -864,7 +879,6 @@ new_core.circuit.battery = battery ai_restore_power()//So the AI initially has power. control_disabled = TRUE //Can't control things remotely if you're stuck in a card! - interaction_range = 0 radio_enabled = FALSE //No talking on the built-in radio for you either! forceMove(card) card.AI = src @@ -984,7 +998,7 @@ update_sight() if(client.eye != src) var/atom/AT = client.eye - AT.get_remote_view_fullscreens(src) + AT?.get_remote_view_fullscreens(src) else clear_fullscreen("remote_view", 0) @@ -1147,6 +1161,14 @@ else if(.) REMOVE_TRAIT(src, TRAIT_INCAPACITATED, POWER_LACK_TRAIT) +/mob/living/silicon/ai/proc/show_camera_list() + var/list/cameras = get_camera_list(network) + var/camera = tgui_input_list(src, "Choose which camera you want to view", "Cameras", cameras) + if(isnull(camera)) + return + if(isnull(cameras[camera])) + return + switchCamera(cameras[camera]) /mob/living/silicon/on_handsblocked_start() return // AIs have no hands diff --git a/code/modules/mob/living/silicon/ai/ai_say.dm b/code/modules/mob/living/silicon/ai/ai_say.dm index a2805ae4144..78519109101 100644 --- a/code/modules/mob/living/silicon/ai/ai_say.dm +++ b/code/modules/mob/living/silicon/ai/ai_say.dm @@ -156,11 +156,7 @@ if(!only_listener) // Play voice for all mobs in the z level for(var/mob/player_mob as anything in GLOB.player_list) - if(player_mob.client && !player_mob.client?.prefs) - stack_trace("[player_mob] ([player_mob.ckey]) has null prefs, which shouldn't be possible!") - continue - - if(!player_mob.can_hear() || !(player_mob.client?.prefs.read_preference(/datum/preference/toggle/sound_announcements))) + if(!player_mob.can_hear() || !(safe_read_pref(player_mob.client, /datum/preference/toggle/sound_announcements))) continue var/turf/player_turf = get_turf(player_mob) diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index e064cb3da58..03824857c4e 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -21,8 +21,6 @@ if(icon_exists(icon, "[base_icon]_death_transition")) flick("[base_icon]_death_transition", src) - cameraFollow = null - if(is_anchored) flip_anchored() diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index 9b72c455995..a9ad9884045 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -165,9 +165,10 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) /// Will check if a mob is on a viewable turf. Returns 1 if it is, otherwise returns 0. /datum/cameranet/proc/checkCameraVis(mob/living/target) var/turf/position = get_turf(target) + if(!position) + return return checkTurfVis(position) - /datum/cameranet/proc/checkTurfVis(turf/position) var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z) if(chunk) @@ -177,6 +178,16 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) return TRUE return FALSE +/datum/cameranet/proc/getTurfVis(turf/position) + RETURN_TYPE(/datum/camerachunk) + var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z) + if(!chunk) + return FALSE + if(chunk.changed) + chunk.hasChanged(1) // Update now, no matter if it's visible or not. + if(chunk.visibleTurfs[position]) + return chunk + /obj/effect/overlay/camera_static name = "static" icon = null diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index e5390f9a3f0..6204ecdea60 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -93,32 +93,33 @@ // It will also stream the chunk that the new loc is in. /mob/camera/ai_eye/proc/setLoc(destination, force_update = FALSE) - if(ai) - if(!isturf(ai.loc)) - return - destination = get_turf(destination) - if(!force_update && (destination == get_turf(src)) ) - return //we are already here! - if (destination) - abstract_move(destination) - else - moveToNullspace() - if(use_static) - ai.camera_visibility(src) - if(ai.client && !ai.multicam_on) - ai.client.set_eye(src) - update_ai_detect_hud() - update_parallax_contents() - //Holopad - if(istype(ai.current, /obj/machinery/holopad)) - var/obj/machinery/holopad/H = ai.current - if(!H.move_hologram(ai, destination)) - H.clear_holo(ai) + if(!ai) + return + if(!isturf(ai.loc)) + return + destination = get_turf(destination) + if(!force_update && (destination == get_turf(src))) + return //we are already here! + if (destination) + abstract_move(destination) + else + moveToNullspace() + if(use_static) + ai.camera_visibility(src) + if(ai.client && !ai.multicam_on) + ai.client.set_eye(src) + update_ai_detect_hud() + update_parallax_contents() + //Holopad + if(istype(ai.current, /obj/machinery/holopad)) + var/obj/machinery/holopad/H = ai.current + if(!H.move_hologram(ai, destination)) + H.clear_holo(ai) - if(ai.camera_light_on) - ai.light_cameras() - if(ai.master_multicam) - ai.master_multicam.refresh_view() + if(ai.camera_light_on) + ai.light_cameras() + if(ai.master_multicam) + ai.master_multicam.refresh_view() /mob/camera/ai_eye/zMove(dir, turf/target, z_move_flags = NONE, recursions_left = 1, list/falling_movs) . = ..() @@ -149,12 +150,14 @@ return ..() /atom/proc/move_camera_by_click() - if(isAI(usr)) - var/mob/living/silicon/ai/AI = usr - if(AI.eyeobj && (AI.multicam_on || (AI.client.eye == AI.eyeobj)) && (AI.eyeobj.z == z)) - AI.cameraFollow = null - if (isturf(loc) || isturf(src)) - AI.eyeobj.setLoc(src) + if(!isAI(usr)) + return + var/mob/living/silicon/ai/AI = usr + if(AI.eyeobj && (AI.multicam_on || (AI.client.eye == AI.eyeobj)) && (AI.eyeobj.z == z)) + if(AI.ai_tracking_tool.tracking) + AI.ai_tracking_tool.set_tracking(FALSE) + if (isturf(loc) || isturf(src)) + AI.eyeobj.setLoc(src) // This will move the AIEye. It will also cause lights near the eye to light up, if toggled. // This is handled in the proc below this one. @@ -178,8 +181,8 @@ else user.sprint = initial - if(!user.tracking) - user.cameraFollow = null + if(user.ai_tracking_tool.tracking) + user.ai_tracking_tool.set_tracking(FALSE) // Return to the Core. /mob/living/silicon/ai/proc/view_core() @@ -188,7 +191,8 @@ H.clear_holo(src) else current = null - cameraFollow = null + if(ai_tracking_tool && ai_tracking_tool.tracking) + ai_tracking_tool.set_tracking(FALSE) unset_machine() if(isturf(loc) && (QDELETED(eyeobj) || !eyeobj.loc)) @@ -227,7 +231,7 @@ /mob/camera/ai_eye/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range) . = ..() - if(relay_speech && speaker && ai && !radio_freq && speaker != ai && near_camera(speaker)) + if(relay_speech && speaker && ai && !radio_freq && speaker != ai && GLOB.cameranet.checkCameraVis(speaker)) ai.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans, message_mods) /obj/effect/overlay/ai_detect_hud diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 18a47acf703..966db2b7697 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -82,8 +82,6 @@ if(aiRestorePowerRoutine) clear_sight(SEE_TURFS|SEE_MOBS|SEE_OBJS) - if(see_override) - set_invis_see(see_override) return ..() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index e30dc26bc74..9732222f0cf 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -419,11 +419,11 @@ // They stay locked down if their wire is cut. if(wires?.is_cut(WIRE_LOCKDOWN)) state = TRUE - else if(!ai_lockdown) - lockdown_timer = addtimer(CALLBACK(src,PROC_REF(lockdown_override), FALSE), 10 MINUTES, TIMER_UNIQUE | TIMER_OVERRIDE | TIMER_DELETE_ME | TIMER_STOPPABLE) - to_chat(src, "

[span_alert("ALERT - Remote system lockdown engaged. Trying to hack the lockdown subsystem...")]
") if(state) throw_alert(ALERT_HACKED, /atom/movable/screen/alert/locked) + if(!ai_lockdown) + lockdown_timer = addtimer(CALLBACK(src,PROC_REF(lockdown_override), FALSE), 10 MINUTES, TIMER_UNIQUE | TIMER_OVERRIDE | TIMER_DELETE_ME | TIMER_STOPPABLE) + to_chat(src, "

[span_alert("ALERT - Remote system lockdown engaged. Trying to hack the lockdown subsystem...")]
") else deltimer(lockdown_timer) clear_alert(ALERT_HACKED) @@ -662,9 +662,6 @@ lighting_color_cutoffs = blend_cutoff_colors(lighting_color_cutoffs, list(25, 8, 5)) set_invis_see(min(see_invisible, SEE_INVISIBLE_LIVING)) - if(see_override) - set_invis_see(see_override) - if(SSmapping.level_trait(z, ZTRAIT_NOXRAY)) new_sight = null @@ -685,6 +682,7 @@ update_health_hud() update_icons() //Updates eye_light overlay + /mob/living/silicon/robot/revive(full_heal_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE) . = ..() if(!.) @@ -697,6 +695,7 @@ src.set_stat(CONSCIOUS) notify_ai(AI_NOTIFICATION_NEW_BORG) toggle_headlamp(FALSE, TRUE) //This will reenable borg headlamps if doomsday is currently going on still. + update_stat() return TRUE /mob/living/silicon/robot/fully_replace_character_name(oldname, newname) @@ -1037,3 +1036,13 @@ /// Draw power from the robot /mob/living/silicon/robot/proc/draw_power(power_to_draw) cell?.use(power_to_draw) + + +/mob/living/silicon/robot/set_stat(new_stat) + . = ..() + update_stat() // This is probably not needed, but hopefully should be a little sanity check for the spaghetti that borgs are built from + +/mob/living/silicon/robot/on_knockedout_trait_loss(datum/source) + . = ..() + set_stat(CONSCIOUS) //This is a horrible hack, but silicon code forced my hand + update_stat() diff --git a/code/modules/mob/living/silicon/robot/robot_model.dm b/code/modules/mob/living/silicon/robot/robot_model.dm index 8fa15bda9a2..a1313b7cace 100644 --- a/code/modules/mob/living/silicon/robot/robot_model.dm +++ b/code/modules/mob/living/silicon/robot/robot_model.dm @@ -193,9 +193,8 @@ if(!to_stock) //Nothing for us in the silo continue - storage_datum.energy += mat_container.use_amount_mat(to_stock, storage_datum.mat_type) + storage_datum.energy += charger.materials.use_materials(list(GET_MATERIAL_REF(storage_datum.mat_type) = to_stock), action = "resupplied", name = "units") charger.balloon_alert(robot, "+ [to_stock]u [initial(storage_datum.mat_type.name)]") - charger.materials.silo_log(charger, "resupplied", -1, "units", list(GET_MATERIAL_REF(storage_datum.mat_type) = to_stock)) playsound(charger, 'sound/weapons/gun/general/mag_bullet_insert.ogg', 50, vary = FALSE) return charger.balloon_alert(robot, "restock process complete") diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 1b20b5d4b15..fbe9986c3ca 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -49,6 +49,7 @@ var/emagged = FALSE var/hack_software = FALSE //Will be able to use hacking actions interaction_range = 7 //wireless control range + var/control_disabled = FALSE // Set to 1 to stop AI from interacting via Click() var/obj/item/modular_computer/pda/silicon/modularInterface diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 41f9234638e..bf785954fe7 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -6,7 +6,6 @@ mob_biotypes = MOB_ROBOTIC stop_automated_movement = TRUE wander = FALSE - healable = FALSE damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) hud_possible = list(DIAG_STAT_HUD, DIAG_BOT_HUD, DIAG_HUD, DIAG_BATT_HUD, DIAG_PATH_HUD = HUD_LIST_LIST) diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index 603e6fbfb4b..b4b4dd80f7f 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -128,10 +128,12 @@ return ..() /mob/living/simple_animal/bot/cleanbot/Exited(atom/movable/gone, direction) + . = ..() if(gone == build_bucket) build_bucket = null - return ..() - + if(gone == weapon) + weapon = null + update_appearance(UPDATE_ICON) /mob/living/simple_animal/bot/cleanbot/Destroy() QDEL_NULL(build_bucket) @@ -248,12 +250,6 @@ if(is_type_in_typecache(scan_target, target_types)) return scan_target -/mob/living/simple_animal/bot/cleanbot/handle_atom_del(atom/deleting_atom) - if(deleting_atom == weapon) - weapon = null - update_appearance(UPDATE_ICON) - return ..() - /mob/living/simple_animal/bot/cleanbot/handle_automated_action() . = ..() if(!.) diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index 9428ece78cb..f3b9040e4b1 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -132,6 +132,39 @@ heal_threshold = 0 heal_amount = 5 +/mob/living/simple_animal/bot/medbot/nukie + name = "Oppenheimer" + desc = "A medibot stolen from a Nanotrasen station and upgraded by the Syndicate. Despite their best efforts at reprogramming, it still appears visibly upset near nuclear explosives." + skin = "bezerk" + health = 40 + maxHealth = 40 + maints_access_required = list(ACCESS_SYNDICATE) + radio_key = /obj/item/encryptionkey/syndicate + radio_channel = RADIO_CHANNEL_SYNDICATE + damagetype_healer = "all" + heal_threshold = 0 + heal_amount = 5 + +/mob/living/simple_animal/bot/medbot/nukie/Initialize(mapload, new_skin) + . = ..() + RegisterSignal(SSdcs, COMSIG_GLOB_NUKE_DEVICE_DISARMED, PROC_REF(nuke_disarm)) + RegisterSignal(SSdcs, COMSIG_GLOB_NUKE_DEVICE_ARMED, PROC_REF(nuke_arm)) + RegisterSignal(SSdcs, COMSIG_GLOB_NUKE_DEVICE_DETONATING, PROC_REF(nuke_detonate)) + internal_radio.set_frequency(FREQ_SYNDICATE) + internal_radio.freqlock = RADIO_FREQENCY_LOCKED + +/mob/living/simple_animal/bot/medbot/nukie/proc/nuke_disarm() + SIGNAL_HANDLER + INVOKE_ASYNC(src, PROC_REF(speak), pick(MEDIBOT_VOICED_FORGIVE, MEDIBOT_VOICED_THANKS, MEDIBOT_VOICED_GOOD_PERSON)) + +/mob/living/simple_animal/bot/medbot/nukie/proc/nuke_arm() + SIGNAL_HANDLER + INVOKE_ASYNC(src, PROC_REF(speak), pick(MEDIBOT_VOICED_WAIT, MEDIBOT_VOICED_DONT, MEDIBOT_VOICED_IM_SCARED)) + +/mob/living/simple_animal/bot/medbot/nukie/proc/nuke_detonate() + SIGNAL_HANDLER + INVOKE_ASYNC(src, PROC_REF(speak), pick(MEDIBOT_VOICED_THE_END, MEDIBOT_VOICED_NOOO, MEDIBOT_VOICED_SUFFER)) + /mob/living/simple_animal/bot/medbot/examine(mob/user) . = ..() if(tipped_status == MEDBOT_PANIC_NONE) @@ -175,7 +208,8 @@ access_card.add_access(para_trim.access + para_trim.wildcard_access) prev_access = access_card.access.Copy() - skin = new_skin + if(!isnull(new_skin)) + skin = new_skin update_appearance() if(!CONFIG_GET(flag/no_default_techweb_link) && !linked_techweb) linked_techweb = SSresearch.science_tech diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 2af81656139..c6ae677136a 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -86,14 +86,14 @@ AddElement(/datum/element/ridable, /datum/component/riding/creature/mulebot) diag_hud_set_mulebotcell() -/mob/living/simple_animal/bot/mulebot/handle_atom_del(atom/A) - if(A == load) +/mob/living/simple_animal/bot/mulebot/Exited(atom/movable/gone, direction) + . = ..() + if(gone == load) unload(0) - if(A == cell) + if(gone == cell) turn_off() cell = null diag_hud_set_mulebotcell() - return ..() /mob/living/simple_animal/bot/mulebot/examine(mob/user) . = ..() diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 28defd68aa3..04b62db59d3 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -158,11 +158,11 @@ playsound(src, 'sound/machines/defib_zap.ogg', 50) visible_message(span_warning("[src] shakes and speeds up!")) -/mob/living/simple_animal/bot/secbot/handle_atom_del(atom/deleting_atom) - if(deleting_atom == weapon) +/mob/living/simple_animal/bot/secbot/Exited(atom/movable/gone, direction) + . = ..() + if(gone == weapon) weapon = null update_appearance() - return ..() // Variables sent to TGUI /mob/living/simple_animal/bot/secbot/ui_data(mob/user) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index 356b6b18cba..b095016827f 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -27,7 +27,6 @@ maxbodytemp = 0 wander = 0 speed = 0 - healable = 0 density = FALSE pass_flags = PASSTABLE | PASSMOB sight = SEE_TURFS | SEE_OBJS @@ -45,7 +44,7 @@ unique_name = TRUE faction = list(FACTION_NEUTRAL,FACTION_SILICON,FACTION_TURRET) dextrous = TRUE - dextrous_hud_type = /datum/hud/dextrous/drone + hud_type = /datum/hud/dextrous/drone // Going for a sort of pale green here lighting_cutoff_red = 30 lighting_cutoff_green = 35 diff --git a/code/modules/mob/living/simple_animal/friendly/pet.dm b/code/modules/mob/living/simple_animal/friendly/pet.dm index 2c509d799ee..084ce1577e4 100644 --- a/code/modules/mob/living/simple_animal/friendly/pet.dm +++ b/code/modules/mob/living/simple_animal/friendly/pet.dm @@ -75,10 +75,10 @@ . = ..() add_memory_in_range(src, 7, /datum/memory/pet_died, deuteragonist = src) //Protagonist is the person memorizing it -/mob/living/simple_animal/pet/handle_atom_del(atom/deleting_atom) +/mob/living/simple_animal/pet/Exited(atom/movable/gone, direction) . = ..() - if(deleting_atom != collar) + if(gone != collar) return collar = null diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 51676c54a3f..7d7d7ecdc6f 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -29,7 +29,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians attack_verb_simple = "punch" maxHealth = INFINITY //The spirit itself is invincible health = INFINITY - healable = FALSE //don't brusepack the guardian + mob_biotypes = MOB_BEAST damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) //how much damage from each damage type we transfer to the owner environment_smash = ENVIRONMENT_SMASH_STRUCTURES obj_damage = 40 @@ -43,7 +43,6 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians light_range = 3 light_on = FALSE hud_type = /datum/hud/guardian - dextrous_hud_type = /datum/hud/dextrous/guardian //if we're set to dextrous, account for it. faction = list() /// The guardian's color, used for their sprite, chat, and some effects made by it. @@ -407,10 +406,9 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians return to_chat(summoner, span_bolddanger("Your [name] is under attack! You take damage!")) summoner.visible_message(span_bolddanger("Blood sprays from [summoner] as [src] takes damage!")) - switch(summoner.stat) - if(UNCONSCIOUS, HARD_CRIT) - to_chat(summoner, span_bolddanger("Your body can't take the strain of sustaining [src] in this condition, it begins to fall apart!")) - summoner.adjustCloneLoss(amount * 0.5) //dying hosts take 50% bonus damage as cloneloss + if(summoner.stat == UNCONSCIOUS || summoner.stat == HARD_CRIT) + to_chat(summoner, span_bolddanger("Your head pounds, you can't take the strain of sustaining [src] in this condition!")) + summoner.adjustOrganLoss(ORGAN_SLOT_BRAIN, amount * 0.5) /mob/living/simple_animal/hostile/guardian/ex_act(severity, target) switch(severity) diff --git a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm index 9d7fb55edad..798b2067c63 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm @@ -12,6 +12,7 @@ creator_desc = "Does low damage on attack, but is capable of holding items and storing a single item within it. It will drop items held in its hands when it recalls, but it will retain the stored item." creator_icon = "dextrous" dextrous = TRUE + hud_type = /datum/hud/dextrous/guardian held_items = list(null, null) var/obj/item/internal_storage //what we're storing within ourself diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm index 2bcfb639749..5347f049e13 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/support.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm @@ -50,7 +50,7 @@ target.adjustBruteLoss(-healing_amount) target.adjustFireLoss(-healing_amount) target.adjustOxyLoss(-healing_amount) - target.adjustToxLoss(-healing_amount) + target.adjustToxLoss(-healing_amount, forced = TRUE) var/obj/effect/temp_visual/heal/heal_effect = new /obj/effect/temp_visual/heal(get_turf(target)) heal_effect.color = guardian_color diff --git a/code/modules/mob/living/simple_animal/hostile/constructs/constructs.dm b/code/modules/mob/living/simple_animal/hostile/constructs/constructs.dm index 3d2702530ff..124b797d0da 100644 --- a/code/modules/mob/living/simple_animal/hostile/constructs/constructs.dm +++ b/code/modules/mob/living/simple_animal/hostile/constructs/constructs.dm @@ -26,7 +26,6 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 maxbodytemp = INFINITY - healable = 0 faction = list(FACTION_CULT) pressure_resistance = 100 unique_name = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm deleted file mode 100644 index 8c78685517a..00000000000 --- a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm +++ /dev/null @@ -1,43 +0,0 @@ -/mob/living/simple_animal/hostile/eyeball - name = "eyeball" - desc = "An odd looking creature, it won't stop staring..." - icon = 'icons/mob/simple/carp.dmi' - icon_state = "eyeball" - icon_living = "eyeball" - icon_gib = "" - maxHealth = 30 - health = 30 - harm_intent_damage = 15 - obj_damage = 10 - melee_damage_lower = 8 - melee_damage_upper = 12 - speed = 0 - gender = NEUTER - mob_biotypes = MOB_ORGANIC - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "gently pushes aside" - response_disarm_simple = "gently push aside" - emote_taunt = list("glares") - taunt_chance = 25 - speak_emote = list("telepathically cries") - turns_per_move = 5 - attack_verb_continuous = "blinks at" - attack_verb_simple = "blink at" - attack_sound = 'sound/weapons/pierce.ogg' - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - maxbodytemp = 1500 - gold_core_spawnable = HOSTILE_SPAWN - faction = list(FACTION_SPOOKY) - del_on_death = 1 - // Redish ethereal glow. These lads live on the cult ship - lighting_cutoff_red = 40 - lighting_cutoff_green = 20 - lighting_cutoff_blue = 30 - sight = SEE_SELF|SEE_MOBS|SEE_OBJS|SEE_TURFS - -/mob/living/simple_animal/hostile/eyeball/Initialize(mapload) - . = ..() - AddElement(/datum/element/simple_flying) - ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm index fa86cc950e5..cceb0cdf58c 100644 --- a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm +++ b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm @@ -30,6 +30,7 @@ attack_verb_simple = "pummel" attack_sound = 'sound/weapons/punch1.ogg' dextrous = TRUE + hud_type = /datum/hud/dextrous held_items = list(null, null) faction = list(FACTION_MONKEY, FACTION_JUNGLE) robust_searching = TRUE @@ -114,6 +115,23 @@ oogas = rand(2,6) playsound(src, 'sound/creatures/gorilla.ogg', 50) +/mob/living/simple_animal/hostile/gorilla/lesser + name = "lesser Gorilla" + desc = "An adolescent Gorilla. It may not be fully grown but, much like a banana, that just means it's sturdier and harder to chew!" + speak_chance = 100 // compensating for something + maxHealth = 120 + health = 120 + butcher_results = list(/obj/item/food/meat/slab/gorilla = 2) + speed = 0.35 + melee_damage_lower = 10 + melee_damage_upper = 15 + obj_damage = 15 + stat_attack = SOFT_CRIT + unique_name = TRUE + +/mob/living/simple_animal/hostile/gorilla/lesser/Initialize(mapload) + . = ..() + transform *= 0.75 // smolrilla /mob/living/simple_animal/hostile/gorilla/cargo_domestic name = "Cargorilla" // Overriden, normally diff --git a/code/modules/mob/living/simple_animal/hostile/heretic_monsters.dm b/code/modules/mob/living/simple_animal/hostile/heretic_monsters.dm index 6b87eb03ffd..4269f847d92 100644 --- a/code/modules/mob/living/simple_animal/hostile/heretic_monsters.dm +++ b/code/modules/mob/living/simple_animal/hostile/heretic_monsters.dm @@ -26,7 +26,6 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 maxbodytemp = INFINITY - healable = FALSE movement_type = GROUND pressure_resistance = 100 del_on_death = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 277076661bc..305853adb96 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -480,20 +480,11 @@ else targeted_zone = ran_zone() casing.fire_casing(targeted_atom, src, null, null, null, targeted_zone, 0, src) - else if(projectiletype) - var/obj/projectile/P = new projectiletype(startloc) - playsound(src, projectilesound, 100, TRUE) - P.starting = startloc - P.firer = src - P.fired_from = src - P.yo = targeted_atom.y - startloc.y - P.xo = targeted_atom.x - startloc.x + return + if(projectiletype) + fire_projectile(projectiletype, targeted_atom, projectilesound) if(AIStatus != AI_ON)//Don't want mindless mobs to have their movement screwed up firing in space newtonian_move(get_dir(targeted_atom, target_from)) - P.original = targeted_atom - P.preparePixelProjectile(targeted_atom, src) - P.fire() - return P /mob/living/simple_animal/hostile/proc/CanSmashTurfs(turf/T) diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm index 801a9e75ec8..65c03c446df 100644 --- a/code/modules/mob/living/simple_animal/hostile/illusion.dm +++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm @@ -16,25 +16,19 @@ health = 100 speed = 0 faction = list(FACTION_ILLUSION) - var/life_span = INFINITY //how long until they despawn - var/mob/living/parent_mob - var/multiply_chance = 0 //if we multiply on hit - del_on_death = 1 + del_on_death = TRUE death_message = "vanishes into thin air! It was a fake!" + /// Weakref to what we're copying + var/datum/weakref/parent_mob_ref + /// Prob of getting a clone on attack + var/multiply_chance = 0 - -/mob/living/simple_animal/hostile/illusion/Life(seconds_per_tick = SSMOBS_DT, times_fired) - ..() - if(world.time > life_span) - death() - - -/mob/living/simple_animal/hostile/illusion/proc/Copy_Parent(mob/living/original, life = 50, hp = 100, damage = 0, replicate = 0 ) +/mob/living/simple_animal/hostile/illusion/proc/Copy_Parent(mob/living/original, life = 5 SECONDS, hp = 100, damage = 0, replicate = 0) appearance = original.appearance - parent_mob = original + parent_mob_ref = WEAKREF(original) setDir(original.dir) - life_span = world.time+life - health = hp + maxHealth = hp + updatehealth() // re-cap health to new value melee_damage_lower = damage melee_damage_upper = damage multiply_chance = replicate @@ -42,25 +36,28 @@ transform = initial(transform) pixel_x = base_pixel_x pixel_y = base_pixel_y - + addtimer(CALLBACK(src, TYPE_PROC_REF(/mob/living, death)), life) /mob/living/simple_animal/hostile/illusion/examine(mob/user) + var/mob/living/parent_mob = parent_mob_ref?.resolve() if(parent_mob) return parent_mob.examine(user) - else - return ..() - + return ..() /mob/living/simple_animal/hostile/illusion/AttackingTarget() . = ..() - if(. && isliving(target) && prob(multiply_chance)) - var/mob/living/L = target - if(L.stat == DEAD) - return - var/mob/living/simple_animal/hostile/illusion/M = new(loc) - M.faction = faction.Copy() - M.Copy_Parent(parent_mob, 80, health/2, melee_damage_upper, multiply_chance/2) - M.GiveTarget(L) + if(!. || !isliving(target) || !prob(multiply_chance)) + return + var/mob/living/hitting_target = target + if(hitting_target.stat == DEAD) + return + var/mob/living/parent_mob = parent_mob_ref?.resolve() + if(isnull(parent_mob)) + return + var/mob/living/simple_animal/hostile/illusion/new_clone = new(loc) + new_clone.Copy_Parent(parent_mob, 8 SECONDS, health / 2, melee_damage_upper, multiply_chance / 2) + new_clone.faction = faction.Copy() + new_clone.GiveTarget(target) ///////Actual Types///////// diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm index 7e7e0b34510..aa7ddc11c72 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm @@ -148,6 +148,7 @@ /mob/living/simple_animal/hostile/jungle/leaper/Initialize(mapload) . = ..() + AddComponent(/datum/component/seethrough_mob) remove_verb(src, /mob/living/verb/pulled) add_cell_sample() diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm b/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm deleted file mode 100644 index b7caeb42c14..00000000000 --- a/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm +++ /dev/null @@ -1,84 +0,0 @@ -//Large and powerful, but timid. It won't engage anything above 50 health, or anything without legcuffs. -//It can fire fleshy snares that legcuff anyone that it hits, making them look especially tasty to the arachnid. -/mob/living/simple_animal/hostile/jungle/mega_arachnid - name = "mega arachnid" - desc = "Though physically imposing, it prefers to ambush its prey, and it will only engage with an already crippled opponent." - icon = 'icons/mob/simple/jungle/arachnid.dmi' - icon_state = "arachnid" - icon_living = "arachnid" - icon_dead = "arachnid_dead" - mob_biotypes = MOB_ORGANIC|MOB_BUG - melee_damage_lower = 30 - melee_damage_upper = 30 - maxHealth = 300 - health = 300 - speed = 1 - ranged = 1 - pixel_x = -16 - base_pixel_x = -16 - move_to_delay = 10 - aggro_vision_range = 9 - speak_emote = list("chitters") - attack_sound = 'sound/weapons/bladeslice.ogg' - attack_vis_effect = ATTACK_EFFECT_SLASH - ranged_cooldown_time = 60 - projectiletype = /obj/projectile/mega_arachnid - projectilesound = 'sound/weapons/pierce.ogg' - alpha = 50 - - footstep_type = FOOTSTEP_MOB_CLAW - var/datum/action/small_sprite/mini_arachnid = new/datum/action/small_sprite/mega_arachnid() - -/mob/living/simple_animal/hostile/jungle/mega_arachnid/Life(seconds_per_tick = SSMOBS_DT, times_fired) - ..() - if(target && ranged_cooldown > world.time && iscarbon(target)) - var/mob/living/carbon/C = target - if(!C.legcuffed && C.health < 50) - retreat_distance = 9 - minimum_distance = 9 - alpha = 125 - return - retreat_distance = 0 - minimum_distance = 0 - alpha = 255 - - -/mob/living/simple_animal/hostile/jungle/mega_arachnid/Aggro() - ..() - alpha = 255 - -/mob/living/simple_animal/hostile/jungle/mega_arachnid/LoseAggro() - ..() - alpha = 50 - -/mob/living/simple_animal/hostile/jungle/mega_arachnid/Initialize(mapload) - . = ..() - add_cell_sample() - mini_arachnid.Grant(src) - -/mob/living/simple_animal/hostile/jungle/mega_arachnid/add_cell_sample() - . = ..() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_MEGA_ARACHNID, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - -/obj/projectile/mega_arachnid - name = "flesh snare" - icon_state = "tentacle_end" - damage = 0 - -/obj/projectile/mega_arachnid/on_hit(atom/target, blocked = FALSE) - if(iscarbon(target) && blocked < 100) - var/obj/item/restraints/legcuffs/beartrap/mega_arachnid/B = new /obj/item/restraints/legcuffs/beartrap/mega_arachnid(get_turf(target)) - B.spring_trap(null, target) - return ..() - -/obj/item/restraints/legcuffs/beartrap/mega_arachnid - name = "fleshy restraints" - desc = "Used by mega arachnids to immobilize their prey." - item_flags = DROPDEL - flags_1 = NONE - icon_state = "flesh_snare" - armed = TRUE - -/obj/item/restraints/legcuffs/beartrap/mega_arachnid/Initialize(mapload) - . = ..() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_MEGA_ARACHNID, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm index 81000dfd17e..6a040ed7a33 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm @@ -50,11 +50,10 @@ var/chosen_attack = 1 /// Attack actions, sets chosen_attack to the number in the action var/list/attack_action_types = list() - /// If there is a small sprite icon for players controlling the megafauna to use - var/small_sprite_type /mob/living/simple_animal/hostile/megafauna/Initialize(mapload) . = ..() + AddComponent(/datum/component/seethrough_mob) AddElement(/datum/element/simple_flying) if(gps_name && true_spawn) AddComponent(/datum/component/gps, gps_name) @@ -63,9 +62,6 @@ for(var/action_type in attack_action_types) var/datum/action/innate/megafauna_attack/attack_action = new action_type() attack_action.Grant(src) - if(small_sprite_type) - var/datum/action/small_sprite/small_action = new small_sprite_type() - small_action.Grant(src) /mob/living/simple_animal/hostile/megafauna/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) //Safety check diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 55b80a8d0b8..db18216880e 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -67,7 +67,6 @@ Difficulty: Hard score_achievement_type = /datum/award/score/bubblegum_score death_message = "sinks into a pool of blood, fleeing the battle. You've won, for now... " death_sound = 'sound/magic/enter_blood.ogg' - small_sprite_type = /datum/action/small_sprite/megafauna/bubblegum faction = list(FACTION_MINING, FACTION_BOSS, FACTION_HELL) /// Check to see if we should spawn blood var/spawn_blood = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 99f7a69e777..a9c38d985c1 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -55,7 +55,6 @@ loot = list(/obj/structure/closet/crate/necropolis/colossus) death_message = "disintegrates, leaving a glowing core in its wake." death_sound = 'sound/magic/demon_dies.ogg' - small_sprite_type = /datum/action/small_sprite/megafauna/colossus /// Spiral shots ability var/datum/action/cooldown/mob_cooldown/projectile_attack/spiral_shots/colossus/spiral_shots /// Random shots ablity @@ -425,7 +424,7 @@ name = "lavaland" floor = /turf/open/floor/fakebasalt wall = /turf/closed/wall/mineral/cult - flora_and_fauna = list(/mob/living/simple_animal/hostile/asteroid/goldgrub) + flora_and_fauna = list(/mob/living/basic/mining/goldgrub) flora_and_fauna_chance = 1 // Snow terrain is slow to move in and cold! Get the assistants to shovel your driveway. diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm index aee844dd52f..fab7548e4e9 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm @@ -354,8 +354,8 @@ Difficulty: Extremely Hard if(!owner.stat) to_chat(owner, span_userdanger("You become frozen in a cube!")) cube = icon('icons/effects/freeze.dmi', "ice_cube") - var/icon/size_check = icon(owner.icon, owner.icon_state) - cube.Scale(size_check.Width(), size_check.Height()) + var/list/icon_dimensions = get_icon_dimensions(owner.icon) + cube.Scale(icon_dimensions["width"], icon_dimensions["height"]) owner.add_overlay(cube) return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 66d380f65e4..66d487c8697 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -73,7 +73,6 @@ death_message = "collapses into a pile of bones, its flesh sloughing away." death_sound = 'sound/magic/demon_dies.ogg' footstep_type = FOOTSTEP_MOB_HEAVY - small_sprite_type = /datum/action/small_sprite/megafauna/drake /// Fire cone ability var/datum/action/cooldown/mob_cooldown/fire_breath/cone/fire_cone /// Meteors ability diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index ec106189067..05695daf59a 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -60,7 +60,6 @@ attack_action_types = list(/datum/action/innate/megafauna_attack/create_skull, /datum/action/innate/megafauna_attack/charge_target, /datum/action/innate/megafauna_attack/create_turrets) - small_sprite_type = /datum/action/small_sprite/megafauna/legion var/size = LEGION_LARGE var/charging = FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm deleted file mode 100644 index 97a144f0477..00000000000 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ /dev/null @@ -1,220 +0,0 @@ -//A beast that fire freezing blasts. -/mob/living/simple_animal/hostile/asteroid/basilisk - name = "basilisk" - desc = "A territorial beast, covered in a thick shell that absorbs energy. Its stare causes victims to freeze from the inside." - icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' - icon_state = "Basilisk" - icon_living = "Basilisk" - icon_aggro = "Basilisk_alert" - icon_dead = "Basilisk_dead" - icon_gib = "syndicate_gib" - mob_biotypes = MOB_ORGANIC|MOB_BEAST - move_to_delay = 20 - projectiletype = /obj/projectile/temp/basilisk - projectilesound = 'sound/weapons/pierce.ogg' - ranged = 1 - ranged_message = "stares" - ranged_cooldown_time = 30 - throw_message = "does nothing against the hard shell of" - vision_range = 2 - speed = 3 - maxHealth = 200 - health = 200 - harm_intent_damage = 5 - obj_damage = 60 - melee_damage_lower = 12 - melee_damage_upper = 12 - attack_verb_continuous = "bites into" - attack_verb_simple = "bite into" - speak_emote = list("chitters") - attack_sound = 'sound/weapons/bladeslice.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE - aggro_vision_range = 9 - turns_per_move = 5 - gold_core_spawnable = HOSTILE_SPAWN - loot = list(/obj/item/stack/ore/diamond{layer = ABOVE_MOB_LAYER}, - /obj/item/stack/ore/diamond{layer = ABOVE_MOB_LAYER}) - var/lava_drinker = TRUE - var/warmed_up = FALSE - -/obj/projectile/temp/basilisk - name = "freezing blast" - icon_state = "ice_2" - damage = 10 - damage_type = BURN - armor_flag = ENERGY - temperature = -50 // Cools you down! per hit! - var/slowdown = TRUE //Determines if the projectile applies a slowdown status effect on carbons or not - -/obj/projectile/temp/basilisk/on_hit(atom/target, blocked = 0) - . = ..() - if(iscarbon(target) && slowdown) - var/mob/living/carbon/carbon_target = target - carbon_target.apply_status_effect(/datum/status_effect/freezing_blast) - -/obj/projectile/temp/basilisk/heated - name = "energy blast" - icon_state= "chronobolt" - damage = 40 - damage_type = BRUTE - temperature = 0 - slowdown = FALSE - - -/mob/living/simple_animal/hostile/asteroid/basilisk/GiveTarget(new_target) - if(..()) //we have a target - var/atom/target_from = GET_TARGETS_FROM(src) - if(isliving(target) && !target.Adjacent(target_from) && ranged_cooldown <= world.time)//No more being shot at point blank or spammed with RNG beams - INVOKE_ASYNC(src, PROC_REF(OpenFire), target) - -/mob/living/simple_animal/hostile/asteroid/basilisk/ex_act(severity, target) - switch(severity) - if(EXPLODE_DEVASTATE) - investigate_log("has been gibbed by an explosion.", INVESTIGATE_DEATHS) - gib() - if(EXPLODE_HEAVY) - adjustBruteLoss(140) - if(EXPLODE_LIGHT) - adjustBruteLoss(110) - - return TRUE - -/mob/living/simple_animal/hostile/asteroid/basilisk/AttackingTarget() - . = ..() - if(lava_drinker && !warmed_up && islava(target)) - visible_message(span_warning("[src] begins to drink from [target]...")) - if(do_after(src, 70, target = target)) - visible_message(span_warning("[src] begins to fire up!")) - fully_heal() - icon_state = "Basilisk_alert" - set_varspeed(0) - warmed_up = TRUE - projectiletype = /obj/projectile/temp/basilisk/heated - addtimer(CALLBACK(src, PROC_REF(cool_down)), 3000) - -/mob/living/simple_animal/hostile/asteroid/basilisk/proc/cool_down() - visible_message(span_warning("[src] appears to be cooling down...")) - if(stat != DEAD) - icon_state = "Basilisk" - set_varspeed(3) - warmed_up = FALSE - projectiletype = /obj/projectile/temp/basilisk - -//Watcher -/mob/living/simple_animal/hostile/asteroid/basilisk/watcher - name = "watcher" - desc = "A levitating, eye-like creature held aloft by winglike formations of sinew. A sharp spine of crystal protrudes from its body." - icon = 'icons/mob/simple/lavaland/lavaland_monsters_wide.dmi' - icon_state = "watcher" - icon_living = "watcher" - icon_aggro = "watcher" - icon_dead = "watcher_dead" - health_doll_icon = "watcher" - pixel_x = -12 - base_pixel_x = -12 - throw_message = "bounces harmlessly off of" - melee_damage_lower = 15 - melee_damage_upper = 15 - attack_verb_continuous = "impales" - attack_verb_simple = "impale" - combat_mode = TRUE - speak_emote = list("telepathically cries") - attack_sound = 'sound/weapons/bladeslice.ogg' - attack_vis_effect = null // doesn't bite unlike the parent type. - stat_attack = HARD_CRIT - robust_searching = 1 - crusher_loot = /obj/item/crusher_trophy/watcher_wing - gold_core_spawnable = NO_SPAWN - loot = list() - butcher_results = list(/obj/item/stack/ore/diamond = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 1) - lava_drinker = FALSE - search_objects = 1 - wanted_objects = list(/obj/item/pen/survival, /obj/item/stack/ore/diamond) - -/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/Initialize(mapload) - . = ..() - AddElement(/datum/element/simple_flying) - -/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/Life(seconds_per_tick = SSMOBS_DT, times_fired) - . = ..() - if(stat == CONSCIOUS) - consume_bait() - -/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/proc/consume_bait() - for(var/obj/potential_consumption in view(1, src)) - if(istype(potential_consumption, /obj/item/stack/ore/diamond)) - qdel(potential_consumption) - visible_message(span_notice("[src] consumes [potential_consumption], and it disappears! ...At least, you think.")) - else if(istype(potential_consumption, /obj/item/pen/survival)) - qdel(potential_consumption) - visible_message(span_notice("[src] examines [potential_consumption] closer, and telekinetically shatters the pen.")) - -/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random/Initialize(mapload) - . = ..() - if(prob(1)) - if(prob(75)) - new /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/magmawing(loc) - else - new /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing(loc) - return INITIALIZE_HINT_QDEL - -/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/magmawing - name = "magmawing watcher" - desc = "When raised very close to lava, some watchers adapt to the extreme heat and use lava as both a weapon and wings." - icon_state = "watcher_magmawing" - icon_living = "watcher_magmawing" - icon_aggro = "watcher_magmawing" - icon_dead = "watcher_magmawing_dead" - maxHealth = 215 //Compensate for the lack of slowdown on projectiles with a bit of extra health - health = 215 - light_system = MOVABLE_LIGHT - light_range = 3 - light_power = 2.5 - light_color = LIGHT_COLOR_LAVA - projectiletype = /obj/projectile/temp/basilisk/magmawing - crusher_loot = /obj/item/crusher_trophy/blaster_tubes/magma_wing - crusher_drop_mod = 60 - -/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing - name = "icewing watcher" - desc = "Very rarely, some watchers will eke out an existence far from heat sources. In the absence of warmth, they become icy and fragile but fire much stronger freezing blasts." - icon_state = "watcher_icewing" - icon_living = "watcher_icewing" - icon_aggro = "watcher_icewing" - icon_dead = "watcher_icewing_dead" - maxHealth = 170 - health = 170 - projectiletype = /obj/projectile/temp/basilisk/icewing - butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/bone = 1) //No sinew; the wings are too fragile to be usable - crusher_loot = /obj/item/crusher_trophy/watcher_wing/ice_wing - crusher_drop_mod = 30 - -/obj/projectile/temp/basilisk/magmawing - name = "scorching blast" - icon_state = "lava" - damage = 5 - damage_type = BURN - temperature = 200 // Heats you up! per hit! - slowdown = FALSE - -/obj/projectile/temp/basilisk/magmawing/on_hit(atom/target, blocked = FALSE) - . = ..() - if(.) - var/mob/living/L = target - if (istype(L)) - L.adjust_fire_stacks(0.1) - L.ignite_mob() - -/obj/projectile/temp/basilisk/icewing - damage = 5 - damage_type = BURN - -/obj/projectile/temp/basilisk/icewing/on_hit(atom/target, blocked = FALSE) - . = ..() - if(.) - var/mob/living/L = target - if(istype(L)) - L.apply_status_effect(/datum/status_effect/freon/watcher) - -/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril - from_spawner = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index a25da50f829..6fe1fa1ecfc 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -28,6 +28,7 @@ //Gives player-controlled variants the ability to swap attacks /mob/living/simple_animal/hostile/asteroid/elite/Initialize(mapload) . = ..() + AddComponent(/datum/component/seethrough_mob) for(var/action_type in attack_action_types) var/datum/action/innate/elite_attack/attack_action = new action_type() attack_action.Grant(src) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm deleted file mode 100644 index f06c87363ce..00000000000 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm +++ /dev/null @@ -1,146 +0,0 @@ -//An ore-devouring but easily scared creature -/mob/living/simple_animal/hostile/asteroid/goldgrub - name = "goldgrub" - desc = "A worm that grows fat from eating everything in its sight. Seems to enjoy precious metals and other shiny things, hence the name." - icon = 'icons/mob/simple/lavaland/lavaland_monsters_wide.dmi' - icon_state = "goldgrub" - icon_living = "goldgrub" - icon_aggro = "goldgrub_alert" - icon_dead = "goldgrub_dead" - icon_gib = "syndicate_gib" - pixel_x = -12 - base_pixel_x = -12 - mob_biotypes = MOB_ORGANIC|MOB_BEAST - vision_range = 2 - aggro_vision_range = 9 - move_to_delay = 5 - friendly_verb_continuous = "harmlessly rolls into" - friendly_verb_simple = "harmlessly roll into" - maxHealth = 45 - health = 45 - harm_intent_damage = 5 - melee_damage_lower = 0 - melee_damage_upper = 0 - attack_verb_continuous = "barrels into" - attack_verb_simple = "barrel into" - attack_sound = 'sound/weapons/punch1.ogg' - combat_mode = FALSE - speak_emote = list("screeches") - throw_message = "sinks in slowly, before being pushed out of " - death_message = "stops moving as green liquid oozes from the carcass!" - status_flags = CANPUSH - gold_core_spawnable = HOSTILE_SPAWN - search_objects = 1 - wanted_objects = list(/obj/item/stack/ore/diamond, /obj/item/stack/ore/gold, /obj/item/stack/ore/silver, - /obj/item/stack/ore/uranium) - - var/chase_time = 100 - var/will_burrow = TRUE - var/datum/action/innate/goldgrub/spitore/spit - var/datum/action/innate/goldgrub/burrow/burrow - var/is_burrowed = FALSE - -/mob/living/simple_animal/hostile/asteroid/goldgrub/Initialize(mapload) - . = ..() - var/i = rand(1,3) - while(i) - loot += pick(/obj/item/stack/ore/silver, /obj/item/stack/ore/gold, /obj/item/stack/ore/uranium, /obj/item/stack/ore/diamond) - i-- - spit = new - burrow = new - spit.Grant(src) - burrow.Grant(src) - -/datum/action/innate/goldgrub - background_icon_state = "bg_default" - overlay_icon_state = "bg_default_border" - -/datum/action/innate/goldgrub/spitore - name = "Spit Ore" - desc = "Vomit out all of your consumed ores." - -/datum/action/innate/goldgrub/spitore/Activate() - var/mob/living/simple_animal/hostile/asteroid/goldgrub/G = owner - if(G.stat == DEAD || G.is_burrowed) - return - G.barf_contents() - -/datum/action/innate/goldgrub/burrow - name = "Burrow" - desc = "Burrow under soft ground, evading predators and increasing your speed." - -/datum/action/innate/goldgrub/burrow/Activate() - var/mob/living/simple_animal/hostile/asteroid/goldgrub/G = owner - var/obj/effect/dummy/phased_mob/holder = null - if(G.stat == DEAD) - return - var/turf/T = get_turf(G) - if (!isasteroidturf(T) || !do_after(G, 30, target = T)) - to_chat(G, span_warning("You can only burrow in and out of mining turfs and must stay still!")) - return - if (get_dist(G, T) != 0) - to_chat(G, span_warning("Action cancelled, as you moved while reappearing.")) - return - if(G.is_burrowed) - holder = G.loc - holder.eject_jaunter() - holder = null - G.is_burrowed = FALSE - G.visible_message(span_danger("[G] emerges from the ground!")) - playsound(get_turf(G), 'sound/effects/break_stone.ogg', 50, TRUE, -1) - else - G.visible_message(span_danger("[G] buries into the ground, vanishing from sight!")) - playsound(get_turf(G), 'sound/effects/break_stone.ogg', 50, TRUE, -1) - holder = new /obj/effect/dummy/phased_mob(T, G) - G.is_burrowed = TRUE - -/mob/living/simple_animal/hostile/asteroid/goldgrub/GiveTarget(new_target) - add_target(new_target) - if(target != null) - if(istype(target, /obj/item/stack/ore)) - visible_message(span_notice("The [name] looks at [target.name] with hungry eyes.")) - else if(isliving(target)) - Aggro() - visible_message(span_danger("The [name] tries to flee from [target.name]!")) - retreat_distance = 10 - minimum_distance = 10 - if(will_burrow) - addtimer(CALLBACK(src, PROC_REF(Burrow)), chase_time) - -/mob/living/simple_animal/hostile/asteroid/goldgrub/AttackingTarget() - if(istype(target, /obj/item/stack/ore)) - EatOre(target) - return - return ..() - -/mob/living/simple_animal/hostile/asteroid/goldgrub/proc/EatOre(atom/movable/targeted_ore) - if(targeted_ore && targeted_ore.loc != src) - targeted_ore.forceMove(src) - return TRUE - return FALSE - -/mob/living/simple_animal/hostile/asteroid/goldgrub/death(gibbed) - barf_contents() - return ..() - -/mob/living/simple_animal/hostile/asteroid/goldgrub/proc/barf_contents() - visible_message(span_danger("[src] spits out its consumed ores!")) - playsound(src, 'sound/effects/splat.ogg', 50, TRUE) - for(var/atom/movable/AM in src) - AM.forceMove(loc) - -/mob/living/simple_animal/hostile/asteroid/goldgrub/proc/Burrow()//Begin the chase to kill the goldgrub in time - if(!stat) - visible_message(span_danger("The [name] buries into the ground, vanishing from sight!")) - qdel(src) - -/mob/living/simple_animal/hostile/asteroid/goldgrub/bullet_act(obj/projectile/P) - if(stat == DEAD) - return BULLET_ACT_FORCE_PIERCE - else - visible_message(span_danger("The [P.name] is repelled by [name]'s girth!")) - return BULLET_ACT_BLOCK - -/mob/living/simple_animal/hostile/asteroid/goldgrub/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - vision_range = 9 - . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm index 5e8a72b1a09..9a00d34e34e 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm @@ -126,13 +126,12 @@ robust_searching = 1 has_clickbox = FALSE var/dwarf_mob = FALSE + var/snow_legion = FALSE var/mob/living/carbon/human/stored_mob -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/random/Initialize(mapload) +/mob/living/simple_animal/hostile/asteroid/hivelord/legion/Initialize(mapload) . = ..() - if(prob(5)) - new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(loc) - return INITIALIZE_HINT_QDEL + AddElement(/datum/element/content_barfer) /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf name = "dwarf legion" @@ -149,18 +148,24 @@ /mob/living/simple_animal/hostile/asteroid/hivelord/legion/death(gibbed) visible_message(span_warning("The skulls on [src] wail in anger as they flee from their dying host!")) - var/turf/T = get_turf(src) - if(T) - if(stored_mob) - stored_mob.forceMove(get_turf(src)) - stored_mob = null - else if(from_spawner) - new /obj/effect/mob_spawn/corpse/human/charredskeleton(T) + if (!isnull(stored_mob)) + stored_mob = null + return ..() + + // We didn't contain a real body so spawn a random one + var/turf/our_turf = get_turf(src) + if(our_turf) + if(from_spawner) + new /obj/effect/mob_spawn/corpse/human/charredskeleton(our_turf) else if(dwarf_mob) - new /obj/effect/mob_spawn/corpse/human/legioninfested/dwarf(T) + new /obj/effect/mob_spawn/corpse/human/legioninfested/dwarf(our_turf) + else if(snow_legion) + new /obj/effect/mob_spawn/corpse/human/legioninfested/snow(our_turf) + + new /obj/effect/mob_spawn/corpse/human/legioninfested/dwarf(our_turf) else - new /obj/effect/mob_spawn/corpse/human/legioninfested(T) - ..(gibbed) + new /obj/effect/mob_spawn/corpse/human/legioninfested(our_turf) + return ..() /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril from_spawner = TRUE @@ -305,6 +310,7 @@ loot = list(/obj/item/organ/internal/monster_core/regenerative_core/legion) brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow weather_immunities = list(TRAIT_SNOWSTORM_IMMUNE) + snow_legion = TRUE /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow/make_legion(mob/living/carbon/human/H) return new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow(H.loc) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_demon.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_demon.dm index c9254abc330..25d1ea9da74 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_demon.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_demon.dm @@ -11,7 +11,7 @@ speak_emote = list("telepathically cries") speed = 2 move_to_delay = 2 - projectiletype = /obj/projectile/temp/basilisk/ice + projectiletype = /obj/projectile/temp/ice_demon projectilesound = 'sound/weapons/pierce.ogg' ranged = TRUE ranged_message = "manifests ice" @@ -47,12 +47,16 @@ . = ..() AddElement(/datum/element/simple_flying) -/obj/projectile/temp/basilisk/ice +/obj/projectile/temp/ice_demon name = "ice blast" + icon_state = "ice_2" damage = 5 + damage_type = BURN + armor_flag = ENERGY + speed = 1 + pixel_speed_multiplier = 0.25 range = 200 temperature = -75 - slowdown = FALSE /mob/living/simple_animal/hostile/asteroid/ice_demon/OpenFire() ranged_cooldown = world.time + ranged_cooldown_time diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_whelp.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_whelp.dm deleted file mode 100644 index 123f26f69e4..00000000000 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_whelp.dm +++ /dev/null @@ -1,53 +0,0 @@ -/mob/living/simple_animal/hostile/asteroid/ice_whelp - name = "ice whelp" - desc = "The offspring of an ice drake, weak in comparison but still terrifying." - icon = 'icons/mob/simple/icemoon/icemoon_monsters.dmi' - icon_state = "ice_whelp" - icon_living = "ice_whelp" - icon_dead = "ice_whelp_dead" - mob_biotypes = MOB_ORGANIC|MOB_BEAST - mouse_opacity = MOUSE_OPACITY_ICON - friendly_verb_continuous = "stares down" - friendly_verb_simple = "stare down" - speak_emote = list("roars") - speed = 12 - move_to_delay = 12 - ranged = TRUE - ranged_cooldown_time = 5 SECONDS - maxHealth = 300 - health = 300 - obj_damage = 40 - armour_penetration = 20 - melee_damage_lower = 20 - melee_damage_upper = 20 - attack_verb_continuous = "chomps" - attack_verb_simple = "chomp" - attack_sound = 'sound/magic/demon_attack1.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE - ranged_message = "breathes fire at" - vision_range = 9 - aggro_vision_range = 9 - move_force = MOVE_FORCE_VERY_STRONG - move_resist = MOVE_FORCE_VERY_STRONG - pull_force = MOVE_FORCE_VERY_STRONG - butcher_results = list(/obj/item/stack/ore/diamond = 3, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 10, /obj/item/stack/sheet/animalhide/ashdrake = 1) - loot = list() - crusher_loot = /obj/item/crusher_trophy/tail_spike - death_message = "collapses on its side." - death_sound = 'sound/magic/demon_dies.ogg' - stat_attack = HARD_CRIT - robust_searching = TRUE - footstep_type = FOOTSTEP_MOB_CLAW - /// How far the whelps fire can go - var/fire_range = 4 - -/mob/living/simple_animal/hostile/asteroid/ice_whelp/Shoot() - var/turf/target_fire_turf = get_ranged_target_turf_direct(src, target, fire_range) - var/list/burn_turfs = get_line(src, target_fire_turf) - get_turf(src) - dragon_fire_line(src, burn_turfs, frozen = TRUE) - -/mob/living/simple_animal/hostile/asteroid/ice_whelp/death(gibbed) - move_force = MOVE_FORCE_DEFAULT - move_resist = MOVE_RESIST_DEFAULT - pull_force = PULL_FORCE_DEFAULT - return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/morph.dm b/code/modules/mob/living/simple_animal/hostile/morph.dm deleted file mode 100644 index da01eabb34a..00000000000 --- a/code/modules/mob/living/simple_animal/hostile/morph.dm +++ /dev/null @@ -1,195 +0,0 @@ -/mob/living/simple_animal/hostile/morph - name = "morph" - real_name = "morph" - desc = "A revolting, pulsating pile of flesh." - speak_emote = list("gurgles") - emote_hear = list("gurgles") - icon = 'icons/mob/simple/animal.dmi' - icon_state = "morph" - icon_living = "morph" - icon_dead = "morph_dead" - combat_mode = TRUE - stop_automated_movement = 1 - status_flags = CANPUSH - pass_flags = PASSTABLE - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - maxHealth = 150 - health = 150 - healable = 0 - obj_damage = 50 - melee_damage_lower = 20 - melee_damage_upper = 20 - // Oh you KNOW it's gonna be real green - lighting_cutoff_red = 10 - lighting_cutoff_green = 35 - lighting_cutoff_blue = 15 - vision_range = 1 // Only attack when target is close - wander = FALSE - attack_verb_continuous = "glomps" - attack_verb_simple = "glomp" - attack_sound = 'sound/effects/blobattack.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE //nom nom nom - butcher_results = list(/obj/item/food/meat/slab = 2) - - var/morphed = FALSE - var/melee_damage_disguised = 0 - var/eat_while_disguised = FALSE - var/atom/movable/form = null - var/static/list/blacklist_typecache = typecacheof(list( - /atom/movable/screen, - /obj/singularity, - /obj/energy_ball, - /obj/narsie, - /mob/living/simple_animal/hostile/morph, - /obj/effect, - )) - -/mob/living/simple_animal/hostile/morph/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - AddElement(/datum/element/content_barfer) - -/mob/living/simple_animal/hostile/morph/examine(mob/user) - if(morphed) - . = form.examine(user) - if(get_dist(user,src) <= 3) - . += span_warning("It doesn't look quite right...") - else - . = ..() - -/mob/living/simple_animal/hostile/morph/med_hud_set_health() - if(morphed && !isliving(form)) - var/image/holder = hud_list[HEALTH_HUD] - holder.icon_state = null - return //we hide medical hud while morphed - ..() - -/mob/living/simple_animal/hostile/morph/med_hud_set_status() - if(morphed && !isliving(form)) - var/image/holder = hud_list[STATUS_HUD] - holder.icon_state = null - return //we hide medical hud while morphed - ..() - -/mob/living/simple_animal/hostile/morph/proc/allowed(atom/movable/A) // make it into property/proc ? not sure if worth it - return !is_type_in_typecache(A, blacklist_typecache) && (isobj(A) || ismob(A)) - -/mob/living/simple_animal/hostile/morph/proc/eat(atom/movable/A) - if(morphed && !eat_while_disguised) - to_chat(src, span_warning("You cannot eat anything while you are disguised!")) - return FALSE - if(A && A.loc != src) - visible_message(span_warning("[src] swallows [A] whole!")) - A.forceMove(src) - return TRUE - return FALSE - -/mob/living/simple_animal/hostile/morph/ShiftClickOn(atom/movable/A) - if(!stat) - if(A == src) - restore() - return - if(istype(A) && allowed(A)) - assume(A) - else - to_chat(src, span_warning("You need to be conscious to transform!")) - ..() - -/mob/living/simple_animal/hostile/morph/proc/assume(atom/movable/target) - morphed = TRUE - form = target - - visible_message(span_warning("[src] suddenly twists and changes shape, becoming a copy of [target]!"), \ - span_notice("You twist your body and assume the form of [target].")) - appearance = target.appearance - copy_overlays(target) - alpha = max(alpha, 150) //fucking chameleons - transform = initial(transform) - pixel_y = base_pixel_y - pixel_x = base_pixel_x - - //Morphed is weaker - melee_damage_lower = melee_damage_disguised - melee_damage_upper = melee_damage_disguised - add_movespeed_modifier(/datum/movespeed_modifier/morph_disguised) - - med_hud_set_health() - med_hud_set_status() //we're an object honest - return - -/mob/living/simple_animal/hostile/morph/proc/restore() - if(!morphed) - to_chat(src, span_warning("You're already in your normal form!")) - return - morphed = FALSE - form = null - alpha = initial(alpha) - color = initial(color) - desc = initial(desc) - animate_movement = SLIDE_STEPS - maptext = null - - visible_message(span_warning("[src] suddenly collapses in on itself, dissolving into a pile of green flesh!"), \ - span_notice("You reform to your normal body.")) - name = initial(name) - icon = initial(icon) - icon_state = initial(icon_state) - cut_overlays() - - //Baseline stats - melee_damage_lower = initial(melee_damage_lower) - melee_damage_upper = initial(melee_damage_upper) - remove_movespeed_modifier(/datum/movespeed_modifier/morph_disguised) - - med_hud_set_health() - med_hud_set_status() //we are not an object - -/mob/living/simple_animal/hostile/morph/death(gibbed) - if(morphed) - visible_message(span_warning("[src] twists and dissolves into a pile of green flesh!"), \ - span_userdanger("Your skin ruptures! Your flesh breaks apart! No disguise can ward off de--")) - restore() - ..() - -/mob/living/simple_animal/hostile/morph/Aggro() // automated only - ..() - if(morphed) - restore() - -/mob/living/simple_animal/hostile/morph/LoseAggro() - vision_range = initial(vision_range) - -/mob/living/simple_animal/hostile/morph/AIShouldSleep(list/possible_targets) - . = ..() - if(.) - var/list/things = list() - for(var/atom/movable/A in view(src)) - if(allowed(A)) - things += A - var/atom/movable/T = pick(things) - assume(T) - -/mob/living/simple_animal/hostile/morph/can_track(mob/living/user) - if(morphed) - return FALSE - return ..() - -/mob/living/simple_animal/hostile/morph/AttackingTarget() - if(morphed && !melee_damage_disguised) - to_chat(src, span_warning("You can not attack while disguised!")) - return - if(isliving(target)) //Eat Corpses to regen health - var/mob/living/L = target - if(L.stat == DEAD) - if(do_after(src, 30, target = L)) - if(eat(L)) - adjustHealth(-50) - return - else if(isitem(target)) //Eat items just to be annoying - var/obj/item/I = target - if(!I.anchored) - if(do_after(src, 20, target = I)) - eat(I) - return - return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/ooze.dm b/code/modules/mob/living/simple_animal/hostile/ooze.dm index 4e7de6b5433..72b464ff136 100644 --- a/code/modules/mob/living/simple_animal/hostile/ooze.dm +++ b/code/modules/mob/living/simple_animal/hostile/ooze.dm @@ -39,6 +39,7 @@ create_reagents(300) add_cell_sample() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + AddElement(/datum/element/content_barfer) /mob/living/simple_animal/hostile/ooze/attacked_by(obj/item/I, mob/living/user) if(!eat_atom(I, TRUE)) @@ -202,12 +203,7 @@ ///Register for owner death /datum/action/consume/New(Target) . = ..() - RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(on_owner_death)) - RegisterSignal(owner, COMSIG_QDELETING, PROC_REF(handle_mob_deletion)) - -/datum/action/consume/proc/handle_mob_deletion() - SIGNAL_HANDLER - stop_consuming() //Shit out the vored mob before u go go + RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(stop_consuming)) ///Try to consume the pulled mob /datum/action/consume/Trigger(trigger_flags) @@ -235,14 +231,17 @@ /datum/action/consume/proc/start_consuming(mob/living/target) vored_mob = target vored_mob.forceMove(owner) ///AAAAAAAAAAAAAAAAAAAAAAHHH!!! - RegisterSignal(vored_mob, COMSIG_QDELETING, PROC_REF(handle_mob_deletion)) + RegisterSignal(vored_mob, COMSIG_QDELETING, PROC_REF(stop_consuming)) playsound(owner,'sound/items/eatfood.ogg', rand(30,50), TRUE) owner.visible_message(span_warning("[src] devours [target]!"), span_notice("You devour [target].")) START_PROCESSING(SSprocessing, src) ///Stop consuming the mob; dump them on the floor /datum/action/consume/proc/stop_consuming() + SIGNAL_HANDLER STOP_PROCESSING(SSprocessing, src) + if (isnull(vored_mob)) + return vored_mob.forceMove(get_turf(owner)) playsound(get_turf(owner), 'sound/effects/splat.ogg', 50, TRUE) owner.visible_message(span_warning("[owner] pukes out [vored_mob]!"), span_notice("You puke out [vored_mob].")) @@ -260,10 +259,9 @@ if(vored_mob.getBruteLoss() >= 200) stop_consuming() -///On owner death dump the current vored mob -/datum/action/consume/proc/on_owner_death() - SIGNAL_HANDLER +/datum/action/consume/Remove(mob/remove_from) stop_consuming() + return ..() ///* Gelatinious Grapes code below *\\\\ diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm index 551b4fbffed..529c3025479 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm @@ -207,6 +207,7 @@ emote_see = list("honks", "sweats", "jiggles", "contemplates its existence") speak_chance = 5 dextrous = TRUE + hud_type = /datum/hud/dextrous maxHealth = 140 health = 140 speed = -5 diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm index ca22166e91b..aba636c11bf 100644 --- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm +++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm @@ -16,7 +16,6 @@ melee_damage_upper = 15 minbodytemp = 0 maxbodytemp = 1500 - healable = 0 //they're skeletons how would bruise packs help them?? attack_verb_continuous = "slashes" attack_verb_simple = "slash" attack_sound = 'sound/hallucinations/growl1.ogg' diff --git a/code/modules/mob/living/simple_animal/hostile/smspider.dm b/code/modules/mob/living/simple_animal/hostile/smspider.dm index a6f14e33c9a..150180a11cf 100644 --- a/code/modules/mob/living/simple_animal/hostile/smspider.dm +++ b/code/modules/mob/living/simple_animal/hostile/smspider.dm @@ -17,7 +17,6 @@ health = 10 minbodytemp = 0 maxbodytemp = 1500 - healable = 0 attack_verb_continuous = "slices" attack_verb_simple = "slice" attack_sound = 'sound/effects/supermatter.ogg' diff --git a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm index 1d5be805b56..f87e78009a9 100644 --- a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm @@ -73,8 +73,6 @@ var/using_special = FALSE /// Determines whether or not Space Dragon is currently tearing through a wall. var/tearing_wall = FALSE - /// The ability to make your sprite smaller - var/datum/action/small_sprite/space_dragon/small_sprite /// The color of the space dragon. var/chosen_color /// Minimum devastation damage dealt coefficient based on max health @@ -84,12 +82,10 @@ /mob/living/simple_animal/hostile/space_dragon/Initialize(mapload) . = ..() + AddComponent(/datum/component/seethrough_mob) AddElement(/datum/element/simple_flying) add_traits(list(TRAIT_SPACEWALK, TRAIT_FREE_HYPERSPACE_MOVEMENT, TRAIT_NO_FLOATING_ANIM, TRAIT_HEALS_FROM_CARP_RIFTS), INNATE_TRAIT) AddElement(/datum/element/content_barfer) - small_sprite = new - small_sprite.Grant(src) - RegisterSignal(small_sprite, COMSIG_ACTION_TRIGGER, PROC_REF(add_dragon_overlay)) /mob/living/simple_animal/hostile/space_dragon/Login() . = ..() @@ -104,13 +100,26 @@ /mob/living/simple_animal/hostile/space_dragon/Life(seconds_per_tick = SSMOBS_DT, times_fired) . = ..() tiredness = max(tiredness - (0.5 * seconds_per_tick), 0) - for(var/mob/living/consumed_mob in src) - if(consumed_mob.stat == DEAD) - continue - playsound(src, 'sound/effects/splat.ogg', 50, TRUE) - visible_message(span_danger("[src] vomits up [consumed_mob]!")) - consumed_mob.forceMove(loc) - consumed_mob.Paralyze(50) + +/mob/living/simple_animal/hostile/space_dragon/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) + . = ..() + if (isliving(arrived)) + RegisterSignal(arrived, COMSIG_MOB_STATCHANGE, PROC_REF(eaten_stat_changed)) + +/mob/living/simple_animal/hostile/space_dragon/Exited(atom/movable/gone, direction) + . = ..() + if (isliving(gone)) + UnregisterSignal(gone, COMSIG_MOB_STATCHANGE) + +/// Release consumed mobs if they transition from dead to alive +/mob/living/simple_animal/hostile/space_dragon/proc/eaten_stat_changed(mob/living/eaten) + SIGNAL_HANDLER + if (eaten.stat == DEAD) + return + playsound(src, 'sound/effects/splat.ogg', vol = 50, vary = TRUE) + visible_message(span_danger("[src] vomits up [eaten]!")) + eaten.forceMove(loc) + eaten.Paralyze(5 SECONDS) /mob/living/simple_animal/hostile/space_dragon/AttackingTarget() if(using_special) @@ -169,16 +178,11 @@ /mob/living/simple_animal/hostile/space_dragon/death(gibbed) . = ..() add_dragon_overlay() - UnregisterSignal(small_sprite, COMSIG_ACTION_TRIGGER) /mob/living/simple_animal/hostile/space_dragon/revive(full_heal_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE) - var/was_dead = stat == DEAD . = ..() add_dragon_overlay() - if (was_dead) - RegisterSignal(small_sprite, COMSIG_ACTION_TRIGGER, PROC_REF(add_dragon_overlay)) - /** * Allows space dragon to choose its own name. * @@ -221,8 +225,6 @@ */ /mob/living/simple_animal/hostile/space_dragon/proc/add_dragon_overlay() cut_overlays() - if(!small_sprite.small) - return if(stat == DEAD) var/mutable_appearance/overlay = mutable_appearance(icon, "overlay_dead") overlay.appearance_flags = RESET_COLOR diff --git a/code/modules/mob/living/simple_animal/revenant.dm b/code/modules/mob/living/simple_animal/revenant.dm index 97ec1d93a69..25a283a7364 100644 --- a/code/modules/mob/living/simple_animal/revenant.dm +++ b/code/modules/mob/living/simple_animal/revenant.dm @@ -19,7 +19,6 @@ health = INFINITY //Revenants don't use health, they use essence instead maxHealth = INFINITY plane = GHOST_PLANE - healable = FALSE sight = SEE_SELF throwforce = 0 diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index 87e6f536cb6..dbb795e91c5 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -9,7 +9,6 @@ mob_biotypes = MOB_SPIRIT maxHealth = 40 health = 40 - healable = 0 speak_emote = list("hisses") emote_hear = list("wails.","screeches.") response_help_continuous = "puts their hand through" diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 7922c6c3f28..52d5bc9129a 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -70,9 +70,6 @@ /// List of weather immunity traits that are then added on Initialize(), see traits.dm. var/list/weather_immunities - ///Healable by medical stacks? Defaults to yes. - var/healable = 1 - ///Atmos effect - Yes, you can make creatures that require plasma or co2 to survive. N2O is a trace gas and handled separately, hence why it isn't here. It'd be hard to add it. Hard and me don't mix (Yes, yes make all the dick jokes you want with that.) - Errorage ///Leaving something at 0 means it's off - has no maximum. var/list/atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) @@ -138,7 +135,6 @@ ///If the creature has, and can use, hands. var/dextrous = FALSE - var/dextrous_hud_type = /datum/hud/dextrous ///The Status of our AI, can be set to AI_ON (On, usual processing), AI_IDLE (Will not process, but will return to AI_ON if an enemy comes near), AI_OFF (Off, Not processing ever), AI_Z_OFF (Temporarily off due to nonpresence of players). var/AIStatus = AI_ON diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index ca578f949df..27827bbd88b 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -183,7 +183,7 @@ return if(iscarbon(prey)) - prey.adjustCloneLoss(rand(2, 4) * 0.5 * seconds_per_tick) + prey.adjustBruteLoss(rand(2, 4) * 0.5 * seconds_per_tick) prey.adjustToxLoss(rand(1, 2) * 0.5 * seconds_per_tick) if(SPT_PROB(5, seconds_per_tick) && prey.client) @@ -199,7 +199,7 @@ var/mob/living/animal_victim = prey var/totaldamage = 0 //total damage done to this unfortunate animal - totaldamage += animal_victim.adjustCloneLoss(rand(2, 4) * 0.5 * seconds_per_tick) + totaldamage += animal_victim.adjustBruteLoss(rand(2, 4) * 0.5 * seconds_per_tick) totaldamage += animal_victim.adjustToxLoss(rand(1, 2) * 0.5 * seconds_per_tick) if(totaldamage <= 0) //if we did no(or negative!) damage to it, stop diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm index 61706dfa58b..01197efc8ed 100644 --- a/code/modules/mob/living/simple_animal/slime/powers.dm +++ b/code/modules/mob/living/simple_animal/slime/powers.dm @@ -66,7 +66,7 @@ if(isanimal(meal)) var/mob/living/simple_animal/simple_meal = meal - if(simple_meal.damage_coeff[TOX] <= 0 && simple_meal.damage_coeff[CLONE] <= 0) //The creature wouldn't take any damage, it must be too weird even for us. + if(simple_meal.damage_coeff[TOX] <= 0 && simple_meal.damage_coeff[BRUTE] <= 0) //The creature wouldn't take any damage, it must be too weird even for us. if(silent) return FALSE to_chat(src, "[pick("This subject is incompatible", \ @@ -76,7 +76,7 @@ return FALSE else if(isbasicmob(meal)) var/mob/living/basic/basic_meal = meal - if(basic_meal.damage_coeff[TOX] <= 0 && basic_meal.damage_coeff[CLONE] <= 0) + if(basic_meal.damage_coeff[TOX] <= 0 && basic_meal.damage_coeff[BRUTE] <= 0) if (silent) return FALSE to_chat(src, "[pick("This subject is incompatible", \ @@ -132,6 +132,14 @@ "This subject does not have life energy", "This subject is empty", \ "I am not satisified", "I can not feed from this subject", \ "I do not feel nourished", "This subject is not food")]!") + + var/mob/living/victim = buckled + + if(istype(victim)) + var/bio_protection = 100 - victim.getarmor(null, BIO) + if(prob(bio_protection)) + victim.apply_status_effect(/datum/status_effect/slimed, slime_colours_to_rgb[colour], colour == SLIME_TYPE_RAINBOW) + if(!silent) visible_message(span_warning("[src] lets go of [buckled]!"), \ span_notice("I stopped feeding.")) @@ -192,7 +200,7 @@ for(var/i in 1 to 4) var/child_colour if(mutation_chance >= 100) - child_colour = "rainbow" + child_colour = SLIME_TYPE_RAINBOW else if(prob(mutation_chance)) child_colour = slime_mutation[rand(1,4)] else diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index a5aadf03849..837457390f8 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -25,7 +25,7 @@ maxHealth = 150 health = 150 - healable = 0 + mob_biotypes = MOB_SLIME melee_damage_lower = 5 melee_damage_upper = 25 @@ -77,33 +77,58 @@ var/static/regex/slime_name_regex = new("\\w+ (baby|adult) slime \\(\\d+\\)") ///////////TIME FOR SUBSPECIES - var/colour = "grey" + var/colour = SLIME_TYPE_GREY var/coretype = /obj/item/slime_extract/grey var/list/slime_mutation[4] var/static/list/slime_colours = list( - "adamantine", - "black", - "blue", - "bluespace", - "cerulean", - "dark blue", - "dark purple", - "gold", - "green", - "grey", - "light pink", - "metal", - "oil", - "orange", - "pink", - "purple", - "pyrite", - "rainbow", - "red", - "sepia", - "silver", - "yellow", + SLIME_TYPE_ADAMANTINE, + SLIME_TYPE_BLACK, + SLIME_TYPE_BLUE, + SLIME_TYPE_BLUESPACE, + SLIME_TYPE_CERULEAN, + SLIME_TYPE_DARK_BLUE, + SLIME_TYPE_DARK_PURPLE, + SLIME_TYPE_GOLD, + SLIME_TYPE_GREEN, + SLIME_TYPE_GREY, + SLIME_TYPE_LIGHT_PINK, + SLIME_TYPE_METAL, + SLIME_TYPE_OIL, + SLIME_TYPE_ORANGE, + SLIME_TYPE_PINK, + SLIME_TYPE_PURPLE, + SLIME_TYPE_PYRITE, + SLIME_TYPE_RAINBOW, + SLIME_TYPE_RED, + SLIME_TYPE_SEPIA, + SLIME_TYPE_SILVER, + SLIME_TYPE_YELLOW, + ) + + var/static/list/slime_colours_to_rgb = list( + SLIME_TYPE_ADAMANTINE = COLOR_SLIME_ADAMANTINE, + SLIME_TYPE_BLACK = COLOR_SLIME_BLACK, + SLIME_TYPE_BLUE = COLOR_SLIME_BLUE, + SLIME_TYPE_BLUESPACE = COLOR_SLIME_BLUESPACE, + SLIME_TYPE_CERULEAN = COLOR_SLIME_CERULEAN, + SLIME_TYPE_DARK_BLUE = COLOR_SLIME_DARK_BLUE, + SLIME_TYPE_DARK_PURPLE = COLOR_SLIME_DARK_PURPLE, + SLIME_TYPE_GOLD = COLOR_SLIME_GOLD, + SLIME_TYPE_GREEN = COLOR_SLIME_GREEN, + SLIME_TYPE_GREY = COLOR_SLIME_GREY, + SLIME_TYPE_LIGHT_PINK = COLOR_SLIME_LIGHT_PINK, + SLIME_TYPE_METAL = COLOR_SLIME_METAL, + SLIME_TYPE_OIL = COLOR_SLIME_OIL, + SLIME_TYPE_ORANGE = COLOR_SLIME_ORANGE, + SLIME_TYPE_PINK = COLOR_SLIME_PINK, + SLIME_TYPE_PURPLE = COLOR_SLIME_PURPLE, + SLIME_TYPE_PYRITE = COLOR_SLIME_PYRITE, + SLIME_TYPE_RAINBOW = COLOR_SLIME_RAINBOW, + SLIME_TYPE_RED = COLOR_SLIME_RED, + SLIME_TYPE_SEPIA = COLOR_SLIME_SEPIA, + SLIME_TYPE_SILVER = COLOR_SLIME_SILVER, + SLIME_TYPE_YELLOW = COLOR_SLIME_YELLOW, ) ///////////CORE-CROSSING CODE diff --git a/code/modules/mob/living/simple_animal/slime/subtypes.dm b/code/modules/mob/living/simple_animal/slime/subtypes.dm index 47d45d71fdc..e948de7cd4d 100644 --- a/code/modules/mob/living/simple_animal/slime/subtypes.dm +++ b/code/modules/mob/living/simple_animal/slime/subtypes.dm @@ -2,74 +2,74 @@ var/list/slime_mutation_colors[4] switch(colour) //Tier 1 - if("grey") - slime_mutation_colors[1] = "orange" - slime_mutation_colors[2] = "metal" - slime_mutation_colors[3] = "blue" - slime_mutation_colors[4] = "purple" + if(SLIME_TYPE_GREY) + slime_mutation_colors[1] = SLIME_TYPE_ORANGE + slime_mutation_colors[2] = SLIME_TYPE_METAL + slime_mutation_colors[3] = SLIME_TYPE_BLUE + slime_mutation_colors[4] = SLIME_TYPE_PURPLE //Tier 2 - if("purple") - slime_mutation_colors[1] = "dark purple" - slime_mutation_colors[2] = "dark blue" - slime_mutation_colors[3] = "green" - slime_mutation_colors[4] = "green" - if("metal") - slime_mutation_colors[1] = "silver" - slime_mutation_colors[2] = "yellow" - slime_mutation_colors[3] = "gold" - slime_mutation_colors[4] = "gold" - if("orange") - slime_mutation_colors[1] = "dark purple" - slime_mutation_colors[2] = "yellow" - slime_mutation_colors[3] = "red" - slime_mutation_colors[4] = "red" - if("blue") - slime_mutation_colors[1] = "dark blue" - slime_mutation_colors[2] = "silver" - slime_mutation_colors[3] = "pink" - slime_mutation_colors[4] = "pink" + if(SLIME_TYPE_PURPLE) + slime_mutation_colors[1] = SLIME_TYPE_DARK_PURPLE + slime_mutation_colors[2] = SLIME_TYPE_DARK_BLUE + slime_mutation_colors[3] = SLIME_TYPE_GREEN + slime_mutation_colors[4] = SLIME_TYPE_GREEN + if(SLIME_TYPE_METAL) + slime_mutation_colors[1] = SLIME_TYPE_SILVER + slime_mutation_colors[2] = SLIME_TYPE_YELLOW + slime_mutation_colors[3] = SLIME_TYPE_GOLD + slime_mutation_colors[4] = SLIME_TYPE_GOLD + if(SLIME_TYPE_ORANGE) + slime_mutation_colors[1] = SLIME_TYPE_DARK_PURPLE + slime_mutation_colors[2] = SLIME_TYPE_YELLOW + slime_mutation_colors[3] = SLIME_TYPE_RED + slime_mutation_colors[4] = SLIME_TYPE_RED + if(SLIME_TYPE_BLUE) + slime_mutation_colors[1] = SLIME_TYPE_DARK_BLUE + slime_mutation_colors[2] = SLIME_TYPE_SILVER + slime_mutation_colors[3] = SLIME_TYPE_PINK + slime_mutation_colors[4] = SLIME_TYPE_PINK //Tier 3 - if("dark blue") - slime_mutation_colors[1] = "purple" - slime_mutation_colors[2] = "blue" - slime_mutation_colors[3] = "cerulean" - slime_mutation_colors[4] = "cerulean" - if("dark purple") - slime_mutation_colors[1] = "purple" - slime_mutation_colors[2] = "orange" - slime_mutation_colors[3] = "sepia" - slime_mutation_colors[4] = "sepia" - if("yellow") - slime_mutation_colors[1] = "metal" - slime_mutation_colors[2] = "orange" - slime_mutation_colors[3] = "bluespace" - slime_mutation_colors[4] = "bluespace" - if("silver") - slime_mutation_colors[1] = "metal" - slime_mutation_colors[2] = "blue" - slime_mutation_colors[3] = "pyrite" - slime_mutation_colors[4] = "pyrite" + if(SLIME_TYPE_DARK_BLUE) + slime_mutation_colors[1] = SLIME_TYPE_PURPLE + slime_mutation_colors[2] = SLIME_TYPE_BLUE + slime_mutation_colors[3] = SLIME_TYPE_CERULEAN + slime_mutation_colors[4] = SLIME_TYPE_CERULEAN + if(SLIME_TYPE_DARK_PURPLE) + slime_mutation_colors[1] = SLIME_TYPE_PURPLE + slime_mutation_colors[2] = SLIME_TYPE_ORANGE + slime_mutation_colors[3] = SLIME_TYPE_SEPIA + slime_mutation_colors[4] = SLIME_TYPE_SEPIA + if(SLIME_TYPE_YELLOW) + slime_mutation_colors[1] = SLIME_TYPE_METAL + slime_mutation_colors[2] = SLIME_TYPE_ORANGE + slime_mutation_colors[3] = SLIME_TYPE_BLUESPACE + slime_mutation_colors[4] = SLIME_TYPE_BLUESPACE + if(SLIME_TYPE_SILVER) + slime_mutation_colors[1] = SLIME_TYPE_METAL + slime_mutation_colors[2] = SLIME_TYPE_BLUE + slime_mutation_colors[3] = SLIME_TYPE_PYRITE + slime_mutation_colors[4] = SLIME_TYPE_PYRITE //Tier 4 - if("pink") - slime_mutation_colors[1] = "pink" - slime_mutation_colors[2] = "pink" - slime_mutation_colors[3] = "light pink" - slime_mutation_colors[4] = "light pink" - if("red") - slime_mutation_colors[1] = "red" - slime_mutation_colors[2] = "red" - slime_mutation_colors[3] = "oil" - slime_mutation_colors[4] = "oil" - if("gold") - slime_mutation_colors[1] = "gold" - slime_mutation_colors[2] = "gold" - slime_mutation_colors[3] = "adamantine" - slime_mutation_colors[4] = "adamantine" - if("green") - slime_mutation_colors[1] = "green" - slime_mutation_colors[2] = "green" - slime_mutation_colors[3] = "black" - slime_mutation_colors[4] = "black" + if(SLIME_TYPE_PINK) + slime_mutation_colors[1] = SLIME_TYPE_PINK + slime_mutation_colors[2] = SLIME_TYPE_PINK + slime_mutation_colors[3] = SLIME_TYPE_LIGHT_PINK + slime_mutation_colors[4] = SLIME_TYPE_LIGHT_PINK + if(SLIME_TYPE_RED) + slime_mutation_colors[1] = SLIME_TYPE_RED + slime_mutation_colors[2] = SLIME_TYPE_RED + slime_mutation_colors[3] = SLIME_TYPE_OIL + slime_mutation_colors[4] = SLIME_TYPE_OIL + if(SLIME_TYPE_GOLD) + slime_mutation_colors[1] = SLIME_TYPE_GOLD + slime_mutation_colors[2] = SLIME_TYPE_GOLD + slime_mutation_colors[3] = SLIME_TYPE_ADAMANTINE + slime_mutation_colors[4] = SLIME_TYPE_ADAMANTINE + if(SLIME_TYPE_GREEN) + slime_mutation_colors[1] = SLIME_TYPE_GREEN + slime_mutation_colors[2] = SLIME_TYPE_GREEN + slime_mutation_colors[3] = SLIME_TYPE_BLACK + slime_mutation_colors[4] = SLIME_TYPE_BLACK // Tier 5 else slime_mutation_colors[1] = colour diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index ee77b5ab634..bbc37911bb1 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -513,14 +513,14 @@ /mob/living/proc/cure_fakedeath(source) remove_traits(list(TRAIT_FAKEDEATH, TRAIT_DEATHCOMA), source) if(stat != DEAD) - tod = null + station_timestamp_timeofdeath = null /// Induces fake death on a living mob. /mob/living/proc/fakedeath(source, silent = FALSE) if(stat != DEAD) if(!silent) emote("deathgasp") - tod = station_time_timestamp() + station_timestamp_timeofdeath = station_time_timestamp() add_traits(list(TRAIT_FAKEDEATH, TRAIT_DEATHCOMA), source) @@ -721,4 +721,4 @@ /// Helper to check if we seem to be alive or not /mob/living/proc/appears_alive() - return health >= 0 && !HAS_TRAIT(src, TRAIT_FAKEDEATH) + return stat != DEAD && !HAS_TRAIT(src, TRAIT_FAKEDEATH) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 1fdcce6bc93..9c94e70c194 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -655,7 +655,7 @@ //you can only initiate exaimines if you have a hand, it's not disabled, and only as many examines as you have hands /// our active hand, to check if it's disabled/detatched var/obj/item/bodypart/active_hand = has_active_hand()? get_active_hand() : null - if(!active_hand || active_hand.bodypart_disabled || LAZYLEN(do_afters) >= usable_hands) + if(!active_hand || active_hand.bodypart_disabled || do_after_count() >= usable_hands) to_chat(src, span_warning("You don't have a free hand to examine this!")) return FALSE @@ -1083,7 +1083,7 @@ mob_light(range = 2, color = antimagic_color, duration = 5 SECONDS) add_overlay(antimagic_effect) - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, cut_overlay)), antimagic_effect, 5 SECONDS) + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, cut_overlay), antimagic_effect), 5 SECONDS) /** * Buckle a living mob to this mob. Also turns you to face the other mob @@ -1504,6 +1504,8 @@ /mob/proc/update_equipment_speed_mods() var/speedies = equipped_speed_mods() + if(speedies > 0 && HAS_TRAIT(src, TRAIT_SETTLER)) //if our movespeed mod is in the negatives, we don't modify it since that's a benefit + speedies *= 0.2 if(!speedies) remove_movespeed_modifier(/datum/movespeed_modifier/equipment_speedmod) else diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index ae544889633..ddf2bb72b78 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -117,9 +117,6 @@ /// How many ticks this mob has been over reating var/overeatduration = 0 // How long this guy is overeating //Carbon - /// The movement intent of the mob (run/wal) - var/m_intent = MOVE_INTENT_RUN//Living - /// The last known IP of the client who was in this mob var/lastKnownIP = null diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index dc314a6a103..45262602c7d 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -496,28 +496,30 @@ set name = "toggle-walk-run" set hidden = TRUE set instant = TRUE - if(mob) - mob.toggle_move_intent(usr) + if(isliving(mob)) + var/mob/living/user_mob = mob + user_mob.toggle_move_intent(usr) /** * Toggle the move intent of the mob * * triggers an update the move intent hud as well */ -/mob/proc/toggle_move_intent(mob/user) - if(m_intent == MOVE_INTENT_RUN) - m_intent = MOVE_INTENT_WALK +/mob/living/proc/toggle_move_intent(mob/user) + if(move_intent == MOVE_INTENT_RUN) + move_intent = MOVE_INTENT_WALK else //SKYRAT EDIT ADDITION BEGIN - GUNPOINT if (HAS_TRAIT(src,TRAIT_NORUNNING)) to_chat(src, "You find yourself unable to run.") return FALSE //SKYRAT EDIT ADDITION END - m_intent = MOVE_INTENT_RUN - SET_PLANE_IMPLICIT(src, (m_intent == MOVE_INTENT_WALK && !HAS_TRAIT(src, TRAIT_OVERSIZED)) ? GAME_PLANE_FOV_HIDDEN : GAME_PLANE) //SKYRAT EDIT ADDITION - Oversized Overhaul + move_intent = MOVE_INTENT_RUN + SET_PLANE_IMPLICIT(src, (move_intent == MOVE_INTENT_WALK && !HAS_TRAIT(src, TRAIT_OVERSIZED)) ? GAME_PLANE_FOV_HIDDEN : GAME_PLANE) //SKYRAT EDIT ADDITION - Oversized Overhaul if(hud_used?.static_inventory) for(var/atom/movable/screen/mov_intent/selector in hud_used.static_inventory) selector.update_appearance() + update_move_intent_slowdown() ///Moves a mob upwards in z level /mob/verb/up() diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 56ff1cfae2a..f02624449ba 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -288,7 +288,7 @@ SSblackbox.record_feedback("amount", "gorillas_created", 1) - var/Itemlist = get_equipped_items(TRUE) + var/Itemlist = get_equipped_items(include_pockets = TRUE) Itemlist += held_items for(var/obj/item/W in Itemlist) dropItemToGround(W, TRUE) diff --git a/code/modules/mob_spawn/corpses/mining_corpses.dm b/code/modules/mob_spawn/corpses/mining_corpses.dm index ac853119d5b..8f28bbd430d 100644 --- a/code/modules/mob_spawn/corpses/mining_corpses.dm +++ b/code/modules/mob_spawn/corpses/mining_corpses.dm @@ -29,9 +29,9 @@ /obj/effect/mob_spawn/corpse/human/legioninfested/Initialize(mapload) var/corpse_theme = pick_weight(list( - "Miner" = 66, - "Ashwalker" = 10, - "Clown" = 10, + "Miner" = 64, + "Clown" = 5, + "Ashwalker" = 15, "Golem" = 10, pick(list( "Cultist", @@ -45,12 +45,44 @@ outfit = /datum/outfit/consumed_miner if("Ashwalker") outfit = /datum/outfit/consumed_ashwalker + if("Golem") + outfit = /datum/outfit/consumed_golem if("Clown") outfit = /datum/outfit/consumed_clown if("Cultist") outfit = /datum/outfit/consumed_cultist if("Dame") outfit = /datum/outfit/consumed_dame + if("Operative") + outfit = /datum/outfit/syndicatecommandocorpse/lessenedgear + if("Shadow") + outfit = /datum/outfit/consumed_shadowperson + . = ..() + +/obj/effect/mob_spawn/corpse/human/legioninfested/snow/Initialize(mapload) + var/corpse_theme = pick_weight(list( + "Miner" = 64, + "Clown" = 5, + "Golem" = 15, + "Settler" = 10, + pick(list( + "Cultist", + "Heremoth", + "Operative", + "Shadow", + )) = 4, + )) + switch(corpse_theme) + if("Miner") + outfit = /datum/outfit/consumed_miner + if("Settler") + outfit = /datum/outfit/consumed_ice_settler + if("Heremoth") + outfit = /datum/outfit/consumed_heremoth + if("Clown") + outfit = /datum/outfit/consumed_clown + if("Cultist") + outfit = /datum/outfit/consumed_cultist if("Golem") outfit = /datum/outfit/consumed_golem if("Operative") @@ -222,6 +254,36 @@ if(prob(50)) neck = /obj/item/bedsheet/rd/royal_cape +/datum/outfit/consumed_ice_settler + name = "Legion-Consumed Settler" + uniform = /obj/item/clothing/under/costume/traditional + suit = /obj/item/clothing/suit/hooded/wintercoat + shoes = /obj/item/clothing/shoes/winterboots + mask = /obj/item/clothing/mask/breath + +/datum/outfit/consumed_ice_settler/pre_equip(mob/living/carbon/human/ice_settler, visualsOnly = FALSE) + if(prob(40)) + r_pocket = pick_weight(list( + /obj/item/coin/silver = 5, + /obj/item/fishing_hook = 2, + /obj/item/coin/gold = 2, + /obj/item/fishing_hook/shiny = 1, + )) + if(prob(30)) + back = pick_weight(list( + /obj/item/pickaxe = 4, + /obj/item/tank/internals/oxygen = 6, + )) + else + back = /obj/item/storage/backpack/satchel/explorer + backpack_contents = list() + var/backpack_loot = pick(list( + /obj/item/food/fishmeat = 89, + /obj/item/food/fishmeat/carp = 10, + /obj/item/skeleton_key = 1, + )) + backpack_contents += backpack_loot + //this is so pointlessly gendered but whatever bro i'm here to refactor not judge /datum/outfit/consumed_dame name = "Legion-Consumed Dame" @@ -274,3 +336,26 @@ /obj/item/stack/sheet/runed_metal = 15, ) r_pocket = /obj/item/clothing/glasses/hud/health/night/cultblind + +/datum/outfit/consumed_heremoth + name = "Legion-Consumed Tribal Mothman" + uniform = /obj/item/clothing/under/costume/loincloth + suit = /obj/item/clothing/suit/hooded/cultrobes/eldritch + head = /obj/item/clothing/head/hooded/cult_hoodie/eldritch + +/datum/outfit/consumed_heremoth/pre_equip(mob/living/carbon/human/moth, visualsOnly = FALSE) + if(!visualsOnly) + moth.set_species(/datum/species/moth) + if(prob(70)) + glasses = /obj/item/clothing/glasses/blindfold + if(prob(90)) + back = /obj/item/storage/backpack/cultpack + backpack_contents = list() + var/backpack_loot = pick(list( + /obj/item/flashlight/lantern = 1, + /obj/item/toy/plush/moth = 1, + /obj/item/toy/eldritch_book = 2, + /obj/item/knife/combat/survival = 2, + )) + backpack_contents += backpack_loot + diff --git a/code/modules/mob_spawn/corpses/nonhuman_corpses.dm b/code/modules/mob_spawn/corpses/nonhuman_corpses.dm index e80273e1acc..060f7e178be 100644 --- a/code/modules/mob_spawn/corpses/nonhuman_corpses.dm +++ b/code/modules/mob_spawn/corpses/nonhuman_corpses.dm @@ -48,10 +48,6 @@ /// Dead headcrab for changeling-themed ruins /obj/effect/mob_spawn/corpse/headcrab - mob_type = /mob/living/basic/headslug + mob_type = /mob/living/basic/headslug/beakless icon = 'icons/mob/simple/animal.dmi' icon_state = "headslug_dead" - -/obj/effect/mob_spawn/corpse/headcrab/special(mob/living/basic/headslug/crab) - . = ..() - crab.egg_lain = TRUE // Prevents using mad science to become a changeling diff --git a/code/modules/mob_spawn/ghost_roles/golem_roles.dm b/code/modules/mob_spawn/ghost_roles/golem_roles.dm index 58ce98bcb6f..c86a8958238 100644 --- a/code/modules/mob_spawn/ghost_roles/golem_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/golem_roles.dm @@ -101,7 +101,7 @@ CRASH("[type] created a golem without a mind.") new_spawn.mind.enslave_mind_to_creator(real_owner) - to_chat(new_spawn, span_userdanger("Serve [real_owner], and assist [real_owner.p_them()] in completing [real_owner.p_their()] goals at any cost.")) + to_chat(new_spawn, span_userdanger("Serve [real_owner.real_name], and assist [real_owner.p_them()] in completing [real_owner.p_their()] goals at any cost.")) /obj/effect/mob_spawn/ghost_role/human/golem/servant/name_mob(mob/living/spawned_mob, forced_name) if(forced_name || !iscarbon(spawned_mob)) diff --git a/code/modules/mob_spawn/ghost_roles/mining_roles.dm b/code/modules/mob_spawn/ghost_roles/mining_roles.dm index 190bd8a3388..933688bf86f 100644 --- a/code/modules/mob_spawn/ghost_roles/mining_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/mining_roles.dm @@ -129,7 +129,8 @@ name = "Space Bartender" id = /obj/item/card/id/advanced id_trim = /datum/id_trim/space_bartender - uniform = /obj/item/clothing/under/rank/civilian/bartender + neck = /obj/item/clothing/neck/bowtie + uniform = /obj/item/clothing/under/costume/buttondown/slacks/service suit = /obj/item/clothing/suit/armor/vest back = /obj/item/storage/backpack glasses = /obj/item/clothing/glasses/sunglasses/reagent diff --git a/code/modules/mob_spawn/ghost_roles/spider_roles.dm b/code/modules/mob_spawn/ghost_roles/spider_roles.dm index 24bef0abfa3..e3dbea6b1ba 100644 --- a/code/modules/mob_spawn/ghost_roles/spider_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/spider_roles.dm @@ -23,7 +23,7 @@ /obj/structure/spider/eggcluster/examine_more(mob/user) . = ..() - if(istype(user, /mob/living/basic/giant_spider/midwife)) + if(istype(user, /mob/living/basic/spider/giant/midwife)) switch(spawner.amount_grown) if(0 to 24) . += span_info("These eggs look shrunken and dormant.") @@ -74,12 +74,12 @@ var/obj/structure/spider/eggcluster/egg /// The types of spiders that the spawner can produce var/list/potentialspawns = list( - /mob/living/basic/spiderling/nurse, - /mob/living/basic/spiderling/hunter, - /mob/living/basic/spiderling/ambush, - /mob/living/basic/spiderling/tangle, - /mob/living/basic/spiderling/guard, - /mob/living/basic/spiderling/scout, + /mob/living/basic/spider/growing/spiderling/nurse, + /mob/living/basic/spider/growing/spiderling/hunter, + /mob/living/basic/spider/growing/spiderling/ambush, + /mob/living/basic/spider/growing/spiderling/tangle, + /mob/living/basic/spider/growing/spiderling/guard, + /mob/living/basic/spider/growing/spiderling/scout, ) /// Do we flash the byond window when this particular egg type is available? var/flash_window = FALSE @@ -122,11 +122,13 @@ to_chat(user, span_warning("\The [src] is not ready to hatch yet!")) return FALSE -/obj/effect/mob_spawn/ghost_role/spider/special(mob/living/basic/giant_spider/spawned_mob, mob/mob_possessor) +/obj/effect/mob_spawn/ghost_role/spider/special(mob/living/basic/spider/spawned_mob, mob/mob_possessor) + . = ..() spawned_mob.directive = directive egg.spawner = null QDEL_NULL(egg) - return ..() + var/datum/antagonist/spider/spider_antag = new(directive) + spawned_mob.mind.add_antag_datum(spider_antag) /obj/effect/mob_spawn/ghost_role/spider/enriched name = "enriched egg cluster" @@ -134,9 +136,9 @@ you_are_text = "You are an enriched spider." cluster_type = /obj/structure/spider/eggcluster/enriched potentialspawns = list( - /mob/living/basic/spiderling/tarantula, - /mob/living/basic/spiderling/viper, - /mob/living/basic/spiderling/midwife, + /mob/living/basic/spider/growing/spiderling/tarantula, + /mob/living/basic/spider/growing/spiderling/viper, + /mob/living/basic/spider/growing/spiderling/midwife, ) flash_window = TRUE @@ -148,7 +150,7 @@ directive = "You are the spawn of a vicious changeling. You have no ambitions except to wreak havoc and ensure your own survival. You are aggressive to all living beings outside of your species, including changelings." cluster_type = /obj/structure/spider/eggcluster/bloody potentialspawns = list( - /mob/living/basic/spiderling/hunter/flesh, + /mob/living/basic/spider/giant/hunter/flesh, ) flash_window = TRUE @@ -159,7 +161,7 @@ directive = "Ensure the survival of the spider species and overtake whatever structure you find yourself in." cluster_type = /obj/structure/spider/eggcluster/midwife potentialspawns = list( - /mob/living/basic/spiderling/midwife, + /mob/living/basic/spider/giant/midwife, // We don't want the event to end instantly because of a 2 hp spiderling dying ) flash_window = TRUE @@ -176,9 +178,9 @@ var/list/spider_list = list() var/list/display_spiders = list() for(var/choice in potentialspawns) - var/mob/living/basic/spiderling/chosen_spiderling = choice - var/mob/living/basic/young_spider/young_spider = initial(chosen_spiderling.grow_as) - var/mob/living/basic/giant_spider/spider = initial(young_spider.grow_as) + var/mob/living/basic/spider/growing/spiderling/chosen_spiderling = choice + var/mob/living/basic/spider/growing/young/young_spider = initial(chosen_spiderling.grow_as) + var/mob/living/basic/spider/giant/spider = initial(young_spider.grow_as) // God this is so stupid spider_list[initial(spider.name)] = chosen_spiderling var/datum/radial_menu_choice/option = new diff --git a/code/modules/mob_spawn/ghost_roles/unused_roles.dm b/code/modules/mob_spawn/ghost_roles/unused_roles.dm index 4473960502c..817b2154986 100644 --- a/code/modules/mob_spawn/ghost_roles/unused_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/unused_roles.dm @@ -129,7 +129,8 @@ /datum/outfit/cryobartender name = "Cryogenic Bartender" - uniform = /obj/item/clothing/under/rank/civilian/bartender + neck = /obj/item/clothing/neck/bowtie + uniform = /obj/item/clothing/under/costume/buttondown/slacks/service suit = /obj/item/clothing/suit/armor/vest back = /obj/item/storage/backpack glasses = /obj/item/clothing/glasses/sunglasses/reagent diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm index 37083aeb2c1..3fca395e4b7 100644 --- a/code/modules/mod/mod_activation.dm +++ b/code/modules/mod/mod_activation.dm @@ -163,6 +163,7 @@ if(!module.active || (module.allow_flags & MODULE_ALLOW_INACTIVE)) continue module.on_deactivation(display_message = FALSE) + mod_link.end_call() activating = TRUE to_chat(wearer, span_notice("MODsuit [active ? "shutting down" : "starting up"].")) @@ -233,17 +234,15 @@ if (!seal && wearer?.invalid_internals()) wearer.cutoff_internals() -/// Finishes the suit's activation, starts processing +/// Finishes the suit's activation /obj/item/mod/control/proc/finish_activation(on) active = on if(active) for(var/obj/item/mod/module/module as anything in modules) module.on_suit_activation() - START_PROCESSING(SSobj, src) else for(var/obj/item/mod/module/module as anything in modules) module.on_suit_deactivation() - STOP_PROCESSING(SSobj, src) update_speed() update_icon_state() wearer.update_clothing(slot_flags) diff --git a/code/modules/mod/mod_construction.dm b/code/modules/mod/mod_construction.dm index 398ba2f216e..fdbcf47d379 100644 --- a/code/modules/mod/mod_construction.dm +++ b/code/modules/mod/mod_construction.dm @@ -281,18 +281,18 @@ QDEL_NULL(boots) return ..() -/obj/item/mod/construction/shell/handle_atom_del(atom/deleted_atom) - if(deleted_atom == core) +/obj/item/mod/construction/shell/Exited(atom/movable/gone, direction) + . = ..() + if(gone == core) core = null - if(deleted_atom == helmet) + if(gone == helmet) helmet = null - if(deleted_atom == chestplate) + if(gone == chestplate) chestplate = null - if(deleted_atom == gauntlets) + if(gone == gauntlets) gauntlets = null - if(deleted_atom == boots) + if(gone == boots) boots = null - return ..() #undef START_STEP #undef CORE_STEP diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index 5cce89f1511..573cee3531a 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -85,6 +85,10 @@ var/obj/item/mod/module/selected_module /// AI or pAI mob inhabiting the MOD. var/mob/living/silicon/ai_assistant + /// The MODlink datum, letting us call people from the suit. + var/datum/mod_link/mod_link + /// The starting MODlink frequency, overridden on subtypes that want it to be something. + var/starting_frequency = null /// Delay between moves as AI. var/static/movedelay = 0 /// Cooldown for AI moves. @@ -142,10 +146,10 @@ for(var/obj/item/mod/module/module as anything in theme.inbuilt_modules) module = new module(src) install(module) + START_PROCESSING(SSobj, src) /obj/item/mod/control/Destroy() - if(active) - STOP_PROCESSING(SSobj, src) + STOP_PROCESSING(SSobj, src) for(var/obj/item/mod/module/module as anything in modules) uninstall(module, deleting = TRUE) for(var/obj/item/part as anything in mod_parts) @@ -174,6 +178,7 @@ if(core) QDEL_NULL(core) QDEL_NULL(wires) + QDEL_NULL(mod_link) return ..() /obj/item/mod/control/atom_destruction(damage_flag) @@ -220,6 +225,7 @@ . += span_notice("You could install a pAI with a pAI card.") // SKYRAT EDIT CHANGE - ORIGINAL: . += span_notice("You could install an AI or pAI using their storage card.") else if(isAI(ai_assistant)) . += span_notice("You could remove [ai_assistant] with an intellicard.") + . += span_notice("You could copy/set link frequency with a multitool.") . += span_notice("You could examine it more thoroughly...") /obj/item/mod/control/examine_more(mob/user) @@ -229,13 +235,17 @@ /obj/item/mod/control/process(seconds_per_tick) if(seconds_electrified > MACHINE_NOT_ELECTRIFIED) seconds_electrified-- + if(mod_link.link_call) + subtract_charge((DEFAULT_CHARGE_DRAIN * 0.25) * seconds_per_tick) + if(!active) + return if(!get_charge() && active && !activating) power_off() - return PROCESS_KILL + return var/malfunctioning_charge_drain = 0 if(malfunctioning) malfunctioning_charge_drain = rand(1,20) - subtract_charge((charge_drain + malfunctioning_charge_drain)*seconds_per_tick) + subtract_charge((charge_drain + malfunctioning_charge_drain) * seconds_per_tick) update_charge_alert() for(var/obj/item/mod/module/module as anything in modules) if(malfunctioning && module.active && SPT_PROB(5, seconds_per_tick)) @@ -506,6 +516,7 @@ retract(null, part) if(active) finish_activation(on = FALSE) + mod_link?.end_call() var/mob/old_wearer = wearer unset_wearer() old_wearer.temporarilyRemoveItemFromInventory(src) @@ -600,6 +611,10 @@ QDEL_LIST_ASSOC_VAL(old_module.pinned_to) old_module.mod = null +/// Intended for callbacks, don't use normally, just get wearer by itself. +/obj/item/mod/control/proc/get_wearer() + return wearer + /obj/item/mod/control/proc/update_access(mob/user, obj/item/card/id/card) if(!allowed(user)) balloon_alert(user, "insufficient access!") diff --git a/code/modules/mod/mod_link.dm b/code/modules/mod/mod_link.dm new file mode 100644 index 00000000000..8a3340fad3e --- /dev/null +++ b/code/modules/mod/mod_link.dm @@ -0,0 +1,539 @@ +/proc/make_link_visual_generic(datum/mod_link/mod_link, proc_path) + var/mob/living/user = mod_link.get_user_callback.Invoke() + var/obj/effect/overlay/link_visual = new() + link_visual.name = "holocall ([mod_link.id])" + link_visual.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + LAZYADD(mod_link.holder.update_on_z, link_visual) + link_visual.appearance_flags |= KEEP_TOGETHER + link_visual.makeHologram(0.75) + mod_link.visual_overlays = user.overlays - user.active_thinking_indicator + link_visual.add_overlay(mod_link.visual_overlays) + mod_link.visual = link_visual + mod_link.holder.become_hearing_sensitive(REF(mod_link)) + mod_link.holder.RegisterSignals(user, list(COMSIG_CARBON_APPLY_OVERLAY, COMSIG_CARBON_REMOVE_OVERLAY), proc_path) + return link_visual + +/proc/get_link_visual_generic(datum/mod_link/mod_link, atom/movable/visuals, proc_path) + var/mob/living/user = mod_link.get_user_callback.Invoke() + playsound(mod_link.holder, 'sound/machines/terminal_processing.ogg', 50, vary = TRUE) + visuals.add_overlay(mutable_appearance('icons/effects/effects.dmi', "static_base", TURF_LAYER)) + visuals.add_overlay(mutable_appearance('icons/effects/effects.dmi', "modlink", ABOVE_ALL_MOB_LAYER)) + visuals.add_filter("crop_square", 1, alpha_mask_filter(icon = icon('icons/effects/effects.dmi', "modlink_filter"))) + visuals.maptext_height = 6 + visuals.alpha = 0 + user.vis_contents += visuals + visuals.forceMove(user) + animate(visuals, 0.5 SECONDS, alpha = 255) + var/datum/callback/setdir_callback = CALLBACK(mod_link.holder, proc_path) + setdir_callback.Invoke(user, user.dir, user.dir) + mod_link.holder.RegisterSignal(mod_link.holder.loc, COMSIG_ATOM_DIR_CHANGE, proc_path) + +/proc/delete_link_visual_generic(datum/mod_link/mod_link) + var/mob/living/user = mod_link.get_user_callback.Invoke() + playsound(mod_link.get_other().holder, 'sound/machines/terminal_processing.ogg', 50, vary = TRUE, frequency = -1) + LAZYREMOVE(mod_link.holder.update_on_z, mod_link.visual) + mod_link.holder.lose_hearing_sensitivity(REF(mod_link)) + mod_link.holder.UnregisterSignal(user, list(COMSIG_CARBON_APPLY_OVERLAY, COMSIG_CARBON_REMOVE_OVERLAY, COMSIG_ATOM_DIR_CHANGE)) + QDEL_NULL(mod_link.visual) + +/proc/on_user_set_dir_generic(datum/mod_link/mod_link, newdir) + var/atom/other_visual = mod_link.get_other().visual + if(!newdir) //can sometimes be null or 0 + return + other_visual.setDir(SOUTH) + other_visual.pixel_x = 0 + other_visual.pixel_y = 0 + var/matrix/new_transform = matrix() + if(newdir & NORTH) + other_visual.pixel_y = 13 + other_visual.layer = BELOW_MOB_LAYER + SET_PLANE_IMPLICIT(other_visual, GAME_PLANE_FOV_HIDDEN) + if(newdir & SOUTH) + other_visual.pixel_y = -24 + other_visual.layer = ABOVE_ALL_MOB_LAYER + SET_PLANE_IMPLICIT(other_visual, GAME_PLANE_UPPER_FOV_HIDDEN) + new_transform.Scale(-1, 1) + new_transform.Translate(-1, 0) + if(newdir & EAST) + other_visual.pixel_x = 14 + other_visual.layer = BELOW_MOB_LAYER + SET_PLANE_IMPLICIT(other_visual, GAME_PLANE_FOV_HIDDEN) + new_transform.Shear(0.5, 0) + new_transform.Scale(0.65, 1) + if(newdir & WEST) + other_visual.pixel_x = -14 + other_visual.layer = BELOW_MOB_LAYER + SET_PLANE_IMPLICIT(other_visual, GAME_PLANE_FOV_HIDDEN) + new_transform.Shear(-0.5, 0) + new_transform.Scale(0.65, 1) + other_visual.transform = new_transform + +/obj/item/mod/control/Initialize(mapload, datum/mod_theme/new_theme, new_skin, obj/item/mod/core/new_core) + . = ..() + mod_link = new( + src, + starting_frequency, + CALLBACK(src, PROC_REF(get_wearer)), + CALLBACK(src, PROC_REF(can_call)), + CALLBACK(src, PROC_REF(make_link_visual)), + CALLBACK(src, PROC_REF(get_link_visual)), + CALLBACK(src, PROC_REF(delete_link_visual)) + ) + +/obj/item/mod/control/multitool_act_secondary(mob/living/user, obj/item/multitool/tool) + if(!multitool_check_buffer(user, tool)) + return + var/tool_frequency = null + if(istype(tool.buffer, /datum/mod_link)) + var/datum/mod_link/buffer_link = tool.buffer + tool_frequency = buffer_link.frequency + balloon_alert(user, "frequency set") + if(!tool_frequency && mod_link.frequency) + tool.set_buffer(mod_link) + balloon_alert(user, "frequency copied") + else if(tool_frequency && !mod_link.frequency) + mod_link.frequency = tool_frequency + else if(tool_frequency && mod_link.frequency) + var/response = tgui_alert(user, "Would you like to copy or imprint the frequency?", "MODlink Frequency", list("Copy", "Imprint")) + if(!user.is_holding(tool)) + return + switch(response) + if("Copy") + tool.set_buffer(mod_link) + balloon_alert(user, "frequency copied") + if("Imprint") + mod_link.frequency = tool_frequency + balloon_alert(user, "frequency set") + +/obj/item/mod/control/proc/can_call() + return get_charge() && wearer && wearer.stat < DEAD + +/obj/item/mod/control/proc/make_link_visual() + return make_link_visual_generic(mod_link, PROC_REF(on_overlay_change)) + +/obj/item/mod/control/proc/get_link_visual(atom/movable/visuals) + return get_link_visual_generic(mod_link, visuals, PROC_REF(on_wearer_set_dir)) + +/obj/item/mod/control/proc/delete_link_visual() + return delete_link_visual_generic(mod_link) + +/obj/item/mod/control/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods, message_range) + . = ..() + if(speaker != wearer && speaker != ai_assistant) + return + mod_link.visual.say(raw_message, sanitize = FALSE, message_range = 2) + +/obj/item/mod/control/proc/on_overlay_change(atom/source, cache_index, overlay) + SIGNAL_HANDLER + addtimer(CALLBACK(src, PROC_REF(update_link_visual)), 1 TICKS, TIMER_UNIQUE) + +/obj/item/mod/control/proc/update_link_visual() + if(QDELETED(mod_link.link_call)) + return + mod_link.visual.cut_overlay(mod_link.visual_overlays) + mod_link.visual_overlays = wearer.overlays - wearer.active_thinking_indicator + mod_link.visual.add_overlay(mod_link.visual_overlays) + +/obj/item/mod/control/proc/on_wearer_set_dir(atom/source, dir, newdir) + SIGNAL_HANDLER + on_user_set_dir_generic(mod_link, newdir || SOUTH) + +/obj/item/clothing/neck/link_scryer + name = "\improper MODlink scryer" + desc = "An intricate piece of machinery that creates a holographic video call with another MODlink-compatible device. Essentially a video necklace." + icon_state = "modlink" + actions_types = list(/datum/action/item_action/call_link) + /// The installed power cell. + var/obj/item/stock_parts/cell/cell + /// The MODlink datum we operate. + var/datum/mod_link/mod_link + /// Initial frequency of the MODlink. + var/starting_frequency + /// An additional name tag for the scryer, seen as "MODlink scryer - [label]" + var/label + +/obj/item/clothing/neck/link_scryer/Initialize(mapload) + . = ..() + mod_link = new( + src, + starting_frequency, + CALLBACK(src, PROC_REF(get_user)), + CALLBACK(src, PROC_REF(can_call)), + CALLBACK(src, PROC_REF(make_link_visual)), + CALLBACK(src, PROC_REF(get_link_visual)), + CALLBACK(src, PROC_REF(delete_link_visual)) + ) + START_PROCESSING(SSobj, src) + +/obj/item/clothing/neck/link_scryer/Destroy() + QDEL_NULL(cell) + QDEL_NULL(mod_link) + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/clothing/neck/link_scryer/examine(mob/user) + . = ..() + if(cell) + . += span_notice("The battery charge reads [cell.percent()]%. Right-click with an empty hand to remove it.") + else + . += span_notice("It is missing a battery, one can be installed by clicking with a power cell on it.") + . += span_notice("The MODlink ID is [mod_link.id], frequency is [mod_link.frequency || "unset"]. Right-click with multitool to copy/imprint frequency.") + . += span_notice("Use in hand to set name.") + +/obj/item/clothing/neck/link_scryer/equipped(mob/living/user, slot) + . = ..() + if(slot != ITEM_SLOT_NECK) + mod_link?.end_call() + +/obj/item/clothing/neck/link_scryer/dropped(mob/living/user) + . = ..() + mod_link?.end_call() + +/obj/item/clothing/neck/link_scryer/attack_self(mob/user, modifiers) + var/new_label = reject_bad_text(tgui_input_text(user, "Change the visible name", "Set Name", label, MAX_NAME_LEN)) + if(!new_label) + balloon_alert(user, "invalid name!") + return + label = new_label + balloon_alert(user, "name set") + update_name() + +/obj/item/clothing/neck/link_scryer/process(seconds_per_tick) + if(!mod_link.link_call) + return + cell.use(min(20 * seconds_per_tick, cell.charge)) + +/obj/item/clothing/neck/link_scryer/attackby(obj/item/attacked_by, mob/user, params) + . = ..() + if(cell || !istype(attacked_by, /obj/item/stock_parts/cell)) + return + if(!user.transferItemToLoc(attacked_by, src)) + return + cell = attacked_by + balloon_alert(user, "installed [cell.name]") + +/obj/item/clothing/neck/link_scryer/update_name(updates) + . = ..() + name = "[initial(name)][label ? " - [label]" : ""]" + +/obj/item/clothing/neck/link_scryer/Exited(atom/movable/gone, direction) + . = ..() + if(gone == cell) + cell = null + +/obj/item/clothing/neck/link_scryer/attack_hand_secondary(mob/user, list/modifiers) + if(!cell) + return SECONDARY_ATTACK_CONTINUE_CHAIN + balloon_alert(user, "removed [cell.name]") + user.put_in_hands(cell) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/item/clothing/neck/link_scryer/multitool_act_secondary(mob/living/user, obj/item/multitool/tool) + if(!multitool_check_buffer(user, tool)) + return + var/tool_frequency = null + if(istype(tool.buffer, /datum/mod_link)) + var/datum/mod_link/buffer_link = tool.buffer + tool_frequency = buffer_link.frequency + balloon_alert(user, "frequency set") + if(!tool_frequency && mod_link.frequency) + tool.set_buffer(mod_link) + balloon_alert(user, "frequency copied") + else if(tool_frequency && !mod_link.frequency) + mod_link.frequency = tool_frequency + else if(tool_frequency && mod_link.frequency) + var/response = tgui_alert(user, "Would you like to copy or imprint the frequency?", "MODlink Frequency", list("Copy", "Imprint")) + if(!user.is_holding(tool)) + return + switch(response) + if("Copy") + tool.set_buffer(mod_link) + balloon_alert(user, "frequency copied") + if("Imprint") + mod_link.frequency = tool_frequency + balloon_alert(user, "frequency set") + +/obj/item/clothing/neck/link_scryer/worn_overlays(mutable_appearance/standing, isinhands) + . = ..() + if(!QDELETED(mod_link.link_call)) + . += mutable_appearance('icons/mob/clothing/neck.dmi', "modlink_active") + +/obj/item/clothing/neck/link_scryer/ui_action_click(mob/user) + if(mod_link.link_call) + mod_link.end_call() + else + call_link(user, mod_link) + +/obj/item/clothing/neck/link_scryer/proc/get_user() + var/mob/living/carbon/user = loc + return istype(user) && user.wear_neck == src ? user : null + +/obj/item/clothing/neck/link_scryer/proc/can_call() + var/mob/living/user = loc + return istype(user) && cell?.charge && user.stat < DEAD + +/obj/item/clothing/neck/link_scryer/proc/make_link_visual() + var/mob/living/user = mod_link.get_user_callback.Invoke() + user.update_worn_neck() + return make_link_visual_generic(mod_link, PROC_REF(on_overlay_change)) + +/obj/item/clothing/neck/link_scryer/proc/get_link_visual(atom/movable/visuals) + return get_link_visual_generic(mod_link, visuals, PROC_REF(on_user_set_dir)) + +/obj/item/clothing/neck/link_scryer/proc/delete_link_visual() + var/mob/living/user = mod_link.get_user_callback.Invoke() + if(!QDELETED(user)) + user.update_worn_neck() + return delete_link_visual_generic(mod_link) + +/obj/item/clothing/neck/link_scryer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods, message_range) + . = ..() + if(speaker != loc) + return + mod_link.visual.say(raw_message, sanitize = FALSE, message_range = 3) + +/obj/item/clothing/neck/link_scryer/proc/on_overlay_change(atom/source, cache_index, overlay) + SIGNAL_HANDLER + addtimer(CALLBACK(src, PROC_REF(update_link_visual)), 1 TICKS, TIMER_UNIQUE) + +/obj/item/clothing/neck/link_scryer/proc/update_link_visual() + if(QDELETED(mod_link.link_call)) + return + var/mob/living/user = loc + mod_link.visual.cut_overlay(mod_link.visual_overlays) + mod_link.visual_overlays = user.overlays - user.active_thinking_indicator + mod_link.visual.add_overlay(mod_link.visual_overlays) + +/obj/item/clothing/neck/link_scryer/proc/on_user_set_dir(atom/source, dir, newdir) + SIGNAL_HANDLER + on_user_set_dir_generic(mod_link, newdir || SOUTH) + +/obj/item/clothing/neck/link_scryer/loaded + starting_frequency = "NT" + +/obj/item/clothing/neck/link_scryer/loaded/Initialize(mapload) + . = ..() + cell = new /obj/item/stock_parts/cell/high(src) + +/obj/item/clothing/neck/link_scryer/loaded/charlie + starting_frequency = MODLINK_FREQ_CHARLIE + +/// A MODlink datum, used to handle unique functions that will be used in the MODlink call. +/datum/mod_link + /// Generic name for multitool buffers. + var/name = "MODlink" + /// The frequency of the MODlink. You can only call other MODlinks on the same frequency. + var/frequency + /// The unique ID of the MODlink. + var/id = "" + /// The atom that holds the MODlink. + var/atom/movable/holder + /// A reference to the visuals generated by the MODlink. + var/atom/movable/visual + /// A list of all overlays of the user, copied everytime they have an overlay change. + var/list/visual_overlays = list() + /// A reference to the call between two MODlinks. + var/datum/mod_link_call/link_call + /// A callback that returns the user of the MODlink. + var/datum/callback/get_user_callback + /// A callback that returns whether the MODlink can currently call. + var/datum/callback/can_call_callback + /// A callback that returns the visuals of the MODlink. + var/datum/callback/make_visual_callback + /// A callback that receives the visuals of the other MODlink. + var/datum/callback/get_visual_callback + /// A callback that deletes the visuals of the MODlink. + var/datum/callback/delete_visual_callback + +/datum/mod_link/New( + atom/holder, + frequency, + datum/callback/get_user_callback, + datum/callback/can_call_callback, + datum/callback/make_visual_callback, + datum/callback/get_visual_callback, + datum/callback/delete_visual_callback +) + var/attempts = 0 + var/digits_to_make = 3 + do + if(attempts == 10) + attempts = 0 + digits_to_make++ + id = "" + for(var/i in 1 to digits_to_make) + id += num2text(rand(0,9)) + attempts++ + while(GLOB.mod_link_ids[id]) + GLOB.mod_link_ids[id] = src + src.frequency = frequency + src.holder = holder + src.get_user_callback = get_user_callback + src.can_call_callback = can_call_callback + src.make_visual_callback = make_visual_callback + src.get_visual_callback = get_visual_callback + src.delete_visual_callback = delete_visual_callback + RegisterSignal(holder, COMSIG_QDELETING, PROC_REF(on_holder_delete)) + +/datum/mod_link/Destroy() + GLOB.mod_link_ids -= id + if(link_call) + end_call() + get_user_callback = null + make_visual_callback = null + get_visual_callback = null + delete_visual_callback = null + return ..() + +/datum/mod_link/proc/get_other() + RETURN_TYPE(/datum/mod_link) + if(!link_call) + return + return link_call.caller == src ? link_call.receiver : link_call.caller + +/datum/mod_link/proc/call_link(datum/mod_link/called, mob/user) + if(!frequency) + return + if(!istype(called)) + holder.balloon_alert(user, "invalid target!") + return + var/mob/living/link_user = get_user_callback.Invoke() + if(!link_user) + return + if(HAS_TRAIT(link_user, TRAIT_IN_CALL)) + holder.balloon_alert(user, "user already in call!") + return + var/mob/living/link_target = called.get_user_callback.Invoke() + if(!link_target) + holder.balloon_alert(user, "invalid target!") + return + if(HAS_TRAIT(link_target, TRAIT_IN_CALL)) + holder.balloon_alert(user, "target already in call!") + return + if(!can_call_callback.Invoke() || !called.can_call_callback.Invoke()) + holder.balloon_alert(user, "can't call!") + return + link_target.playsound_local(get_turf(called.holder), 'sound/weapons/ring.ogg', 15, vary = TRUE) + var/atom/movable/screen/alert/modlink_call/alert = link_target.throw_alert("[REF(src)]_modlink", /atom/movable/screen/alert/modlink_call) + alert.desc = "[holder] ([id]) is calling you! Left-click this to accept the call. Right-click to deny it." + alert.caller_ref = WEAKREF(src) + alert.receiver_ref = WEAKREF(called) + alert.user_ref = WEAKREF(user) + +/datum/mod_link/proc/end_call() + QDEL_NULL(link_call) + +/datum/mod_link/proc/on_holder_delete(atom/source) + SIGNAL_HANDLER + qdel(src) + +/// A MODlink call datum, used to handle the call between two MODlinks. +/datum/mod_link_call + /// The MODlink that is calling. + var/datum/mod_link/caller + /// The MODlink that is being called. + var/datum/mod_link/receiver + +/datum/mod_link_call/New(datum/mod_link/caller, datum/mod_link/receiver) + caller.link_call = src + receiver.link_call = src + src.caller = caller + src.receiver = receiver + var/mob/living/caller_mob = caller.get_user_callback.Invoke() + ADD_TRAIT(caller_mob, TRAIT_IN_CALL, REF(src)) + var/mob/living/receiver_mob = receiver.get_user_callback.Invoke() + ADD_TRAIT(receiver_mob, TRAIT_IN_CALL, REF(src)) + make_visuals() + START_PROCESSING(SSprocessing, src) + +/datum/mod_link_call/Destroy() + var/mob/living/caller_mob = caller.get_user_callback.Invoke() + if(!QDELETED(caller_mob)) + REMOVE_TRAIT(caller_mob, TRAIT_IN_CALL, REF(src)) + var/mob/living/receiver_mob = receiver.get_user_callback.Invoke() + if(!QDELETED(receiver_mob)) + REMOVE_TRAIT(receiver_mob, TRAIT_IN_CALL, REF(src)) + STOP_PROCESSING(SSprocessing, src) + clear_visuals() + caller.link_call = null + receiver.link_call = null + return ..() + +/datum/mod_link_call/process(seconds_per_tick) + if(can_continue_call()) + return + qdel(src) + +/datum/mod_link_call/proc/can_continue_call() + return caller.frequency == receiver.frequency && caller.can_call_callback.Invoke() && receiver.can_call_callback.Invoke() + +/datum/mod_link_call/proc/make_visuals() + var/caller_visual = caller.make_visual_callback.Invoke() + var/receiver_visual = receiver.make_visual_callback.Invoke() + caller.get_visual_callback.Invoke(receiver_visual) + receiver.get_visual_callback.Invoke(caller_visual) + +/datum/mod_link_call/proc/clear_visuals() + caller.delete_visual_callback.Invoke() + receiver.delete_visual_callback.Invoke() + +/proc/call_link(mob/user, datum/mod_link/calling_link) + if(!calling_link.frequency) + return + var/list/callers = list() + for(var/id in GLOB.mod_link_ids) + var/datum/mod_link/link = GLOB.mod_link_ids[id] + if(link.frequency != calling_link.frequency) + continue + if(link == calling_link) + continue + if(!link.can_call_callback.Invoke()) + continue + callers["[link.holder] ([id])"] = id + if(!length(callers)) + calling_link.holder.balloon_alert(user, "no targets on freq [calling_link.frequency]!") + return + var/chosen_link = tgui_input_list(user, "Choose ID to call from [calling_link.frequency] frequency", "MODlink", callers) + if(!chosen_link) + return + calling_link.call_link(GLOB.mod_link_ids[callers[chosen_link]], user) + +/atom/movable/screen/alert/modlink_call + name = "MODlink Call Incoming" + desc = "Someone is calling you! Left-click this to accept the call. Right-click to deny it." + icon_state = "called" + timeout = 10 SECONDS + var/end_message = "call timed out!" + /// A weak reference to the MODlink that is calling. + var/datum/weakref/caller_ref + /// A weak reference to the MODlink that is being called. + var/datum/weakref/receiver_ref + /// A weak reference to the mob that is calling. + var/datum/weakref/user_ref + +/atom/movable/screen/alert/modlink_call/Click(location, control, params) + . = ..() + if(usr != owner) + return + var/datum/mod_link/caller = caller_ref.resolve() + var/datum/mod_link/receiver = receiver_ref.resolve() + if(!caller || !receiver) + return + if(caller.link_call || receiver.link_call) + return + var/list/modifiers = params2list(params) + if(LAZYACCESS(modifiers, RIGHT_CLICK)) + end_message = "call denied!" + owner.clear_alert("[REF(caller)]_modlink") + return + end_message = "call accepted" + new /datum/mod_link_call(caller, receiver) + owner.clear_alert("[REF(caller)]_modlink") + +/atom/movable/screen/alert/modlink_call/Destroy() + var/mob/living/user = user_ref?.resolve() + var/datum/mod_link/caller = caller_ref?.resolve() + if(!user || !caller) + return ..() + caller.holder.balloon_alert(user, end_message) + return ..() diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index f48fa7e1554..521dd6f0240 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -306,7 +306,7 @@ the bare essentials, geared far more for environmental hazards than combat against fauna; however, \ this gives way to incredible protection against corrosives and thermal protection good enough for \ both casual backstroking through molten magma and romantic walks through arctic terrain. \ - Instead, the suit is capable of using its' anomalous properties to attract and \ + Instead, the suit is capable of using its anomalous properties to attract and \ carefully distribute layers of ash or ice across the surface; these layers are ablative, but incredibly strong. \ Lastly, the suit is capable of compressing and shrinking the mass of the wearer, as well as \ rearranging its own constitution, to allow them to fit upright in a sphere form that can \ @@ -954,6 +954,7 @@ slowdown_inactive = 1 slowdown_active = 0.5 ui_theme = "syndicate" + resistance_flags = FIRE_PROOF inbuilt_modules = list(/obj/item/mod/module/armor_booster) allowed_suit_storage = list( /obj/item/ammo_box, @@ -1436,7 +1437,7 @@ /datum/mod_theme/responsory name = "responsory" - desc = "A high-speed rescue suit by Nanotrasen, intended for its' emergency response teams." + desc = "A high-speed rescue suit by Nanotrasen, intended for its emergency response teams." extended_desc = "A streamlined suit of Nanotrasen design, these sleek black suits are only worn by \ elite emergency response personnel to help save the day. While the slim and nimble design of the suit \ cuts the ceramics and ablatives in it down, dropping the protection, \ diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index e820525ff9a..6abf91562d1 100644 --- a/code/modules/mod/mod_types.dm +++ b/code/modules/mod/mod_types.dm @@ -1,4 +1,5 @@ /obj/item/mod/control/pre_equipped + starting_frequency = MODLINK_FREQ_NANOTRASEN /// The skin we apply to the suit, defaults to the default_skin of the theme. var/applied_skin /// The MOD core we apply to the suit. @@ -52,10 +53,13 @@ /obj/item/mod/module/welding, /obj/item/mod/module/rad_protection, /obj/item/mod/module/flashlight, + /obj/item/mod/module/tether, /obj/item/mod/module/magboot, ) default_pins = list( /obj/item/mod/module/magboot, + /obj/item/mod/module/flashlight, + /obj/item/mod/module/tether, ) /obj/item/mod/control/pre_equipped/atmospheric @@ -65,9 +69,14 @@ /obj/item/mod/module/welding, /obj/item/mod/module/rad_protection, /obj/item/mod/module/flashlight, + /obj/item/mod/module/magboot, /obj/item/mod/module/t_ray, /obj/item/mod/module/quick_carry, ) + default_pins = list( + /obj/item/mod/module/magboot, + /obj/item/mod/module/flashlight, + ) /obj/item/mod/control/pre_equipped/advanced theme = /datum/mod_theme/advanced @@ -80,8 +89,9 @@ /obj/item/mod/module/jetpack, ) default_pins = list( - /obj/item/mod/module/jetpack, /obj/item/mod/module/magboot/advanced, + /obj/item/mod/module/flashlight, + /obj/item/mod/module/jetpack, ) /obj/item/mod/control/pre_equipped/loader @@ -196,6 +206,7 @@ /obj/item/mod/control/pre_equipped/traitor theme = /datum/mod_theme/syndicate + starting_frequency = MODLINK_FREQ_SYNDICATE applied_cell = /obj/item/stock_parts/cell/super applied_modules = list( /obj/item/mod/module/storage/syndicate, @@ -213,6 +224,7 @@ /obj/item/mod/control/pre_equipped/traitor_elite theme = /datum/mod_theme/elite + starting_frequency = MODLINK_FREQ_SYNDICATE applied_cell = /obj/item/stock_parts/cell/bluespace applied_modules = list( /obj/item/mod/module/storage/syndicate, @@ -229,6 +241,7 @@ /obj/item/mod/control/pre_equipped/nuclear theme = /datum/mod_theme/syndicate + starting_frequency = MODLINK_FREQ_SYNDICATE applied_cell = /obj/item/stock_parts/cell/hyper req_access = list(ACCESS_SYNDICATE) applied_modules = list( @@ -248,6 +261,7 @@ /obj/item/mod/control/pre_equipped/elite theme = /datum/mod_theme/elite + starting_frequency = MODLINK_FREQ_SYNDICATE applied_cell = /obj/item/stock_parts/cell/bluespace req_access = list(ACCESS_SYNDICATE) applied_modules = list( @@ -280,6 +294,7 @@ /obj/item/mod/control/pre_equipped/infiltrator theme = /datum/mod_theme/infiltrator + starting_frequency = MODLINK_FREQ_SYNDICATE applied_cell = /obj/item/stock_parts/cell/super applied_modules = list( /obj/item/mod/module/emp_shield, @@ -291,6 +306,7 @@ /obj/item/mod/control/pre_equipped/interdyne theme = /datum/mod_theme/interdyne + starting_frequency = MODLINK_FREQ_SYNDICATE applied_cell = /obj/item/stock_parts/cell/super applied_modules = list( /obj/item/mod/module/defibrillator/combat, @@ -304,6 +320,7 @@ /obj/item/mod/control/pre_equipped/enchanted theme = /datum/mod_theme/enchanted + starting_frequency = null applied_core = /obj/item/mod/core/infinite applied_modules = list( /obj/item/mod/module/storage/large_capacity, @@ -313,6 +330,7 @@ /obj/item/mod/control/pre_equipped/ninja theme = /datum/mod_theme/ninja + starting_frequency = null applied_cell = /obj/item/stock_parts/cell/ninja applied_modules = list( /obj/item/mod/module/storage, @@ -334,6 +352,7 @@ /obj/item/mod/control/pre_equipped/prototype theme = /datum/mod_theme/prototype + starting_frequency = MODLINK_FREQ_CHARLIE req_access = list(ACCESS_AWAY_GENERAL) applied_modules = list( /obj/item/mod/module/storage, @@ -349,6 +368,7 @@ /obj/item/mod/control/pre_equipped/responsory theme = /datum/mod_theme/responsory + starting_frequency = MODLINK_FREQ_CENTCOM applied_cell = /obj/item/stock_parts/cell/hyper req_access = list(ACCESS_CENT_GENERAL) applied_modules = list( @@ -427,6 +447,7 @@ /obj/item/mod/control/pre_equipped/apocryphal theme = /datum/mod_theme/apocryphal + starting_frequency = MODLINK_FREQ_CENTCOM applied_cell = /obj/item/stock_parts/cell/bluespace req_access = list(ACCESS_CENT_SPECOPS) applied_modules = list( @@ -452,6 +473,7 @@ /obj/item/mod/control/pre_equipped/corporate theme = /datum/mod_theme/corporate + starting_frequency = MODLINK_FREQ_CENTCOM applied_core = /obj/item/mod/core/infinite req_access = list(ACCESS_CENT_SPECOPS) applied_modules = list( @@ -463,6 +485,7 @@ /obj/item/mod/control/pre_equipped/chrono theme = /datum/mod_theme/chrono + starting_frequency = null applied_core = /obj/item/mod/core/infinite applied_modules = list( /obj/item/mod/module/eradication_lock, @@ -483,6 +506,7 @@ /obj/item/mod/control/pre_equipped/debug theme = /datum/mod_theme/debug + starting_frequency = null applied_core = /obj/item/mod/core/infinite applied_modules = list( //one of every type of module, for testing if they all work correctly /obj/item/mod/module/storage/bluespace, @@ -496,6 +520,7 @@ /obj/item/mod/control/pre_equipped/administrative theme = /datum/mod_theme/administrative + starting_frequency = MODLINK_FREQ_CENTCOM applied_core = /obj/item/mod/core/infinite applied_modules = list( /obj/item/mod/module/storage/bluespace, @@ -516,6 +541,7 @@ //these exist for the prefs menu /obj/item/mod/control/pre_equipped/empty + starting_frequency = null /obj/item/mod/control/pre_equipped/empty/syndicate theme = /datum/mod_theme/syndicate diff --git a/code/modules/mod/mod_ui.dm b/code/modules/mod/mod_ui.dm index cbf30fe1611..eaf4b75d7ee 100644 --- a/code/modules/mod/mod_ui.dm +++ b/code/modules/mod/mod_ui.dm @@ -15,6 +15,9 @@ "ai_name" = ai_assistant?.name, "has_pai" = ispAI(ai_assistant), "is_ai" = ai_assistant && ai_assistant == user, + "link_id" = mod_link.id, + "link_freq" = mod_link.frequency, + "link_call" = mod_link.get_other()?.id, // Wires "open" = open, "seconds_electrified" = seconds_electrified, @@ -76,10 +79,6 @@ . = ..() if(.) return - if(locked && (!allowed(usr) || !ispAI(usr))) // pAIs automatically fail out of allowed() - balloon_alert(usr, "insufficient access!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - return if(malfunctioning && prob(75)) balloon_alert(usr, "button malfunctions!") return @@ -87,6 +86,11 @@ if("lock") locked = !locked balloon_alert(usr, "[locked ? "locked" : "unlocked"]!") + if("call") + if(!mod_link.link_call) + call_link(usr, mod_link) + else + mod_link.end_call() if("activate") toggle_activate(usr) if("select") diff --git a/code/modules/mod/modules/module_kinesis.dm b/code/modules/mod/modules/module_kinesis.dm index 84dc503af1f..52e08133857 100644 --- a/code/modules/mod/modules/module_kinesis.dm +++ b/code/modules/mod/modules/module_kinesis.dm @@ -159,7 +159,7 @@ /obj/item/mod/module/anomaly_locked/kinesis/proc/grab_atom(atom/movable/target) grabbed_atom = target if(isliving(grabbed_atom)) - add_traits(grabbed_atom, list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), REF(src)) + grabbed_atom.add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), REF(src)) RegisterSignal(grabbed_atom, COMSIG_MOB_STATCHANGE, PROC_REF(on_statchange)) ADD_TRAIT(grabbed_atom, TRAIT_NO_FLOATING_ANIM, REF(src)) RegisterSignal(grabbed_atom, COMSIG_MOVABLE_SET_ANCHORED, PROC_REF(on_setanchored)) diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm index 068944a8e1b..9c1f5e65d78 100644 --- a/code/modules/mod/modules/modules_engineering.dm +++ b/code/modules/mod/modules/modules_engineering.dm @@ -124,7 +124,7 @@ /obj/projectile/tether/fire(setAngle) if(firer) line = firer.Beam(src, "line", 'icons/obj/clothing/modsuit/mod_modules.dmi', emissive = FALSE) - ..() + return ..() /obj/projectile/tether/on_hit(atom/target) . = ..() diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm index 133bf25b833..757d952974e 100644 --- a/code/modules/mod/modules/modules_general.dm +++ b/code/modules/mod/modules/modules_general.dm @@ -835,7 +835,7 @@ balloon_alert(mod.wearer, "not enough material") playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE) -/obj/item/mod/module/recycler/proc/InsertSheets(obj/item/recycler, obj/item/stack/sheets) +/obj/item/mod/module/recycler/proc/InsertSheets(obj/item/recycler, obj/item/stack/sheets, atom/context) SIGNAL_HANDLER attempt_insert_storage(sheets) diff --git a/code/modules/mod/modules/modules_ninja.dm b/code/modules/mod/modules/modules_ninja.dm index 9f6fd3b702d..90c731a7c36 100644 --- a/code/modules/mod/modules/modules_ninja.dm +++ b/code/modules/mod/modules/modules_ninja.dm @@ -76,6 +76,18 @@ use_power_cost = DEFAULT_CHARGE_DRAIN * 5 cooldown_time = 3 SECONDS +/obj/item/mod/module/stealth/ninja/on_activation() + . = ..() + if(!.) + return + ADD_TRAIT(mod.wearer, TRAIT_SILENT_FOOTSTEPS, MOD_TRAIT) + +/obj/item/mod/module/stealth/ninja/on_deactivation(display_message = TRUE, deleting = FALSE) + . = ..() + if(!.) + return + REMOVE_TRAIT(mod.wearer, TRAIT_SILENT_FOOTSTEPS, MOD_TRAIT) + ///Camera Vision - Prevents flashes, blocks tracking. /obj/item/mod/module/welding/camera_vision name = "MOD camera vision module" @@ -311,34 +323,76 @@ module_type = MODULE_ACTIVE use_power_cost = DEFAULT_CHARGE_DRAIN * 6 incompatible_modules = list(/obj/item/mod/module/energy_net) - cooldown_time = 1.5 SECONDS + cooldown_time = 5 SECONDS + /// List of all energy nets this module made. + var/list/energy_nets = list() + +/obj/item/mod/module/energy_net/on_suit_deactivation(deleting) + for(var/obj/structure/energy_net/net as anything in energy_nets) + net.atom_destruction(ENERGY) /obj/item/mod/module/energy_net/on_select_use(atom/target) . = ..() if(!.) return - if(!isliving(target)) - balloon_alert(mod.wearer, "invalid target!") - return - var/mob/living/living_target = target - if(locate(/obj/structure/energy_net) in get_turf(living_target)) - balloon_alert(mod.wearer, "already trapped!") - return - for(var/turf/between_turf as anything in get_line(get_turf(mod.wearer), get_turf(living_target))) - if(between_turf.density) - balloon_alert(mod.wearer, "not through obstacles!") - return - if(IS_SPACE_NINJA(mod.wearer)) + if(IS_SPACE_NINJA(mod.wearer) && isliving(target)) mod.wearer.say("Get over here!", forced = type) - mod.wearer.Beam(living_target, "n_beam", time = 1.5 SECONDS) - var/obj/structure/energy_net/net = new /obj/structure/energy_net(living_target.drop_location()) - net.affected_mob = living_target - mod.wearer.visible_message(span_danger("[mod.wearer] caught [living_target] with an energy net!"), span_notice("You caught [living_target] with an energy net!")) - if(living_target.buckled) - living_target.buckled.unbuckle_mob(living_target, force = TRUE) - net.buckle_mob(living_target, force = TRUE) + var/obj/projectile/net = new /obj/projectile/energy_net(mod.wearer.loc, src) + net.preparePixelProjectile(target, mod.wearer) + net.firer = mod.wearer + playsound(src, 'sound/weapons/punchmiss.ogg', 25, TRUE) + INVOKE_ASYNC(net, TYPE_PROC_REF(/obj/projectile, fire)) drain_power(use_power_cost) +/obj/item/mod/module/energy_net/proc/add_net(obj/structure/energy_net/net) + energy_nets += net + RegisterSignal(net, COMSIG_QDELETING, PROC_REF(remove_net)) + +/obj/item/mod/module/energy_net/proc/remove_net(obj/structure/energy_net/net) + SIGNAL_HANDLER + energy_nets -= net + +/obj/projectile/energy_net + name = "energy net" + icon_state = "net_projectile" + icon = 'icons/obj/clothing/modsuit/mod_modules.dmi' + damage = 0 + range = 9 + hitsound = 'sound/items/fultext_deploy.ogg' + hitsound_wall = 'sound/items/fultext_deploy.ogg' + /// Reference to the beam following the projectile. + var/line + /// Reference to the energy net module. + var/datum/weakref/net_module + +/obj/projectile/energy_net/Initialize(mapload, net_module) + . = ..() + src.net_module = WEAKREF(net_module) + +/obj/projectile/energy_net/fire(setAngle) + if(firer) + line = firer.Beam(src, "net_beam", 'icons/obj/clothing/modsuit/mod_modules.dmi') + return ..() + +/obj/projectile/energy_net/on_hit(mob/living/target) + . = ..() + if(!istype(target)) + return + if(locate(/obj/structure/energy_net) in get_turf(target)) + return + var/obj/structure/energy_net/net = new /obj/structure/energy_net(target.drop_location()) + var/obj/item/mod/module/energy_net/module = net_module?.resolve() + if(module) + module.add_net(net) + firer?.visible_message(span_danger("[firer] caught [target] with an energy net!"), span_notice("You caught [target] with an energy net!")) + if(target.buckled) + target.buckled.unbuckle_mob(target, force = TRUE) + net.buckle_mob(target, force = TRUE) + +/obj/projectile/energy_net/Destroy() + QDEL_NULL(line) + return ..() + ///Adrenaline Boost - Stops all stuns the ninja is affected with, increases his speed. /obj/item/mod/module/adrenaline_boost name = "MOD adrenaline boost module" diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm index 432bac8fbe5..9bda5fef503 100644 --- a/code/modules/mod/modules/modules_supply.dm +++ b/code/modules/mod/modules/modules_supply.dm @@ -158,6 +158,12 @@ if(!ismineralturf(bumped_into) || !drain_power(use_power_cost)) return var/turf/closed/mineral/mineral_turf = bumped_into + var/turf/closed/mineral/gibtonite/giberal_turf = mineral_turf + if(istype(giberal_turf) && giberal_turf.stage != GIBTONITE_UNSTRUCK) + playsound(bumper, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + to_chat(bumper, span_warning("[icon2html(src, bumper)] Unstable gibtonite ore deposit detected! Drills disabled.")) + on_deactivation() + return mineral_turf.gets_drilled(mod.wearer) return COMPONENT_CANCEL_ATTACK_CHAIN @@ -566,6 +572,7 @@ light_range = 1 light_power = 1 light_color = COLOR_LIGHT_ORANGE + embedding = null /obj/projectile/bullet/mining_bomb/Initialize(mapload) . = ..() diff --git a/code/modules/modular_computers/computers/item/computer_ui.dm b/code/modules/modular_computers/computers/item/computer_ui.dm index fa00efae0a2..11c12ea0c47 100644 --- a/code/modules/modular_computers/computers/item/computer_ui.dm +++ b/code/modules/modular_computers/computers/item/computer_ui.dm @@ -128,7 +128,7 @@ switch(action) if("PC_exit") - active_program.kill_program() + active_program.kill_program(usr) return TRUE if("PC_shutdown") shutdown_computer() @@ -146,7 +146,7 @@ if(!istype(killed_program)) return - killed_program.kill_program() + killed_program.kill_program(usr) to_chat(usr, span_notice("Program [killed_program.filename].[killed_program.filetype] with PID [rand(100,999)] has been killed.")) return TRUE @@ -221,3 +221,8 @@ if(physical) return physical return src + +/obj/item/modular_computer/ui_close(mob/user) + . = ..() + if(active_program) + active_program.ui_close(user) diff --git a/code/modules/modular_computers/computers/item/disks/role_disks.dm b/code/modules/modular_computers/computers/item/disks/role_disks.dm index e8c68bc8363..da52ee76281 100644 --- a/code/modules/modular_computers/computers/item/disks/role_disks.dm +++ b/code/modules/modular_computers/computers/item/disks/role_disks.dm @@ -116,18 +116,13 @@ * Engineering */ /obj/item/computer_disk/engineering - name = "station engineer data disk" + name = "engineering data disk" desc = "Removable disk used to download engineering-related tablet apps." icon_state = "datadisk6" starting_programs = list( + /datum/computer_file/program/alarm_monitor, + /datum/computer_file/program/atmosscan, /datum/computer_file/program/supermatter_monitor, + ) -/obj/item/computer_disk/atmos - name = "atmospheric technician data disk" - desc = "Removable disk used to download atmos-related tablet apps." - icon_state = "datadisk6" - starting_programs = list( - /datum/computer_file/program/atmosscan, - /datum/computer_file/program/alarm_monitor, - ) diff --git a/code/modules/modular_computers/computers/item/disks/unique_disks.dm b/code/modules/modular_computers/computers/item/disks/unique_disks.dm new file mode 100644 index 00000000000..144fa52c65a --- /dev/null +++ b/code/modules/modular_computers/computers/item/disks/unique_disks.dm @@ -0,0 +1,8 @@ +/obj/item/computer_disk/syndicate + name = "golden data disk" + desc = "A data disk with some high-tech programs, probably expensive as hell." + icon_state = "datadisk8" + custom_materials = list(/datum/material/gold = SMALL_MATERIAL_AMOUNT) + +/obj/item/computer_disk/syndicate/camera_app + starting_programs = list(/datum/computer_file/program/secureye/syndicate) diff --git a/code/modules/modular_computers/computers/item/role_tablet_presets.dm b/code/modules/modular_computers/computers/item/role_tablet_presets.dm index 3ec27995181..b96f61d44b4 100644 --- a/code/modules/modular_computers/computers/item/role_tablet_presets.dm +++ b/code/modules/modular_computers/computers/item/role_tablet_presets.dm @@ -91,18 +91,19 @@ greyscale_colors = "#FAFAFA#000099#B347BC" inserted_item = /obj/item/pen/fountain starting_programs = list( - /datum/computer_file/program/crew_manifest, - /datum/computer_file/program/status, - /datum/computer_file/program/science, - /datum/computer_file/program/robocontrol, + /datum/computer_file/program/borg_monitor, /datum/computer_file/program/budgetorders, + /datum/computer_file/program/crew_manifest, + /datum/computer_file/program/robocontrol, + /datum/computer_file/program/science, + /datum/computer_file/program/status, /datum/computer_file/program/signal_commander, ) /obj/item/modular_computer/pda/heads/quartermaster name = "quartermaster PDA" greyscale_config = /datum/greyscale_config/tablet/stripe_thick - greyscale_colors = "#D6B328#6506CA#927444" + greyscale_colors = "#c4b787#18191e#8b4c31" inserted_item = /obj/item/pen/survival stored_paper = 20 starting_programs = list( @@ -155,6 +156,8 @@ greyscale_config = /datum/greyscale_config/tablet/stripe_thick greyscale_colors = "#D99A2E#69DBF3#E3DF3D" starting_programs = list( + /datum/computer_file/program/alarm_monitor, + /datum/computer_file/program/atmosscan, /datum/computer_file/program/supermatter_monitor, ) @@ -163,8 +166,9 @@ greyscale_config = /datum/greyscale_config/tablet/stripe_thick greyscale_colors = "#EEDC43#00E5DA#727272" starting_programs = list( - /datum/computer_file/program/atmosscan, /datum/computer_file/program/alarm_monitor, + /datum/computer_file/program/atmosscan, + /datum/computer_file/program/supermatter_monitor, ) /** @@ -177,6 +181,7 @@ greyscale_colors = "#FAFAFA#000099#B347BC" starting_programs = list( /datum/computer_file/program/atmosscan, + /datum/computer_file/program/science, /datum/computer_file/program/signal_commander, ) @@ -185,7 +190,9 @@ greyscale_config = /datum/greyscale_config/tablet/stripe_double greyscale_colors = "#484848#0099CC#D94927" starting_programs = list( + /datum/computer_file/program/science, /datum/computer_file/program/robocontrol, + /datum/computer_file/program/borg_monitor, ) /obj/item/modular_computer/pda/geneticist @@ -247,7 +254,7 @@ /obj/item/modular_computer/pda/cargo name = "cargo technician PDA" - greyscale_colors = "#D6B328#6506CA" + greyscale_colors = "#8b4c31#2c2e32" stored_paper = 20 starting_programs = list( /datum/computer_file/program/shipping, @@ -258,7 +265,10 @@ /obj/item/modular_computer/pda/shaftminer name = "shaft miner PDA" greyscale_config = /datum/greyscale_config/tablet/stripe_thick - greyscale_colors = "#927444#D6B328#6C3BA1" + greyscale_colors = "#927444#8b4c31#4c202d" + starting_programs = list( + /datum/computer_file/program/skill_tracker, + ) /** * Service @@ -268,6 +278,7 @@ name = "janitor PDA" greyscale_colors = "#933ea8#235AB2" starting_programs = list( + /datum/computer_file/program/skill_tracker, /datum/computer_file/program/radar/custodial_locator, ) diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index c8034335af4..59ef183f6d6 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -41,6 +41,8 @@ var/alert_pending = FALSE /// How well this program will help combat detomatix viruses. var/detomatix_resistance = NONE + ///Boolean on whether or not only one copy of the app can exist. This means it deletes itself when cloned elsewhere. + var/unique_copy = FALSE /datum/computer_file/program/clone() var/datum/computer_file/program/temp = ..() @@ -49,6 +51,11 @@ temp.program_icon_state = program_icon_state temp.requires_ntnet = requires_ntnet temp.usage_flags = usage_flags + if(unique_copy) + if(computer) + computer.remove_file(src) + if(disk_host) + disk_host.remove_file(src) return temp /** @@ -173,9 +180,9 @@ * Use this proc to kill the program. * Designed to be implemented by each program if it requires on-quit logic, such as the NTNRC client. * Args: - * - reload_ui - Whether we reload the UI on computer's shutdown. + * - user - If there's a user, this is the person killing the program. **/ -/datum/computer_file/program/proc/kill_program() +/datum/computer_file/program/proc/kill_program(mob/user) SHOULD_CALL_PARENT(TRUE) if(src == computer.active_program) diff --git a/code/modules/modular_computers/file_system/programs/airestorer.dm b/code/modules/modular_computers/file_system/programs/airestorer.dm index 21d66d4b0fc..4f24b2c61d8 100644 --- a/code/modules/modular_computers/file_system/programs/airestorer.dm +++ b/code/modules/modular_computers/file_system/programs/airestorer.dm @@ -30,7 +30,7 @@ examine_text += span_info("Alt-click to eject the intelliCard.") return examine_text -/datum/computer_file/program/ai_restorer/kill_program() +/datum/computer_file/program/ai_restorer/kill_program(mob/user) try_eject(forced = TRUE) return ..() diff --git a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm index 4e165ed70d4..339dd3175eb 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm @@ -32,7 +32,7 @@ target = null error = "Connection to destination relay lost." -/datum/computer_file/program/ntnet_dos/kill_program() +/datum/computer_file/program/ntnet_dos/kill_program(mob/user) if(target) target.dos_sources.Remove(src) target = null diff --git a/code/modules/modular_computers/file_system/programs/borg_monitor.dm b/code/modules/modular_computers/file_system/programs/borg_monitor.dm index c085ad3ae4e..2a2e494c1ec 100644 --- a/code/modules/modular_computers/file_system/programs/borg_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/borg_monitor.dm @@ -19,7 +19,7 @@ DL_source = null return ..() -/datum/computer_file/program/borg_monitor/kill_program() +/datum/computer_file/program/borg_monitor/kill_program(mob/user) loglist = null //Not everything is saved if you close an app DL_source = null DL_progress = 0 @@ -99,9 +99,9 @@ ) data["cyborgs"] += list(cyborg_data) data["DL_progress"] = DL_progress - + data["borglog"] = loglist - + return data /datum/computer_file/program/borg_monitor/ui_act(action, params, datum/tgui/ui, datum/ui_state/state) diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm index 815ef740f18..529cf813d1b 100644 --- a/code/modules/modular_computers/file_system/programs/card.dm +++ b/code/modules/modular_computers/file_system/programs/card.dm @@ -79,7 +79,7 @@ return FALSE computer.crew_manifest_update = TRUE -/datum/computer_file/program/card_mod/kill_program() +/datum/computer_file/program/card_mod/kill_program(mob/user) computer.crew_manifest_update = FALSE var/obj/item/card/id/inserted_auth_card = computer.computer_id_slot if(inserted_auth_card) diff --git a/code/modules/modular_computers/file_system/programs/maintenance/_maintenance_program.dm b/code/modules/modular_computers/file_system/programs/maintenance/_maintenance_program.dm index 0575aa8a0f0..25a2d1ad941 100644 --- a/code/modules/modular_computers/file_system/programs/maintenance/_maintenance_program.dm +++ b/code/modules/modular_computers/file_system/programs/maintenance/_maintenance_program.dm @@ -7,10 +7,4 @@ /datum/computer_file/program/maintenance filetype = "MNT" available_on_ntnet = FALSE - -/datum/computer_file/program/maintenance/clone(rename = FALSE) - . = ..() - if(computer) - computer.remove_file(src) - if(disk_host) - disk_host.remove_file(src) + unique_copy = TRUE diff --git a/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm b/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm index 36a5b4c0fad..2b5d3048052 100644 --- a/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm +++ b/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm @@ -612,14 +612,12 @@ message = emoji_parse(message) //already sent- this just shows the sent emoji as one to the sender in the to_chat // Show it to ghosts - var/ghost_message = span_name("[sender] [rigged ? "(as [fake_name]) Rigged " : ""]PDA Message --> [span_name("[signal.format_target()]")]: \"[signal.format_message()]\"") - for(var/mob/player_mob as anything in GLOB.current_observers_list) - if(player_mob.client && !player_mob.client?.prefs) - stack_trace("[player_mob] ([player_mob.ckey]) had null prefs, which shouldn't be possible!") + var/ghost_message = span_game_say("[span_name("[sender]")] [rigged ? "(as [span_name(fake_name)]) Rigged " : ""]PDA Message --> [span_name("[signal.format_target()]")]: \"[signal.format_message()]\"") + var/list/message_listeners = GLOB.dead_player_list + GLOB.current_observers_list + for(var/mob/listener as anything in message_listeners) + if(!(get_chat_toggles(listener) & CHAT_GHOSTPDA)) continue - - if(isobserver(player_mob) && (player_mob.client?.prefs.chat_toggles & CHAT_GHOSTPDA)) - to_chat(player_mob, "[FOLLOW_LINK(player_mob, sender)] [ghost_message]") + to_chat(listener, "[FOLLOW_LINK(listener, sender)] [ghost_message]") to_chat(sender, span_info("PDA message sent to [signal.format_target()]: \"[message]\"")) diff --git a/code/modules/modular_computers/file_system/programs/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/ntdownloader.dm index 53a68f2c6d5..efa61b2630c 100644 --- a/code/modules/modular_computers/file_system/programs/ntdownloader.dm +++ b/code/modules/modular_computers/file_system/programs/ntdownloader.dm @@ -162,6 +162,6 @@ return TRUE return FALSE -/datum/computer_file/program/ntnetdownload/kill_program() +/datum/computer_file/program/ntnetdownload/kill_program(mob/user) abort_file_download() return ..() diff --git a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm index 30aa03a613b..aa780fc3cf8 100644 --- a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm @@ -200,7 +200,7 @@ channel.offline_clients.Remove(src) channel.active_clients.Add(src) -/datum/computer_file/program/chatclient/kill_program() +/datum/computer_file/program/chatclient/kill_program(mob/user) for(var/datum/ntnet_conversation/channel as anything in SSmodular_computers.chat_channels) channel.go_offline(src) active_channel = null diff --git a/code/modules/modular_computers/file_system/programs/radar.dm b/code/modules/modular_computers/file_system/programs/radar.dm index 06aefba487f..c230614339d 100644 --- a/code/modules/modular_computers/file_system/programs/radar.dm +++ b/code/modules/modular_computers/file_system/programs/radar.dm @@ -31,7 +31,7 @@ scan() START_PROCESSING(SSfastprocess, src) -/datum/computer_file/program/radar/kill_program() +/datum/computer_file/program/radar/kill_program(mob/user) objects = list() selected = null STOP_PROCESSING(SSfastprocess, src) @@ -320,7 +320,7 @@ RegisterSignal(SSdcs, COMSIG_GLOB_NUKE_DEVICE_ARMED, PROC_REF(on_nuke_armed)) -/datum/computer_file/program/radar/fission360/kill_program() +/datum/computer_file/program/radar/fission360/kill_program(mob/user) UnregisterSignal(SSdcs, COMSIG_GLOB_NUKE_DEVICE_ARMED) return ..() diff --git a/code/modules/modular_computers/file_system/programs/secureye.dm b/code/modules/modular_computers/file_system/programs/secureye.dm index 5c97cd16147..bba55b4474e 100644 --- a/code/modules/modular_computers/file_system/programs/secureye.dm +++ b/code/modules/modular_computers/file_system/programs/secureye.dm @@ -14,18 +14,42 @@ tgui_id = "NtosSecurEye" program_icon = "eye" + ///Boolean on whether or not the app will make noise when flipping around the channels. + var/spying = FALSE + var/list/network = list("ss13") + ///List of weakrefs of all users watching the program. + var/list/concurrent_users = list() + /// Weakref to the active camera var/datum/weakref/camera_ref /// The turf where the camera was last updated. var/turf/last_camera_turf - var/list/concurrent_users = list() // Stuff needed to render the map var/atom/movable/screen/map_view/cam_screen + /// All the plane masters that need to be applied. var/atom/movable/screen/background/cam_background -/datum/computer_file/program/secureye/New() + ///Internal tracker used to find a specific person and keep them on cameras. + var/datum/trackable/internal_tracker + +///Syndicate subtype that has no access restrictions and is available on Syndinet +/datum/computer_file/program/secureye/syndicate + filename = "syndeye" + filedesc = "SyndEye" + extended_desc = "This program allows for illegal access to security camera networks." + transfer_access = list() + available_on_ntnet = FALSE + available_on_syndinet = TRUE + requires_ntnet = FALSE + usage_flags = PROGRAM_ALL + unique_copy = TRUE + + network = list("ss13", "mine", "rd", "labor", "ordnance", "minisat") + spying = TRUE + +/datum/computer_file/program/secureye/on_install(datum/computer_file/source, obj/item/modular_computer/computer_installing) . = ..() // Map name has to start and end with an A-Z character, // and definitely NOT with a square bracket or even a number. @@ -40,30 +64,33 @@ cam_background = new cam_background.assigned_map = map_name cam_background.del_on_map_removal = FALSE + RegisterSignal(src, COMSIG_TRACKABLE_TRACKING_TARGET, PROC_REF(on_track_target)) /datum/computer_file/program/secureye/Destroy() QDEL_NULL(cam_screen) QDEL_NULL(cam_background) + QDEL_NULL(internal_tracker) + last_camera_turf = null + return ..() + +/datum/computer_file/program/secureye/kill_program(mob/user) + if(user) + ui_close(user) return ..() /datum/computer_file/program/secureye/ui_interact(mob/user, datum/tgui/ui) - // Update UI - ui = SStgui.try_update_ui(user, src, ui) - // Update the camera, showing static if necessary and updating data if the location has moved. update_active_camera_screen() - if(!ui) - var/user_ref = REF(user) - var/is_living = isliving(user) - // Ghosts shouldn't count towards concurrent users, which produces - // an audible terminal_on click. - if(is_living) - concurrent_users += user_ref - // Register map objects - cam_screen.display_to(user) - user.client.register_map_obj(cam_background) - return ..() + var/user_ref = REF(user) + var/is_living = isliving(user) + // Ghosts shouldn't count towards concurrent users, which produces + // an audible terminal_on click. + if(is_living) + concurrent_users += user_ref + // Register map objects + cam_screen.display_to(user) + user.client.register_map_obj(cam_background) /datum/computer_file/program/secureye/ui_status(mob/user) . = ..() @@ -86,7 +113,8 @@ /datum/computer_file/program/secureye/ui_static_data(mob/user) var/list/data = list() data["mapRef"] = cam_screen.assigned_map - var/list/cameras = get_available_cameras() + data["can_spy"] = !!spying + var/list/cameras = get_camera_list(network) data["cameras"] = list() for(var/i in cameras) var/obj/machinery/camera/C = cameras[i] @@ -100,22 +128,49 @@ . = ..() if(.) return - if(action == "switch_camera") - var/c_tag = format_text(params["name"]) - var/list/cameras = get_available_cameras() - var/obj/machinery/camera/selected_camera = cameras[c_tag] - camera_ref = WEAKREF(selected_camera) - playsound(src, get_sfx(SFX_TERMINAL_TYPE), 25, FALSE) + switch(action) + if("switch_camera") + var/c_tag = format_text(params["name"]) + var/list/cameras = get_camera_list(network) + var/obj/machinery/camera/selected_camera = cameras[c_tag] + camera_ref = WEAKREF(selected_camera) + if(!spying) + playsound(computer, get_sfx(SFX_TERMINAL_TYPE), 25, FALSE) + if(!selected_camera) + return TRUE + if(internal_tracker && internal_tracker.tracking) + internal_tracker.set_tracking(FALSE) - if(!selected_camera) + update_active_camera_screen() return TRUE - update_active_camera_screen() + if("start_tracking") + if(!internal_tracker) + internal_tracker = new(src) + internal_tracker.set_tracked_mob(usr) + return TRUE - return TRUE +/datum/computer_file/program/secureye/proc/on_track_target(datum/trackable/source, mob/living/target) + SIGNAL_HANDLER + var/datum/camerachunk/target_camerachunk = GLOB.cameranet.getTurfVis(get_turf(target)) + if(!target_camerachunk) + CRASH("[src] was able to track [target] through /datum/trackable, but was not on a visible turf to cameras.") + for(var/obj/machinery/camera/cameras as anything in target_camerachunk.cameras["[target.z]"]) + var/found_target = locate(target) in cameras.can_see() + if(!found_target) + continue + var/new_camera = WEAKREF(cameras) + if(camera_ref == new_camera) + return + camera_ref = new_camera + update_active_camera_screen() + return /datum/computer_file/program/secureye/ui_close(mob/user) . = ..() + //don't track anyone while we're shutting off. + if(internal_tracker && internal_tracker.tracking) + internal_tracker.set_tracking(FALSE) var/user_ref = REF(user) var/is_living = isliving(user) // Living creature or not, we remove you anyway. @@ -125,7 +180,9 @@ // Turn off the console if(length(concurrent_users) == 0 && is_living) camera_ref = null - playsound(src, 'sound/machines/terminal_off.ogg', 25, FALSE) + last_camera_turf = null + if(!spying) + playsound(computer, 'sound/machines/terminal_off.ogg', 25, FALSE) /datum/computer_file/program/secureye/proc/update_active_camera_screen() var/obj/machinery/camera/active_camera = camera_ref?.resolve() @@ -168,26 +225,4 @@ cam_background.icon_state = "scanline2" cam_background.fill_rect(1, 1, DEFAULT_MAP_SIZE, DEFAULT_MAP_SIZE) -// Returns the list of cameras accessible from this computer -/datum/computer_file/program/secureye/proc/get_available_cameras() - var/list/L = list() - for (var/obj/machinery/camera/cam as anything in GLOB.cameranet.cameras) - //Get the camera's turf in case it's inside something like a borg - var/turf/camera_turf = get_turf(cam) - if(!is_station_level(camera_turf.z))//Only show station cameras. - continue - L.Add(cam) - var/list/camlist = list() - for(var/obj/machinery/camera/cam in L) - if(!cam.network) - stack_trace("Camera in a cameranet has no camera network") - continue - if(!(islist(cam.network))) - stack_trace("Camera in a cameranet has a non-list camera network") - continue - var/list/tempnetwork = cam.network & network - if(tempnetwork.len) - camlist["[cam.c_tag]"] = cam - return camlist - #undef DEFAULT_MAP_SIZE diff --git a/code/modules/modular_computers/file_system/programs/signalcommander.dm b/code/modules/modular_computers/file_system/programs/signalcommander.dm index b6b17722430..6d636bab370 100644 --- a/code/modules/modular_computers/file_system/programs/signalcommander.dm +++ b/code/modules/modular_computers/file_system/programs/signalcommander.dm @@ -19,7 +19,7 @@ . = ..() set_frequency(signal_frequency) -/datum/computer_file/program/signal_commander/kill_program() +/datum/computer_file/program/signal_commander/kill_program(mob/user) . = ..() SSradio.remove_object(computer, signal_frequency) diff --git a/code/modules/modular_computers/file_system/programs/sm_monitor.dm b/code/modules/modular_computers/file_system/programs/sm_monitor.dm index b95927417cd..0ba8a721407 100644 --- a/code/modules/modular_computers/file_system/programs/sm_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/sm_monitor.dm @@ -22,7 +22,7 @@ refresh() /// Apparently destroy calls this [/datum/computer_file/Destroy]. Here just to clean our references. -/datum/computer_file/program/supermatter_monitor/kill_program() +/datum/computer_file/program/supermatter_monitor/kill_program(mob/user) for(var/supermatter in supermatters) clear_supermatter(supermatter) return ..() diff --git a/code/modules/movespeed/modifiers/mobs.dm b/code/modules/movespeed/modifiers/mobs.dm index 52c79945021..59b514a3d57 100644 --- a/code/modules/movespeed/modifiers/mobs.dm +++ b/code/modules/movespeed/modifiers/mobs.dm @@ -167,3 +167,10 @@ /datum/movespeed_modifier/goliath_mount multiplicative_slowdown = -26 + +/datum/movespeed_modifier/settler + multiplicative_slowdown = 0.2 + blacklisted_movetypes = FLOATING|FLYING + +/datum/movespeed_modifier/basilisk_overheat + multiplicative_slowdown = -18 diff --git a/code/modules/pai/card.dm b/code/modules/pai/card.dm index ef930cc2558..a652b745c9e 100644 --- a/code/modules/pai/card.dm +++ b/code/modules/pai/card.dm @@ -57,12 +57,13 @@ if(pai && !pai.holoform) pai.emp_act(severity) -/obj/item/pai_card/handle_atom_del(atom/thing) - if(thing == pai) //double check /mob/living/silicon/pai/Destroy() if you change these. - pai = null - emotion_icon = initial(emotion_icon) - update_appearance() - return ..() +/obj/item/pai_card/proc/on_pai_del(atom/source) + SIGNAL_HANDLER + if(QDELETED(src)) + return + pai = null + emotion_icon = initial(emotion_icon) + update_appearance() /obj/item/pai_card/Initialize(mapload) . = ..() @@ -269,6 +270,7 @@ if(pai) return FALSE pai = downloaded + RegisterSignal(pai, COMSIG_QDELETING, PROC_REF(on_pai_del)) emotion_icon = "null" update_appearance() playsound(src, 'sound/effects/pai_boot.ogg', 50, TRUE, -1) diff --git a/code/modules/pai/door_jack.dm b/code/modules/pai/door_jack.dm index 13717797f25..182cdc10027 100644 --- a/code/modules/pai/door_jack.dm +++ b/code/modules/pai/door_jack.dm @@ -35,6 +35,7 @@ /mob/living/silicon/pai/proc/extend_cable() QDEL_NULL(hacking_cable) //clear any old cables hacking_cable = new + RegisterSignal(hacking_cable, COMSIG_QDELETING, PROC_REF(on_hacking_cable_del)) var/mob/living/carbon/hacker = get_holder() if(iscarbon(hacker) && hacker.put_in_hands(hacking_cable)) //important to double check since get_holder can return non-null values that aren't carbons. hacker.visible_message(span_notice("A port on [src] opens to reveal a cable, which [hacker] quickly grabs."), span_notice("A port on [src] opens to reveal a cable, which you quickly grab."), span_hear("You hear the soft click of a plastic component and manage to catch the falling cable.")) @@ -89,7 +90,6 @@ */ /mob/living/silicon/pai/proc/retract_cable() balloon_alert(src, "cable retracted") - untrack_pai() QDEL_NULL(hacking_cable) return TRUE @@ -112,17 +112,11 @@ // Now begin hacking if(!do_after(src, 15 SECONDS, hacking_cable.machine, timed_action_flags = NONE, progress = TRUE)) balloon_alert(src, "failed! retracting...") - untrack_pai() - untrack_thing(hacking_cable) QDEL_NULL(hacking_cable) - if(!QDELETED(card)) - card.update_appearance() return FALSE var/obj/machinery/door/door = hacking_cable.machine balloon_alert(src, "success") door.open() - untrack_pai() - untrack_thing(hacking_cable) QDEL_NULL(hacking_cable) return TRUE diff --git a/code/modules/pai/pai.dm b/code/modules/pai/pai.dm index d2434b8257c..4dfaaca5437 100644 --- a/code/modules/pai/pai.dm +++ b/code/modules/pai/pai.dm @@ -184,30 +184,32 @@ else . += "Systems nonfunctional." -/mob/living/silicon/pai/handle_atom_del(atom/deleting_atom) - if(deleting_atom == hacking_cable) - untrack_pai() - untrack_thing(hacking_cable) - hacking_cable = null - SStgui.update_user_uis(src) - if(!QDELETED(card)) - card.update_appearance() - if(deleting_atom == atmos_analyzer) +/mob/living/silicon/pai/Exited(atom/movable/gone, direction) + if(gone == atmos_analyzer) atmos_analyzer = null - if(deleting_atom == camera) + else if(gone == camera) camera = null - if(deleting_atom == host_scan) + else if(gone == host_scan) host_scan = null - if(deleting_atom == internal_gps) + else if(gone == internal_gps) internal_gps = null - if(deleting_atom == instrument) + else if(gone == instrument) instrument = null - if(deleting_atom == newscaster) + else if(gone == newscaster) newscaster = null - if(deleting_atom == signaler) + else if(gone == signaler) signaler = null return ..() +/mob/living/silicon/pai/proc/on_hacking_cable_del(atom/source) + SIGNAL_HANDLER + untrack_pai() + untrack_thing(hacking_cable) + hacking_cable = null + SStgui.update_user_uis(src) + if(!QDELETED(card)) + card.update_appearance() + /mob/living/silicon/pai/Initialize(mapload) . = ..() START_PROCESSING(SSfastprocess, src) diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 22fb66eab5c..4d0a0efe596 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -1,4 +1,4 @@ -/obj/item/folder//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE +/obj/item/folder name = "folder" desc = "A folder." icon = 'icons/obj/service/bureaucracy.dmi' diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index 86511b1bb5c..2703744d18a 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -1,4 +1,4 @@ -/obj/item/hand_labeler//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE +/obj/item/hand_labeler //SKYRAT EDIT - ICON OVERRIDDEN BY AESTHETICS - SEE MODULE name = "hand labeler" desc = "A combined label printer, applicator, and remover, all in a single portable device. Designed to be easy to operate and use." icon = 'icons/obj/service/bureaucracy.dmi' diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index b0b7524e4fb..0f122c104eb 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -96,22 +96,19 @@ GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks()) /obj/machinery/photocopier/proc/setup_components() AddComponent(/datum/component/payment, PHOTOCOPIER_FEE, SSeconomy.get_dep_account(ACCOUNT_CIV), PAYMENT_CLINICAL) -/obj/machinery/photocopier/handle_atom_del(atom/deleting_atom) - if(deleting_atom == object_copy) +/obj/machinery/photocopier/Exited(atom/movable/gone, direction) + . = ..() + if(gone == object_copy) object_copy = null - if(deleting_atom == ass) - ass = null - if(deleting_atom == toner_cartridge) + if(gone == toner_cartridge) toner_cartridge = null - if(deleting_atom in paper_stack) - paper_stack -= deleting_atom - return ..() + if(gone in paper_stack) + paper_stack -= gone /obj/machinery/photocopier/Destroy() // object_copy can be a traitor objective, don't qdel if(object_copy) object_copy.forceMove(drop_location()) - object_copy = null QDEL_NULL(toner_cartridge) QDEL_LIST(paper_stack) @@ -623,10 +620,6 @@ GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks()) visible_message(span_warning("[object_copy] is shoved out of the way by [ass]!")) object_copy = null -/obj/machinery/photocopier/Exited(atom/movable/gone, direction) - check_ass() // There was potentially a person sitting on the copier, check if they're still there. - return ..() - /** * Checks the living mob `ass` exists and its location is the same as the photocopier. * diff --git a/code/modules/paperwork/ticketmachine.dm b/code/modules/paperwork/ticketmachine.dm index befa61d24ec..8d62bf784cb 100644 --- a/code/modules/paperwork/ticketmachine.dm +++ b/code/modules/paperwork/ticketmachine.dm @@ -54,7 +54,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/ticket_machine, 32) if(!multitool_check_buffer(user, I)) //make sure it has a data buffer return var/obj/item/multitool/M = I - M.buffer = src + M.set_buffer(src) to_chat(user, span_notice("You store linkage information in [I]'s buffer.")) return TRUE diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index 7b92fe6a502..33c22c66aef 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -1,7 +1,7 @@ #define CAMERA_PICTURE_SIZE_HARD_LIMIT 21 -/obj/item/camera//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE +/obj/item/camera name = "camera" icon = 'icons/obj/art/camera.dmi' desc = "A polaroid camera." diff --git a/code/modules/photography/photos/photo.dm b/code/modules/photography/photos/photo.dm index 7af4c546cff..9be79a58266 100644 --- a/code/modules/photography/photos/photo.dm +++ b/code/modules/photography/photos/photo.dm @@ -43,6 +43,7 @@ if(!isobserver(seen)) continue set_custom_materials(list(/datum/material/hauntium =SHEET_MATERIAL_AMOUNT)) + grind_results = list(/datum/reagent/hauntium = 20) break /obj/item/photo/update_icon_state() diff --git a/code/modules/plumbing/plumbers/_plumb_machinery.dm b/code/modules/plumbing/plumbers/_plumb_machinery.dm index ac75cfd68be..be75cf20479 100644 --- a/code/modules/plumbing/plumbers/_plumb_machinery.dm +++ b/code/modules/plumbing/plumbers/_plumb_machinery.dm @@ -14,8 +14,6 @@ var/buffer = 50 ///Flags for reagents, like INJECTABLE, TRANSPARENT bla bla everything thats in DEFINES/reagents.dm var/reagent_flags = TRANSPARENT - ///category for plumbing RCD - var/category = "" /obj/machinery/plumbing/Initialize(mapload, bolt = TRUE) . = ..() @@ -61,8 +59,6 @@ icon_state = "pipe_input" pass_flags_self = PASSMACHINE | LETPASSTHROW // Small reagent_flags = TRANSPARENT | REFILLABLE - ///category for plumbing RCD - category="Distribution" /obj/machinery/plumbing/input/Initialize(mapload, bolt, layer) @@ -76,9 +72,6 @@ icon_state = "pipe_output" pass_flags_self = PASSMACHINE | LETPASSTHROW // Small reagent_flags = TRANSPARENT | DRAINABLE - ///category for plumbing service rcd - category="Distribution" - /obj/machinery/plumbing/output/Initialize(mapload, bolt, layer) . = ..() @@ -88,30 +81,23 @@ name = "drinking tap" desc = "A manual output for plumbing systems, for taking drinks directly into glasses." icon_state = "tap_output" - ///category for plumbing RCD - category = "Distribution" /obj/machinery/plumbing/tank name = "chemical tank" desc = "A massive chemical holding tank." icon_state = "tank" buffer = 400 - ///category for plumbing RCD - category="Storage" /obj/machinery/plumbing/tank/Initialize(mapload, bolt, layer) . = ..() AddComponent(/datum/component/plumbing/tank, bolt, layer) - ///Layer manifold machine that connects a bunch of layers /obj/machinery/plumbing/layer_manifold name = "layer manifold" desc = "A plumbing manifold for layers." icon_state = "manifold" density = FALSE - ///category for plumbing service rcd - category="Distribution" /obj/machinery/plumbing/layer_manifold/Initialize(mapload, bolt, layer) . = ..() diff --git a/code/modules/plumbing/plumbers/acclimator.dm b/code/modules/plumbing/plumbers/acclimator.dm index a256413be57..da5c4529a42 100644 --- a/code/modules/plumbing/plumbers/acclimator.dm +++ b/code/modules/plumbing/plumbers/acclimator.dm @@ -12,8 +12,6 @@ base_icon_state = "acclimator" buffer = 200 active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - ///category for plumbing RCD - category="Storage" ///towards wich temperature do we build? var/target_temperature = 300 diff --git a/code/modules/plumbing/plumbers/bottler.dm b/code/modules/plumbing/plumbers/bottler.dm index 219accbc3b5..e28126d6220 100644 --- a/code/modules/plumbing/plumbers/bottler.dm +++ b/code/modules/plumbing/plumbers/bottler.dm @@ -8,8 +8,6 @@ reagent_flags = TRANSPARENT | DRAINABLE buffer = 100 active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - ///category for plumbing RCD - category="Storage" ///how much do we fill var/wanted_amount = 10 diff --git a/code/modules/plumbing/plumbers/destroyer.dm b/code/modules/plumbing/plumbers/destroyer.dm index 082a1fe2fa3..de03f03aa0f 100644 --- a/code/modules/plumbing/plumbers/destroyer.dm +++ b/code/modules/plumbing/plumbers/destroyer.dm @@ -4,8 +4,6 @@ icon_state = "disposal" pass_flags_self = PASSMACHINE | LETPASSTHROW // Small active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - ///category for plumbing RCD - category="Synthesizers" ///we remove 5 reagents per second var/disposal_rate = 5 diff --git a/code/modules/plumbing/plumbers/fermenter.dm b/code/modules/plumbing/plumbers/fermenter.dm index eccbc382eae..0fd631ca457 100644 --- a/code/modules/plumbing/plumbers/fermenter.dm +++ b/code/modules/plumbing/plumbers/fermenter.dm @@ -4,13 +4,9 @@ icon_state = "fermenter" layer = ABOVE_ALL_MOB_LAYER plane = ABOVE_GAME_PLANE - - reagent_flags = TRANSPARENT | DRAINABLE buffer = 400 active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - ///category for plumbing RCD - category="Synthesizers" ///input dir var/eat_dir = SOUTH diff --git a/code/modules/plumbing/plumbers/filter.dm b/code/modules/plumbing/plumbers/filter.dm index a085c255070..4e4a282bd1d 100644 --- a/code/modules/plumbing/plumbers/filter.dm +++ b/code/modules/plumbing/plumbers/filter.dm @@ -4,8 +4,6 @@ desc = "A chemical filter for filtering chemicals. The left and right outputs appear to be from the perspective of the input port." icon_state = "filter" density = FALSE - ///category for plumbing RCD - category="Distribution" ///whitelist of chems id's that go to the left side. Empty to disable port var/list/left = list() diff --git a/code/modules/plumbing/plumbers/grinder_chemical.dm b/code/modules/plumbing/plumbers/grinder_chemical.dm index fcc5037c18f..54a8b48f2d2 100644 --- a/code/modules/plumbing/plumbers/grinder_chemical.dm +++ b/code/modules/plumbing/plumbers/grinder_chemical.dm @@ -9,8 +9,6 @@ buffer = 400 active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 var/eat_dir = SOUTH - ///category for plumbing RCD - category="Synthesizers" /obj/machinery/plumbing/grinder_chemical/Initialize(mapload, bolt, layer) . = ..() diff --git a/code/modules/plumbing/plumbers/pill_press.dm b/code/modules/plumbing/plumbers/pill_press.dm index 5eab87f4f4a..3a9afca5e02 100644 --- a/code/modules/plumbing/plumbers/pill_press.dm +++ b/code/modules/plumbing/plumbers/pill_press.dm @@ -5,8 +5,6 @@ icon_state = "pill_press" buffer = 60 //SKYRAT EDIT HYPOVIALS. This is needed so it can completely fill the vials up. active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - ///category for plumbing RCD - category="Storage" ///maximum size of a pill var/max_pill_volume = 50 diff --git a/code/modules/plumbing/plumbers/plumbing_buffer.dm b/code/modules/plumbing/plumbers/plumbing_buffer.dm index dd9b63e34f6..b2bb21bc24e 100644 --- a/code/modules/plumbing/plumbers/plumbing_buffer.dm +++ b/code/modules/plumbing/plumbers/plumbing_buffer.dm @@ -8,8 +8,6 @@ icon_state = "buffer" pass_flags_self = PASSMACHINE | LETPASSTHROW // It looks short enough. buffer = 200 - ///category for plumbing RCD - category="Synthesizers" var/datum/buffer_net/buffer_net var/activation_volume = 100 diff --git a/code/modules/plumbing/plumbers/pumps.dm b/code/modules/plumbing/plumbers/pumps.dm index bb05d96690f..79374fcf38c 100644 --- a/code/modules/plumbing/plumbers/pumps.dm +++ b/code/modules/plumbing/plumbers/pumps.dm @@ -8,8 +8,6 @@ anchored = FALSE density = TRUE use_power = NO_POWER_USE - ///category for plumbing RCD - category="Synthesizers" ///units we pump per second var/pump_power = 1 diff --git a/code/modules/plumbing/plumbers/reaction_chamber.dm b/code/modules/plumbing/plumbers/reaction_chamber.dm index 5b5985c5334..689d043418b 100644 --- a/code/modules/plumbing/plumbers/reaction_chamber.dm +++ b/code/modules/plumbing/plumbers/reaction_chamber.dm @@ -7,8 +7,6 @@ buffer = 200 reagent_flags = TRANSPARENT | NO_REACT active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - ///category for plumbing RCD - category="Synthesizers" /** * list of set reagents that the reaction_chamber allows in, and must all be present before mixing is enabled. diff --git a/code/modules/plumbing/plumbers/splitters.dm b/code/modules/plumbing/plumbers/splitters.dm index 1b704783c27..de279227009 100644 --- a/code/modules/plumbing/plumbers/splitters.dm +++ b/code/modules/plumbing/plumbers/splitters.dm @@ -6,8 +6,6 @@ active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 buffer = 100 density = FALSE - ///category for plumbing RCD - category="Distribution" ///constantly switches between TRUE and FALSE. TRUE means the batch tick goes straight, FALSE means the next batch goes in the side duct. var/turn_straight = TRUE diff --git a/code/modules/plumbing/plumbers/synthesizer.dm b/code/modules/plumbing/plumbers/synthesizer.dm index 9186e899bbe..a4521dd9b2e 100644 --- a/code/modules/plumbing/plumbers/synthesizer.dm +++ b/code/modules/plumbing/plumbers/synthesizer.dm @@ -7,9 +7,6 @@ icon = 'icons/obj/pipes_n_cables/hydrochem/plumbers.dmi' active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - ///category for plumbing RCD - category="Synthesizers" - ///Amount we produce for every process. Ideally keep under 5 since thats currently the standard duct capacity var/amount = 1 ///I track them here because I have no idea how I'd make tgui loop like that diff --git a/code/modules/plumbing/plumbers/teleporter.dm b/code/modules/plumbing/plumbers/teleporter.dm index 1d18959fc86..7b3a62c9939 100644 --- a/code/modules/plumbing/plumbers/teleporter.dm +++ b/code/modules/plumbing/plumbers/teleporter.dm @@ -4,8 +4,6 @@ desc = "A bluespace anchor for chemicals. Does not require power. Use a multitool linked to a Chemical Recipient on this machine to start teleporting reagents." icon_state = "beacon" density = FALSE - ///category for plumbing RCD - category="Distribution" ///whoever we teleport our chems to var/obj/machinery/plumbing/receiver/target = null @@ -74,7 +72,7 @@ return var/obj/item/multitool/M = I - M.buffer = src + M.set_buffer(src) to_chat(user, span_notice("You store linkage information in [I]'s buffer.")) return TRUE diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm index f5b2ffabee5..b9f60aea016 100644 --- a/code/modules/power/apc/apc_main.dm +++ b/code/modules/power/apc/apc_main.dm @@ -260,14 +260,14 @@ area.apc = null area = null -/obj/machinery/power/apc/handle_atom_del(atom/deleting_atom) - if(deleting_atom == cell) +/obj/machinery/power/apc/Exited(atom/movable/gone, direction) + . = ..() + if(gone == cell) cell = null charging = APC_NOT_CHARGING update_appearance() if(!QDELING(src)) SStgui.update_uis(src) - return ..() /obj/machinery/power/apc/examine(mob/user) . = ..() diff --git a/code/modules/power/apc/apc_tool_act.dm b/code/modules/power/apc/apc_tool_act.dm index 8d35d4c8722..8884786a4eb 100644 --- a/code/modules/power/apc/apc_tool_act.dm +++ b/code/modules/power/apc/apc_tool_act.dm @@ -161,13 +161,13 @@ if(machine_stat & BROKEN) balloon_alert(user, "frame is too damaged!") return FALSE - return list("mode" = RCD_WALLFRAME, "delay" = 20, "cost" = 1) + return list("mode" = RCD_WALLFRAME, "delay" = 2 SECONDS, "cost" = 1) if(!cell) if(machine_stat & MAINT) balloon_alert(user, "no board for a cell!") return FALSE - return list("mode" = RCD_WALLFRAME, "delay" = 50, "cost" = 10) + return list("mode" = RCD_WALLFRAME, "delay" = 5 SECONDS, "cost" = 10) balloon_alert(user, "has both board and cell!") return FALSE diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 0852eb41d32..3951ae44def 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -64,7 +64,7 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri if(isobserver(user)) . += get_power_info() -/obj/structure/cable/proc/on_rat_eat(datum/source, mob/living/simple_animal/hostile/regalrat/king) +/obj/structure/cable/proc/on_rat_eat(datum/source, mob/living/basic/regal_rat/king) SIGNAL_HANDLER if(avail()) @@ -72,6 +72,8 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri playsound(king, 'sound/effects/sparks2.ogg', 100, TRUE) deconstruct() + return COMPONENT_RAT_INTERACTED + ///Set the linked indicator bitflags /obj/structure/cable/proc/Connect_cable(clear_before_updating = FALSE) var/under_thing = NONE diff --git a/code/modules/power/lighting/light.dm b/code/modules/power/lighting/light.dm index 55fc135058b..2486a6500c1 100644 --- a/code/modules/power/lighting/light.dm +++ b/code/modules/power/lighting/light.dm @@ -153,20 +153,10 @@ switch(status) // set icon_states if(LIGHT_OK) var/area/local_area = get_area(src) - //SKYRAT EDIT BEGIN - Original - /* if(low_power_mode || major_emergency || (local_area?.fire)) icon_state = "[base_state]_emergency" else icon_state = "[base_state]" - */ - if(low_power_mode) - icon_state = "[base_state]_lpower" - else if(major_emergency || (local_area?.fire)) - icon_state = "[base_state]_emergency" - else - icon_state = "[base_state]" - // SKYRAT EDIT END if(LIGHT_EMPTY) icon_state = "[base_state]-empty" if(LIGHT_BURNED) @@ -180,12 +170,11 @@ if(!on || status != LIGHT_OK) return - /* SKYRAT EDIT START - ORIGINAL: - var/area/local_area = get_area(src) - if(emergency_mode || (local_area?.fire)) - */ - var/area/local_area = get_area(src) - if(low_power_mode || major_emergency || (local_area?.fire)) // SKYRAT EDIT END + . += emissive_appearance(overlay_icon, "[base_state]", src, alpha = src.alpha) + + var/area/local_area = get_room_area(src) + + if(low_power_mode || major_emergency || (local_area?.fire)) . += mutable_appearance(overlay_icon, "[base_state]_emergency") return if(nightshift_enabled) diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 54ff044d883..39c3e536144 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -61,11 +61,11 @@ /obj/machinery/power/multitool_act(mob/living/user, obj/item/tool) if(!can_change_cable_layer || !cable_layer_change_checks(user, tool)) - return TOOL_ACT_TOOLTYPE_SUCCESS + return var/choice = tgui_input_list(user, "Select Power Line For Operation", "Select Cable Layer", GLOB.cable_name_to_layer) if(isnull(choice)) - return TOOL_ACT_TOOLTYPE_SUCCESS + return cable_layer = GLOB.cable_name_to_layer[choice] balloon_alert(user, "now operating on the [choice]") diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 2d77c2bc8aa..d3e4fe9e808 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -47,6 +47,7 @@ /// What the game tells ghosts when you make one var/ghost_notification_message = "IT'S LOOSE" + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE | PASSCLOSEDTURF | PASSMACHINE | PASSSTRUCTURE | PASSDOORS flags_1 = SUPERMATTER_IGNORES_1 resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF obj_flags = CAN_BE_HIT | DANGEROUS_POSSESSION @@ -472,3 +473,7 @@ /obj/singularity/deadchat_controlled/Initialize(mapload, starting_energy) . = ..() deadchat_plays(mode = DEMOCRACY_MODE) + +/// Special singularity that spawns for shuttle events only +/obj/singularity/shuttle_event + anchored = FALSE diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 2b6c31231fc..71f2346646c 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -169,6 +169,9 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /// Only values greater or equal to the current one can change the strat. var/delam_priority = SM_DELAM_PRIO_NONE + /// Lazy list of the crazy engineers who managed to turn a cascading engine around. + var/list/datum/weakref/saviors = null + /obj/machinery/power/supermatter_crystal/Initialize(mapload) . = ..() gas_percentage = list() @@ -312,6 +315,16 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) processing_sound() handle_high_power() psychological_examination() + + // handle the engineers that saved the engine from cascading, if there were any + if(get_status() < SUPERMATTER_EMERGENCY && !isnull(saviors)) + for(var/datum/weakref/savior_ref as anything in saviors) + var/mob/living/savior = savior_ref.resolve() + if(!istype(savior)) // didn't live to tell the tale, sadly. + continue + savior.client?.give_award(/datum/award/achievement/misc/theoretical_limits, savior) + LAZYNULL(saviors) + if(prob(15)) supermatter_pull(loc, min(internal_energy/850, 3))//850, 1700, 2550 update_appearance() @@ -515,6 +528,17 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(healed) final_countdown = FALSE + + if(!istype(delamination_strategy, /datum/sm_delam/cascade)) + return + + for(var/mob/living/lucky_engi as anything in mobs_in_area_type(list(/area/station/engineering/supermatter))) + if(isnull(lucky_engi.client)) + continue + if(isanimal_or_basicmob(lucky_engi)) + continue + LAZYADD(saviors, WEAKREF(lucky_engi)) + return // delam averted sleep(1 SECONDS) diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 171bd82cd6f..b21938e2608 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -146,11 +146,10 @@ ) miniball.transform *= pick(0.3, 0.4, 0.5, 0.6, 0.7) - var/icon/I = icon(icon, icon_state,dir) + var/list/icon_dimensions = get_icon_dimensions(icon) - var/orbitsize = (I.Width() + I.Height()) * pick(0.4, 0.5, 0.6, 0.7, 0.8) + var/orbitsize = (icon_dimensions["width"] + icon_dimensions["height"]) * pick(0.4, 0.5, 0.6, 0.7, 0.8) orbitsize -= (orbitsize / world.icon_size) * (world.icon_size * 0.25) - miniball.orbit(src, orbitsize, pick(FALSE, TRUE), rand(10, 25), pick(3, 4, 5, 6, 36)) /obj/energy_ball/Bump(atom/A) diff --git a/code/modules/power/turbine/turbine.dm b/code/modules/power/turbine/turbine.dm index 2888bedbd0e..fedfd42014e 100644 --- a/code/modules/power/turbine/turbine.dm +++ b/code/modules/power/turbine/turbine.dm @@ -421,7 +421,7 @@ //log rotor to link later to computer balloon_alert(user, "all parts linked") var/obj/item/multitool/multitool = tool - multitool.buffer = src + multitool.set_buffer(src) to_chat(user, span_notice("You store linkage information in [tool]'s buffer.")) //success diff --git a/code/modules/procedural_mapping/mapGenerators/asteroid.dm b/code/modules/procedural_mapping/mapGenerators/asteroid.dm index 3da5c0d6182..ab2bc6f2ca4 100644 --- a/code/modules/procedural_mapping/mapGenerators/asteroid.dm +++ b/code/modules/procedural_mapping/mapGenerators/asteroid.dm @@ -20,8 +20,8 @@ /datum/map_generator_module/splatter_layer/asteroid_monsters spawnableTurfs = list() spawnableAtoms = list( + /mob/living/basic/mining/basilisk = 10, /mob/living/basic/mining/goliath/ancient = 10, - /mob/living/simple_animal/hostile/asteroid/basilisk = 10, /mob/living/simple_animal/hostile/asteroid/hivelord = 10, ) diff --git a/code/modules/procedural_mapping/mapGenerators/lavaland.dm b/code/modules/procedural_mapping/mapGenerators/lavaland.dm index d262a317a13..2c8ae376a3c 100644 --- a/code/modules/procedural_mapping/mapGenerators/lavaland.dm +++ b/code/modules/procedural_mapping/mapGenerators/lavaland.dm @@ -10,9 +10,11 @@ /datum/map_generator_module/splatter_layer/lavaland_monsters spawnableTurfs = list() - spawnableAtoms = list(/mob/living/basic/mining/goliath = 10, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion = 10, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher = 10) + spawnableAtoms = list( + /obj/effect/spawner/random/lavaland_mob/goliath = 10, + /obj/effect/spawner/random/lavaland_mob/legion = 10, + /obj/effect/spawner/random/lavaland_mob/watcher = 10, + ) /datum/map_generator_module/splatter_layer/lavaland_tendrils spawnableTurfs = list() diff --git a/code/modules/projectiles/ammunition/_ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm index 9b01f982a5f..9641adc29b5 100644 --- a/code/modules/projectiles/ammunition/_ammunition.dm +++ b/code/modules/projectiles/ammunition/_ammunition.dm @@ -67,17 +67,34 @@ /obj/item/ammo_casing/proc/add_notes_ammo() // Try to get a projectile to derive stats from var/obj/projectile/exam_proj = projectile_type + var/initial_damage = initial(exam_proj.damage) + var/initial_stamina = initial(exam_proj.stamina) + // projectile damage multiplier for guns with snowflaked damage multipliers + var/proj_damage_mult = 1 if(!ispath(exam_proj) || pellets == 0) return + // are we in an ammo box? + if(isammobox(loc)) + var/obj/item/ammo_box/our_box = loc + // is our ammo box in a gun? + if(isgun(our_box.loc)) + var/obj/item/gun/our_gun = our_box.loc + // grab the damage multiplier + proj_damage_mult = our_gun.projectile_damage_multiplier + // if not, are we just in a gun e.g. chambered + else if(isgun(loc)) + var/obj/item/gun/our_gun = loc + // grab the damage multiplier. + proj_damage_mult = our_gun.projectile_damage_multiplier var/list/readout = list() + if(proj_damage_mult <= 0 || (initial_damage <= 0 && initial_stamina <= 0)) + return "Our legal team has determined the offensive nature of these [span_warning(caliber)] rounds to be esoteric." // No dividing by 0 - if(initial(exam_proj.damage) > 0) - readout += "Most monkeys our legal team subjected to these [span_warning(caliber)] rounds succumbed to their wounds after [span_warning("[HITS_TO_CRIT(initial(exam_proj.damage) * pellets)] shot\s")] at point-blank, taking [span_warning("[pellets] shot\s")] per round" - if(initial(exam_proj.stamina) > 0) - readout += "[!readout.len ? "Most monkeys" : "More fortunate monkeys"] collapsed from exhaustion after [span_warning("[HITS_TO_CRIT(initial(exam_proj.stamina) * pellets)] impact\s")] of these [span_warning("[caliber]")] rounds" - if(!readout.len) // Everything else failed, give generic text - return "Our legal team has determined the offensive nature of these [span_warning(caliber)] rounds to be esoteric" + if(initial_damage) + readout += "Most monkeys our legal team subjected to these [span_warning(caliber)] rounds succumbed to their wounds after [span_warning("[HITS_TO_CRIT((initial(exam_proj.damage) * proj_damage_mult) * pellets)] shot\s")] at point-blank, taking [span_warning("[pellets] shot\s")] per round." + if(initial_stamina) + readout += "[!readout.len ? "Most monkeys" : "More fortunate monkeys"] collapsed from exhaustion after [span_warning("[HITS_TO_CRIT((initial(exam_proj.stamina) * proj_damage_mult) * pellets)] impact\s")] of these [span_warning("[caliber]")] rounds." return readout.Join("\n") // Sending over a single string, rather than the whole list /obj/item/ammo_casing/update_icon_state() diff --git a/code/modules/projectiles/ammunition/_firing.dm b/code/modules/projectiles/ammunition/_firing.dm index 76c67a9f036..b890222a86c 100644 --- a/code/modules/projectiles/ammunition/_firing.dm +++ b/code/modules/projectiles/ammunition/_firing.dm @@ -57,6 +57,9 @@ loaded_projectile.damage *= G.projectile_damage_multiplier loaded_projectile.stamina *= G.projectile_damage_multiplier + loaded_projectile.wound_bonus += G.projectile_wound_bonus + loaded_projectile.bare_wound_bonus += G.projectile_wound_bonus + if(tk_firing(user, fired_from)) loaded_projectile.ignore_source_check = TRUE diff --git a/code/modules/projectiles/ammunition/ballistic/harpoon.dm b/code/modules/projectiles/ammunition/ballistic/harpoon.dm index 61aa16fe56e..79590ccb97d 100644 --- a/code/modules/projectiles/ammunition/ballistic/harpoon.dm +++ b/code/modules/projectiles/ammunition/ballistic/harpoon.dm @@ -7,7 +7,7 @@ /obj/item/ammo_casing/harpoon/Initialize(mapload) . = ..() - AddElement(/datum/element/caseless) + AddElement(/datum/element/caseless, TRUE) /obj/item/ammo_casing/harpoon/update_icon_state() . = ..() diff --git a/code/modules/projectiles/ammunition/ballistic/rifle.dm b/code/modules/projectiles/ammunition/ballistic/rifle.dm index 4e07c4c6ff9..3e545dc1060 100644 --- a/code/modules/projectiles/ammunition/ballistic/rifle.dm +++ b/code/modules/projectiles/ammunition/ballistic/rifle.dm @@ -1,19 +1,24 @@ -// 7.62 (Nagant Rifle) +// .310 Strilka (Sakhno Rifle) -/obj/item/ammo_casing/a762 - name = "7.62 bullet casing" - desc = "A 7.62 bullet casing." - icon_state = "762-casing" - caliber = CALIBER_A762 - projectile_type = /obj/projectile/bullet/a762 +/obj/item/ammo_casing/strilka310 + name = ".310 Strilka bullet casing" + desc = "A .310 Strilka bullet casing. Casing is a bit of a fib, there is no case, its just a block of red powder." + icon_state = "310-casing" + caliber = CALIBER_STRILKA310 + projectile_type = /obj/projectile/bullet/strilka310 -/obj/item/ammo_casing/a762/surplus - name = "7.62 surplus bullet casing" - desc = "A surplus 7.62 bullet casing." - projectile_type = /obj/projectile/bullet/a762/surplus +/obj/item/ammo_casing/strilka310/Initialize(mapload) + . = ..() -/obj/item/ammo_casing/a762/enchanted - projectile_type = /obj/projectile/bullet/a762/enchanted + AddElement(/datum/element/caseless) + +/obj/item/ammo_casing/strilka310/surplus + name = ".310 Strilka surplus bullet casing" + desc = "A surplus .310 Strilka bullet casing. Casing is a bit of a fib, there is no case, its just a block of red powder. Damp red powder at that." + projectile_type = /obj/projectile/bullet/strilka310/surplus + +/obj/item/ammo_casing/strilka310/enchanted + projectile_type = /obj/projectile/bullet/strilka310/enchanted // .223 (M-90gl Carbine) diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm index ac706dc7618..c8a75cf9a77 100644 --- a/code/modules/projectiles/ammunition/energy/laser.dm +++ b/code/modules/projectiles/ammunition/energy/laser.dm @@ -1,6 +1,6 @@ /obj/item/ammo_casing/energy/laser projectile_type = /obj/projectile/beam/laser - e_cost = 63 + e_cost = 83 select_name = "kill" /obj/item/ammo_casing/energy/laser/revolver e_cost = 100 @@ -14,7 +14,7 @@ /obj/item/ammo_casing/energy/lasergun projectile_type = /obj/projectile/beam/laser - e_cost = 52 + e_cost = 62.5 select_name = "kill" /obj/item/ammo_casing/energy/lasergun/old diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm index bb2bb789a2d..1f79e66e1ea 100644 --- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -50,6 +50,15 @@ QDEL_LIST(stored_ammo) return ..() +/obj/item/ammo_box/Exited(atom/movable/gone, direction) + . = ..() + if(gone in stored_ammo) + remove_from_stored_ammo(gone) + +/obj/item/ammo_box/proc/remove_from_stored_ammo(atom/movable/gone) + stored_ammo -= gone + update_appearance() + /obj/item/ammo_box/add_weapon_description() AddElement(/datum/element/weapon_description, attached_proc = PROC_REF(add_notes_box)) @@ -84,19 +93,19 @@ return for(var/i in max(1, stored_ammo.len) to max_ammo) - stored_ammo += new round_check() //SKYRAT EDTI CHANGE - SEC_HUAL - Moving to nullspace seems to help with lag. + stored_ammo += new round_check(src) update_appearance() -///gets a round from the magazine, if keep is TRUE the round will stay in the gun +///gets a round from the magazine, if keep is TRUE the round will be moved to the bottom of the list. /obj/item/ammo_box/proc/get_round(keep = FALSE) - if (!stored_ammo.len) + var/ammo_len = length(stored_ammo) + if (!ammo_len) return null - else - var/b = stored_ammo[stored_ammo.len] - stored_ammo -= b - if (keep) - stored_ammo.Insert(1,b) - return b + var/casing = stored_ammo[ammo_len] + if (keep) + stored_ammo -= casing + stored_ammo.Insert(1,casing) + return casing ///puts a round into the magazine /obj/item/ammo_box/proc/give_round(obj/item/ammo_casing/R, replace_spent = 0) @@ -106,7 +115,7 @@ if (stored_ammo.len < max_ammo) stored_ammo += R - R.moveToNullspace() //SKYRAT EDTI CHANGE - SEC_HUAL - Moving to nullspace seems to help with lag. + R.forceMove(src) return TRUE //for accessibles magazines (e.g internal ones) when full, start replacing spent ammo @@ -117,7 +126,7 @@ AC.forceMove(get_turf(src.loc)) stored_ammo += R - R.moveToNullspace() //SKYRAT EDTI CHANGE - SEC_HUAL - Moving to nullspace seems to help with lag. + R.forceMove(src) return TRUE return FALSE @@ -204,11 +213,8 @@ return boolets ///list of every bullet in the magazine -/obj/item/ammo_box/magazine/proc/ammo_list(drop_list = FALSE) - var/list/L = stored_ammo.Copy() - if(drop_list) - stored_ammo.Cut() - return L +/obj/item/ammo_box/magazine/proc/ammo_list() + return stored_ammo.Copy() ///drops the entire contents of the magazine on the floor /obj/item/ammo_box/magazine/proc/empty_magazine() @@ -216,14 +222,3 @@ for(var/obj/item/ammo in stored_ammo) ammo.forceMove(turf_mag) stored_ammo -= ammo - -/obj/item/ammo_box/magazine/handle_atom_del(atom/A) - stored_ammo -= A - update_appearance() - -//SKRYAT EDIT ADDITION BEGIN - SEC_HAUL -/obj/item/ammo_box/Destroy() - . = ..() - for(var/i in stored_ammo) - qdel(i) -//SKYRAT EDIT END diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm index 1c4d65280ec..e7870537805 100644 --- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm +++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm @@ -115,17 +115,18 @@ /obj/item/ammo_box/rocket/can_load(mob/user) return FALSE -/obj/item/ammo_box/a762 - name = "stripper clip (7.62mm)" +/obj/item/ammo_box/strilka310 + name = "stripper clip (.310 Strilka)" desc = "A stripper clip." - icon_state = "762" - ammo_type = /obj/item/ammo_casing/a762 + icon_state = "310_strip" + ammo_type = /obj/item/ammo_casing/strilka310 max_ammo = 5 + caliber = CALIBER_STRILKA310 multiple_sprites = AMMO_BOX_PER_BULLET -/obj/item/ammo_box/a762/surplus - name = "stripper clip (7.62mm Surplus)" - ammo_type = /obj/item/ammo_casing/a762/surplus +/obj/item/ammo_box/strilka310/surplus + name = "stripper clip (.310 Surplus)" + ammo_type = /obj/item/ammo_casing/strilka310/surplus /obj/item/ammo_box/n762 name = "ammo box (7.62x38mmR)" diff --git a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm index c4509b917c7..c60ec087c51 100644 --- a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm +++ b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm @@ -4,14 +4,18 @@ caliber = CALIBER_357 max_ammo = 7 -/obj/item/ammo_box/magazine/internal/cylinder/get_round(keep = 0) +///Here, we have to maintain the list size, to emulate a cylinder with several chambers, empty or otherwise. +/obj/item/ammo_box/magazine/internal/cylinder/remove_from_stored_ammo(atom/movable/gone) + for(var/index in 1 to length(stored_ammo)) + var/obj/item/ammo_casing/bullet = stored_ammo[index] + if(gone == bullet) + stored_ammo[index] = null + update_appearance() + return + +/obj/item/ammo_box/magazine/internal/cylinder/get_round() rotate() - - var/b = stored_ammo[1] - if(!keep) - stored_ammo[1] = null - - return b + return stored_ammo[1] /obj/item/ammo_box/magazine/internal/cylinder/proc/rotate() var/b = stored_ammo[1] @@ -22,15 +26,10 @@ for(var/i in 1 to rand(0, max_ammo*2)) rotate() -/obj/item/ammo_box/magazine/internal/cylinder/ammo_list(drop_list = FALSE) - var/list/L = list() - for(var/i=1 to stored_ammo.len) - var/obj/item/ammo_casing/bullet = stored_ammo[i] - if(bullet) - L.Add(bullet) - if(drop_list)//We have to maintain the list size, to emulate a cylinder - stored_ammo[i] = null - return L +/obj/item/ammo_box/magazine/internal/cylinder/ammo_list() + var/list/no_nulls_ammo = stored_ammo.Copy() + list_clear_nulls(no_nulls_ammo) + return no_nulls_ammo /obj/item/ammo_box/magazine/internal/cylinder/give_round(obj/item/ammo_casing/R, replace_spent = 0) if(!R || !(caliber ? (caliber == R.caliber) : (ammo_type == R.type))) diff --git a/code/modules/projectiles/boxes_magazines/internal/rifle.dm b/code/modules/projectiles/boxes_magazines/internal/rifle.dm index 3d5aab03049..83133186c9d 100644 --- a/code/modules/projectiles/boxes_magazines/internal/rifle.dm +++ b/code/modules/projectiles/boxes_magazines/internal/rifle.dm @@ -1,13 +1,13 @@ /obj/item/ammo_box/magazine/internal/boltaction name = "bolt action rifle internal magazine" desc = "Oh god, this shouldn't be here" - ammo_type = /obj/item/ammo_casing/a762 - caliber = CALIBER_A762 + ammo_type = /obj/item/ammo_casing/strilka310 + caliber = CALIBER_STRILKA310 max_ammo = 5 multiload = TRUE /obj/item/ammo_box/magazine/internal/boltaction/surplus - ammo_type = /obj/item/ammo_casing/a762/surplus + ammo_type = /obj/item/ammo_casing/strilka310/surplus /obj/item/ammo_box/magazine/internal/boltaction/pipegun name = "pipegun internal magazine" @@ -21,8 +21,8 @@ /obj/item/ammo_box/magazine/internal/enchanted max_ammo = 1 - caliber = CALIBER_A762 - ammo_type = /obj/item/ammo_casing/a762/enchanted + caliber = CALIBER_STRILKA310 + ammo_type = /obj/item/ammo_casing/strilka310/enchanted /obj/item/ammo_box/magazine/internal/boltaction/harpoon max_ammo = 1 diff --git a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm index d5e234034d6..dfd99e24766 100644 --- a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm +++ b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm @@ -21,6 +21,10 @@ ammo_type = /obj/item/ammo_casing/shotgun/beanbag max_ammo = 6 +/obj/item/ammo_box/magazine/internal/shot/com/compact + name = "compact shotgun internal magazine" + max_ammo = 5 + /obj/item/ammo_box/magazine/internal/shot/dual name = "double-barrel shotgun internal magazine" max_ammo = 2 diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 61e9b0bac49..96900458922 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -49,6 +49,9 @@ /// Just 'slightly' snowflakey way to modify projectile damage for projectiles fired from this gun. var/projectile_damage_multiplier = 1 + /// Even snowflakier way to modify projectile wounding bonus/potential for projectiles fired from this gun. + var/projectile_wound_bonus = 0 + var/spread = 0 //Spread induced by the gun itself. var/randomspread = 1 //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once. @@ -108,22 +111,19 @@ /obj/item/gun/proc/add_seclight_point() return -/obj/item/gun/handle_atom_del(atom/A) - if(A == pin) +/obj/item/gun/Exited(atom/movable/gone, direction) + . = ..() + if(gone == pin) pin = null - if(A == chambered) + if(gone == chambered) chambered = null update_appearance() - if(A == suppressed) + if(gone == suppressed) clear_suppressor() - return ..() - -/obj/item/gun/Exited(atom/movable/gone, direction) if(gone == bayonet) bayonet = null if(!QDELING(src)) update_appearance() - return ..() ///Clears var and updates icon. In the case of ballistic weapons, also updates the gun's weight. /obj/item/gun/proc/clear_suppressor() diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index e6f72601ba9..61dcb1748e4 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -181,8 +181,10 @@ /obj/item/gun/ballistic/proc/add_notes_ballistic() if(magazine) // Make sure you have a magazine, to get the notes from return "\n[magazine.add_notes_box()]" - else - return "\nThe warning attached to the magazine is missing..." + else if(chambered) // if you don't have a magazine, is there something chambered? + return "\n[chambered.add_notes_ammo()]" + else // we have a very expensive mechanical paperweight. + return "\nThe lack of magazine and usable cartridge in chamber makes its usefulness questionable, at best." /obj/item/gun/ballistic/vv_edit_var(vname, vval) . = ..() @@ -257,27 +259,34 @@ stack_trace("Trying to move a qdeleted casing of type [casing.type]!") chambered = null else if(casing_ejector || !from_firing) - chambered = null casing.forceMove(drop_location()) //Eject casing onto ground. if(!QDELETED(casing)) casing.bounce_away(TRUE) SEND_SIGNAL(casing, COMSIG_CASING_EJECTED) else if(empty_chamber) + UnregisterSignal(chambered, COMSIG_MOVABLE_MOVED) chambered = null if (chamber_next_round && (magazine?.max_ammo > 1)) chamber_round() ///Used to chamber a new round and eject the old one -/obj/item/gun/ballistic/proc/chamber_round(keep_bullet = FALSE, spin_cylinder, replace_new_round) +/obj/item/gun/ballistic/proc/chamber_round(spin_cylinder, replace_new_round) if (chambered || !magazine) return if (magazine.ammo_count()) - chambered = magazine.get_round(keep_bullet || bolt_type == BOLT_TYPE_NO_BOLT) - if (bolt_type != BOLT_TYPE_OPEN) + chambered = magazine.get_round((bolt_type == BOLT_TYPE_OPEN && !bolt_locked) || bolt_type == BOLT_TYPE_NO_BOLT) + if (bolt_type != BOLT_TYPE_OPEN && !(internal_magazine && bolt_type == BOLT_TYPE_NO_BOLT)) chambered.forceMove(src) + else + RegisterSignal(chambered, COMSIG_MOVABLE_MOVED, PROC_REF(clear_chambered)) if(replace_new_round) magazine.give_round(new chambered.type) +/obj/item/gun/ballistic/proc/clear_chambered(datum/source) + SIGNAL_HANDLER + UnregisterSignal(chambered, COMSIG_MOVABLE_MOVED) + chambered = null + ///updates a bunch of racking related stuff and also handles the sound effects and the like /obj/item/gun/ballistic/proc/rack(mob/user = null) if (bolt_type == BOLT_TYPE_NO_BOLT) //If there's no bolt, nothing to rack @@ -321,7 +330,7 @@ else playsound(src, load_empty_sound, load_sound_volume, load_sound_vary) if (bolt_type == BOLT_TYPE_OPEN && !bolt_locked) - chamber_round(TRUE) + chamber_round() update_appearance() return TRUE else @@ -506,9 +515,8 @@ eject_magazine(user) return if(bolt_type == BOLT_TYPE_NO_BOLT) - chambered = null var/num_unloaded = 0 - for(var/obj/item/ammo_casing/CB in get_ammo_list(FALSE, TRUE)) + for(var/obj/item/ammo_casing/CB as anything in get_ammo_list(FALSE)) CB.forceMove(drop_location()) CB.bounce_away(FALSE, NONE) num_unloaded++ @@ -516,7 +524,7 @@ if(T && is_station_level(T.z)) SSblackbox.record_feedback("tally", "station_mess_created", 1, CB.name) if (num_unloaded) - balloon_alert(user, "[num_unloaded] [cartridge_wording] unloaded") + balloon_alert(user, "[num_unloaded] [cartridge_wording]\s unloaded") SEND_SIGNAL(src, COMSIG_UPDATE_AMMO_HUD) // SKYRAT EDIT ADDITION - this is normally handled by eject_magazine() but internal magazines are a special case playsound(user, eject_sound, eject_sound_volume, eject_sound_vary) update_appearance() @@ -559,14 +567,12 @@ return bullets ///gets a list of every bullet in the gun -/obj/item/gun/ballistic/proc/get_ammo_list(countchambered = TRUE, drop_all = FALSE) +/obj/item/gun/ballistic/proc/get_ammo_list(countchambered = TRUE) var/list/rounds = list() if(chambered && countchambered) rounds.Add(chambered) - if(drop_all) - chambered = null if(magazine) - rounds.Add(magazine.ammo_list(drop_all)) + rounds.Add(magazine.ammo_list()) return rounds #define BRAINS_BLOWN_THROW_RANGE 3 diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 387081d6a0c..3e286f6c58b 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -325,11 +325,6 @@ name = "Surplus Rifle" desc = "One of countless obsolete ballistic rifles that still sees use as a cheap deterrent. Uses 10mm ammo and its bulky frame prevents one-hand firing." icon_state = "surplus" - inhand_icon_state = "moistnugget" - 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 worn_icon_state = null weapon_weight = WEAPON_HEAVY accepted_magazine_type = /obj/item/ammo_box/magazine/m10mm/rifle diff --git a/code/modules/projectiles/guns/ballistic/bows/_bow.dm b/code/modules/projectiles/guns/ballistic/bows/_bow.dm index dc20a502592..c356d5b266c 100644 --- a/code/modules/projectiles/guns/ballistic/bows/_bow.dm +++ b/code/modules/projectiles/guns/ballistic/bows/_bow.dm @@ -33,38 +33,33 @@ if(isnull(chambered)) return ..() - chambered.forceMove(drop_location()) - magazine.get_round(keep = FALSE) - - var/obj/item/ammo_casing/arrow/our_arrow = chambered - user.put_in_hands(our_arrow) - - drawn = FALSE - chambered = null + user.put_in_hands(chambered) + chambered = magazine.get_round() update_appearance() /obj/item/gun/ballistic/bow/proc/drop_arrow() - drawn = FALSE - if(chambered) - chambered.forceMove(drop_location()) - magazine.get_round(keep = FALSE) - chambered = null + chambered.forceMove(drop_location()) + chambered = magazine.get_round() update_appearance() -/obj/item/gun/ballistic/bow/chamber_round(keep_bullet = FALSE, spin_cylinder, replace_new_round) +/obj/item/gun/ballistic/bow/chamber_round(spin_cylinder, replace_new_round) if(chambered || !magazine) return - if(magazine.ammo_count()) - chambered = magazine.get_round(TRUE) - chambered.forceMove(src) + chambered = magazine.get_round() + RegisterSignal(chambered, COMSIG_MOVABLE_MOVED, PROC_REF(clear_chambered)) + update_appearance() + +/obj/item/gun/ballistic/bow/clear_chambered(datum/source) + . = ..() + drawn = FALSE /obj/item/gun/ballistic/bow/attack_self(mob/user) if(!chambered) balloon_alert(user, "no arrow nocked!") - else - balloon_alert(user, "[drawn ? "string released" : "string drawn"]") - drawn = !drawn - playsound(src, 'sound/weapons/gun/bow/bow_draw.ogg', 25, TRUE) + return + balloon_alert(user, "[drawn ? "string released" : "string drawn"]") + drawn = !drawn + playsound(src, 'sound/weapons/gun/bow/bow_draw.ogg', 25, TRUE) update_appearance() /obj/item/gun/ballistic/bow/afterattack(atom/target, mob/living/user, flag, params, passthrough = FALSE) @@ -74,11 +69,8 @@ if(!drawn) to_chat(user, span_warning("Without drawing the bow, the arrow uselessly falls to the ground.")) drop_arrow() - update_appearance() return - drawn = FALSE - . = ..() //fires, removing the arrow - update_appearance() + return ..() //fires, removing the arrow /obj/item/gun/ballistic/bow/equipped(mob/user, slot, initial) . = ..() @@ -94,10 +86,11 @@ addtimer(CALLBACK(src, PROC_REF(drop_arrow_if_not_held)), 0.1 SECONDS) /obj/item/gun/ballistic/bow/proc/drop_arrow_if_not_held() - if(!ismob(loc)) - if(drawn) - playsound(src, 'sound/weapons/gun/bow/bow_fire.ogg', 25, TRUE) - drop_arrow() + if(ismob(loc) || !chambered) + return + if(drawn) + playsound(src, 'sound/weapons/gun/bow/bow_fire.ogg', 25, TRUE) + drop_arrow() /obj/item/gun/ballistic/bow/shoot_with_empty_chamber(mob/living/user) return //no clicking sounds please diff --git a/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm b/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm index 325f909554a..d9443719a7e 100644 --- a/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm +++ b/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm @@ -12,6 +12,7 @@ firing_effect_type = null caliber = CALIBER_ARROW is_cased_ammo = FALSE + ///Whether the bullet type spawns another casing of the same type or not. var/reusable = TRUE /obj/item/ammo_casing/arrow/Initialize(mapload) @@ -32,15 +33,17 @@ damage = 50 speed = 1 range = 25 - -/// despawning arrow type -/obj/item/ammo_casing/arrow/despawning/dropped() - . = ..() - addtimer(CALLBACK(src, PROC_REF(floor_vanish)), 5 SECONDS) - -/obj/item/ammo_casing/arrow/despawning/proc/floor_vanish() - if(isturf(loc)) - qdel(src) + embedding = list( + embed_chance = 90, + fall_chance = 2, + jostle_chance = 2, + ignore_throwspeed_threshold = TRUE, + pain_stam_pct = 0.5, + pain_mult = 3, + jostle_pain_mult = 3, + rip_time = 1 SECONDS + ) + shrapnel_type = /obj/item/ammo_casing/arrow /// holy arrows /obj/item/ammo_casing/arrow/holy @@ -57,6 +60,16 @@ desc = "Here it comes, cultist scum!" icon_state = "holy_arrow_projectile" damage = 20 //still a lot but this is roundstart gear so far less + shrapnel_type =/obj/item/ammo_casing/arrow/holy + embedding = list( + embed_chance = 50, + fall_chance = 2, + jostle_chance = 0, + ignore_throwspeed_threshold = TRUE, + pain_stam_pct = 0.5, + pain_mult = 3, + rip_time = 1 SECONDS + ) /obj/projectile/bullet/arrow/holy/Initialize(mapload) . = ..() @@ -76,6 +89,7 @@ desc = "THE UNMATCHED POWER OF THE SUN" icon_state = "holy_arrow_projectile" damage = 20 + embedding = null /obj/projectile/bullet/arrow/blazing/on_hit(atom/target, blocked, pierce_hit) . = ..() diff --git a/code/modules/projectiles/guns/ballistic/bows/bow_quivers.dm b/code/modules/projectiles/guns/ballistic/bows/bow_quivers.dm index fe543e9458c..7d8669c8618 100644 --- a/code/modules/projectiles/guns/ballistic/bows/bow_quivers.dm +++ b/code/modules/projectiles/guns/ballistic/bows/bow_quivers.dm @@ -11,6 +11,7 @@ /obj/item/storage/bag/quiver/Initialize(mapload) . = ..() + atom_storage.numerical_stacking = TRUE atom_storage.max_specific_storage = WEIGHT_CLASS_TINY atom_storage.max_slots = 40 atom_storage.max_total_storage = 100 @@ -23,9 +24,6 @@ for(var/i in 1 to 10) new arrow_path(src) -/obj/item/storage/bag/quiver/despawning - arrow_path = /obj/item/ammo_casing/arrow/despawning - /obj/item/storage/bag/quiver/holy name = "divine quiver" desc = "Holds arrows for your divine bow, where they wait to find their target." diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index f77288f9b24..6439b78a9bd 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -21,13 +21,17 @@ last_fire = world.time -/obj/item/gun/ballistic/revolver/chamber_round(keep_bullet, spin_cylinder = TRUE, replace_new_round) +/obj/item/gun/ballistic/revolver/chamber_round(spin_cylinder = TRUE, replace_new_round) if(!magazine) //if it mag was qdel'd somehow. CRASH("revolver tried to chamber a round without a magazine!") + if(chambered) + UnregisterSignal(chambered, COMSIG_MOVABLE_MOVED) if(spin_cylinder) chambered = magazine.get_round(TRUE) else chambered = magazine.stored_ammo[1] + if(chambered) + RegisterSignal(chambered, COMSIG_MOVABLE_MOVED, PROC_REF(clear_chambered)) /obj/item/gun/ballistic/revolver/shoot_with_empty_chamber(mob/living/user as mob|obj) ..() diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index 04e78453b22..67c70352ff3 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -1,21 +1,15 @@ /obj/item/gun/ballistic/rifle name = "Bolt Rifle" desc = "Some kind of bolt action rifle. You get the feeling you shouldn't have this." - icon = 'icons/obj/weapons/guns/mosinnagant.dmi' - icon_state = "moistnugget" - 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 + icon = 'icons/obj/weapons/guns/wide_guns.dmi' + icon_state = "sakhno" w_class = WEIGHT_CLASS_BULKY - inhand_icon_state = "moistnugget" - worn_icon_state = "moistnugget" accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction bolt_wording = "bolt" bolt_type = BOLT_TYPE_LOCKING semi_auto = FALSE internal_magazine = TRUE - fire_sound = 'sound/weapons/gun/rifle/shot.ogg' + fire_sound = 'sound/weapons/gun/rifle/shot_heavy.ogg' fire_sound_volume = 90 rack_sound = 'sound/weapons/gun/rifle/bolt_out.ogg' bolt_drop_sound = 'sound/weapons/gun/rifle/bolt_in.ogg' @@ -45,35 +39,39 @@ /////////////////////// /obj/item/gun/ballistic/rifle/boltaction - name = "\improper Mosin Nagant" - desc = "A classic Mosin Nagant. They don't make them like they used to. Well, okay, in all honesty, this one is actually \ - a new refurbished version. So it works just fine! Often found in the hands of underpaid Nanotrasen interns, \ - Russian military LARPers, actual Space Russians, revolutionaries and cargo technicians. Still feels slightly moist." - sawn_desc = "A sawn-off Mosin Nagant, popularly known as an \"Obrez\". \ + name = "\improper Sakhno Precision Rifle" + desc = "A Sakhno Precision Rifle, a bolt action weapon that was (and certainly still is) popular with \ + frontiersmen, cargo runners, private security forces, explorers, and other unsavoury types. This particular \ + pattern of the rifle dates back all the way to 2440." + sawn_desc = "A sawn-off Sakhno Precision Rifle, popularly known as an \"Obrez\". \ There was probably a reason it wasn't manufactured this short to begin with. \ - This one is still in surprisingly good condition. Often found in the hands \ - of underpaid Nanotrasen interns without a care for company property, Russian military LARPers, \ - actual drunk Space Russians, Tiger Co-op assassins and cargo technicians. Still feels slightly moist." - weapon_weight = WEAPON_HEAVY - icon_state = "moistnugget" - inhand_icon_state = "moistnugget" + Despite the terrible nature of the modification, the weapon seems otherwise in good condition." + + icon_state = "sakhno" + inhand_icon_state = "sakhno" + worn_icon_state = "sakhno" + slot_flags = ITEM_SLOT_BACK accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction can_bayonet = TRUE - knife_x_offset = 37 - knife_y_offset = 14 + knife_x_offset = 42 + knife_y_offset = 12 can_be_sawn_off = TRUE + weapon_weight = WEAPON_HEAVY var/jamming_chance = 20 var/unjam_chance = 10 var/jamming_increment = 5 var/jammed = FALSE var/can_jam = FALSE + SET_BASE_PIXEL(-8, 0) + /obj/item/gun/ballistic/rifle/boltaction/sawoff(mob/user) . = ..() if(.) spread = 36 can_bayonet = FALSE + SET_BASE_PIXEL(0, 0) update_appearance() /obj/item/gun/ballistic/rifle/boltaction/attack_self(mob/user) @@ -125,46 +123,51 @@ desc = "A weapon favored by carp hunters, but just as infamously employed by agents of the Animal Rights Consortium against human aggressors. Because it's ironic." icon = 'icons/obj/weapons/guns/ballistic.dmi' icon_state = "speargun" - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' - inhand_x_dimension = 32 - inhand_y_dimension = 32 inhand_icon_state = "speargun" worn_icon_state = "speargun" accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/harpoon fire_sound = 'sound/weapons/gun/sniper/shot.ogg' can_be_sawn_off = FALSE + SET_BASE_PIXEL(0, 0) + /obj/item/gun/ballistic/rifle/boltaction/surplus - desc = "A classic Mosin Nagant, ruined by centuries of moisture. Some Space Russians claim that the moisture \ - is a sign of good luck. A sober user will know that this thing is going to fucking jam. Repeatedly. \ - Often found in the hands of cargo technicians, Russian military LARPers, Tiger Co-Op terrorist cells, \ - cryo-frozen Space Russians, and security personnel with a bone to pick. EXTREMELY moist." - sawn_desc = "A sawn-off Mosin Nagant, popularly known as an \"Obrez\". \ + name = "\improper Sakhno M2442 Army" + desc = "A modification of the Sakhno Precision Rifle, \"Sakhno M2442 Army\" is stamped into the side. \ + It is unknown what army this pattern of rifle was made for or if it was ever even used by an army \ + of any sort. What you can discern, however, is that its previous owner did not treat the weapon well. \ + For some reason, there's moisture all through the internals." + sawn_desc = "A sawn-off Sakhno Precision Rifle, popularly known as an \"Obrez\". \ + \"Sakhno M2442 Army\" is stamped into the side of it. \ There was probably a reason it wasn't manufactured this short to begin with. \ - This one has been ruined by centuries of moisture and WILL jam. Often found in the hands of \ - cargo technicians with a death wish, Russian military LARPers, actual drunk Space Russians, \ - Tiger Co-op assassins, cryo-frozen Space Russians, and security personnel with \ - little care for professional conduct while making 'arrests' point blank in the back of the head \ - until the gun clicks. EXTREMELY moist." + Cutting the weapon down seems to have not helped with the moisture problem." + icon_state = "sakhno_tactifucked" accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/surplus can_jam = TRUE /obj/item/gun/ballistic/rifle/boltaction/prime - name = "\improper Regal Nagant" - desc = "A prized hunting Mosin Nagant. Used for the most dangerous game." - icon_state = "moistprime" - inhand_icon_state = "moistprime" - worn_icon_state = "moistprime" + name = "\improper Sakhno-Zhihao Sporting Rifle" + desc = "An upgrade and modernisation of the original Sakhno rifle, made with such wonders as \ + modern materials, a scope, and other impressive technological advancements that, to be honest, \ + were already around when the original weapon was designed. Surprisingly for a rifle of this type, \ + the scope actually has magnification, rather than being decorative." + icon_state = "zhihao" + inhand_icon_state = "zhihao" + worn_icon_state = "zhihao" can_be_sawn_off = TRUE - sawn_desc = "A sawn-off Regal Nagant... Doing this was a sin, I hope you're happy. \ - You are now probably one of the few people in the universe to ever hold a \"Regal Obrez\". \ - Even thinking about that name combination makes you ill." + sawn_desc = "A sawn-off Sakhno-Zhihao Sporting Rifle... Doing this was a sin, I hope you're happy. \ + You are now probably one of the few people in the universe to ever hold an \"Obrez Moderna\". \ + All you had to do was take an allen wrench to the stock to take it off. But no, you just had to \ + go for the saw." + +/obj/item/gun/ballistic/rifle/boltaction/prime/Initialize(mapload) + . = ..() + AddComponent(/datum/component/scope, range_modifier = 1.5) /obj/item/gun/ballistic/rifle/boltaction/prime/sawoff(mob/user) . = ..() if(.) - name = "\improper Regal Obrez" // wear it loud and proud + name = "\improper Obrez Moderna" // wear it loud and proud /obj/item/gun/ballistic/rifle/boltaction/pipegun name = "pipegun" @@ -180,7 +183,7 @@ 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_A762 + 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 @@ -189,6 +192,8 @@ can_be_sawn_off = FALSE projectile_damage_multiplier = 0.75 + SET_BASE_PIXEL(0, 0) + /obj/item/gun/ballistic/rifle/boltaction/pipegun/handle_chamber() . = ..() do_sparks(1, TRUE, src) @@ -207,10 +212,16 @@ /obj/item/gun/ballistic/rifle/enchanted name = "enchanted bolt action rifle" desc = "Careful not to lose your head." + icon_state = "enchanted_rifle" + inhand_icon_state = "enchanted_rifle" + worn_icon_state = "enchanted_rifle" + slot_flags = ITEM_SLOT_BACK var/guns_left = 30 accepted_magazine_type = /obj/item/ammo_box/magazine/internal/enchanted can_be_sawn_off = FALSE + SET_BASE_PIXEL(-8, 0) + /obj/item/gun/ballistic/rifle/enchanted/dropped() . = ..() guns_left = 0 diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 654acc12ad4..a132e169bdf 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -63,6 +63,13 @@ accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/com w_class = WEIGHT_CLASS_HUGE +/obj/item/gun/ballistic/shotgun/automatic/combat/compact + name = "compact shotgun" + desc = "A compact version of the semi automatic combat shotgun. For close encounters." + icon_state = "cshotgunc" + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/com/compact + w_class = WEIGHT_CLASS_BULKY + //Dual Feed Shotgun /obj/item/gun/ballistic/shotgun/automatic/dual_tube diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 73d7d57c4fc..811ba23122f 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -97,17 +97,19 @@ if(!ammo_type.len) return var/obj/projectile/exam_proj - readout += "\nStandard models of this projectile weapon have [span_warning("[ammo_type.len] mode\s")]" + readout += "\nStandard models of this projectile weapon have [span_warning("[ammo_type.len] mode\s")]." readout += "Our heroic interns have shown that one can theoretically stay standing after..." + if(projectile_damage_multiplier <= 0) + readout += "a theoretically infinite number of shots on [span_warning("every")] mode due to esoteric or nonexistent offensive potential." + return readout.Join("\n") // Sending over the singular string, rather than the whole list for(var/obj/item/ammo_casing/energy/for_ammo as anything in ammo_type) exam_proj = for_ammo.projectile_type if(!ispath(exam_proj)) continue - if(initial(exam_proj.damage) > 0) // Don't divide by 0!!!!! - readout += "[span_warning("[HITS_TO_CRIT(initial(exam_proj.damage) * for_ammo.pellets)] shot\s")] on [span_warning("[for_ammo.select_name]")] mode before collapsing from [initial(exam_proj.damage_type) == STAMINA ? "immense pain" : "their wounds"]." + readout += "[span_warning("[HITS_TO_CRIT((initial(exam_proj.damage) * projectile_damage_multiplier) * for_ammo.pellets)] shot\s")] on [span_warning("[for_ammo.select_name]")] mode before collapsing from [initial(exam_proj.damage_type) == STAMINA ? "immense pain" : "their wounds"]." if(initial(exam_proj.stamina) > 0) // In case a projectile does damage AND stamina damage (Energy Crossbow) - readout += "[span_warning("[HITS_TO_CRIT(initial(exam_proj.stamina) * for_ammo.pellets)] shot\s")] on [span_warning("[for_ammo.select_name]")] mode before collapsing from immense pain." + readout += "[span_warning("[HITS_TO_CRIT((initial(exam_proj.stamina) * projectile_damage_multiplier) * for_ammo.pellets)] shot\s")] on [span_warning("[for_ammo.select_name]")] mode before collapsing from immense pain." else readout += "a theoretically infinite number of shots on [span_warning("[for_ammo.select_name]")] mode." @@ -137,11 +139,11 @@ return ..() -/obj/item/gun/energy/handle_atom_del(atom/A) - if(A == cell) +/obj/item/gun/energy/Exited(atom/movable/gone, direction) + . = ..() + if(gone == cell) cell = null update_appearance() - return ..() /obj/item/gun/energy/process(seconds_per_tick) if(selfcharge && cell && cell.percent() < 100) diff --git a/code/modules/projectiles/guns/energy/beam_rifle.dm b/code/modules/projectiles/guns/energy/beam_rifle.dm index 702da95f701..68479abbf47 100644 --- a/code/modules/projectiles/guns/energy/beam_rifle.dm +++ b/code/modules/projectiles/guns/energy/beam_rifle.dm @@ -78,7 +78,7 @@ . = ..() delay = modify_fantasy_variable("delay", delay, -bonus * 2) aiming_time = modify_fantasy_variable("aiming_time", aiming_time, -bonus * 2) - recoil = modify_fantasy_variable("aiming_time", aiming_time, round(-bonus / 2)) + recoil = modify_fantasy_variable("recoil", recoil, round(-bonus / 2)) /obj/item/gun/energy/beam_rifle/remove_fantasy_bonuses(bonus) delay = reset_fantasy_variable("delay", delay) diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index 2c013ee257a..3fd1e7c1949 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -1,4 +1,4 @@ -/obj/item/gun/energy/e_gun //ICON OVERRIDEN IN SKYRAT AESTHETICS - SEE MODULE +/obj/item/gun/energy/e_gun name = "energy gun" desc = "A basic hybrid energy gun with two settings: disable and kill." icon_state = "energy" @@ -110,7 +110,7 @@ /obj/item/gun/energy/e_gun/turret/add_seclight_point() return -/obj/item/gun/energy/e_gun/nuclear +/obj/item/gun/energy/e_gun/nuclear //SKYRAT EDIT - ICON OVERRIDDEN IN AESTHETICS MODULE name = "advanced energy gun" desc = "An energy gun with an experimental miniaturized nuclear reactor that automatically charges the internal power cell." icon_state = "nucgun" diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 575a1b7fbfb..3286675dfd0 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -546,7 +546,7 @@ //Cosmetic -/obj/item/borg/upgrade/modkit/chassis_mod /////ICON OVERRIDE IN modular_skyrat/modules/aesthetics/guns/icons/energy.dmi +/obj/item/borg/upgrade/modkit/chassis_mod name = "super chassis" desc = "Makes your KA yellow. All the fun of having a more powerful KA without actually having a more powerful KA." cost = 0 @@ -573,7 +573,7 @@ holder.update_held_items() ..() -/obj/item/borg/upgrade/modkit/chassis_mod/orange /////ICON OVERRIDE IN modular_skyrat/modules/aesthetics/guns/icons/energy.dmi +/obj/item/borg/upgrade/modkit/chassis_mod/orange name = "hyper chassis" desc = "Makes your KA orange. All the fun of having explosive blasts without actually having explosive blasts." chassis_icon = "kineticgun_h" diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 1bf70f30275..dafaaa6a7de 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -1,4 +1,4 @@ -/obj/item/gun/energy/laser //ICON OVERRIDEN IN SKYRAT AESTHETICS - SEE MODULE +/obj/item/gun/energy/laser name = "laser gun" desc = "A basic energy-based laser gun that fires concentrated beams of light which pass through glass and thin metal." icon_state = "laser" @@ -89,7 +89,7 @@ ///Laser Cannon -/obj/item/gun/energy/lasercannon//ICON OVERRIDEN IN SKYRAT AESTHETICS - SEE MODULE +/obj/item/gun/energy/lasercannon name = "accelerator laser cannon" desc = "An advanced laser cannon that does more damage the farther away the target is." icon_state = "lasercannon" diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 4ef3765133a..33a8e5ac91e 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -1,4 +1,4 @@ -/obj/item/gun/energy/ionrifle +/obj/item/gun/energy/ionrifle //SKYRAT EDIT - ICON OVERRIDDEN IN AESTHETICS MODULE name = "ion rifle" desc = "A man-portable anti-armor weapon designed to disable mechanical threats at range." icon_state = "ionrifle" diff --git a/code/modules/projectiles/guns/special/blastcannon.dm b/code/modules/projectiles/guns/special/blastcannon.dm index 5029f2b2588..f9a8abf7ae3 100644 --- a/code/modules/projectiles/guns/special/blastcannon.dm +++ b/code/modules/projectiles/guns/special/blastcannon.dm @@ -62,11 +62,11 @@ cached_target = null return ..() -/obj/item/gun/blastcannon/handle_atom_del(atom/A) - if(A == bomb) +/obj/item/gun/blastcannon/Exited(atom/movable/gone, direction) + . = ..() + if(gone == bomb) bomb = null update_appearance() - return ..() /obj/item/gun/blastcannon/assume_air(datum/gas_mixture/giver) qdel(giver) diff --git a/code/modules/projectiles/guns/special/syringe_gun.dm b/code/modules/projectiles/guns/special/syringe_gun.dm index aa6f0aec572..270bb8744cc 100644 --- a/code/modules/projectiles/guns/special/syringe_gun.dm +++ b/code/modules/projectiles/guns/special/syringe_gun.dm @@ -38,10 +38,10 @@ max_syringes = reset_fantasy_variable("max_syringes", max_syringes) return ..() -/obj/item/gun/syringe/handle_atom_del(atom/A) +/obj/item/gun/syringe/Exited(atom/movable/gone, direction) . = ..() - if(A in syringes) - syringes.Remove(A) + if(gone in syringes) + syringes -= gone /obj/item/gun/syringe/recharge_newshot() if(!syringes.len) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index c9eb286f598..60bec6ac3b0 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -745,9 +745,6 @@ SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_BEFORE_FIRE, src, original) if(firer) SEND_SIGNAL(firer, COMSIG_PROJECTILE_FIRER_BEFORE_FIRE, src, fired_from, original) - //If no angle needs to resolve it from xo/yo! - if(shrapnel_type && LAZYLEN(embedding)) - AddElement(/datum/element/embed, projectile_payload = shrapnel_type) if(!log_override && firer && original) log_combat(firer, original, "fired at", src, "from [get_area_name(src, TRUE)]") //note: mecha projectile logging is handled in /obj/item/mecha_parts/mecha_equipment/weapon/action(). try to keep these messages roughly the sameish just for consistency's sake. @@ -1134,5 +1131,25 @@ return FALSE +///Checks if the projectile can embed into someone +/obj/projectile/proc/can_embed_into(atom/hit) + return embedding && shrapnel_type && iscarbon(hit) && !HAS_TRAIT(hit, TRAIT_PIERCEIMMUNE) + #undef MOVES_HITSCAN #undef MUZZLE_EFFECT_PIXEL_INCREMENT + +/// Fire a projectile from this atom at another atom +/atom/proc/fire_projectile(projectile_type, atom/target, sound, firer) + if (!isnull(sound)) + playsound(src, sound, vol = 100, vary = TRUE) + + var/turf/startloc = get_turf(src) + var/obj/projectile/bullet = new projectile_type(startloc) + bullet.starting = startloc + bullet.firer = firer || src + bullet.fired_from = src + bullet.yo = target.y - startloc.y + bullet.xo = target.x - startloc.x + bullet.original = target + bullet.preparePixelProjectile(target, src) + bullet.fire() diff --git a/code/modules/projectiles/projectile/bullets/foam_dart.dm b/code/modules/projectiles/projectile/bullets/foam_dart.dm index 60f36c8af5f..6d4cffd4524 100644 --- a/code/modules/projectiles/projectile/bullets/foam_dart.dm +++ b/code/modules/projectiles/projectile/bullets/foam_dart.dm @@ -7,6 +7,7 @@ icon_state = "foamdart_proj" base_icon_state = "foamdart_proj" range = 10 + embedding = null var/modified = FALSE var/obj/item/pen/pen = null diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm index 61266ff1769..4cb7bd543b4 100644 --- a/code/modules/projectiles/projectile/bullets/rifle.dm +++ b/code/modules/projectiles/projectile/bullets/rifle.dm @@ -16,22 +16,22 @@ armour_penetration = 100 projectile_phasing = PASSTABLE | PASSGLASS | PASSGRILLE | PASSCLOSEDTURF | PASSMACHINE | PASSSTRUCTURE | PASSDOORS -// 7.62 (Nagant Rifle) +// .310 Strilka (Sakhno Rifle) -/obj/projectile/bullet/a762 - name = "7.62 bullet" +/obj/projectile/bullet/strilka310 + name = ".310 Strilka bullet" damage = 60 armour_penetration = 10 wound_bonus = -45 wound_falloff_tile = 0 -/obj/projectile/bullet/a762/surplus - name = "7.62 surplus bullet" +/obj/projectile/bullet/strilka310/surplus + name = ".310 Strilka surplus bullet" weak_against_armour = TRUE //this is specifically more important for fighting carbons than fighting noncarbons. Against a simple mob, this is still a full force bullet armour_penetration = 0 -/obj/projectile/bullet/a762/enchanted - name = "enchanted 7.62 bullet" +/obj/projectile/bullet/strilka310/enchanted + name = "enchanted .310 bullet" damage = 20 stamina = 80 @@ -46,3 +46,4 @@ bare_wound_bonus = 80 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_falloff_tile = -5 + shrapnel_type = /obj/item/ammo_casing/harpoon diff --git a/code/modules/projectiles/projectile/energy/_energy.dm b/code/modules/projectiles/projectile/energy/_energy.dm index 6b715fdb74f..86ec80b3b20 100644 --- a/code/modules/projectiles/projectile/energy/_energy.dm +++ b/code/modules/projectiles/projectile/energy/_energy.dm @@ -11,4 +11,4 @@ . = ..() ADD_TRAIT(src, TRAIT_FREE_HYPERSPACE_MOVEMENT, INNATE_TRAIT) - ADD_TRAIT(src, TRAIT_FREE_HYPERSPACE_MOVEMENT, TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT) + ADD_TRAIT(src, TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT, INNATE_TRAIT) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 5f2418f9090..516951e0e04 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -220,9 +220,9 @@ if(EXPLODE_LIGHT) SSexplosions.low_mov_atom += beaker -/obj/machinery/chem_dispenser/handle_atom_del(atom/A) - ..() - if(A == beaker) +/obj/machinery/chem_dispenser/Exited(atom/movable/gone, direction) + . = ..() + if(gone == beaker) beaker = null cut_overlays() @@ -568,6 +568,7 @@ /datum/reagent/consumable/lemonjuice, /datum/reagent/consumable/lemon_lime, /datum/reagent/consumable/limejuice, + /datum/reagent/consumable/melon_soda, /datum/reagent/consumable/menthol, /datum/reagent/consumable/orangejuice, /datum/reagent/consumable/pineapplejuice, @@ -657,6 +658,7 @@ /datum/reagent/consumable/ethanol/ale, /datum/reagent/consumable/ethanol/applejack, /datum/reagent/consumable/ethanol/beer, + /datum/reagent/consumable/ethanol/coconut_rum, /datum/reagent/consumable/ethanol/cognac, /datum/reagent/consumable/ethanol/creme_de_cacao, /datum/reagent/consumable/ethanol/creme_de_coconut, @@ -667,6 +669,7 @@ /datum/reagent/consumable/ethanol/kahlua, /datum/reagent/consumable/ethanol/beer/maltliquor, /datum/reagent/consumable/ethanol/navy_rum, + /datum/reagent/consumable/ethanol/rice_beer, /datum/reagent/consumable/ethanol/rum, /datum/reagent/consumable/ethanol/sake, /datum/reagent/consumable/ethanol/synthanol, // SKYRAT EDIT @@ -676,6 +679,7 @@ /datum/reagent/consumable/ethanol/vodka, /datum/reagent/consumable/ethanol/whiskey, /datum/reagent/consumable/ethanol/wine, + /datum/reagent/consumable/ethanol/yuyake, ) upgrade_reagents = null upgrade_reagents2 = null //SKYRAT EDIT diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 28ec3545880..3716715a2d6 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -49,9 +49,9 @@ QDEL_NULL(beaker) return ..() -/obj/machinery/chem_heater/handle_atom_del(atom/A) +/obj/machinery/chem_heater/Exited(atom/movable/gone, direction) . = ..() - if(A == beaker) + if(gone == beaker) beaker = null update_appearance() @@ -78,8 +78,8 @@ if(!user) return FALSE if(beaker) - try_put_in_hand(beaker, user) UnregisterSignal(beaker.reagents, COMSIG_REAGENTS_REACTION_STEP) + try_put_in_hand(beaker, user) beaker = null if(new_beaker) beaker = new_beaker @@ -155,6 +155,11 @@ use_power(active_power_usage * seconds_per_tick) +/obj/machinery/chem_heater/wrench_act(mob/living/user, obj/item/tool) + . = ..() + default_unfasten_wrench(user, tool) + return TOOL_ACT_TOOLTYPE_SUCCESS + /obj/machinery/chem_heater/attackby(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, "mixer0b", "mixer0b", I)) return diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 4ac2b60aa1c..2c4cff9c376 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -115,9 +115,9 @@ GLOBAL_LIST_INIT(chem_master_containers, list( replace_beaker() return ..() -/obj/machinery/chem_master/handle_atom_del(atom/deleted_atom) - ..() - if(deleted_atom == beaker) +/obj/machinery/chem_master/Exited(atom/movable/gone, direction) + . = ..() + if(gone == beaker) beaker = null update_appearance(UPDATE_ICON) diff --git a/code/modules/reagents/chemistry/machinery/chem_separator.dm b/code/modules/reagents/chemistry/machinery/chem_separator.dm index aa492ec2d75..2e5571fd431 100644 --- a/code/modules/reagents/chemistry/machinery/chem_separator.dm +++ b/code/modules/reagents/chemistry/machinery/chem_separator.dm @@ -43,9 +43,9 @@ QDEL_NULL(soundloop) return ..() -/obj/structure/chem_separator/handle_atom_del(atom/deleted_atom) - ..() - if(deleted_atom == beaker) +/obj/structure/chem_separator/Exited(atom/movable/gone, direction) + . = ..() + if(gone == beaker) beaker = null update_appearance(UPDATE_ICON) diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 273b2309c05..586cb0ce8fa 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -73,11 +73,11 @@ /obj/machinery/computer/pandemic/attack_ai_secondary(mob/user, list/modifiers) return attack_hand_secondary(user, modifiers) -/obj/machinery/computer/pandemic/handle_atom_del(atom/A) - if(A == beaker) +/obj/machinery/computer/pandemic/Exited(atom/movable/gone, direction) + . = ..() + if(gone == beaker) beaker = null update_appearance() - return ..() /obj/machinery/computer/pandemic/attackby(obj/item/held_item, mob/user, params) //Advanced science! Percision instruments (eg droppers and syringes) are precise enough to modify the loaded sample! diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index d0ba93f0535..15929e190cc 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -112,13 +112,13 @@ /obj/machinery/reagentgrinder/attack_ai_secondary(mob/user, list/modifiers) return attack_hand_secondary(user, modifiers) -/obj/machinery/reagentgrinder/handle_atom_del(atom/A) +/obj/machinery/reagentgrinder/Exited(atom/movable/gone, direction) . = ..() - if(A == beaker) + if(gone == beaker) beaker = null update_appearance() - if(holdingitems[A]) - holdingitems -= A + if(holdingitems[gone]) + holdingitems -= gone /obj/machinery/reagentgrinder/proc/drop_all_items() for(var/i in holdingitems) diff --git a/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm b/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm index 32ca971bf41..2299cab5493 100644 --- a/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/atmos_gas_reagents.dm @@ -43,15 +43,12 @@ taste_description = "rubbery" chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE -/datum/reagent/healium/on_mob_metabolize(mob/living/breather) - . = ..() - breather.PermaSleeping() - /datum/reagent/healium/on_mob_end_metabolize(mob/living/breather) - breather.SetSleeping(10) + breather.SetSleeping(1 SECONDS) return ..() /datum/reagent/healium/on_mob_life(mob/living/breather, seconds_per_tick, times_fired) + breather.SetSleeping(30 SECONDS) breather.adjustFireLoss(-2 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) breather.adjustToxLoss(-5 * REM * seconds_per_tick, FALSE, required_biotype = affected_biotype) breather.adjustBruteLoss(-2 * REM * seconds_per_tick, FALSE, required_bodytype = affected_bodytype) diff --git a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm index 69c07deeba6..aacef0822e1 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm @@ -2612,5 +2612,214 @@ if(istype(stomach)) stomach.adjust_charge(reac_volume * 5) +// Welcome to the Blue Room Bar and Grill, home to Mars' finest cocktails +/datum/reagent/consumable/ethanol/rice_beer + name = "Rice Beer" + description = "A light, rice-based lagered beer popular on Mars. Considered a hate crime against Bavarians under the Reinheitsgebot Act of 1516." + boozepwr = 5 + color = "#664300" + quality = DRINK_NICE + taste_description = "mild carbonated malt" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/shochu + name = "Shochu" + description = "Also known as soju or baijiu, this drink is made from fermented rice, much like sake, but at a generally higher proof making it more similar to a true spirit." + boozepwr = 45 + color = "#DDDDDD" + quality = DRINK_NICE + taste_description = "stiff rice wine" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/yuyake + name = "Yūyake" + description = "A sweet melon liqueur from Japan. Considered a relic of the 1980s by most, it has some niche use in cocktail making, in part due to its bright red colour." + boozepwr = 40 + color = "#F54040" + quality = DRINK_NICE + taste_description = "sweet melon" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/coconut_rum + name = "Coconut Rum" + description = "The distilled essence of the beach. Tastes like bleach-blonde hair and suncream." + boozepwr = 21 + color = "#F54040" + quality = DRINK_NICE + taste_description = "coconut rum" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +// Mixed Martian Drinks +/datum/reagent/consumable/ethanol/yuyakita + name = "Yūyakita" + description = "A hell unleashed upon the world by an unnamed patron." + boozepwr = 40 + color = "#F54040" + quality = DRINK_NICE + taste_description = "death" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/saibasan + name = "Saibāsan" + description = "A drink glorifying Cybersun's enduring business." + boozepwr = 20 + color = "#F54040" + quality = DRINK_NICE + taste_description = "betrayal" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/banzai_ti + name = "Banzai-Tī" + description = "A variation on the Long Island Iced Tea, made with yuyake for an alternative flavour that's hard to place." + boozepwr = 40 + color = "#F54040" + quality = DRINK_NICE + taste_description = "an asian twist on the liquor cabinet" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/sanraizusoda + name = "Sanraizusōda" + description = "It's a melon cream soda, except with alcohol- what's not to love? Well... possibly the hangovers." + boozepwr = 6 + color = "#F54040" + quality = DRINK_NICE + taste_description = "creamy melon soda" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/kumicho + name = "Kumichō" + description = "A new take on a classic cocktail, the Kumicho takes the Godfather formula and adds shochu for an Asian twist." + boozepwr = 62 + color = "#F54040" + quality = DRINK_NICE + taste_description = "rice and rye" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/red_planet + name = "Red Planet" + description = "Made in celebration of the Martian Concession, the Red Planet is based on the classic El Presidente, and is as patriotic as it is bright crimson." + boozepwr = 45 + color = "#F54040" + quality = DRINK_NICE + taste_description = "the spirit of freedom" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/amaterasu + name = "Amaterasu" + description = "Named for Amaterasu, the Shinto Goddess of the Sun, this cocktail embodies radiance- or something like that, anyway." + boozepwr = 54 //1 part bitters is a lot + color = "#F54040" + quality = DRINK_NICE + taste_description = "sweet nectar of the gods" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/nekomimosa + name = "Nekomimosa" + description = "An overly sweet cocktail, made with melon liqueur, melon juice, and champagne (which contains no melon, unfortunately)." + boozepwr = 17 + color = "#FF0C8D" + quality = DRINK_NICE + taste_description = "MELON" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/sentai_quencha //melon soda, triple citrus, shochu, blue curacao + name = "Sentai Quencha" + description = "Based on the galaxy-famous \"Kyūkyoku no Ninja Pawā Sentai\", the Sentai Quencha is a favourite at anime conventions and weeb bars." + boozepwr = 28 + color = "#F54040" + quality = DRINK_NICE + taste_description = "ultimate ninja power" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/bosozoku + name = "Bōsōzoku" + description = "A simple summer drink from Mars, made from a 1:1 mix of rice beer and lemonade." + boozepwr = 6 + color = "#F54040" + quality = DRINK_NICE + taste_description = "bittersweet lemon" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/ersatzche + name = "Ersatzche" + description = "Sweet, bitter, spicy- that's a great combination." + boozepwr = 6 + color = "#F54040" + quality = DRINK_NICE + taste_description = "spicy pineapple beer" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/red_city_am + name = "Red City AM" + description = "A breakfast drink from New Osaka, for when you really need to get drunk at 9:30 in the morning in more socially acceptable manner than drinking bagwine on the bullet train. Not that you should drink this on the bullet train either." + boozepwr = 5 //this thing is fucking disgusting and both less tasty and less alcoholic than a bloody mary. it is against god and nature + color = "#F54040" + quality = DRINK_NICE + taste_description = "breakfast in a glass" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/kings_ransom + name = "King's Ransom" + description = "A stiff, bitter drink with an odd name and odder recipe." + boozepwr = 26 + color = "#F54040" + quality = DRINK_NICE + taste_description = "bitter raspberry" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/four_bit + name = "Four Bit" + description = "A drink to power your typing hands." + boozepwr = 26 + color = "#F54040" + quality = DRINK_NICE + taste_description = "cyberspace" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/white_hawaiian //coconut milk, coconut rum, coffee liqueur + name = "White Hawaiian" + description = "A take on the classic White Russian, subbing out the classics for some tropical flavours." + boozepwr = 16 + color = "#F54040" + quality = DRINK_NICE + taste_description = "COCONUT" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/maui_sunrise //coconut rum, pineapple juice, yuyake, triple citrus, lemon-lime soda + name = "Maui Sunrise" + description = "Behind this drink's red facade lurks a sharp, complex flavour." + boozepwr = 15 + color = "#F54040" + quality = DRINK_NICE + taste_description = "sunrise over the pacific" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/imperial_mai_tai //navy rum, rum, lime, triple sec, korta nectar + name = "Imperial Mai Tai" + description = "For when orgeat is in short supply, do as the spacers do- make do and mend." + boozepwr = 52 + color = "#F54040" + quality = DRINK_NICE + taste_description = "spicy nutty rum" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/konococo_rumtini //todo: add espresso | coffee, coffee liqueur, coconut rum, sugar + name = "Konococo Rumtini" + description = "Coconut rum, coffee liqueur, and espresso- an odd combination, to be sure, but a welcomed one." + boozepwr = 20 + color = "#F54040" + quality = DRINK_NICE + taste_description = "coconut coffee" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/ethanol/blue_hawaiian //pineapple juice, lemon juice, coconut rum, blue curacao + name = "Blue Hawaiian" + description = "Sweet, sharp and coconutty." + boozepwr = 30 + color = "#F54040" + quality = DRINK_NICE + taste_description = "the aloha state" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + #undef ALCOHOL_EXPONENT #undef ALCOHOL_THRESHOLD_MODIFIER diff --git a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm index 13a121bd247..4fe48c629ef 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/drink_reagents.dm @@ -615,12 +615,12 @@ /datum/reagent/consumable/wellcheers/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_drowsiness(3 SECONDS * REM * seconds_per_tick) - switch(affected_mob.mob_mood.mood_level) - if (MOOD_LEVEL_SAD4 to MOOD_LEVEL_SAD2) + switch(affected_mob.mob_mood.sanity_level) + if (SANITY_INSANE to SANITY_CRAZY) affected_mob.adjustStaminaLoss(3 * REM * seconds_per_tick, 0) - if (MOOD_LEVEL_SAD2 to MOOD_LEVEL_HAPPY2) + if (SANITY_UNSTABLE to SANITY_DISTURBED) affected_mob.add_mood_event("wellcheers", /datum/mood_event/wellcheers) - if (MOOD_LEVEL_HAPPY2 to MOOD_LEVEL_HAPPY4) + if (SANITY_NEUTRAL to SANITY_GREAT) affected_mob.adjustBruteLoss(-1.5 * REM * seconds_per_tick, 0) return ..() @@ -1160,3 +1160,58 @@ drinker.adjust_hallucinations(60 SECONDS * REM * seconds_per_tick) return ..() + +/datum/reagent/consumable/t_letter + name = "T" + description = "You expected to find this in a soup, but this is fine too." + color = "#583d09" // rgb: 88, 61, 9 + taste_description = "one of your 26 favorite letters" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/t_letter/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + if(!HAS_MIND_TRAIT(affected_mob, TRAIT_MIMING)) + return ..() + affected_mob.set_silence_if_lower(MIMEDRINK_SILENCE_DURATION) + affected_mob.adjust_drowsiness(-6 SECONDS * REM * seconds_per_tick) + affected_mob.AdjustSleeping(-40 * REM * seconds_per_tick) + if(affected_mob.getToxLoss() && SPT_PROB(25, seconds_per_tick)) + affected_mob.adjustToxLoss(-2, FALSE, required_biotype = affected_biotype) + return ..() + +/datum/reagent/consumable/hakka_mate + name = "Hakka-Mate" + description = "A Martian-made yerba mate soda, dragged straight out of the pits of a hacking convention." + color = "#c4b000" + taste_description = "bubbly yerba mate" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/coconut_milk + name = "Coconut Milk" + description = "A versatile milk substitute that's perfect for everything from cooking to making cocktails." + color = "#DFDFDF" + taste_description = "milky coconut" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/melon_soda + name = "Melon Soda" + description = "A neon green hit of nostalgia." + color = "#6FEB48" + taste_description = "fizzy melon" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/volt_energy + name = "24-Volt Energy" + description = "An artificially coloured and flavoured electric energy drink, in lanternfruit flavour. Made for ethereals, by ethereals." + color = "#99E550" + taste_description = "sour pear" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/volt_energy/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) + . = ..() + if(!(methods & (INGEST|INJECT|PATCH)) || !iscarbon(exposed_mob)) + return + + var/mob/living/carbon/exposed_carbon = exposed_mob + var/obj/item/organ/internal/stomach/ethereal/stomach = exposed_carbon.get_organ_slot(ORGAN_SLOT_STOMACH) + if(istype(stomach)) + stomach.adjust_charge(reac_volume * 3) diff --git a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/alcohol.dm b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/alcohol.dm index eda3827876c..bb9e5869ca8 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/alcohol.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/alcohol.dm @@ -175,6 +175,33 @@ desc = "Typically you'd want to mix this with something- but you do you." icon_state = "bitters" +/datum/glass_style/drinking_glass/coconut_rum + required_drink_type = /datum/reagent/consumable/ethanol/coconut_rum + name = "glass of coconut rum" + desc = "Breathe in and relax, you're on vacation until this glass is empty." + icon = 'icons/obj/drinks/drinks.dmi' + icon_state = "ginvodkaglass" + +/datum/glass_style/drinking_glass/yuyake + required_drink_type = /datum/reagent/consumable/ethanol/yuyake + name = "glass of yūyake" + desc = "It's the saccharine essence of the 70s in a glass... the 1970s, that is!" + icon = 'icons/obj/drinks/drinks.dmi' + icon_state = "glass_red" + +/datum/glass_style/drinking_glass/shochu + required_drink_type = /datum/reagent/consumable/ethanol/shochu + name = "glass of shochu" + desc = "A glass of strong rice wine." + icon = 'icons/obj/drinks/drinks.dmi' + icon_state = "ginvodkaglass" + +/datum/glass_style/drinking_glass/rice_beer + required_drink_type = /datum/reagent/consumable/ethanol/rice_beer + name = "glass of rice beer" + desc = "A glass of fine, light rice beer. Best enjoyed cold." + icon = 'icons/obj/drinks/drinks.dmi' + icon_state = "rice_beer" // Shot glasses diff --git a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/coffee_tea.dm b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/coffee_tea.dm index 79ba13a4acb..36a8877b820 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/coffee_tea.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/coffee_tea.dm @@ -73,3 +73,10 @@ name = "glass of mushroom tea" desc = "Oddly savoury for a drink." icon_state = "mushroom_tea_glass" + +/datum/glass_style/drinking_glass/t_letter + required_drink_type = /datum/reagent/consumable/t_letter + name = "glass of T" + desc = "The 20th." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "tletter" diff --git a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/dairy.dm b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/dairy.dm index 4a6592abe0e..e788a589ad1 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/dairy.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/dairy.dm @@ -32,3 +32,10 @@ name = "glass of cream" desc = "Ewwww..." icon_state = "glass_white" + +/datum/glass_style/drinking_glass/coconut_milk + required_drink_type = /datum/reagent/consumable/coconut_milk + name = "glass of coconut milk" + desc = "The essence of the tropics, contained safely within a glass." + icon = 'icons/obj/drinks/drinks.dmi' + icon_state = "glass_white" diff --git a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/mixed_alcohol.dm b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/mixed_alcohol.dm index 8d21cb75483..67802b9af20 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/mixed_alcohol.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/mixed_alcohol.dm @@ -905,6 +905,138 @@ icon = 'icons/obj/drinks/mixed_drinks.dmi' icon_state = "pod_tesla" +/datum/glass_style/drinking_glass/yuyakita + required_drink_type = /datum/reagent/consumable/ethanol/yuyakita + name = "Yūyakita" + desc = "And I looked, and behold a pale horse: and his name that sat on him was Death, and Hell followed with him." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "yuyakita" + +/datum/glass_style/drinking_glass/saibasan + required_drink_type = /datum/reagent/consumable/ethanol/saibasan + name = "Saibāsan" + desc = "A drink made in honour of Cybersun Industries' 600th year of continual business. Officially, you're meant to call this a \"Hong Kong Cooler\" on Nanotrasen stations, but that name sucks." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "saibasan" + +/datum/glass_style/drinking_glass/banzai_ti + required_drink_type = /datum/reagent/consumable/ethanol/banzai_ti + name = "Banzai-Tī" + desc = "A drink to last ten-thousand years- better sip slowly then." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "banzai_ti" + +/datum/glass_style/drinking_glass/sanraizusoda + required_drink_type = /datum/reagent/consumable/ethanol/sanraizusoda + name = "Sanraizusōda" + desc = "A popular children's dessert from Japan, made adult with the addition of booze. Kanpai!" + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "sanraizusoda" + +/datum/glass_style/drinking_glass/kumicho + required_drink_type = /datum/reagent/consumable/ethanol/kumicho + name = "Kumichō" + desc = "Much like the American Godfather, the Kumichō is sophisticated, strong, and almost certainly tied to illicit activities." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "kumicho" + +/datum/glass_style/drinking_glass/red_planet + required_drink_type = /datum/reagent/consumable/ethanol/red_planet + name = "Red Planet" + desc = "A patriotic drink from Mars, commonly enjoyed on September 15th: the day that peace was declared following the Martian uprising, with the Martian Concession granting Mars proper representation as part of the Terran Federation." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "red_planet" + +/datum/glass_style/drinking_glass/amaterasu + required_drink_type = /datum/reagent/consumable/ethanol/amaterasu + name = "Amaterasu" + desc = "And so Amaterasu emerged from the Heavenly Rock Cave, and light was restored to the world." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "amaterasu" + +/datum/glass_style/drinking_glass/nekomimosa + required_drink_type = /datum/reagent/consumable/ethanol/nekomimosa + name = "Nekomimosa" + desc = "A syrupy mess of a cocktail, dedicated to a felinid popstar that took Mars by storm a few years ago." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "nekomimosa" + +/datum/glass_style/drinking_glass/sentai_quencha + required_drink_type = /datum/reagent/consumable/ethanol/sentai_quencha + name = "Sentai Quencha" + desc = "Tastes like ultimate ninja power. And melon. And citrus. And some other stuff." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "sentai_quencha" + +/datum/glass_style/drinking_glass/bosozoku + required_drink_type = /datum/reagent/consumable/ethanol/bosozoku + name = "Bōsōzoku" + desc = "A refreshing summer drink enjoyed across Mars and beyond. Any resemblance to shandies or radlers is unintentional." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "bosozoku" + +/datum/glass_style/drinking_glass/ersatzche + required_drink_type = /datum/reagent/consumable/ethanol/ersatzche + name = "Ersatzche" + desc = "An interesting drink invented in the Blue Room Bar and Grill in New Osaka. It's a tasty take on Mexican tepache, made with a beer base." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "ersatzche" + +/datum/glass_style/drinking_glass/red_city_am + required_drink_type = /datum/reagent/consumable/ethanol/red_city_am + name = "Red City AM" + desc = "A popular breakfast drink from New Osaka's bars- for the enterprising day drinker." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "red_city_am" + +/datum/glass_style/drinking_glass/kings_ransom + required_drink_type = /datum/reagent/consumable/ethanol/kings_ransom + name = "King's Ransom" + desc = "A weird drink that manages to marry a number of seemingly conflicting flavours into a single harmonious taste." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "kings_ransom" + +/datum/glass_style/drinking_glass/four_bit + required_drink_type = /datum/reagent/consumable/ethanol/four_bit + name = "Four Bit" + desc = "Straight out of the pits of a Martian hacking convention." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "four_bit" + +/datum/glass_style/drinking_glass/white_hawaiian + required_drink_type = /datum/reagent/consumable/ethanol/white_hawaiian + name = "White Hawaiian" + desc = "One of the infinite variations on the White Russian, this drink gets away from the frozen north and into the heat of the ring of fire with a host of toasty coconut flavours." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "white_hawaiian" + +/datum/glass_style/drinking_glass/maui_sunrise + required_drink_type = /datum/reagent/consumable/ethanol/maui_sunrise + name = "Maui Sunrise" + desc = "Take a sip and be transported to the Aloha state. Metaphorically, of course." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "maui_sunrise" + +/datum/glass_style/drinking_glass/imperial_mai_tai + required_drink_type = /datum/reagent/consumable/ethanol/imperial_mai_tai + name = "Imperial Mai Tai" + desc = "I mean, who springs for orgeat these days anyway? Korta nut's the new big thing, baby." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "imperial_mai_tai" + +/datum/glass_style/drinking_glass/konococo_rumtini + required_drink_type = /datum/reagent/consumable/ethanol/konococo_rumtini + name = "Konococo Rumtini" + desc = "Considered an acceptable breakfast drink in Little Hawaii." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "konococo_rumtini" + +/datum/glass_style/drinking_glass/blue_hawaiian + required_drink_type = /datum/reagent/consumable/ethanol/blue_hawaiian + name = "Blue Hawaiian" + desc = "It's a tropical vacation in a glass." + icon = 'icons/obj/drinks/mixed_drinks.dmi' + icon_state = "blue_hawaiian" // Shot glasses diff --git a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/sodas.dm b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/sodas.dm index 75c03448b3d..467b80400fb 100644 --- a/code/modules/reagents/chemistry/reagents/drinks/glass_styles/sodas.dm +++ b/code/modules/reagents/chemistry/reagents/drinks/glass_styles/sodas.dm @@ -95,3 +95,24 @@ name = "Sol Dry" desc = "A soothing, mellow drink made from ginger." icon_state = "soldry" + +/datum/glass_style/drinking_glass/hakka_mate + required_drink_type = /datum/reagent/consumable/hakka_mate + name = "glass of Hakka-Mate" + desc = "The perfect drink for hacking. Just don't pour it on your computer, that'll only slow you down." + icon = 'icons/obj/drinks/drinks.dmi' + icon_state = "hakka_mate" + +/datum/glass_style/drinking_glass/melon_soda + required_drink_type = /datum/reagent/consumable/melon_soda + name = "glass of melon soda" + desc = "As enjoyed by Japanese children and 30-something Japan enthusiasts." + icon = 'icons/obj/drinks/drinks.dmi' + icon_state = "melon_soda" + +/datum/glass_style/drinking_glass/volt_energy + required_drink_type = /datum/reagent/consumable/volt_energy + name = "glass of 24-Volt Energy" + desc = "It's sharp, it's sour, it's electrifying!" + icon = 'icons/obj/drinks/drinks.dmi' + icon_state = "volt_energy" diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 57383fc35a1..0cc3d7beea8 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -1103,3 +1103,50 @@ affected_mob.investigate_log("has been gibbed by consuming [src] while fat.", INVESTIGATE_DEATHS) affected_mob.inflate_gib() return ..() + +/datum/reagent/consumable/worcestershire + name = "Worcestershire Sauce" + description = "That's \"Woostershire\" sauce, by the way." + nutriment_factor = 2 * REAGENTS_METABOLISM + color = "#572b26" + taste_description = "sweet fish" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + default_container = /obj/item/reagent_containers/condiment/worcestershire + +/datum/reagent/consumable/red_bay + name = "Red Bay Seasoning" + description = "A secret blend of herbs and spices that goes well with anything- according to Martians, at least." + color = "#8E4C00" + taste_description = "spice" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + default_container = /obj/item/reagent_containers/condiment/red_bay + +/datum/reagent/consumable/curry_powder + name = "Curry Powder" + description = "One of humanity's most common spices. Typically used to make curry." + color = "#F6C800" + taste_description = "dry curry" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + default_container = /obj/item/reagent_containers/condiment/curry_powder + +/datum/reagent/consumable/dashi_concentrate + name = "Dashi Concentrate" + description = "A concentrated form of dashi. Simmer with water in a 1:8 ratio to produce a tasty dashi broth." + color = "#372926" + taste_description = "extreme umami" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + default_container = /obj/item/reagent_containers/condiment/dashi_concentrate + +/datum/reagent/consumable/martian_batter + name = "Martian Batter" + description = "A thick batter made with dashi and flour, used for making dishes such as okonomiyaki and takoyaki." + color = "#D49D26" + taste_description = "umami dough" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/grounding_solution + name = "Grounding Solution" + description = "A food-safe ionic solution designed to neutralise the enigmatic \"liquid electricity\" that is common to food from Sprout, forming harmless salt on contact." + color = "#efeff0" + taste_description = "metallic salt" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED 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 33cefdbb890..8e09b318d1c 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 @@ -192,11 +192,11 @@ Basically, we fill the time between now and 2s from now with hands based off the /datum/reagent/peptides_failed name = "Prion Peptides" taste_description = "spearmint frosting" - description = "These inhibitory peptides cause cellular damage and cost nutrition to the patient!" + description = "These inhibitory peptides drains nutrition and causes brain damage in the patient!" ph = 2.1 /datum/reagent/peptides_failed/on_mob_life(mob/living/carbon/owner, seconds_per_tick, times_fired) - owner.adjustCloneLoss(0.25 * seconds_per_tick) + owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.25 * seconds_per_tick, 170) owner.adjust_nutrition(-5 * REAGENTS_METABOLISM * seconds_per_tick) . = ..() diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index ded0cc1f3da..86978985ff8 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -261,11 +261,11 @@ ph = 8.1 chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/medicine/spaceacillin/on_mob_metabolize(mob/living/L) +/datum/reagent/medicine/spaceacillin/on_mob_add(mob/living/L) . = ..() ADD_TRAIT(L, TRAIT_VIRUS_RESISTANCE, type) -/datum/reagent/medicine/spaceacillin/on_mob_end_metabolize(mob/living/L) +/datum/reagent/medicine/spaceacillin/on_mob_delete(mob/living/L) . = ..() REMOVE_TRAIT(L, TRAIT_VIRUS_RESISTANCE, type) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index acf52fb6c26..42edf6bee30 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2919,3 +2919,42 @@ if(SPT_PROB(10, seconds_per_tick)) carbon_metabolizer.set_heartattack(TRUE) + +/datum/reagent/hauntium + name = "Hauntium" + color = "#3B3B3BA3" + description = "An eerie liquid created by purifying the prescence of ghosts. If it happens to get in your body, it starts hurting your soul." //soul as in mood and heart + taste_description = "evil spirits" + metabolization_rate = 0.75 * REAGENTS_METABOLISM + material = /datum/material/hauntium + ph = 10 + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/hauntium/expose_obj(obj/exposed_obj, volume) //gives 15 seconds of haunting effect for every unit of it that touches an object + . = ..() + if(HAS_TRAIT_FROM(exposed_obj, TRAIT_HAUNTED, HAUNTIUM_REAGENT_TRAIT)) + return + exposed_obj.make_haunted(HAUNTIUM_REAGENT_TRAIT, "#f8f8ff") + addtimer(CALLBACK(exposed_obj, TYPE_PROC_REF(/atom/movable/, remove_haunted), HAUNTIUM_REAGENT_TRAIT), volume * 20 SECONDS) + +/datum/reagent/hauntium/on_mob_metabolize(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + to_chat(affected_mob, span_userdanger("You feel an evil presence inside you!")) + if(affected_mob.mob_biotypes & MOB_UNDEAD || HAS_MIND_TRAIT(affected_mob, TRAIT_MORBID)) + affected_mob.add_mood_event("morbid_hauntium", /datum/mood_event/morbid_hauntium, name) //8 minutes of slight mood buff if undead or morbid + else + affected_mob.add_mood_event("hauntium_spirits", /datum/mood_event/hauntium_spirits, name) //8 minutes of mood debuff + +/datum/reagent/hauntium/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + if(affected_mob.mob_biotypes & MOB_UNDEAD || HAS_MIND_TRAIT(affected_mob, TRAIT_MORBID)) //if morbid or undead,acts like an addiction-less drug + affected_mob.remove_status_effect(/datum/status_effect/jitter) + affected_mob.AdjustStun(-50 * REM * seconds_per_tick) + affected_mob.AdjustKnockdown(-50 * REM * seconds_per_tick) + affected_mob.AdjustUnconscious(-50 * REM * seconds_per_tick) + affected_mob.AdjustParalyzed(-50 * REM * seconds_per_tick) + affected_mob.AdjustImmobilized(-50 * REM * seconds_per_tick) + ..() + else + affected_mob.adjustOrganLoss(ORGAN_SLOT_HEART, REM * seconds_per_tick) //1 heart damage per tick + if(SPT_PROB(10, seconds_per_tick)) + affected_mob.emote(pick("twitch","choke","shiver","gag")) + ..() diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index fcc3c365b50..a9735cd7e75 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -11,6 +11,8 @@ chemical_flags = REAGENT_CAN_BE_SYNTHESIZED ///The amount of toxin damage this will cause when metabolized (also used to calculate liver damage) var/toxpwr = 1.5 + ///The amount to multiply the liver damage this toxin does by (Handled solely in liver code) + var/liver_damage_multiplier = 1 ///won't produce a pain message when processed by liver/life() if there isn't another non-silent toxin present if true var/silent_toxin = FALSE ///The afflicted must be above this health value in order for the toxin to deal damage @@ -1254,12 +1256,14 @@ name = "Spider Toxin" description = "A toxic chemical produced by spiders to weaken prey." health_required = 40 + liver_damage_multiplier = 0 /datum/reagent/toxin/viperspider name = "Viper Spider Toxin" toxpwr = 5 description = "An extremely toxic chemical produced by the rare viper spider. Brings their prey to the brink of death and causes hallucinations." health_required = 10 + liver_damage_multiplier = 0 /datum/reagent/toxin/viperspider/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) affected_mob.adjust_hallucinations(10 SECONDS * REM * seconds_per_tick) diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index 1b6c57fdf98..9248c22dbe9 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -950,3 +950,14 @@ for(var/i in rand(1, created_volume) to created_volume) new /mob/living/basic/ant(location) ..() + +/datum/chemical_reaction/hauntium_solidification + required_reagents = list(/datum/reagent/water/holywater = 10, /datum/reagent/hauntium = 20, /datum/reagent/iron = 1) + mob_react = FALSE + reaction_flags = REACTION_INSTANT + reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER + +/datum/chemical_reaction/hauntium_solidification/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i in 1 to created_volume) + new /obj/item/stack/sheet/hauntium(location) diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 5dc9fed83ce..b39eee137c1 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -125,7 +125,7 @@ /datum/chemical_reaction/slime/slimemobspawn/spider/summon_mobs(datum/reagents/holder, turf/T) T.visible_message(span_danger("The slime extract begins to vibrate crikey-ingly!")) - addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 3, "Traitor Spider Slime", /mob/living/basic/giant_spider/midwife, FACTION_NEUTRAL, FALSE), 50) + addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 3, "Traitor Spider Slime", /mob/living/basic/spider/giant/midwife, FACTION_NEUTRAL, FALSE), 50) //Silver diff --git a/code/modules/reagents/reagent_containers/condiment.dm b/code/modules/reagents/reagent_containers/condiment.dm index 726b593cf22..18a89f76a73 100644 --- a/code/modules/reagents/reagent_containers/condiment.dm +++ b/code/modules/reagents/reagent_containers/condiment.dm @@ -326,6 +326,51 @@ list_reagents = list(/datum/reagent/consumable/ketchup = 50) fill_icon_thresholds = null +/obj/item/reagent_containers/condiment/worcestershire + name = "worcestershire sauce" + desc = "A fermented sauce of legend from old England. Makes almost anything better." + icon_state = "worcestershire" + list_reagents = list(/datum/reagent/consumable/worcestershire = 50) + fill_icon_thresholds = null + +/obj/item/reagent_containers/condiment/red_bay + name = "\improper Red Bay seasoning" + desc = "Mars' favourite seasoning." + icon_state = "red_bay" + list_reagents = list(/datum/reagent/consumable/red_bay = 50) + fill_icon_thresholds = null + +/obj/item/reagent_containers/condiment/curry_powder + name = "curry powder" + desc = "It's this yellow magic that makes curry taste like curry." + icon_state = "curry_powder" + list_reagents = list(/datum/reagent/consumable/curry_powder = 50) + fill_icon_thresholds = null + +/obj/item/reagent_containers/condiment/dashi_concentrate + name = "dashi concentrate" + desc = "A bottle of Amagi brand dashi concentrate. Simmer with water in a 1:8 ratio for a perfect dashi broth." + icon_state = "dashi_concentrate" + list_reagents = list(/datum/reagent/consumable/dashi_concentrate = 50) + fill_icon_thresholds = null + +/obj/item/reagent_containers/condiment/coconut_milk + name = "coconut milk" + desc = "It's coconut milk. Toasty!" + icon_state = "coconut_milk" + inhand_icon_state = "carton" + lefthand_file = 'icons/mob/inhands/items/drinks_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items/drinks_righthand.dmi' + list_reagents = list(/datum/reagent/consumable/coconut_milk = 50) + fill_icon_thresholds = null + +/obj/item/reagent_containers/condiment/grounding_solution + name = "grounding solution" + desc = "A food-safe ionic solution designed to neutralise the enigmatic \"liquid electricity\" that is common to food from Sprout, forming harmless salt on contact." + icon_state = "grounding_solution" + list_reagents = list(/datum/reagent/consumable/grounding_solution = 50) + fill_icon_thresholds = null + //technically condiment packs but they are non transparent /obj/item/reagent_containers/condiment/creamer diff --git a/code/modules/reagents/reagent_containers/cups/glassbottle.dm b/code/modules/reagents/reagent_containers/cups/glassbottle.dm index 1e14311c89e..e2f445c6a1a 100644 --- a/code/modules/reagents/reagent_containers/cups/glassbottle.dm +++ b/code/modules/reagents/reagent_containers/cups/glassbottle.dm @@ -734,6 +734,30 @@ list_reagents = list(/datum/reagent/consumable/ethanol/mushi_kombucha = 30) isGlass = FALSE +/obj/item/reagent_containers/cup/glass/bottle/hakka_mate + name = "Hakka-Mate" + desc = "Hakka-Mate: it's an acquired taste." + icon_state = "hakka_mate_bottle" + list_reagents = list(/datum/reagent/consumable/hakka_mate = 30) + +/obj/item/reagent_containers/cup/glass/bottle/shochu + name = "Shu-Kouba Straight Shochu" + desc = "A boozier form of shochu designed for mixing. Comes straight from Mars' Dusty City itself, Shu-Kouba." + icon_state = "shochu_bottle" + list_reagents = list(/datum/reagent/consumable/ethanol/shochu = 100) + +/obj/item/reagent_containers/cup/glass/bottle/yuyake + name = "Moonlabor Yūyake" + desc = "The distilled essence of disco and flared pants, captured like lightning in a bottle." + icon_state = "yuyake_bottle" + list_reagents = list(/datum/reagent/consumable/ethanol/yuyake = 100) + +/obj/item/reagent_containers/cup/glass/bottle/coconut_rum + name = "Breezy Shoals Coconut Rum" + desc = "Live the breezy life with Breezy Shoals, made with only the *finest Caribbean rum." + icon_state = "coconut_rum_bottle" + list_reagents = list(/datum/reagent/consumable/ethanol/coconut_rum = 100) + ////////////////////////// MOLOTOV /////////////////////// /obj/item/reagent_containers/cup/glass/bottle/molotov name = "molotov cocktail" diff --git a/code/modules/reagents/reagent_containers/cups/soda.dm b/code/modules/reagents/reagent_containers/cups/soda.dm index bf751d075d7..0be90bc7a70 100644 --- a/code/modules/reagents/reagent_containers/cups/soda.dm +++ b/code/modules/reagents/reagent_containers/cups/soda.dm @@ -283,8 +283,51 @@ list_reagents = list(/datum/reagent/consumable/monkey_energy = 50) drink_type = SUGAR | JUNKFOOD +/obj/item/reagent_containers/cup/soda_cans/volt_energy + name = "24-Volt Energy" + desc = "Recharge, with 24-Volt Energy!" + icon_state = "volt_energy" + list_reagents = list(/datum/reagent/consumable/volt_energy = 30) + drink_type = SUGAR | JUNKFOOD + +/obj/item/reagent_containers/cup/soda_cans/melon_soda + name = "Kansumi Melon Soda" + desc = "Japan's favourite melon soda, now available in can form!" + icon_state = "melon_soda" + list_reagents = list(/datum/reagent/consumable/melon_soda = 30) + drink_type = SUGAR | JUNKFOOD + /obj/item/reagent_containers/cup/soda_cans/air name = "canned air" desc = "There is no air shortage. Do not drink." icon_state = "air" list_reagents = list(/datum/reagent/nitrogen = 24, /datum/reagent/oxygen = 6) + +/obj/item/reagent_containers/cup/soda_cans/beer + name = "space beer" + desc = "Canned beer. In space." + icon_state = "space_beer" + volume = 40 + list_reagents = list(/datum/reagent/consumable/ethanol/beer = 40) + drink_type = GRAIN + +/obj/item/reagent_containers/cup/soda_cans/beer/rice + name = "rice beer" + desc = "A light, rice-based lagered beer popular on Mars. Considered a hate crime against Bavarians under the Reinheitsgebot Act of 1516." + icon_state = "ebisu" + list_reagents = list(/datum/reagent/consumable/ethanol/rice_beer = 40) + +/obj/item/reagent_containers/cup/soda_cans/beer/rice/Initialize(mapload) + . = ..() + var/brand = pick("Ebisu Super Dry", "Shimauma Ichiban", "Moonlabor Malt's") + name = "[brand]" + switch(brand) + if("Ebisu Super Dry") + icon_state = "ebisu" + desc = "Mars' favourite rice beer brand, 200 years running." + if("Shimauma Ichiban") + icon_state = "shimauma" + desc = "Mars' most middling rice beer brand. Not as popular as Ebisu, but it's comfortable in second place." + if("Moonlabor Malt's") + icon_state = "moonlabor" + desc = "Mars' underdog rice beer brand. Popular amongst the Yakuza, for reasons unknown." diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index a70b7462005..b8b77d15561 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -255,6 +255,16 @@ /obj/item/reagent_containers/syringe/crude/update_reagent_overlay() return + // Used by monkeys from the elemental plane of bananas. Reagents come from bungo pit, death berries, destroying angel, jupiter cups, and jumping beans. +/obj/item/reagent_containers/syringe/crude/tribal + name = "tribal syringe" + desc = "A crudely made syringe. Smells like bananas." + +/obj/item/reagent_containers/syringe/crude/tribal/Initialize(mapload) + var/toxin_to_get = pick(/datum/reagent/toxin/bungotoxin, /datum/reagent/toxin/coniine, /datum/reagent/toxin/amanitin, /datum/reagent/consumable/liquidelectricity/enriched, /datum/reagent/ants) + list_reagents = list((toxin_to_get) = 5) + return ..() + /obj/item/reagent_containers/syringe/spider_extract name = "spider extract syringe" desc = "Contains crikey juice - makes any gold core create the most deadly companions in the world." diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index b73f04f1935..60f79d3615b 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -175,7 +175,7 @@ visible_message(span_danger("\The [src] explodes!")) // old code for reference: // standard fuel tank = 1000 units = heavy_impact_range = 1, light_impact_range = 5, flame_range = 5 - // big fuel tank =SHEET_MATERIAL_AMOUNT * 2.5 units = devastation_range = 1, heavy_impact_range = 2, light_impact_range = 7, flame_range = 12 + // big fuel tank = 5000 units = devastation_range = 1, heavy_impact_range = 2, light_impact_range = 7, flame_range = 12 // It did not account for how much fuel was actually in the tank at all, just the size of the tank. // I encourage others to better scale these numbers in the future. // As it stands this is a minor nerf in exchange for an easy bombing technique working that has been broken for a while. @@ -313,7 +313,7 @@ name = "high capacity fuel tank" desc = "A tank full of a high quantity of welding fuel. Keep away from open flames." icon_state = "fuel_high" - tank_volume =SHEET_MATERIAL_AMOUNT * 2.5 + tank_volume = 5000 /obj/structure/reagent_dispensers/fueltank/large/boom(damage_type = BRUTE, guaranteed_violent = FALSE) //SKYRAT EDIT CHANGE if(damage_type == BURN || guaranteed_violent) diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index fe21a4bd742..cfdecfcd73c 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -88,8 +88,9 @@ trunk = null return ..() -/obj/machinery/disposal/handle_atom_del(atom/A) - if(A == stored && !QDELETED(src)) +/obj/machinery/disposal/Exited(atom/movable/gone, direction) + . = ..() + if(gone == stored && !QDELETED(src)) stored = null deconstruct(FALSE) @@ -135,7 +136,7 @@ return ..() /// The regal rat spawns ratty treasures from the disposal -/obj/machinery/disposal/proc/rat_rummage(mob/living/simple_animal/hostile/regalrat/king) +/obj/machinery/disposal/proc/rat_rummage(mob/living/basic/regal_rat/king) king.visible_message(span_warning("[king] starts rummaging through [src]."),span_notice("You rummage through [src]...")) if (!do_after(king, 2 SECONDS, src, interaction_key = "regalrat")) return @@ -279,11 +280,13 @@ var/turf/T = loc if(!(flags_1 & NODECONSTRUCT_1)) if(stored) - stored.forceMove(T) - src.transfer_fingerprints_to(stored) - stored.set_anchored(FALSE) - stored.set_density(TRUE) - stored.update_appearance() + var/obj/structure/disposalconstruct/construct = stored + stored = null + construct.forceMove(T) + transfer_fingerprints_to(construct) + construct.set_anchored(FALSE) + construct.set_density(TRUE) + construct.update_appearance() for(var/atom/movable/AM in src) //out, out, darned crowbar! AM.forceMove(T) ..() @@ -545,10 +548,13 @@ return /// Handles the signal for the rat king looking inside the disposal -/obj/machinery/disposal/proc/on_rat_rummage(datum/source, mob/living/simple_animal/hostile/regalrat/king) +/obj/machinery/disposal/proc/on_rat_rummage(datum/source, mob/living/basic/regal_rat/king) SIGNAL_HANDLER + if(king.combat_mode) + return INVOKE_ASYNC(src, TYPE_PROC_REF(/obj/machinery/disposal/, rat_rummage), king) + return COMPONENT_RAT_INTERACTED /// Handles a carbon mob getting shoved into the disposal bin /obj/machinery/disposal/proc/trash_carbon(datum/source, mob/living/carbon/shover, mob/living/carbon/target, shove_blocked) diff --git a/code/modules/recycling/disposal/pipe.dm b/code/modules/recycling/disposal/pipe.dm index c5d60979c58..30573746f5e 100644 --- a/code/modules/recycling/disposal/pipe.dm +++ b/code/modules/recycling/disposal/pipe.dm @@ -76,10 +76,13 @@ expel(holdplease, get_turf(src), 0) stored = null // It gets dumped out in expel() -/obj/structure/disposalpipe/handle_atom_del(atom/A) - if(A == stored && !QDELETED(src)) - spawn_pipe = FALSE - stored = null +/obj/structure/disposalpipe/Exited(atom/movable/gone, direction) + . = ..() + if(gone != stored || QDELETED(src)) + return + spawn_pipe = FALSE + stored = null + if(QDELETED(gone)) deconstruct(FALSE) //pipe has broken. // returns the direction of the next pipe object, given the entrance dir @@ -171,12 +174,13 @@ if(!(flags_1 & NODECONSTRUCT_1)) if(disassembled) if(spawn_pipe) - if(isnull(stored)) // Don't have something? Make one now - stored = new /obj/structure/disposalconstruct(src, null, SOUTH, FALSE, src) - stored.forceMove(loc) - transfer_fingerprints_to(stored) - stored.setDir(dir) + var/obj/structure/disposalconstruct/construct = stored + if(!construct) // Don't have something? Make one now + construct = new /obj/structure/disposalconstruct(src, null, SOUTH, FALSE, src) stored = null + construct.forceMove(loc) + transfer_fingerprints_to(construct) + construct.setDir(dir) spawn_pipe = FALSE else var/turf/T = get_turf(src) @@ -317,6 +321,22 @@ // broken pipes always have dpdir=0 so they're not found as 'real' pipes // i.e. will be treated as an empty turf spawn_pipe = FALSE + anchored = FALSE /obj/structure/disposalpipe/broken/deconstruct() qdel(src) + +/obj/structure/disposalpipe/rotator + icon_state = "pipe-r1" + initialize_dirs = DISP_DIR_LEFT | DISP_DIR_RIGHT | DISP_DIR_FLIP + flip_type = /obj/structure/disposalpipe/rotator/flip + /// In what direction the atom travels. + var/direction_angle = -90 + +/obj/structure/disposalpipe/rotator/nextdir(obj/structure/disposalholder/holder) + return turn(holder.dir, direction_angle) + +/obj/structure/disposalpipe/rotator/flip + icon_state = "pipe-r2" + flip_type = /obj/structure/disposalpipe/rotator + direction_angle = 90 diff --git a/code/modules/requests/request_manager.dm b/code/modules/requests/request_manager.dm index 771cb4262a0..41e46aa53c2 100644 --- a/code/modules/requests/request_manager.dm +++ b/code/modules/requests/request_manager.dm @@ -66,7 +66,7 @@ GLOBAL_DATUM_INIT(requests, /datum/request_manager, new) /datum/request_manager/proc/pray(client/C, message, is_chaplain) request_for_client(C, REQUEST_PRAYER, message) for(var/client/admin in GLOB.admins) - if(is_chaplain && admin.prefs.chat_toggles & CHAT_PRAYER && admin.prefs.toggles & SOUND_PRAYERS) + if(is_chaplain && get_chat_toggles(admin) & CHAT_PRAYER && admin.prefs.toggles & SOUND_PRAYERS) SEND_SOUND(admin, sound('sound/effects/pray.ogg')) /** diff --git a/code/modules/research/designs/autolathe/security_designs.dm b/code/modules/research/designs/autolathe/security_designs.dm index 1a41e1aa89e..c3a0a082d28 100644 --- a/code/modules/research/designs/autolathe/security_designs.dm +++ b/code/modules/research/designs/autolathe/security_designs.dm @@ -186,12 +186,12 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SECURITY -/datum/design/a762surplus - name = "7.62 Surplus Bullet Casing" - id = "a762surplus" +/datum/design/strilka310_surplus + name = ".310 Surplus Bullet Casing (VERY Lethal)" + id = "strilka310_surplus" build_type = AUTOLATHE materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*2) - build_path = /obj/item/ammo_casing/a762/surplus + build_path = /obj/item/ammo_casing/strilka310/surplus category = list( RND_CATEGORY_HACKED, RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index d4e70865982..6597c12fbec 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -874,17 +874,6 @@ ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL -/datum/design/board/spaceship_navigation_beacon - name = "Bluespace Navigation Gigabeacon Board" - desc = "The circuit board for a Bluespace Navigation Gigabeacon." - id = "spaceship_navigation_beacon" - build_type = IMPRINTER - build_path = /obj/item/circuitboard/machine/spaceship_navigation_beacon - category = list( - RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_TELEPORT - ) - departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SCIENCE - /datum/design/board/medical_kiosk name = "Medical Kiosk Board" desc = "The circuit board for a Medical Kiosk." diff --git a/code/modules/research/designs/mecha_designs.dm b/code/modules/research/designs/mecha_designs.dm index b8e08996d93..c495bdc9e47 100644 --- a/code/modules/research/designs/mecha_designs.dm +++ b/code/modules/research/designs/mecha_designs.dm @@ -227,13 +227,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -251,13 +244,6 @@ build_path = /obj/item/mecha_ammo/scattershot materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*3) construction_time = 20 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -275,13 +261,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -299,13 +278,6 @@ build_path = /obj/item/mecha_ammo/incendiary materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*3) construction_time = 20 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -323,13 +295,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/ion materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10,/datum/material/silver=SHEET_MATERIAL_AMOUNT*3,/datum/material/uranium=SHEET_MATERIAL_AMOUNT) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -347,13 +312,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/tesla materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10,/datum/material/silver=SHEET_MATERIAL_AMOUNT*4) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -371,13 +329,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -395,13 +346,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -419,13 +363,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/disabler materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -443,13 +380,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*11,/datum/material/gold=SHEET_MATERIAL_AMOUNT*3,/datum/material/silver=SHEET_MATERIAL_AMOUNT*4) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -467,13 +397,6 @@ build_path = /obj/item/mecha_ammo/flashbang materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*2,/datum/material/gold=SMALL_MATERIAL_AMOUNT*5) construction_time = 20 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -491,13 +414,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/breaching materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*11,/datum/material/gold=SHEET_MATERIAL_AMOUNT*3,/datum/material/silver=SHEET_MATERIAL_AMOUNT*4) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -515,13 +431,6 @@ build_path = /obj/item/mecha_ammo/missiles_pep materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*4,/datum/material/gold=SMALL_MATERIAL_AMOUNT*5) construction_time = 20 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -539,13 +448,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/clusterbang materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10,/datum/material/gold=SHEET_MATERIAL_AMOUNT*5,/datum/material/uranium=SHEET_MATERIAL_AMOUNT*5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -563,13 +465,6 @@ build_path = /obj/item/mecha_ammo/clusterbang materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*3,/datum/material/gold=HALF_SHEET_MATERIAL_AMOUNT * 1.5,/datum/material/uranium=HALF_SHEET_MATERIAL_AMOUNT * 1.5) construction_time = 20 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_WEAPONS, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -587,16 +482,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/wormhole_generator materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_ODYSSEUS, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MISC, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -617,16 +502,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/teleporter materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5,/datum/material/diamond=SHEET_MATERIAL_AMOUNT*5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_ODYSSEUS, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MISC, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -647,16 +522,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/rcd materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*15,/datum/material/gold=SHEET_MATERIAL_AMOUNT*10,/datum/material/plasma=SHEET_MATERIAL_AMOUNT*12.5,/datum/material/silver=SHEET_MATERIAL_AMOUNT*10) construction_time = 1200 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_ODYSSEUS, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MISC, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -677,16 +542,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/thrusters/gas materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*12.5,/datum/material/titanium=SHEET_MATERIAL_AMOUNT * 2.5,/datum/material/silver=SHEET_MATERIAL_AMOUNT*1.5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_ODYSSEUS, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MODULES, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -707,16 +562,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/gravcatapult materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_ODYSSEUS, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MISC, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -737,16 +582,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/repair_droid materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5,/datum/material/glass =SHEET_MATERIAL_AMOUNT * 2.5,/datum/material/gold=HALF_SHEET_MATERIAL_AMOUNT,/datum/material/silver=SHEET_MATERIAL_AMOUNT) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_ODYSSEUS, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MODULES, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -767,16 +602,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/armor/anticcw_armor_booster materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10,/datum/material/silver=SHEET_MATERIAL_AMOUNT * 2.5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_ODYSSEUS, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MODULES, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -797,16 +622,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10,/datum/material/gold=SHEET_MATERIAL_AMOUNT * 2.5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_ODYSSEUS, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MODULES, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -827,11 +642,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/drill/diamonddrill materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5,/datum/material/diamond=SHEET_MATERIAL_AMOUNT*3.25) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, @@ -847,15 +657,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*4, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/plasma =SHEET_MATERIAL_AMOUNT) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -875,15 +676,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/mecha_kineticgun materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*4, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -903,12 +695,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -925,12 +711,6 @@ build_path = /obj/item/mecha_ammo/lmg materials = list(/datum/material/iron= SHEET_MATERIAL_AMOUNT *2) construction_time = 20 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_PHAZON, - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -947,10 +727,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/medical/sleeper materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT * 2.5, /datum/material/glass = SHEET_MATERIAL_AMOUNT*5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_ODYSSEUS - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MEDICAL, RND_CATEGORY_MECHFAB_ODYSSEUS + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT @@ -965,10 +741,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*1.5, /datum/material/glass =SHEET_MATERIAL_AMOUNT) construction_time = 200 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_ODYSSEUS - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MEDICAL, RND_CATEGORY_MECHFAB_ODYSSEUS + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT @@ -983,10 +755,6 @@ materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*7.5, /datum/material/glass = SHEET_MATERIAL_AMOUNT*4, /datum/material/plasma =SHEET_MATERIAL_AMOUNT*1.5, /datum/material/gold = SHEET_MATERIAL_AMOUNT*4, /datum/material/diamond =SHEET_MATERIAL_AMOUNT) construction_time = 250 build_path = /obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_ODYSSEUS - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MEDICAL, RND_CATEGORY_MECHFAB_ODYSSEUS + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 2b329c32c28..7d7c81fdfd4 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -806,15 +806,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/drill materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -833,11 +824,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/mining_scanner materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT * 2.5,/datum/material/glass = SHEET_MATERIAL_AMOUNT *1.25) construction_time = 50 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -851,11 +837,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/extinguisher materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MISC, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -869,15 +850,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/generator materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5,/datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT,/datum/material/silver=SHEET_MATERIAL_AMOUNT,/datum/material/plasma=SHEET_MATERIAL_AMOUNT * 2.5) construction_time = 100 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MISC, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -896,10 +868,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/mousetrap_mortar materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10,/datum/material/bananium=SHEET_MATERIAL_AMOUNT * 2.5) construction_time = 300 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_HONK, RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT @@ -913,10 +881,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10,/datum/material/bananium=SHEET_MATERIAL_AMOUNT * 2.5) construction_time = 300 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_HONK, RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT @@ -930,10 +894,6 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/honker materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10,/datum/material/bananium=SHEET_MATERIAL_AMOUNT*5) construction_time = 500 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_HONK, RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT @@ -947,16 +907,48 @@ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*10,/datum/material/bananium=SHEET_MATERIAL_AMOUNT*3.75) construction_time = 400 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_HONK - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_HONK, RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE +/datum/design/mech_radio + name = "Mech Radio" + id = "mech_radio" + build_type = MECHFAB + build_path = /obj/item/mecha_parts/mecha_equipment/radio + materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*2.5) + construction_time = 100 + category = list( + RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, + RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/mech_air_tank + name = "Mech Air Tank" + id = "mech_air_tank" + build_type = MECHFAB + build_path = /obj/item/mecha_parts/mecha_equipment/air_tank + materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*5) + construction_time = 100 + category = list( + RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MINING, + RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, + RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + ///////////////////////////////////////// //////////////Borg Upgrades////////////// ///////////////////////////////////////// @@ -1350,15 +1342,6 @@ build_path =/obj/item/mecha_parts/mecha_tracking materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*5) construction_time = 50 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_MISC, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT, @@ -1377,15 +1360,6 @@ build_path = /obj/item/mecha_parts/mecha_tracking/ai_control materials = list(/datum/material/iron =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5, /datum/material/silver =SMALL_MATERIAL_AMOUNT * 2) construction_time = 50 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_CONTROL_INTERFACES, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_CONTROL_INTERFACES, @@ -1405,15 +1379,6 @@ build_path = /obj/item/mecha_parts/camera_kit materials = list(/datum/material/iron =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5, /datum/material/plasma =SMALL_MATERIAL_AMOUNT * 2, /datum/material/titanium =SMALL_MATERIAL_AMOUNT * 2) construction_time = 50 - category = list( - RND_CATEGORY_MECHFAB_EQUIPMENT, - RND_CATEGORY_MECHFAB_RIPLEY, - RND_CATEGORY_MECHFAB_GYGAX, - RND_CATEGORY_MECHFAB_DURAND, - RND_CATEGORY_MECHFAB_HONK, - RND_CATEGORY_MECHFAB_PHAZON, - RND_CATEGORY_MECHFAB_CLARKE - ) category = list( RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_CONTROL_INTERFACES, RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_CONTROL_INTERFACES, @@ -1575,6 +1540,18 @@ RND_CATEGORY_MODSUITS + RND_SUBCATEGORY_MODSUITS_MISC ) +/datum/design/modlink_scryer + name = "MODlink Scryer" + desc = "A neck-worn piece of gear that can call with another MODlink-compatible device." + id = "modlink_scryer" + build_type = MECHFAB + materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/gold = SMALL_MATERIAL_AMOUNT * 3, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 3) + construction_time = 5 SECONDS + build_path = /obj/item/clothing/neck/link_scryer + category = list( + RND_CATEGORY_MODSUITS + RND_SUBCATEGORY_MODSUITS_MISC + ) + //MODsuit modules /datum/design/module diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index c1e91330ddb..8bf7723e4bb 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -454,6 +454,11 @@ ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL +/datum/design/cyberimp_xray/moth + name = "Moth X-ray Eyes" + id = "ci-xray-moth" + build_path = /obj/item/organ/internal/eyes/robotic/xray/moth + /datum/design/cyberimp_thermals name = "Thermal Eyes" desc = "These cybernetic eyes will give you Thermal vision. Vertical slit pupil included." @@ -474,6 +479,11 @@ ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL +/datum/design/cyberimp_thermals/moth + name = "Moth Thermal Eyes" + id = "ci-thermals-moth" + build_path = /obj/item/organ/internal/eyes/robotic/thermals/moth + /datum/design/cyberimp_antidrop name = "Anti-Drop Implant" desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle." @@ -868,6 +878,11 @@ ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL +/datum/design/cybernetic_eyes/moth + name = "Basic Cybernetic Moth Eyes" + id = "cybernetic_eyes_moth" + build_path = /obj/item/organ/internal/eyes/robotic/basic/moth + /datum/design/cybernetic_eyes/improved name = "Cybernetic Eyes" desc = "A pair of cybernetic eyes." @@ -878,6 +893,11 @@ ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL +/datum/design/cybernetic_eyes/improved/moth + name = "Cybernetic Moth Eyes" + id = "cybernetic_eyes_improved_moth" + build_path = /obj/item/organ/internal/eyes/robotic/moth + /datum/design/cyberimp_welding name = "Welding Shield Eyes" desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision." @@ -891,6 +911,11 @@ ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL +/datum/design/cyberimp_welding/moth + name = "Welding Shield Moth Eyes" + id = "ci-welding-moth" + build_path = /obj/item/organ/internal/eyes/robotic/shield/moth + /datum/design/cyberimp_gloweyes name = "Luminescent Eyes" desc = "A pair of cybernetic eyes that can emit multicolored light" @@ -904,6 +929,11 @@ ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL +/datum/design/cyberimp_gloweyes/moth + name = "Luminescent Moth Eyes" + id = "ci-gloweyes-moth" + build_path = /obj/item/organ/internal/eyes/robotic/glow/moth + ///////////////////// ///Surgery Designs/// ///////////////////// diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 03f512a3e09..3f4d4b8f8ec 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -1034,6 +1034,18 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SERVICE +/datum/design/radio_navigation_beacon + name = "Compact Radio Navigation Gigabeacon" + id = "gigabeacon" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT) + build_path = /obj/item/folded_navigation_gigabeacon + category = list( + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_ENGINEERING + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_CARGO + // Experimental designs /datum/design/polymorph_belt diff --git a/code/modules/research/designs/tool_designs.dm b/code/modules/research/designs/tool_designs.dm index 8bb0802f286..ed617fb9ac1 100644 --- a/code/modules/research/designs/tool_designs.dm +++ b/code/modules/research/designs/tool_designs.dm @@ -135,6 +135,39 @@ ) departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING +/datum/design/rcd_upgrade/anti_interrupt + name = "RCD anti disruption designs upgrade" + desc = "Prevents interruption of RCD construction and deconstruction." + id = "rcd_upgrade_anti_interrupt" + build_type = PROTOLATHE + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2.5, + /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1.25, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT * 1.5, + /datum/material/titanium = SHEET_MATERIAL_AMOUNT, + ) + build_path = /obj/item/rcd_upgrade/anti_interrupt + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_ENGINEERING_ADVANCED + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design/rcd_upgrade/cooling + name = "RCD cooling upgrade" + desc = "Allows the RCD to more quickly perform multiple actions at once." + id = "rcd_upgrade_cooling" + build_type = PROTOLATHE + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/glass = SHEET_MATERIAL_AMOUNT, + /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT, + ) + build_path = /obj/item/rcd_upgrade/cooling + category = list( + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_ENGINEERING_ADVANCED + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + /datum/design/rcd_upgrade/furnishing name = "RCD furnishing upgrade" desc = "Adds the ability to furnish areas using the RCD." diff --git a/code/modules/research/designs/wiremod_designs.dm b/code/modules/research/designs/wiremod_designs.dm index 7e40b8e9f2b..a3b4a9a8866 100644 --- a/code/modules/research/designs/wiremod_designs.dm +++ b/code/modules/research/designs/wiremod_designs.dm @@ -276,6 +276,17 @@ id = "comp_list_remove" build_path = /obj/item/circuit_component/variable/list/listremove +/datum/design/component/assoc_list_set + name = "Associative List Set" + id = "comp_assoc_list_set" + build_path = /obj/item/circuit_component/variable/assoc_list/list_set + +/datum/design/component/assoc_list_remove + name = "Associative List Remove" + id = "comp_assoc_list_remove" + build_path = /obj/item/circuit_component/variable/assoc_list/list_remove + + /datum/design/component/list_clear name = "List Clear" id = "comp_list_clear" diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index 081dc7b6ab6..f7781d7c8c0 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -304,8 +304,7 @@ // borg.cell.use(SILICON_LATHE_TAX) // BUBBED EDIT - LATHE TAX CONFIG lathe_tax() // BUBBER EDIT ADDITION - LATHE TAX CONFIG //consume materials - materials.mat_container.use_materials(design.materials, coefficient, print_quantity) - materials.silo_log(src, "built", -print_quantity, "[design.name]", design.materials) + materials.use_materials(design.materials, coefficient, print_quantity, "built", "[design.name]") for(var/reagent in design.reagents_list) reagents.remove_reagent(reagent, design.reagents_list[reagent] * print_quantity * coefficient) //produce item diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index cb54716675e..7665082f698 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -102,7 +102,7 @@ /obj/machinery/rnd/server/multitool_act(mob/living/user, obj/item/multitool/tool) if(!stored_research) return - tool.buffer = stored_research + tool.set_buffer(stored_research) to_chat(user, span_notice("Stored [src]'s techweb information in [tool].")) return TRUE diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 32a967927ac..4b74f39198f 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -84,13 +84,11 @@ "plastitanium", "plastitaniumglass", "plate", - "polarizer", // SKYRAT EDIT ADDITION - Polarized windows "prox_sensor", "radio_headset", "rdconsole", "rdserver", "rdservercontrol", - "receiver", "recorder", "rglass", "roll", @@ -127,7 +125,6 @@ "turret_control", "universal_scanner", "voice_analyzer", - "vox_gas_filter", //SKYRAT EDIT ADDITION "watering_can", ) @@ -159,10 +156,6 @@ "cyborgrecharger", "robocontrol", "sflash", - - //SKYRAT EDIT START - RESEARCH DESIGNS - "affection_module", - //SKYRAT EDIT END - RESEARCH DESIGNS ) /datum/techweb_node/mech @@ -171,7 +164,6 @@ display_name = "Mechanical Exosuits" description = "Mechanized exosuits that are several magnitudes stronger and more powerful than the average human." design_ids = list( - "mech_hydraulic_clamp", "mech_recharger", "mecha_tracking", "mechacontrol", @@ -185,6 +177,10 @@ "ripley_right_leg", "ripley_torso", "ripleyupgrade", + "mech_hydraulic_clamp", + "mech_radio", + "mech_air_tank", + "mech_thrusters", ) /datum/techweb_node/mod_basic @@ -257,12 +253,7 @@ "wirebrush", "wirecutters", "wrench", - - //SKYRAT EDIT START - RESEARCH DESIGNS - "bowl", - "drinking_glass", - "shot_glass", - //SKYRAT EDIT END - RESEARCH DESIGNS + "pickaxe", ) /datum/techweb_node/basic_medical @@ -279,6 +270,7 @@ "circular_saw", "cybernetic_ears", "cybernetic_eyes", + "cybernetic_eyes_moth", "cybernetic_heart", "cybernetic_liver", "cybernetic_lungs", @@ -304,17 +296,6 @@ "swab", "syringe", "xlarge_beaker", - - //SKYRAT EDIT START - RESEARCH DESIGNS - "hospital_gown", - "synth_eyes", - "synth_tongue", - "synth_liver", - "synth_lungs", - "synth_stomach", - "synth_ears", - "synth_heart", - //SKYRAT EDIT END - RESEARCH DESIGNS ) /datum/techweb_node/basic_circuitry @@ -327,6 +308,8 @@ "comp_access_checker", "comp_arithmetic", "comp_assoc_list_pick", + "comp_assoc_list_remove", + "comp_assoc_list_set", "comp_binary_convert", "comp_clock", "comp_comparison", @@ -411,10 +394,6 @@ "chem_dispenser", "chem_heater", "chem_mass_spec", - //SKYRAT EDIT - RESEARCH DESIGNS - "anesthetic_machine", - "smartdartgun", - //SKYRAT EDIT - END "chem_master", "chem_pack", "defibmount", @@ -431,8 +410,6 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) required_experiments = list(/datum/experiment/autopsy/human) - -// SKYRAT EDIT BEGIN - MATERIAL MEAT WAS REMOVED /datum/techweb_node/adv_biotech id = "adv_biotech" display_name = "Advanced Biotechnology" @@ -451,26 +428,13 @@ "piercesyringe", "plasmarefiller", "smoke_machine", - - //SKYRAT EDIT START - RESEARCH DESIGNS - "monkey_helmet", - "brute2medicell", - "burn2medicell", - "toxin2medicell", - "oxy2medicell", - "relocatemedicell", - "tempmedicell", - "bodymedicell", - "clotmedicell", - //SKYRAT EDIT END - - //BUBBER EDIT START "crewmonitor", //BUBBER EDIT END ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) required_experiments = list(/datum/experiment/autopsy/nonhuman) - discount_experiments = list(/datum/experiment/scanning/random/material/silver = 4000) // SKYRAT EDIT CHANGE - ORIGINAL : discount_experiments = list(/datum/experiment/scanning/random/material/meat = 4000) + discount_experiments = list(/datum/experiment/scanning/random/material/meat = 4000) /datum/techweb_node/xenoorgan_biotech id = "xenoorgan_bio" @@ -627,6 +591,7 @@ "emitter", "firealarm_electronics", "firelock_board", + "generic_tank", "grounding_rod", "high_cell", "high_micro_laser", @@ -678,13 +643,6 @@ "sheetifier", "weldingmask", "bolter_wrench", - //SKYRAT EDIT START - RESEARCH DESIGNS - "engine_goggles_prescription", - "mesons_prescription", - "multi_cell_charger", - "tray_goggles_prescription", - "plumbing_eng", - //SKYRAT EDIT END - RESEARCH DESIGNS ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 15000) discount_experiments = list( @@ -828,16 +786,6 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000) discount_experiments = list(/datum/experiment/scanning/points/machinery_pinpoint_scan/tier3_cells = 3000) -/datum/techweb_node/regulated_bluespace - id = "regulated_bluespace" - display_name = "Regulated Bluespace Research" - description = "Bluespace technology using stable and balanced procedures. Required by galactic convention for public use." - prereq_ids = list("base") - design_ids = list( - "spaceship_navigation_beacon", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - /datum/techweb_node/unregulated_bluespace id = "unregulated_bluespace" display_name = "Unregulated Bluespace Research" @@ -945,7 +893,6 @@ "paicard", "mecha_camera", "botnavbeacon", - "borg_upgrade_snacks", // SKYRAT ADDITION - BETTER BORG SNACK DISPENSORS ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) @@ -990,7 +937,6 @@ prereq_ids = list("biotech", "datatheory") design_ids = list( "skill_station", - "soulcatcher_device", //SKYRAT EDIT SOULCATCHERS ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) @@ -1007,11 +953,6 @@ "borg_upgrade_selfrepair", "borg_upgrade_thrusters", "borg_upgrade_trashofholding", - - //SKYRAT EDIT START - RESEARCH DESIGNS - "borg_upgrade_clamp", - "borg_upgrade_brush", - //SKYRAT EDIT END - RESEARCH DESIGNS ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) @@ -1046,10 +987,6 @@ "borg_upgrade_lavaproof", "borg_upgrade_rped", "borg_upgrade_hypermod", - // SKYRAT EDIT ADD START - "advanced_materials", - "inducer_module", - // SKYRAT EDIT ADD END //BUBBER EDIT ADD START "borg_upgrade_ewelder", "borg_upgrade_advcutter", @@ -1069,10 +1006,6 @@ "borg_upgrade_piercinghypospray", "borg_upgrade_pinpointer", "borg_upgrade_surgicalprocessor", - - //SKYRAT EDIT START - RESEARCH DESIGNS - "borg_upgrade_surgicaltools", - //SKYRAT EDIT END - RESEARCH DESIGNS ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) @@ -1156,10 +1089,6 @@ "inducer", "tray_goggles", "holopad", - //SKYRAT EDIT - ADDITION MEDIGUNS - "gownmedicell", - "bedmedicell", - //SKYRAT EDIT END "vendatray", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) @@ -1227,7 +1156,6 @@ "cargo", "cargorequest", "comconsole", - "time_clock_frame", //SKYRAT EDIT ADDITION - TIME CLOCKS "bankmachine", "crewconsole", "idcard", @@ -1306,6 +1234,7 @@ "s_server", "s_transmitter", "s_treatment", + "gigabeacon", ) /datum/techweb_node/integrated_hud @@ -1318,31 +1247,6 @@ "health_hud", "scigoggles", "security_hud", - - //SKYRAT EDIT START - RESEARCH DESIGNS - "health_hud_prescription", - "security_hud_prescription", - "diagnostic_hud_prescription", - "science_hud_prescription", - "health_hud_aviator", - "security_hud_aviator", - "diagnostic_hud_aviator", - "meson_hud_aviator", - "science_hud_aviator", - "health_hud_projector", - "security_hud_projector", - "diagnostic_hud_projector", - "meson_hud_projector", - "science_hud_projector", - "permit_glasses", - "nifsoft_money_sense", - "nifsoft_hud_kit", - "nifsoft_hud_science", - "nifsoft_hud_medical", - "nifsoft_hud_security", - "nifsoft_hud_diagnostic", - "nifsoft_hud_cargo", - //SKYRAT EDIT END - RESEARCH DESIGNS ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500) @@ -1372,7 +1276,6 @@ "dnainfuser", "dnascanner", "scan_console", - "self_actualization_device", // SKYRAT EDIT ADDITION: Added the Self-Actualization Device ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) @@ -1412,11 +1315,11 @@ design_ids = list( "cybernetic_ears_u", "cybernetic_eyes_improved", + "cybernetic_eyes_improved_moth", "cybernetic_heart_tier2", "cybernetic_liver_tier2", "cybernetic_lungs_tier2", "cybernetic_stomach_tier2", - "cybernetic_tongue", //SKYRAT EDIT ADDITION ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) @@ -1435,6 +1338,8 @@ "cybernetic_ears_xray", "ci-gloweyes", "ci-welding", + "ci-gloweyes-moth", + "ci-welding-moth", "cybernetic_heart_tier3", "cybernetic_liver_tier3", "cybernetic_lungs_tier3", @@ -1489,11 +1394,14 @@ display_name = "Combat Cybernetic Implants" description = "Military grade combat implants to improve performance." prereq_ids = list("adv_cyber_implants","weaponry","NVGtech","high_efficiency") -// SKYRAT EDIT - REMOVED: X-rays+Thermals from here design_ids = list( "ci-antidrop", "ci-antistun", + "ci-thermals", "ci-thrusters", + "ci-xray", + "ci-thermals-moth", + "ci-xray-moth", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) @@ -1565,20 +1473,19 @@ id = "botany" display_name = "Botanical Engineering" description = "Botanical tools" - prereq_ids = list("adv_engi", "biotech") + prereq_ids = list("biotech") design_ids = list( "biogenerator", "flora_gun", - //SKYRAT EDIT - ADDITION MEDIGUNS - "salvemedicell", - //SKYRAT EDIT END + "gene_shears", "hydro_tray", "portaseeder", "seed_extractor", "adv_watering_can", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000) - discount_experiments = list(/datum/experiment/scanning/random/plants/wild = 3000) + required_experiments = list(/datum/experiment/scanning/random/plants/wild) + discount_experiments = list(/datum/experiment/scanning/random/plants/traits = 3000) /datum/techweb_node/exp_tools id = "exp_tools" @@ -1587,7 +1494,6 @@ prereq_ids = list("adv_engi") design_ids = list( "exwelder", - "gene_shears", "handdrill", "jawsoflife", "laserscalpel", @@ -1611,7 +1517,6 @@ "seclite", "zipties", "inspector", - "nifsoft_remover", //SKYRAT EDIT ADDITION - NIFs ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) @@ -1621,6 +1526,8 @@ description = "Unlocks new designs that improve rapid devices." prereq_ids = list("adv_engi") design_ids = list( + "rcd_upgrade_anti_interrupt", + "rcd_upgrade_cooling", "rcd_upgrade_frames", "rcd_upgrade_furnishing", "rcd_upgrade_simple_circuits", @@ -1651,7 +1558,6 @@ design_ids = list( "pin_testing", "tele_shield", - "ammoworkbench_disk_lethal", //SKYRAT EDIT ADDITION ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 20000) discount_experiments = list(/datum/experiment/ordnance/explosive/pressurebomb = 10000) @@ -1663,7 +1569,6 @@ prereq_ids = list("adv_engi", "weaponry") design_ids = list( "pin_loyalty", - "ammo_workbench", //SKYRAT EDIT ADDITION ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) @@ -1675,10 +1580,6 @@ design_ids = list( "ioncarbine", "stunrevolver", - - //SKYRAT EDIT START - RESEARCH DESIGNS - "medigun_speed", - //SKYRAT EDIT END - RESEARCH DESIGNS ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) @@ -1762,6 +1663,7 @@ "mod_clamp", "mod_drill", "mod_orebag", + "modlink_scryer", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) @@ -1991,6 +1893,7 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) discount_experiments = list(/datum/experiment/scanning/points/machinery_tiered_scan/tier3_mechbay = 2500) + /datum/techweb_node/savannah_ivanov id = "mecha_savannah_ivanov" display_name = "EXOSUIT: Savannah-Ivanov" @@ -2009,7 +1912,7 @@ "savannah_ivanov_targ", "savannah_ivanov_torso", ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) discount_experiments = list(/datum/experiment/scanning/points/machinery_tiered_scan/tier3_mechbay = 3000) /datum/techweb_node/adv_mecha_tools @@ -2019,7 +1922,6 @@ prereq_ids = list("adv_mecha") design_ids = list( "mech_rcd", - "mech_thrusters", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) @@ -2201,6 +2103,7 @@ description = "Things used by the greys." prereq_ids = list("biotech","engineering") boost_item_paths = list( + /obj/item/stack/sheet/mineral/abductor, /obj/item/abductor, /obj/item/cautery/alien, /obj/item/circuitboard/machine/abductor, @@ -2240,12 +2143,6 @@ "alien_retractor", "alien_saw", "alien_scalpel", - //SKYRAT EDIT START - RESEARCH DESIGNS - "brute3medicell", - "burn3medicell", - "oxy3medicell", - "toxin3medicell", - //SKYRAT EDIT END - RESEARCH DESIGNS ) boost_item_paths = list( diff --git a/code/modules/research/xenobiology/crossbreeding/__corecross.dm b/code/modules/research/xenobiology/crossbreeding/__corecross.dm index 4ec793870f5..7d24c7103dc 100644 --- a/code/modules/research/xenobiology/crossbreeding/__corecross.dm +++ b/code/modules/research/xenobiology/crossbreeding/__corecross.dm @@ -48,45 +48,45 @@ To add a crossbreed: name = effect + " " + colour + " extract" var/itemcolor = "#FFFFFF" switch(colour) - if("orange") + if(SLIME_TYPE_ORANGE) itemcolor = "#FFA500" - if("purple") + if(SLIME_TYPE_PURPLE) itemcolor = "#B19CD9" - if("blue") + if(SLIME_TYPE_BLUE) itemcolor = "#ADD8E6" - if("metal") + if(SLIME_TYPE_METAL) itemcolor = "#7E7E7E" - if("yellow") + if(SLIME_TYPE_YELLOW) itemcolor = "#FFFF00" - if("dark purple") + if(SLIME_TYPE_DARK_PURPLE) itemcolor = "#551A8B" - if("dark blue") + if(SLIME_TYPE_DARK_BLUE) itemcolor = "#0000FF" - if("silver") + if(SLIME_TYPE_SILVER) itemcolor = "#D3D3D3" - if("bluespace") + if(SLIME_TYPE_BLUESPACE) itemcolor = "#32CD32" - if("sepia") + if(SLIME_TYPE_SEPIA) itemcolor = "#704214" - if("cerulean") + if(SLIME_TYPE_CERULEAN) itemcolor = "#2956B2" - if("pyrite") + if(SLIME_TYPE_PYRITE) itemcolor = "#FAFAD2" - if("red") + if(SLIME_TYPE_RED) itemcolor = "#FF0000" - if("green") + if(SLIME_TYPE_GREEN) itemcolor = "#00FF00" - if("pink") + if(SLIME_TYPE_PINK) itemcolor = "#FF69B4" - if("gold") + if(SLIME_TYPE_GOLD) itemcolor = "#FFD700" - if("oil") + if(SLIME_TYPE_OIL) itemcolor = "#505050" - if("black") + if(SLIME_TYPE_BLACK) itemcolor = "#000000" - if("light pink") + if(SLIME_TYPE_LIGHT_PINK) itemcolor = "#FFB6C1" - if("adamantine") + if(SLIME_TYPE_ADAMANTINE) itemcolor = "#008B8B" add_atom_colour(itemcolor, FIXED_COLOUR_PRIORITY) diff --git a/code/modules/research/xenobiology/crossbreeding/_mobs.dm b/code/modules/research/xenobiology/crossbreeding/_mobs.dm index 24e44f0a389..046b5764b43 100644 --- a/code/modules/research/xenobiology/crossbreeding/_mobs.dm +++ b/code/modules/research/xenobiology/crossbreeding/_mobs.dm @@ -14,8 +14,7 @@ Slimecrossing Mobs invocation_type = INVOCATION_NONE spell_requirements = NONE - convert_damage = TRUE - convert_damage_type = CLONE + convert_damage_type = TOX possible_shapes = list(/mob/living/simple_animal/slime/transformed_slime) /// If TRUE, we self-delete (remove ourselves) the next time we turn back into a human diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index fea62368ca2..5c6ff3c811a 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -467,7 +467,7 @@ //Stabilized effects start below. /datum/status_effect/stabilized/grey id = "stabilizedgrey" - colour = "grey" + colour = SLIME_TYPE_GREY /datum/status_effect/stabilized/grey/tick(seconds_between_ticks) for(var/mob/living/simple_animal/slime/S in range(1, get_turf(owner))) @@ -478,7 +478,7 @@ /datum/status_effect/stabilized/orange id = "stabilizedorange" - colour = "orange" + colour = SLIME_TYPE_ORANGE /datum/status_effect/stabilized/orange/tick(seconds_between_ticks) var/body_temp_target = owner.get_body_temp_normal(apply_change = FALSE) @@ -499,7 +499,7 @@ /datum/status_effect/stabilized/purple id = "stabilizedpurple" - colour = "purple" + colour = SLIME_TYPE_PURPLE /// Whether we healed from our last tick var/healed_last_tick = FALSE @@ -533,7 +533,7 @@ /datum/status_effect/stabilized/blue id = "stabilizedblue" - colour = "blue" + colour = SLIME_TYPE_BLUE /datum/status_effect/stabilized/blue/on_apply() ADD_TRAIT(owner, TRAIT_NO_SLIP_WATER, "slimestatus") @@ -544,7 +544,7 @@ /datum/status_effect/stabilized/metal id = "stabilizedmetal" - colour = "metal" + colour = SLIME_TYPE_METAL var/cooldown = 30 var/max_cooldown = 30 @@ -567,7 +567,7 @@ /datum/status_effect/stabilized/yellow id = "stabilizedyellow" - colour = "yellow" + colour = SLIME_TYPE_YELLOW var/cooldown = 10 var/max_cooldown = 10 @@ -586,7 +586,6 @@ if(batteries.len) var/obj/item/stock_parts/cell/ToCharge = pick(batteries) ToCharge.charge += min(ToCharge.maxcharge - ToCharge.charge, ToCharge.maxcharge/10) //10% of the cell, or to maximum. - to_chat(owner, span_notice("[linked_extract] discharges some energy into a device you have.")) return ..() /obj/item/hothands @@ -598,7 +597,7 @@ /datum/status_effect/stabilized/darkpurple id = "stabilizeddarkpurple" - colour = "dark purple" + colour = SLIME_TYPE_DARK_PURPLE var/obj/item/hothands/fire /datum/status_effect/stabilized/darkpurple/on_apply() @@ -624,7 +623,7 @@ /datum/status_effect/stabilized/darkblue id = "stabilizeddarkblue" - colour = "dark blue" + colour = SLIME_TYPE_DARK_BLUE /datum/status_effect/stabilized/darkblue/tick(seconds_between_ticks) if(owner.fire_stacks > 0 && prob(80)) @@ -656,7 +655,7 @@ /datum/status_effect/stabilized/silver id = "stabilizedsilver" - colour = "silver" + colour = SLIME_TYPE_SILVER /datum/status_effect/stabilized/silver/on_apply() if(ishuman(owner)) @@ -682,7 +681,7 @@ /datum/status_effect/stabilized/bluespace id = "stabilizedbluespace" - colour = "bluespace" + colour = SLIME_TYPE_BLUESPACE alert_type = /atom/movable/screen/alert/status_effect/bluespaceslime var/healthcheck @@ -712,7 +711,7 @@ /datum/status_effect/stabilized/sepia id = "stabilizedsepia" - colour = "sepia" + colour = SLIME_TYPE_SEPIA var/mod = 0 /datum/status_effect/stabilized/sepia/tick(seconds_between_ticks) @@ -730,7 +729,7 @@ /datum/status_effect/stabilized/cerulean id = "stabilizedcerulean" - colour = "cerulean" + colour = SLIME_TYPE_CERULEAN var/mob/living/clone /datum/status_effect/stabilized/cerulean/on_apply() @@ -766,7 +765,7 @@ /datum/status_effect/stabilized/pyrite id = "stabilizedpyrite" - colour = "pyrite" + colour = SLIME_TYPE_PYRITE var/originalcolor /datum/status_effect/stabilized/pyrite/on_apply() @@ -782,7 +781,7 @@ /datum/status_effect/stabilized/red id = "stabilizedred" - colour = "red" + colour = SLIME_TYPE_RED /datum/status_effect/stabilized/red/on_apply() . = ..() @@ -794,7 +793,7 @@ /datum/status_effect/stabilized/green id = "stabilizedgreen" - colour = "green" + colour = SLIME_TYPE_GREEN var/datum/dna/originalDNA var/originalname @@ -842,7 +841,7 @@ /datum/status_effect/stabilized/pink id = "stabilizedpink" - colour = "pink" + colour = SLIME_TYPE_PINK /// List of weakrefs to mobs we have pacified var/list/mobs = list() /// Name of our faction @@ -914,7 +913,7 @@ /datum/status_effect/stabilized/oil id = "stabilizedoil" - colour = "oil" + colour = SLIME_TYPE_OIL /datum/status_effect/stabilized/oil/tick(seconds_between_ticks) if(owner.stat == DEAD) @@ -931,7 +930,7 @@ /datum/status_effect/stabilized/black id = "stabilizedblack" - colour = "black" + colour = SLIME_TYPE_BLACK /// How much we heal per tick (also how much we damage per tick times DRAIN_DAMAGE_MULTIPLIER). var/heal_amount = 1 /// Weakref to the mob we're currently draining every tick. @@ -992,14 +991,14 @@ owner.apply_damage_type(-heal_amount, damagetype = pick(healing_types)) owner.adjust_nutrition(3) - drained.adjustCloneLoss(heal_amount * DRAIN_DAMAGE_MULTIPLIER) + drained.apply_damage(heal_amount * DRAIN_DAMAGE_MULTIPLIER, damagetype = BRUTE, spread_damage = TRUE) return ..() #undef DRAIN_DAMAGE_MULTIPLIER /datum/status_effect/stabilized/lightpink id = "stabilizedlightpink" - colour = "light pink" + colour = SLIME_TYPE_LIGHT_PINK /datum/status_effect/stabilized/lightpink/on_apply() owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/lightpink) @@ -1019,14 +1018,14 @@ /datum/status_effect/stabilized/adamantine id = "stabilizedadamantine" - colour = "adamantine" + colour = SLIME_TYPE_ADAMANTINE /datum/status_effect/stabilized/adamantine/get_examine_text() return span_warning("[owner.p_They()] [owner.p_have()] strange metallic coating on [owner.p_their()] skin.") /datum/status_effect/stabilized/gold id = "stabilizedgold" - colour = "gold" + colour = SLIME_TYPE_GOLD var/mob/living/simple_animal/familiar /datum/status_effect/stabilized/gold/tick(seconds_between_ticks) @@ -1066,7 +1065,7 @@ /datum/status_effect/stabilized/rainbow id = "stabilizedrainbow" - colour = "rainbow" + colour = SLIME_TYPE_RAINBOW /datum/status_effect/stabilized/rainbow/tick(seconds_between_ticks) if(owner.health <= 0) diff --git a/code/modules/research/xenobiology/crossbreeding/burning.dm b/code/modules/research/xenobiology/crossbreeding/burning.dm index a5f281bb375..0ababd34422 100644 --- a/code/modules/research/xenobiology/crossbreeding/burning.dm +++ b/code/modules/research/xenobiology/crossbreeding/burning.dm @@ -28,11 +28,11 @@ Burning extracts: return /obj/item/slimecross/burning/grey - colour = "grey" + colour = SLIME_TYPE_GREY effect_desc = "Creates a hungry and speedy slime that will love you forever." /obj/item/slimecross/burning/grey/do_effect(mob/user) - var/mob/living/simple_animal/slime/S = new(get_turf(user),"grey") + var/mob/living/simple_animal/slime/S = new(get_turf(user),SLIME_TYPE_GREY) S.visible_message(span_danger("A baby slime emerges from [src], and it nuzzles [user] before burbling hungrily!")) S.set_friendship(user, 20) //Gas, gas, gas S.bodytemperature = T0C + 400 //We gonna step on the gas. @@ -40,7 +40,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/orange - colour = "orange" + colour = SLIME_TYPE_ORANGE effect_desc = "Expels pepperspray in a radius when activated." /obj/item/slimecross/burning/orange/do_effect(mob/user) @@ -54,7 +54,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/purple - colour = "purple" + colour = SLIME_TYPE_PURPLE effect_desc = "Creates a clump of invigorating gel, it has healing properties and makes you feel good." /obj/item/slimecross/burning/purple/do_effect(mob/user) @@ -63,7 +63,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/blue - colour = "blue" + colour = SLIME_TYPE_BLUE effect_desc = "Freezes the floor around you and chills nearby people." /obj/item/slimecross/burning/blue/do_effect(mob/user) @@ -77,7 +77,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/metal - colour = "metal" + colour = SLIME_TYPE_METAL effect_desc = "Instantly destroys walls around you." /obj/item/slimecross/burning/metal/do_effect(mob/user) @@ -88,7 +88,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/yellow - colour = "yellow" + colour = SLIME_TYPE_YELLOW effect_desc = "Electrocutes people near you." /obj/item/slimecross/burning/yellow/do_effect(mob/user) @@ -105,7 +105,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/darkpurple - colour = "dark purple" + colour = SLIME_TYPE_DARK_PURPLE effect_desc = "Creates a cloud of plasma." /obj/item/slimecross/burning/darkpurple/do_effect(mob/user) @@ -115,7 +115,7 @@ Burning extracts: return ..() /obj/item/slimecross/burning/darkblue - colour = "dark blue" + colour = SLIME_TYPE_DARK_BLUE effect_desc = "Expels a burst of chilling smoke while also filling you with regenerative jelly." /obj/item/slimecross/burning/darkblue/do_effect(mob/user) @@ -129,7 +129,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/silver - colour = "silver" + colour = SLIME_TYPE_SILVER effect_desc = "Creates a few pieces of slime jelly laced food." /obj/item/slimecross/burning/silver/do_effect(mob/user) @@ -148,7 +148,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/bluespace - colour = "bluespace" + colour = SLIME_TYPE_BLUESPACE effect_desc = "Teleports anyone directly next to you." /obj/item/slimecross/burning/bluespace/do_effect(mob/user) @@ -161,7 +161,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/sepia - colour = "sepia" + colour = SLIME_TYPE_SEPIA effect_desc = "Turns into a special camera that rewinds time when used." /obj/item/slimecross/burning/sepia/do_effect(mob/user) @@ -170,7 +170,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/cerulean - colour = "cerulean" + colour = SLIME_TYPE_CERULEAN effect_desc = "Produces an extract cloning potion, which copies an extract, as well as its extra uses." /obj/item/slimecross/burning/cerulean/do_effect(mob/user) @@ -179,7 +179,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/pyrite - colour = "pyrite" + colour = SLIME_TYPE_PYRITE effect_desc = "Shatters all lights in the current room." /obj/item/slimecross/burning/pyrite/do_effect(mob/user) @@ -192,7 +192,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/red - colour = "red" + colour = SLIME_TYPE_RED effect_desc = "Makes nearby slimes rabid, and they'll also attack their friends." /obj/item/slimecross/burning/red/do_effect(mob/user) @@ -209,7 +209,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/green - colour = "green" + colour = SLIME_TYPE_GREEN effect_desc = "The user gets a dull arm blade in the hand it is used in." /obj/item/slimecross/burning/green/do_effect(mob/user) @@ -232,7 +232,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/pink - colour = "pink" + colour = SLIME_TYPE_PINK effect_desc = "Creates a beaker of synthpax." /obj/item/slimecross/burning/pink/do_effect(mob/user) @@ -241,7 +241,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/gold - colour = "gold" + colour = SLIME_TYPE_GOLD effect_desc = "Creates a gank squad of monsters that are friendly to the user." /obj/item/slimecross/burning/gold/do_effect(mob/user) @@ -255,7 +255,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/oil - colour = "oil" + colour = SLIME_TYPE_OIL effect_desc = "Creates an explosion after a few seconds." /obj/item/slimecross/burning/oil/do_effect(mob/user) @@ -272,7 +272,7 @@ Burning extracts: qdel(src) /obj/item/slimecross/burning/black - colour = "black" + colour = SLIME_TYPE_BLACK effect_desc = "Transforms the user into a slime. They can transform back at will and do not lose any items." /obj/item/slimecross/burning/black/do_effect(mob/user) @@ -286,7 +286,7 @@ Burning extracts: return ..() /obj/item/slimecross/burning/lightpink - colour = "light pink" + colour = SLIME_TYPE_LIGHT_PINK effect_desc = "Paxes everyone in sight." /obj/item/slimecross/burning/lightpink/do_effect(mob/user) @@ -296,7 +296,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/adamantine - colour = "adamantine" + colour = SLIME_TYPE_ADAMANTINE effect_desc = "Creates a mighty adamantine shield." /obj/item/slimecross/burning/adamantine/do_effect(mob/user) @@ -305,7 +305,7 @@ Burning extracts: ..() /obj/item/slimecross/burning/rainbow - colour = "rainbow" + colour = SLIME_TYPE_RAINBOW effect_desc = "Creates the Rainbow Knife, a kitchen knife that deals random types of damage." /obj/item/slimecross/burning/rainbow/do_effect(mob/user) diff --git a/code/modules/research/xenobiology/crossbreeding/charged.dm b/code/modules/research/xenobiology/crossbreeding/charged.dm index f9d59193a66..cb7070c83a4 100644 --- a/code/modules/research/xenobiology/crossbreeding/charged.dm +++ b/code/modules/research/xenobiology/crossbreeding/charged.dm @@ -29,7 +29,7 @@ Charged extracts: return /obj/item/slimecross/charged/grey - colour = "grey" + colour = SLIME_TYPE_GREY effect_desc = "Produces a slime reviver potion, which revives dead slimes." /obj/item/slimecross/charged/grey/do_effect(mob/user) @@ -38,7 +38,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/orange - colour = "orange" + colour = SLIME_TYPE_ORANGE effect_desc = "Instantly makes a large burst of flame for a moment." /obj/item/slimecross/charged/orange/do_effect(mob/user) @@ -49,7 +49,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/purple - colour = "purple" + colour = SLIME_TYPE_PURPLE effect_desc = "Creates a packet of omnizine." /obj/item/slimecross/charged/purple/do_effect(mob/user) @@ -58,7 +58,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/blue - colour = "blue" + colour = SLIME_TYPE_BLUE effect_desc = "Creates a potion that neuters the mutation chance of a slime, which passes on to new generations." /obj/item/slimecross/charged/blue/do_effect(mob/user) @@ -67,7 +67,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/metal - colour = "metal" + colour = SLIME_TYPE_METAL effect_desc = "Produces a bunch of metal and plasteel." /obj/item/slimecross/charged/metal/do_effect(mob/user) @@ -77,7 +77,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/yellow - colour = "yellow" + colour = SLIME_TYPE_YELLOW effect_desc = "Creates a hypercharged slime cell battery, which has high capacity but takes longer to recharge." /obj/item/slimecross/charged/yellow/do_effect(mob/user) @@ -86,7 +86,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/darkpurple - colour = "dark purple" + colour = SLIME_TYPE_DARK_PURPLE effect_desc = "Creates several sheets of plasma." /obj/item/slimecross/charged/darkpurple/do_effect(mob/user) @@ -95,7 +95,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/darkblue - colour = "dark blue" + colour = SLIME_TYPE_DARK_BLUE effect_desc = "Produces a pressure proofing potion." /obj/item/slimecross/charged/darkblue/do_effect(mob/user) @@ -104,7 +104,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/silver - colour = "silver" + colour = SLIME_TYPE_SILVER effect_desc = "Creates a slime cake and some drinks." /obj/item/slimecross/charged/silver/do_effect(mob/user) @@ -116,7 +116,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/bluespace - colour = "bluespace" + colour = SLIME_TYPE_BLUESPACE effect_desc = "Makes a bluespace polycrystal." /obj/item/slimecross/charged/bluespace/do_effect(mob/user) @@ -125,7 +125,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/sepia - colour = "sepia" + colour = SLIME_TYPE_SEPIA effect_desc = "Creates a camera obscura." /obj/item/slimecross/charged/sepia/do_effect(mob/user) @@ -134,7 +134,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/cerulean - colour = "cerulean" + colour = SLIME_TYPE_CERULEAN effect_desc = "Creates an extract enhancer, giving whatever it's used on five more uses." /obj/item/slimecross/charged/cerulean/do_effect(mob/user) @@ -143,7 +143,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/pyrite - colour = "pyrite" + colour = SLIME_TYPE_PYRITE effect_desc = "Creates bananium. Oh no." /obj/item/slimecross/charged/pyrite/do_effect(mob/user) @@ -152,7 +152,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/red - colour = "red" + colour = SLIME_TYPE_RED effect_desc = "Produces a lavaproofing potion" /obj/item/slimecross/charged/red/do_effect(mob/user) @@ -161,7 +161,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/green - colour = "green" + colour = SLIME_TYPE_GREEN effect_desc = "Lets you choose what slime species you want to be." /obj/item/slimecross/charged/green/do_effect(mob/user) @@ -183,7 +183,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/pink - colour = "pink" + colour = SLIME_TYPE_PINK effect_desc = "Produces a... lovepotion... no ERP." /obj/item/slimecross/charged/pink/do_effect(mob/user) @@ -192,7 +192,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/gold - colour = "gold" + colour = SLIME_TYPE_GOLD effect_desc = "Slowly spawns 10 hostile monsters." var/max_spawn = 10 var/spawned = 0 @@ -219,7 +219,7 @@ Charged extracts: return ..() /obj/item/slimecross/charged/oil - colour = "oil" + colour = SLIME_TYPE_OIL effect_desc = "Creates an explosion after a few seconds." /obj/item/slimecross/charged/oil/do_effect(mob/user) @@ -231,7 +231,7 @@ Charged extracts: qdel(src) /obj/item/slimecross/charged/black - colour = "black" + colour = SLIME_TYPE_BLACK effect_desc = "Randomizes the user's species." /obj/item/slimecross/charged/black/do_effect(mob/user) @@ -252,7 +252,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/lightpink - colour = "light pink" + colour = SLIME_TYPE_LIGHT_PINK effect_desc = "Produces a pacification potion, which works on monsters and humanoids." /obj/item/slimecross/charged/lightpink/do_effect(mob/user) @@ -261,7 +261,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/adamantine - colour = "adamantine" + colour = SLIME_TYPE_ADAMANTINE effect_desc = "Creates a completed golem shell." /obj/item/slimecross/charged/adamantine/do_effect(mob/user) @@ -270,7 +270,7 @@ Charged extracts: ..() /obj/item/slimecross/charged/rainbow - colour = "rainbow" + colour = SLIME_TYPE_RAINBOW effect_desc = "Produces three living slimes of random colors." /obj/item/slimecross/charged/rainbow/do_effect(mob/user) diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm index b2bf3684661..c3586437c32 100644 --- a/code/modules/research/xenobiology/crossbreeding/chilling.dm +++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm @@ -28,7 +28,7 @@ Chilling extracts: return /obj/item/slimecross/chilling/grey - colour = "grey" + colour = SLIME_TYPE_GREY effect_desc = "Creates some slime barrier cubes. When used they create slimy barricades." /obj/item/slimecross/chilling/grey/do_effect(mob/user) @@ -38,7 +38,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/orange - colour = "orange" + colour = SLIME_TYPE_ORANGE effect_desc = "Creates a ring of fire one tile away from the user." /obj/item/slimecross/chilling/orange/do_effect(mob/user) @@ -49,7 +49,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/purple - colour = "purple" + colour = SLIME_TYPE_PURPLE effect_desc = "Injects everyone in the area with some regenerative jelly." /obj/item/slimecross/chilling/purple/do_effect(mob/user) @@ -63,7 +63,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/blue - colour = "blue" + colour = SLIME_TYPE_BLUE effect_desc = "Creates a rebreather, a tankless mask." /obj/item/slimecross/chilling/blue/do_effect(mob/user) @@ -72,7 +72,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/metal - colour = "metal" + colour = SLIME_TYPE_METAL effect_desc = "Temporarily surrounds the user with unbreakable walls." /obj/item/slimecross/chilling/metal/do_effect(mob/user) @@ -83,7 +83,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/yellow - colour = "yellow" + colour = SLIME_TYPE_YELLOW effect_desc = "Recharges the room's APC by 50%." /obj/item/slimecross/chilling/yellow/do_effect(mob/user) @@ -95,7 +95,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/darkpurple - colour = "dark purple" + colour = SLIME_TYPE_DARK_PURPLE effect_desc = "Removes all plasma gas in the area." /obj/item/slimecross/chilling/darkpurple/do_effect(mob/user) @@ -119,7 +119,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/darkblue - colour = "dark blue" + colour = SLIME_TYPE_DARK_BLUE effect_desc = "Seals the user in a protective block of ice." /obj/item/slimecross/chilling/darkblue/do_effect(mob/user) @@ -130,7 +130,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/silver - colour = "silver" + colour = SLIME_TYPE_SILVER effect_desc = "Creates several ration packs." /obj/item/slimecross/chilling/silver/do_effect(mob/user) @@ -141,7 +141,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/bluespace - colour = "bluespace" + colour = SLIME_TYPE_BLUESPACE effect_desc = "Touching people with this extract adds them to a list, when it is activated it teleports everyone on that list to the user." var/list/allies = list() var/active = FALSE @@ -184,7 +184,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/sepia - colour = "sepia" + colour = SLIME_TYPE_SEPIA effect_desc = "Touching someone with it adds/removes them from a list. Activating the extract stops time for 30 seconds, and everyone on the list is immune, except the user." var/list/allies = list() @@ -206,7 +206,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/cerulean - colour = "cerulean" + colour = SLIME_TYPE_CERULEAN effect_desc = "Creates a flimsy copy of the user, that they control." /obj/item/slimecross/chilling/cerulean/do_effect(mob/user) @@ -217,7 +217,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/pyrite - colour = "pyrite" + colour = SLIME_TYPE_PYRITE effect_desc = "Creates a pair of Prism Glasses, which allow the wearer to place colored light crystals." /obj/item/slimecross/chilling/pyrite/do_effect(mob/user) @@ -226,7 +226,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/red - colour = "red" + colour = SLIME_TYPE_RED effect_desc = "Pacifies every slime in your vacinity." /obj/item/slimecross/chilling/red/do_effect(mob/user) @@ -241,7 +241,7 @@ Chilling extracts: return ..() /obj/item/slimecross/chilling/green - colour = "green" + colour = SLIME_TYPE_GREEN effect_desc = "Creates a bone gun in the hand it is used in, which uses blood as ammo." /obj/item/slimecross/chilling/green/do_effect(mob/user) @@ -264,7 +264,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/pink - colour = "pink" + colour = SLIME_TYPE_PINK effect_desc = "Creates a slime corgi puppy." /obj/item/slimecross/chilling/pink/do_effect(mob/user) @@ -273,7 +273,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/gold - colour = "gold" + colour = SLIME_TYPE_GOLD effect_desc = "Produces a golden capture device" /obj/item/slimecross/chilling/gold/do_effect(mob/user) @@ -282,7 +282,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/oil - colour = "oil" + colour = SLIME_TYPE_OIL effect_desc = "It creates a weak, but wide-ranged explosion." /obj/item/slimecross/chilling/oil/do_effect(mob/user) @@ -294,7 +294,7 @@ Chilling extracts: qdel(src) /obj/item/slimecross/chilling/black - colour = "black" + colour = SLIME_TYPE_BLACK effect_desc = "Transforms the user into a golem." /obj/item/slimecross/chilling/black/do_effect(mob/user) @@ -305,7 +305,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/lightpink - colour = "light pink" + colour = SLIME_TYPE_LIGHT_PINK effect_desc = "Creates a Heroine Bud, a special flower that pacifies whoever wears it on their head. They will not be able to take it off without help." /obj/item/slimecross/chilling/lightpink/do_effect(mob/user) @@ -314,7 +314,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/adamantine - colour = "adamantine" + colour = SLIME_TYPE_ADAMANTINE effect_desc = "Solidifies into a set of adamantine armor." /obj/item/slimecross/chilling/adamantine/do_effect(mob/user) @@ -323,7 +323,7 @@ Chilling extracts: ..() /obj/item/slimecross/chilling/rainbow - colour = "rainbow" + colour = SLIME_TYPE_RAINBOW effect_desc = "Makes an unpassable wall in every door in the area." /obj/item/slimecross/chilling/rainbow/do_effect(mob/user) diff --git a/code/modules/research/xenobiology/crossbreeding/consuming.dm b/code/modules/research/xenobiology/crossbreeding/consuming.dm index 0deb64b481f..43bfd2dbe8a 100644 --- a/code/modules/research/xenobiology/crossbreeding/consuming.dm +++ b/code/modules/research/xenobiology/crossbreeding/consuming.dm @@ -83,7 +83,7 @@ Consuming extracts: ..() /obj/item/slimecross/consuming/grey - colour = "grey" + colour = SLIME_TYPE_GREY effect_desc = "Creates a slime cookie." cookietype = /obj/item/slime_cookie/grey @@ -95,7 +95,7 @@ Consuming extracts: nutrition = 15 /obj/item/slimecross/consuming/orange - colour = "orange" + colour = SLIME_TYPE_ORANGE effect_desc = "Creates a slime cookie that heats the target up and grants cold immunity for a short time." cookietype = /obj/item/slime_cookie/orange @@ -109,7 +109,7 @@ Consuming extracts: M.apply_status_effect(/datum/status_effect/firecookie) /obj/item/slimecross/consuming/purple - colour = "purple" + colour = SLIME_TYPE_PURPLE effect_desc = "Creates a slime cookie that heals the target from every type of damage." cookietype = /obj/item/slime_cookie/purple @@ -128,7 +128,7 @@ Consuming extracts: M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -5) /obj/item/slimecross/consuming/blue - colour = "blue" + colour = SLIME_TYPE_BLUE effect_desc = "Creates a slime cookie that wets the floor around you and makes you immune to water based slipping for a short time." cookietype = /obj/item/slime_cookie/blue @@ -142,7 +142,7 @@ Consuming extracts: M.apply_status_effect(/datum/status_effect/watercookie) /obj/item/slimecross/consuming/metal - colour = "metal" + colour = SLIME_TYPE_METAL effect_desc = "Creates a slime cookie that increases the target's resistance to brute damage." cookietype = /obj/item/slime_cookie/metal @@ -156,7 +156,7 @@ Consuming extracts: M.apply_status_effect(/datum/status_effect/metalcookie) /obj/item/slimecross/consuming/yellow - colour = "yellow" + colour = SLIME_TYPE_YELLOW effect_desc = "Creates a slime cookie that makes the target immune to electricity for a short time." cookietype = /obj/item/slime_cookie/yellow @@ -170,7 +170,7 @@ Consuming extracts: M.apply_status_effect(/datum/status_effect/sparkcookie) /obj/item/slimecross/consuming/darkpurple - colour = "dark purple" + colour = SLIME_TYPE_DARK_PURPLE effect_desc = "Creates a slime cookie that reverses how the target's body treats toxins." cookietype = /obj/item/slime_cookie/darkpurple @@ -184,7 +184,7 @@ Consuming extracts: M.apply_status_effect(/datum/status_effect/toxincookie) /obj/item/slimecross/consuming/darkblue - colour = "dark blue" + colour = SLIME_TYPE_DARK_BLUE effect_desc = "Creates a slime cookie that chills the target and extinguishes them." cookietype = /obj/item/slime_cookie/darkblue @@ -199,7 +199,7 @@ Consuming extracts: M.extinguish_mob() /obj/item/slimecross/consuming/silver - colour = "silver" + colour = SLIME_TYPE_SILVER effect_desc = "Creates a slime cookie that never gets the target fat." cookietype = /obj/item/slime_cookie/silver @@ -214,7 +214,7 @@ Consuming extracts: M.reagents.add_reagent(/datum/reagent/consumable/nutriment/stabilized,10) /obj/item/slimecross/consuming/bluespace - colour = "bluespace" + colour = SLIME_TYPE_BLUESPACE effect_desc = "Creates a slime cookie that teleports the target to a random place in the area." cookietype = /obj/item/slime_cookie/bluespace @@ -250,7 +250,7 @@ Consuming extracts: playsound(get_turf(M), SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) /obj/item/slimecross/consuming/sepia - colour = "sepia" + colour = SLIME_TYPE_SEPIA effect_desc = "Creates a slime cookie that makes the target do things slightly faster." cookietype = /obj/item/slime_cookie/sepia @@ -264,7 +264,7 @@ Consuming extracts: M.apply_status_effect(/datum/status_effect/timecookie) /obj/item/slimecross/consuming/cerulean - colour = "cerulean" + colour = SLIME_TYPE_CERULEAN effect_desc = "Creates a slime cookie that has a chance to make another once you eat it." cookietype = /obj/item/slime_cookie/cerulean cookies = 3 //You're gonna get more. @@ -282,7 +282,7 @@ Consuming extracts: C.taste = taste + " and a sugar cookie" /obj/item/slimecross/consuming/pyrite - colour = "pyrite" + colour = SLIME_TYPE_PYRITE effect_desc = "Creates a slime cookie that randomly colors the target." cookietype = /obj/item/slime_cookie/pyrite @@ -324,7 +324,7 @@ Consuming extracts: M.add_atom_colour(colour,WASHABLE_COLOUR_PRIORITY) /obj/item/slimecross/consuming/red - colour = "red" + colour = SLIME_TYPE_RED effect_desc = "Creates a slime cookie that creates a spatter of blood on the floor, while also restoring some of the target's blood." cookietype = /obj/item/slime_cookie/red @@ -342,7 +342,7 @@ Consuming extracts: C.blood_volume += 25 //Half a vampire drain. /obj/item/slimecross/consuming/green - colour = "green" + colour = SLIME_TYPE_GREEN effect_desc = "Creates a slime cookie that is absolutely disgusting, makes the target vomit, however all reagent in their body are also removed." cookietype = /obj/item/slime_cookie/green @@ -359,7 +359,7 @@ Consuming extracts: M.reagents.remove_all() /obj/item/slimecross/consuming/pink - colour = "pink" + colour = SLIME_TYPE_PINK effect_desc = "Creates a slime cookie that makes the target want to spread the love." cookietype = /obj/item/slime_cookie/pink @@ -373,7 +373,7 @@ Consuming extracts: M.apply_status_effect(/datum/status_effect/lovecookie) /obj/item/slimecross/consuming/gold - colour = "gold" + colour = SLIME_TYPE_GOLD effect_desc = "Creates a slime cookie that has a gold coin inside." cookietype = /obj/item/slime_cookie/gold @@ -392,7 +392,7 @@ Consuming extracts: M.put_in_hand(C) /obj/item/slimecross/consuming/oil - colour = "oil" + colour = SLIME_TYPE_OIL effect_desc = "Creates a slime cookie that slows anyone next to the user." cookietype = /obj/item/slime_cookie/oil @@ -406,7 +406,7 @@ Consuming extracts: M.apply_status_effect(/datum/status_effect/tarcookie) /obj/item/slimecross/consuming/black - colour = "black" + colour = SLIME_TYPE_BLACK effect_desc = "Creates a slime cookie that makes the target look like a spooky skeleton for a little bit." cookietype = /obj/item/slime_cookie/black @@ -420,7 +420,7 @@ Consuming extracts: M.apply_status_effect(/datum/status_effect/spookcookie) /obj/item/slimecross/consuming/lightpink - colour = "light pink" + colour = SLIME_TYPE_LIGHT_PINK effect_desc = "Creates a slime cookie that makes the target, and anyone next to the target, pacifistic for a small amount of time." cookietype = /obj/item/slime_cookie/lightpink @@ -434,7 +434,7 @@ Consuming extracts: M.apply_status_effect(/datum/status_effect/peacecookie) /obj/item/slimecross/consuming/adamantine - colour = "adamantine" + colour = SLIME_TYPE_ADAMANTINE effect_desc = "Creates a slime cookie that increases the target's resistance to burn damage." cookietype = /obj/item/slime_cookie/adamantine @@ -448,7 +448,7 @@ Consuming extracts: M.apply_status_effect(/datum/status_effect/adamantinecookie) /obj/item/slimecross/consuming/rainbow - colour = "rainbow" + colour = SLIME_TYPE_RAINBOW effect_desc = "Creates a slime cookie that has the effect of a random cookie." /obj/item/slimecross/consuming/rainbow/spawncookie() diff --git a/code/modules/research/xenobiology/crossbreeding/industrial.dm b/code/modules/research/xenobiology/crossbreeding/industrial.dm index a5cdb181e2b..5222ab3608c 100644 --- a/code/modules/research/xenobiology/crossbreeding/industrial.dm +++ b/code/modules/research/xenobiology/crossbreeding/industrial.dm @@ -52,37 +52,37 @@ Industrial extracts: icon_state = "industrial_still" /obj/item/slimecross/industrial/grey - colour = "grey" + colour = SLIME_TYPE_GREY effect_desc = "Produces monkey cubes." itempath = /obj/item/food/monkeycube itemamount = 5 /obj/item/slimecross/industrial/orange - colour = "orange" + colour = SLIME_TYPE_ORANGE effect_desc = "Produces slime zippo lighters." plasmarequired = 6 itempath = /obj/item/lighter/slime /obj/item/slimecross/industrial/purple - colour = "purple" + colour = SLIME_TYPE_PURPLE effect_desc = "Produces autoinjectors with regen jelly inside." plasmarequired = 5 itempath = /obj/item/slimecrossbeaker/autoinjector/regenpack /obj/item/slimecross/industrial/blue - colour = "blue" + colour = SLIME_TYPE_BLUE effect_desc = "Produces full fire extinguishers." plasmarequired = 10 itempath = /obj/item/extinguisher /obj/item/slimecross/industrial/metal - colour = "metal" + colour = SLIME_TYPE_METAL effect_desc = "Produces iron sheets." plasmarequired = 3 itempath = /obj/item/stack/sheet/iron/ten /obj/item/slimecross/industrial/yellow - colour = "yellow" + colour = SLIME_TYPE_YELLOW effect_desc = "Produces high capacity power cells, which are not fully charged on creation." plasmarequired = 5 itempath = /obj/item/stock_parts/cell/high @@ -93,13 +93,13 @@ Industrial extracts: C.charge = rand(0,C.maxcharge/2) /obj/item/slimecross/industrial/darkpurple - colour = "dark purple" + colour = SLIME_TYPE_DARK_PURPLE effect_desc = "Produces plasma... for plasma." plasmarequired = 10 itempath = /obj/item/stack/sheet/mineral/plasma /obj/item/slimecross/industrial/darkblue - colour = "dark blue" + colour = SLIME_TYPE_DARK_BLUE effect_desc = "Produces one-use fireproofing potions." plasmarequired = 6 itempath = /obj/item/slimepotion/fireproof @@ -110,7 +110,7 @@ Industrial extracts: potion.uses = 1 /obj/item/slimecross/industrial/silver - colour = "silver" + colour = SLIME_TYPE_SILVER effect_desc = "Produces random food and drink items." plasmarequired = 1 //Item picked below. @@ -123,49 +123,49 @@ Industrial extracts: ADD_TRAIT(spawned, TRAIT_FOOD_SILVER, INNATE_TRAIT) /obj/item/slimecross/industrial/bluespace - colour = "bluespace" + colour = SLIME_TYPE_BLUESPACE effect_desc = "Produces synthetic bluespace crystals." plasmarequired = 7 itempath = /obj/item/stack/ore/bluespace_crystal/artificial /obj/item/slimecross/industrial/sepia - colour = "sepia" + colour = SLIME_TYPE_SEPIA effect_desc = "Produces cameras." plasmarequired = 2 itempath = /obj/item/camera /obj/item/slimecross/industrial/cerulean - colour = "cerulean" + colour = SLIME_TYPE_CERULEAN effect_desc = "Produces normal slime extract enhancers." plasmarequired = 5 itempath = /obj/item/slimepotion/enhancer /obj/item/slimecross/industrial/pyrite - colour = "pyrite" + colour = SLIME_TYPE_PYRITE effect_desc = "Produces cans of spraypaint." plasmarequired = 2 itempath = /obj/item/toy/crayon/spraycan /obj/item/slimecross/industrial/red - colour = "red" + colour = SLIME_TYPE_RED effect_desc = "Produces blood orbs." plasmarequired = 5 itempath = /obj/item/slimecrossbeaker/bloodpack /obj/item/slimecross/industrial/green - colour = "green" + colour = SLIME_TYPE_GREEN effect_desc = "Produces self-use-only slime jelly autoinjectors." plasmarequired = 7 itempath = /obj/item/slimecrossbeaker/autoinjector/slimejelly /obj/item/slimecross/industrial/pink - colour = "pink" + colour = SLIME_TYPE_PINK effect_desc = "Produces synthpax and space drug autoinjectors." plasmarequired = 6 itempath = /obj/item/slimecrossbeaker/autoinjector/peaceandlove /obj/item/slimecross/industrial/gold - colour = "gold" + colour = SLIME_TYPE_GOLD effect_desc = "Produces random coins." plasmarequired = 10 @@ -174,31 +174,31 @@ Industrial extracts: ..() /obj/item/slimecross/industrial/oil - colour = "oil" + colour = SLIME_TYPE_OIL effect_desc = "Produces IEDs." plasmarequired = 4 itempath = /obj/item/grenade/iedcasing/spawned /obj/item/slimecross/industrial/black //What does this have to do with black slimes? No clue! Fun, though - colour = "black" + colour = SLIME_TYPE_BLACK effect_desc = "Produces slime brand regenerative cigarettes." plasmarequired = 6 itempath = /obj/item/storage/fancy/cigarettes/cigpack_xeno /obj/item/slimecross/industrial/lightpink - colour = "light pink" + colour = SLIME_TYPE_LIGHT_PINK effect_desc = "Produces heart shaped boxes that have candies in them." plasmarequired = 3 itempath = /obj/item/storage/fancy/heart_box /obj/item/slimecross/industrial/adamantine - colour = "adamantine" + colour = SLIME_TYPE_ADAMANTINE effect_desc = "Produces sheets of adamantine." plasmarequired = 10 itempath = /obj/item/stack/sheet/mineral/adamantine /obj/item/slimecross/industrial/rainbow - colour = "rainbow" + colour = SLIME_TYPE_RAINBOW effect_desc = "Produces random slime extracts." plasmarequired = 5 //Item picked below. diff --git a/code/modules/research/xenobiology/crossbreeding/prismatic.dm b/code/modules/research/xenobiology/crossbreeding/prismatic.dm index 9cfc4542d52..95e3c77e4d6 100644 --- a/code/modules/research/xenobiology/crossbreeding/prismatic.dm +++ b/code/modules/research/xenobiology/crossbreeding/prismatic.dm @@ -19,7 +19,7 @@ Prismatic extracts: playsound(target, 'sound/effects/slosh.ogg', 20, TRUE) /obj/item/slimecross/prismatic/grey/ - colour = "grey" + colour = SLIME_TYPE_GREY desc = "It's constantly wet with a pungent-smelling, clear chemical." /obj/item/slimecross/prismatic/grey/afterattack(turf/target, mob/user, proximity) @@ -32,87 +32,87 @@ Prismatic extracts: /obj/item/slimecross/prismatic/orange paintcolor = "#FFA500" - colour = "orange" + colour = SLIME_TYPE_ORANGE /obj/item/slimecross/prismatic/purple paintcolor = "#B19CD9" - colour = "purple" + colour = SLIME_TYPE_PURPLE /obj/item/slimecross/prismatic/blue paintcolor = "#ADD8E6" - colour = "blue" + colour = SLIME_TYPE_BLUE /obj/item/slimecross/prismatic/metal paintcolor = "#7E7E7E" - colour = "metal" + colour = SLIME_TYPE_METAL /obj/item/slimecross/prismatic/yellow paintcolor = "#FFFF00" - colour = "yellow" + colour = SLIME_TYPE_YELLOW /obj/item/slimecross/prismatic/darkpurple paintcolor = "#551A8B" - colour = "dark purple" + colour = SLIME_TYPE_DARK_PURPLE /obj/item/slimecross/prismatic/darkblue paintcolor = "#0000FF" - colour = "dark blue" + colour = SLIME_TYPE_DARK_BLUE /obj/item/slimecross/prismatic/silver paintcolor = "#D3D3D3" - colour = "silver" + colour = SLIME_TYPE_SILVER /obj/item/slimecross/prismatic/bluespace paintcolor = "#32CD32" - colour = "bluespace" + colour = SLIME_TYPE_BLUESPACE /obj/item/slimecross/prismatic/sepia paintcolor = "#704214" - colour = "sepia" + colour = SLIME_TYPE_SEPIA /obj/item/slimecross/prismatic/cerulean paintcolor = "#2956B2" - colour = "cerulean" + colour = SLIME_TYPE_CERULEAN /obj/item/slimecross/prismatic/pyrite paintcolor = "#FAFAD2" - colour = "pyrite" + colour = SLIME_TYPE_PYRITE /obj/item/slimecross/prismatic/red paintcolor = "#FF0000" - colour = "red" + colour = SLIME_TYPE_RED /obj/item/slimecross/prismatic/green paintcolor = "#00FF00" - colour = "green" + colour = SLIME_TYPE_GREEN /obj/item/slimecross/prismatic/pink paintcolor = "#FF69B4" - colour = "pink" + colour = SLIME_TYPE_PINK /obj/item/slimecross/prismatic/gold paintcolor = "#FFD700" - colour = "gold" + colour = SLIME_TYPE_GOLD /obj/item/slimecross/prismatic/oil paintcolor = "#505050" - colour = "oil" + colour = SLIME_TYPE_OIL /obj/item/slimecross/prismatic/black paintcolor = "#000000" - colour = "black" + colour = SLIME_TYPE_BLACK /obj/item/slimecross/prismatic/lightpink paintcolor = "#FFB6C1" - colour = "light pink" + colour = SLIME_TYPE_LIGHT_PINK /obj/item/slimecross/prismatic/adamantine paintcolor = "#008B8B" - colour = "adamantine" + colour = SLIME_TYPE_ADAMANTINE /obj/item/slimecross/prismatic/rainbow paintcolor = "#FFFFFF" - colour = "rainbow" + colour = SLIME_TYPE_RAINBOW /obj/item/slimecross/prismatic/rainbow/attack_self(mob/user) var/newcolor = input(user, "Choose the slime color:", "Color change",paintcolor) as color|null diff --git a/code/modules/research/xenobiology/crossbreeding/recurring.dm b/code/modules/research/xenobiology/crossbreeding/recurring.dm index 2c9f5f2d21c..c6ca420cc04 100644 --- a/code/modules/research/xenobiology/crossbreeding/recurring.dm +++ b/code/modules/research/xenobiology/crossbreeding/recurring.dm @@ -44,95 +44,95 @@ Recurring extracts: /obj/item/slimecross/recurring/grey extract_type = /obj/item/slime_extract/grey - colour = "grey" + colour = SLIME_TYPE_GREY /obj/item/slimecross/recurring/orange extract_type = /obj/item/slime_extract/orange - colour = "orange" + colour = SLIME_TYPE_ORANGE /obj/item/slimecross/recurring/purple extract_type = /obj/item/slime_extract/purple - colour = "purple" + colour = SLIME_TYPE_PURPLE /obj/item/slimecross/recurring/blue extract_type = /obj/item/slime_extract/blue - colour = "blue" + colour = SLIME_TYPE_BLUE /obj/item/slimecross/recurring/metal extract_type = /obj/item/slime_extract/metal - colour = "metal" + colour = SLIME_TYPE_METAL max_cooldown = 20 /obj/item/slimecross/recurring/yellow extract_type = /obj/item/slime_extract/yellow - colour = "yellow" + colour = SLIME_TYPE_YELLOW max_cooldown = 20 /obj/item/slimecross/recurring/darkpurple extract_type = /obj/item/slime_extract/darkpurple - colour = "dark purple" + colour = SLIME_TYPE_DARK_PURPLE max_cooldown = 20 /obj/item/slimecross/recurring/darkblue extract_type = /obj/item/slime_extract/darkblue - colour = "dark blue" + colour = SLIME_TYPE_DARK_BLUE /obj/item/slimecross/recurring/silver extract_type = /obj/item/slime_extract/silver - colour = "silver" + colour = SLIME_TYPE_SILVER /obj/item/slimecross/recurring/bluespace extract_type = /obj/item/slime_extract/bluespace - colour = "bluespace" + colour = SLIME_TYPE_BLUESPACE /obj/item/slimecross/recurring/sepia extract_type = /obj/item/slime_extract/sepia - colour = "sepia" + colour = SLIME_TYPE_SEPIA max_cooldown = 36 //No infinite timestop for you! /obj/item/slimecross/recurring/cerulean extract_type = /obj/item/slime_extract/cerulean - colour = "cerulean" + colour = SLIME_TYPE_CERULEAN /obj/item/slimecross/recurring/pyrite extract_type = /obj/item/slime_extract/pyrite - colour = "pyrite" + colour = SLIME_TYPE_PYRITE /obj/item/slimecross/recurring/red extract_type = /obj/item/slime_extract/red - colour = "red" + colour = SLIME_TYPE_RED /obj/item/slimecross/recurring/green extract_type = /obj/item/slime_extract/green - colour = "green" + colour = SLIME_TYPE_GREEN /obj/item/slimecross/recurring/pink extract_type = /obj/item/slime_extract/pink - colour = "pink" + colour = SLIME_TYPE_PINK /obj/item/slimecross/recurring/gold extract_type = /obj/item/slime_extract/gold - colour = "gold" + colour = SLIME_TYPE_GOLD max_cooldown = 30 /obj/item/slimecross/recurring/oil extract_type = /obj/item/slime_extract/oil - colour = "oil" //Why would you want this? + colour = SLIME_TYPE_OIL //Why would you want this? /obj/item/slimecross/recurring/black extract_type = /obj/item/slime_extract/black - colour = "black" + colour = SLIME_TYPE_BLACK /obj/item/slimecross/recurring/lightpink extract_type = /obj/item/slime_extract/lightpink - colour = "light pink" + colour = SLIME_TYPE_LIGHT_PINK /obj/item/slimecross/recurring/adamantine extract_type = /obj/item/slime_extract/adamantine - colour = "adamantine" + colour = SLIME_TYPE_ADAMANTINE max_cooldown = 20 /obj/item/slimecross/recurring/rainbow extract_type = /obj/item/slime_extract/rainbow - colour = "rainbow" + colour = SLIME_TYPE_RAINBOW max_cooldown = 40 //It's pretty powerful. diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm index 3e073191e5b..f0f395b33a6 100644 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm @@ -35,11 +35,11 @@ Regenerative extracts: qdel(src) /obj/item/slimecross/regenerative/grey - colour = "grey" //Has no bonus effect. + colour = SLIME_TYPE_GREY //Has no bonus effect. effect_desc = "Fully heals the target and does nothing else." /obj/item/slimecross/regenerative/orange - colour = "orange" + colour = SLIME_TYPE_ORANGE /obj/item/slimecross/regenerative/orange/core_effect_before(mob/living/target, mob/user) target.visible_message(span_warning("The [src] boils over!")) @@ -48,14 +48,14 @@ Regenerative extracts: new /obj/effect/hotspot(targetturf) /obj/item/slimecross/regenerative/purple - colour = "purple" + colour = SLIME_TYPE_PURPLE effect_desc = "Fully heals the target and injects them with some regen jelly." /obj/item/slimecross/regenerative/purple/core_effect(mob/living/target, mob/user) target.reagents.add_reagent(/datum/reagent/medicine/regen_jelly,10) /obj/item/slimecross/regenerative/blue - colour = "blue" + colour = SLIME_TYPE_BLUE effect_desc = "Fully heals the target and makes the floor wet." /obj/item/slimecross/regenerative/blue/core_effect(mob/living/target, mob/user) @@ -65,7 +65,7 @@ Regenerative extracts: target.visible_message(span_warning("The milky goo in the extract gets all over the floor!")) /obj/item/slimecross/regenerative/metal - colour = "metal" + colour = SLIME_TYPE_METAL effect_desc = "Fully heals the target and encases the target in a locker." /obj/item/slimecross/regenerative/metal/core_effect(mob/living/target, mob/user) @@ -76,7 +76,7 @@ Regenerative extracts: target.forceMove(C) /obj/item/slimecross/regenerative/yellow - colour = "yellow" + colour = SLIME_TYPE_YELLOW effect_desc = "Fully heals the target and fully recharges a single item on the target." /obj/item/slimecross/regenerative/yellow/core_effect(mob/living/target, mob/user) @@ -90,7 +90,7 @@ Regenerative extracts: to_chat(target, span_notice("You feel a strange electrical pulse, and one of your electrical items was recharged.")) /obj/item/slimecross/regenerative/darkpurple - colour = "dark purple" + colour = SLIME_TYPE_DARK_PURPLE effect_desc = "Fully heals the target and gives them purple clothing if they are naked." /obj/item/slimecross/regenerative/darkpurple/core_effect(mob/living/target, mob/user) @@ -103,7 +103,7 @@ Regenerative extracts: target.visible_message(span_notice("The milky goo congeals into clothing!")) /obj/item/slimecross/regenerative/darkblue - colour = "dark blue" + colour = SLIME_TYPE_DARK_BLUE effect_desc = "Fully heals the target and fireproofs their clothes." /obj/item/slimecross/regenerative/darkblue/core_effect(mob/living/target, mob/user) @@ -131,7 +131,7 @@ Regenerative extracts: C.resistance_flags |= FIRE_PROOF /obj/item/slimecross/regenerative/silver - colour = "silver" + colour = SLIME_TYPE_SILVER effect_desc = "Fully heals the target and makes their belly feel round and full." /obj/item/slimecross/regenerative/silver/core_effect(mob/living/target, mob/user) @@ -139,7 +139,7 @@ Regenerative extracts: to_chat(target, span_notice("You feel satiated.")) /obj/item/slimecross/regenerative/bluespace - colour = "bluespace" + colour = SLIME_TYPE_BLUESPACE effect_desc = "Fully heals the target and teleports them to where this core was created." var/turf/open/T @@ -155,7 +155,7 @@ Regenerative extracts: T = get_turf(src) /obj/item/slimecross/regenerative/sepia - colour = "sepia" + colour = SLIME_TYPE_SEPIA effect_desc = "Fully heals the target. After 10 seconds, relocate the target to the initial position the core was used with their previous health status." /obj/item/slimecross/regenerative/sepia/core_effect_before(mob/living/target, mob/user) @@ -163,7 +163,7 @@ Regenerative extracts: target.AddComponent(/datum/component/dejavu) /obj/item/slimecross/regenerative/cerulean - colour = "cerulean" + colour = SLIME_TYPE_CERULEAN effect_desc = "Fully heals the target and makes a second regenerative core with no special effects." /obj/item/slimecross/regenerative/cerulean/core_effect(mob/living/target, mob/user) @@ -175,7 +175,7 @@ Regenerative extracts: to_chat(user, span_notice("Some of the milky goo congeals in your hand!")) /obj/item/slimecross/regenerative/pyrite - colour = "pyrite" + colour = SLIME_TYPE_PYRITE effect_desc = "Fully heals and randomly colors the target." /obj/item/slimecross/regenerative/pyrite/core_effect(mob/living/target, mob/user) @@ -183,7 +183,7 @@ Regenerative extracts: target.add_atom_colour(rgb(rand(0,255),rand(0,255),rand(0,255)),WASHABLE_COLOUR_PRIORITY) /obj/item/slimecross/regenerative/red - colour = "red" + colour = SLIME_TYPE_RED effect_desc = "Fully heals the target and injects them with some ephedrine." /obj/item/slimecross/regenerative/red/core_effect(mob/living/target, mob/user) @@ -191,7 +191,7 @@ Regenerative extracts: target.reagents.add_reagent(/datum/reagent/medicine/ephedrine,3) /obj/item/slimecross/regenerative/green - colour = "green" + colour = SLIME_TYPE_GREEN effect_desc = "Fully heals the target and changes the spieces or color of a slime or jellyperson." /obj/item/slimecross/regenerative/green/core_effect(mob/living/target, mob/user) @@ -204,7 +204,7 @@ Regenerative extracts: /obj/item/slimecross/regenerative/pink - colour = "pink" + colour = SLIME_TYPE_PINK effect_desc = "Fully heals the target and injects them with some krokodil." /obj/item/slimecross/regenerative/pink/core_effect(mob/living/target, mob/user) @@ -212,7 +212,7 @@ Regenerative extracts: target.reagents.add_reagent(/datum/reagent/drug/krokodil,4) /obj/item/slimecross/regenerative/gold - colour = "gold" + colour = SLIME_TYPE_GOLD effect_desc = "Fully heals the target and produces a random coin." /obj/item/slimecross/regenerative/gold/core_effect(mob/living/target, mob/user) @@ -222,7 +222,7 @@ Regenerative extracts: target.put_in_hand(C) /obj/item/slimecross/regenerative/oil - colour = "oil" + colour = SLIME_TYPE_OIL effect_desc = "Fully heals the target and flashes everyone in sight." /obj/item/slimecross/regenerative/oil/core_effect(mob/living/target, mob/user) @@ -231,7 +231,7 @@ Regenerative extracts: L.flash_act() /obj/item/slimecross/regenerative/black - colour = "black" + colour = SLIME_TYPE_BLACK effect_desc = "Fully heals the target and creates an imperfect duplicate of them made of slime, that fakes their death." /obj/item/slimecross/regenerative/black/core_effect_before(mob/living/target, mob/user) @@ -253,7 +253,7 @@ Regenerative extracts: dummy.death() /obj/item/slimecross/regenerative/lightpink - colour = "light pink" + colour = SLIME_TYPE_LIGHT_PINK effect_desc = "Fully heals the target and also heals the user." /obj/item/slimecross/regenerative/lightpink/core_effect(mob/living/target, mob/user) @@ -266,14 +266,14 @@ Regenerative extracts: to_chat(U, span_notice("Some of the milky goo sprays onto you, as well!")) /obj/item/slimecross/regenerative/adamantine - colour = "adamantine" + colour = SLIME_TYPE_ADAMANTINE effect_desc = "Fully heals the target and boosts their armor." /obj/item/slimecross/regenerative/adamantine/core_effect(mob/living/target, mob/user) //WIP - Find out why this doesn't work. target.apply_status_effect(/datum/status_effect/slimeskin) /obj/item/slimecross/regenerative/rainbow - colour = "rainbow" + colour = SLIME_TYPE_RAINBOW effect_desc = "Fully heals the target and temporarily makes them immortal, but pacifistic." /obj/item/slimecross/regenerative/rainbow/core_effect(mob/living/target, mob/user) diff --git a/code/modules/research/xenobiology/crossbreeding/reproductive.dm b/code/modules/research/xenobiology/crossbreeding/reproductive.dm index 88bfcb3379a..a0888c1c2f8 100644 --- a/code/modules/research/xenobiology/crossbreeding/reproductive.dm +++ b/code/modules/research/xenobiology/crossbreeding/reproductive.dm @@ -60,88 +60,88 @@ Reproductive extracts: /obj/item/slimecross/reproductive/grey extract_type = /obj/item/slime_extract/grey - colour = "grey" + colour = SLIME_TYPE_GREY /obj/item/slimecross/reproductive/orange extract_type = /obj/item/slime_extract/orange - colour = "orange" + colour = SLIME_TYPE_ORANGE /obj/item/slimecross/reproductive/purple extract_type = /obj/item/slime_extract/purple - colour = "purple" + colour = SLIME_TYPE_PURPLE /obj/item/slimecross/reproductive/blue extract_type = /obj/item/slime_extract/blue - colour = "blue" + colour = SLIME_TYPE_BLUE /obj/item/slimecross/reproductive/metal extract_type = /obj/item/slime_extract/metal - colour = "metal" + colour = SLIME_TYPE_METAL /obj/item/slimecross/reproductive/yellow extract_type = /obj/item/slime_extract/yellow - colour = "yellow" + colour = SLIME_TYPE_YELLOW /obj/item/slimecross/reproductive/darkpurple extract_type = /obj/item/slime_extract/darkpurple - colour = "dark purple" + colour = SLIME_TYPE_DARK_PURPLE /obj/item/slimecross/reproductive/darkblue extract_type = /obj/item/slime_extract/darkblue - colour = "dark blue" + colour = SLIME_TYPE_DARK_BLUE /obj/item/slimecross/reproductive/silver extract_type = /obj/item/slime_extract/silver - colour = "silver" + colour = SLIME_TYPE_SILVER /obj/item/slimecross/reproductive/bluespace extract_type = /obj/item/slime_extract/bluespace - colour = "bluespace" + colour = SLIME_TYPE_BLUESPACE /obj/item/slimecross/reproductive/sepia extract_type = /obj/item/slime_extract/sepia - colour = "sepia" + colour = SLIME_TYPE_SEPIA /obj/item/slimecross/reproductive/cerulean extract_type = /obj/item/slime_extract/cerulean - colour = "cerulean" + colour = SLIME_TYPE_CERULEAN /obj/item/slimecross/reproductive/pyrite extract_type = /obj/item/slime_extract/pyrite - colour = "pyrite" + colour = SLIME_TYPE_PYRITE /obj/item/slimecross/reproductive/red extract_type = /obj/item/slime_extract/red - colour = "red" + colour = SLIME_TYPE_RED /obj/item/slimecross/reproductive/green extract_type = /obj/item/slime_extract/green - colour = "green" + colour = SLIME_TYPE_GREEN /obj/item/slimecross/reproductive/pink extract_type = /obj/item/slime_extract/pink - colour = "pink" + colour = SLIME_TYPE_PINK /obj/item/slimecross/reproductive/gold extract_type = /obj/item/slime_extract/gold - colour = "gold" + colour = SLIME_TYPE_GOLD /obj/item/slimecross/reproductive/oil extract_type = /obj/item/slime_extract/oil - colour = "oil" + colour = SLIME_TYPE_OIL /obj/item/slimecross/reproductive/black extract_type = /obj/item/slime_extract/black - colour = "black" + colour = SLIME_TYPE_BLACK /obj/item/slimecross/reproductive/lightpink extract_type = /obj/item/slime_extract/lightpink - colour = "light pink" + colour = SLIME_TYPE_LIGHT_PINK /obj/item/slimecross/reproductive/adamantine extract_type = /obj/item/slime_extract/adamantine - colour = "adamantine" + colour = SLIME_TYPE_ADAMANTINE /obj/item/slimecross/reproductive/rainbow extract_type = /obj/item/slime_extract/rainbow - colour = "rainbow" + colour = SLIME_TYPE_RAINBOW diff --git a/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm b/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm index ab6f9381086..6fb3f8c7c9d 100644 --- a/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm +++ b/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm @@ -64,88 +64,88 @@ Self-sustaining extracts: /obj/item/slimecross/selfsustaining/grey extract_type = /obj/item/slime_extract/grey - colour = "grey" + colour = SLIME_TYPE_GREY /obj/item/slimecross/selfsustaining/orange extract_type = /obj/item/slime_extract/orange - colour = "orange" + colour = SLIME_TYPE_ORANGE /obj/item/slimecross/selfsustaining/purple extract_type = /obj/item/slime_extract/purple - colour = "purple" + colour = SLIME_TYPE_PURPLE /obj/item/slimecross/selfsustaining/blue extract_type = /obj/item/slime_extract/blue - colour = "blue" + colour = SLIME_TYPE_BLUE /obj/item/slimecross/selfsustaining/metal extract_type = /obj/item/slime_extract/metal - colour = "metal" + colour = SLIME_TYPE_METAL /obj/item/slimecross/selfsustaining/yellow extract_type = /obj/item/slime_extract/yellow - colour = "yellow" + colour = SLIME_TYPE_YELLOW /obj/item/slimecross/selfsustaining/darkpurple extract_type = /obj/item/slime_extract/darkpurple - colour = "dark purple" + colour = SLIME_TYPE_DARK_PURPLE /obj/item/slimecross/selfsustaining/darkblue extract_type = /obj/item/slime_extract/darkblue - colour = "dark blue" + colour = SLIME_TYPE_DARK_BLUE /obj/item/slimecross/selfsustaining/silver extract_type = /obj/item/slime_extract/silver - colour = "silver" + colour = SLIME_TYPE_SILVER /obj/item/slimecross/selfsustaining/bluespace extract_type = /obj/item/slime_extract/bluespace - colour = "bluespace" + colour = SLIME_TYPE_BLUESPACE /obj/item/slimecross/selfsustaining/sepia extract_type = /obj/item/slime_extract/sepia - colour = "sepia" + colour = SLIME_TYPE_SEPIA /obj/item/slimecross/selfsustaining/cerulean extract_type = /obj/item/slime_extract/cerulean - colour = "cerulean" + colour = SLIME_TYPE_CERULEAN /obj/item/slimecross/selfsustaining/pyrite extract_type = /obj/item/slime_extract/pyrite - colour = "pyrite" + colour = SLIME_TYPE_PYRITE /obj/item/slimecross/selfsustaining/red extract_type = /obj/item/slime_extract/red - colour = "red" + colour = SLIME_TYPE_RED /obj/item/slimecross/selfsustaining/green extract_type = /obj/item/slime_extract/green - colour = "green" + colour = SLIME_TYPE_GREEN /obj/item/slimecross/selfsustaining/pink extract_type = /obj/item/slime_extract/pink - colour = "pink" + colour = SLIME_TYPE_PINK /obj/item/slimecross/selfsustaining/gold extract_type = /obj/item/slime_extract/gold - colour = "gold" + colour = SLIME_TYPE_GOLD /obj/item/slimecross/selfsustaining/oil extract_type = /obj/item/slime_extract/oil - colour = "oil" + colour = SLIME_TYPE_OIL /obj/item/slimecross/selfsustaining/black extract_type = /obj/item/slime_extract/black - colour = "black" + colour = SLIME_TYPE_BLACK /obj/item/slimecross/selfsustaining/lightpink extract_type = /obj/item/slime_extract/lightpink - colour = "light pink" + colour = SLIME_TYPE_LIGHT_PINK /obj/item/slimecross/selfsustaining/adamantine extract_type = /obj/item/slime_extract/adamantine - colour = "adamantine" + colour = SLIME_TYPE_ADAMANTINE /obj/item/slimecross/selfsustaining/rainbow extract_type = /obj/item/slime_extract/rainbow - colour = "rainbow" + colour = SLIME_TYPE_RAINBOW diff --git a/code/modules/research/xenobiology/crossbreeding/stabilized.dm b/code/modules/research/xenobiology/crossbreeding/stabilized.dm index 0584927c647..eb49f5dc2c3 100644 --- a/code/modules/research/xenobiology/crossbreeding/stabilized.dm +++ b/code/modules/research/xenobiology/crossbreeding/stabilized.dm @@ -57,71 +57,71 @@ Stabilized extracts: //Colors and subtypes: /obj/item/slimecross/stabilized/grey - colour = "grey" + colour = SLIME_TYPE_GREY effect_desc = "Makes slimes friendly to the owner" /obj/item/slimecross/stabilized/orange - colour = "orange" + colour = SLIME_TYPE_ORANGE effect_desc = "Passively tries to increase or decrease the owner's body temperature to normal" /obj/item/slimecross/stabilized/purple - colour = "purple" + colour = SLIME_TYPE_PURPLE effect_desc = "Provides a regeneration effect" /obj/item/slimecross/stabilized/blue - colour = "blue" + colour = SLIME_TYPE_BLUE effect_desc = "Makes the owner immune to slipping on water, soap or foam. Space lube and ice are still too slippery." /obj/item/slimecross/stabilized/metal - colour = "metal" + colour = SLIME_TYPE_METAL effect_desc = "Every 30 seconds, adds a sheet of material to a random stack in the owner's backpack." /obj/item/slimecross/stabilized/yellow - colour = "yellow" + colour = SLIME_TYPE_YELLOW effect_desc = "Every ten seconds it recharges a device on the owner by 10%." /obj/item/slimecross/stabilized/darkpurple - colour = "dark purple" + colour = SLIME_TYPE_DARK_PURPLE effect_desc = "Gives you burning fingertips, automatically cooking any microwavable food you hold." /obj/item/slimecross/stabilized/darkblue - colour = "dark blue" + colour = SLIME_TYPE_DARK_BLUE effect_desc = "Slowly extinguishes the owner if they are on fire, also wets items like monkey cubes, creating a monkey." /obj/item/slimecross/stabilized/silver - colour = "silver" + colour = SLIME_TYPE_SILVER effect_desc = "Slows the rate at which the owner loses nutrition" /obj/item/slimecross/stabilized/bluespace - colour = "bluespace" + colour = SLIME_TYPE_BLUESPACE effect_desc = "On a two minute cooldown, when the owner has taken enough damage, they are teleported to a safe place." /obj/item/slimecross/stabilized/sepia - colour = "sepia" + colour = SLIME_TYPE_SEPIA effect_desc = "Randomly adjusts the owner's speed." /obj/item/slimecross/stabilized/cerulean - colour = "cerulean" + colour = SLIME_TYPE_CERULEAN effect_desc = "Creates a duplicate of the owner. If the owner dies they will take control of the duplicate, unless the death was from beheading or gibbing." /obj/item/slimecross/stabilized/pyrite - colour = "pyrite" + colour = SLIME_TYPE_PYRITE effect_desc = "Randomly colors the owner every few seconds." /obj/item/slimecross/stabilized/red - colour = "red" + colour = SLIME_TYPE_RED effect_desc = "Nullifies all equipment based slowdowns." /obj/item/slimecross/stabilized/green - colour = "green" + colour = SLIME_TYPE_GREEN effect_desc = "Changes the owner's name and appearance while holding this extract." /obj/item/slimecross/stabilized/pink - colour = "pink" + colour = SLIME_TYPE_PINK effect_desc = "As long as no creatures are harmed in the owner's presense, they will not attack you. If the peace is broken it takes two minutes to restore." /obj/item/slimecross/stabilized/gold - colour = "gold" + colour = SLIME_TYPE_GOLD effect_desc = "Creates a pet when held." var/mob_type var/datum/mind/saved_mind @@ -171,23 +171,23 @@ Stabilized extracts: START_PROCESSING(SSobj, src) /obj/item/slimecross/stabilized/oil - colour = "oil" + colour = SLIME_TYPE_OIL effect_desc = "The owner will violently explode when they die while holding this extract." /obj/item/slimecross/stabilized/black - colour = "black" + colour = SLIME_TYPE_BLACK effect_desc = "While strangling someone, the owner's hands melt around their neck, draining their life in exchange for food and healing." /obj/item/slimecross/stabilized/lightpink - colour = "light pink" + colour = SLIME_TYPE_LIGHT_PINK effect_desc = "The owner moves at high speeds while holding this extract, also stabilizes anyone in critical condition around you using Epinephrine." /obj/item/slimecross/stabilized/adamantine - colour = "adamantine" + colour = SLIME_TYPE_ADAMANTINE effect_desc = "Owner gains a slight boost in damage resistance to all types." /obj/item/slimecross/stabilized/rainbow - colour = "rainbow" + colour = SLIME_TYPE_RAINBOW effect_desc = "Accepts a regenerative extract and automatically uses it if the owner enters a critical condition." var/obj/item/slimecross/regenerative/regencore diff --git a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm b/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm index 1e78c4dbfca..1210e5527eb 100644 --- a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm +++ b/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm @@ -251,7 +251,7 @@ virus_suspectibility = 0 resulting_atoms = list(/mob/living/simple_animal/slime = 1) -/datum/micro_organism/cell_line/blob_spore //shitty cell line to dilute the pool, feel free to make easier to grow if it doesn't interfer with growing the powerful mobs enough. +/datum/micro_organism/cell_line/blob_spore //nuisance cell line desc = "Immature blob spores" required_reagents = list(/datum/reagent/consumable/nutriment/protein) @@ -262,7 +262,8 @@ suppressive_reagents = list( /datum/reagent/consumable/tinlux = -6, - /datum/reagent/napalm = -4) + /datum/reagent/napalm = -4, + /datum/reagent/medicine/psicodine = -2) //Blob zombies likely wouldn't appreciate psicodine so why this is here virus_suspectibility = 0 resulting_atoms = list(/mob/living/simple_animal/hostile/blob/blobspore/independent = 2) //These are useless so we might as well spawn 2. @@ -341,17 +342,18 @@ //////////////////// //// MISC //// //////////////////// -/datum/micro_organism/cell_line/cockroach //nuisance cell line designed to complicate the growing of slime type cell lines. +/datum/micro_organism/cell_line/cockroach //general nuisance cell line desc = "Blattodeoid anthropod cells" required_reagents = list(/datum/reagent/consumable/nutriment/protein) supplementary_reagents = list( - /datum/reagent/yuck = 4, - /datum/reagent/growthserum = 2, + /datum/reagent/growthserum = 1, /datum/reagent/toxin/slimejelly = 2, + /datum/reagent/yuck = 2, //Almost every fun recipe requires this. Making this value too high makes cockroaches extremely anti-fun. /datum/reagent/consumable/nutriment/vitamin = 1) suppressive_reagents = list( /datum/reagent/toxin/pestkiller = -2, + /datum/reagent/consumable/salt = -3, //Some salts are toxic to cockroaches, + helps makes the cell line more manageable /datum/reagent/consumable/poisonberryjuice = -4, /datum/reagent/consumable/ethanol/bug_spray = -4) @@ -734,6 +736,6 @@ /datum/reagent/drug/nicotine = -1, /datum/reagent/toxin/pestkiller = -1) - resulting_atoms = list(/mob/living/simple_animal/hostile/jungle/mega_arachnid = 1) + resulting_atoms = list(/mob/living/basic/mega_arachnid = 1) #undef VAT_GROWTH_RATE diff --git a/code/modules/research/xenobiology/vatgrowing/vatgrower.dm b/code/modules/research/xenobiology/vatgrowing/vatgrower.dm index b2620335a64..ab2a732c9c5 100644 --- a/code/modules/research/xenobiology/vatgrowing/vatgrower.dm +++ b/code/modules/research/xenobiology/vatgrowing/vatgrower.dm @@ -4,9 +4,6 @@ desc = "Tastes just like the chef's soup." icon_state = "growing_vat" buffer = 300 - ///category for plumbing RCD - category = "Synthesizers" - ///List of all microbiological samples in this soup. var/datum/biological_sample/biological_sample diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index c741743118f..ac148161b03 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -69,12 +69,12 @@ connected_recycler = null return ..() -/obj/machinery/computer/camera_advanced/xenobio/handle_atom_del(atom/A) - if(A == current_potion) +/obj/machinery/computer/camera_advanced/xenobio/Exited(atom/movable/gone, direction) + . = ..() + if(gone == current_potion) current_potion = null - if(A in stored_slimes) - stored_slimes -= A - return ..() + if(gone in stored_slimes) + stored_slimes -= gone /obj/machinery/computer/camera_advanced/xenobio/CreateEye() eyeobj = new /mob/camera/ai_eye/remote/xenobio(get_turf(src)) diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 8ea95301780..f81f328c0f3 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -105,7 +105,7 @@ if(SLIME_ACTIVATE_MAJOR) to_chat(user, span_notice("Your [name] starts pulsing...")) if(do_after(user, 40, target = user)) - var/mob/living/simple_animal/slime/S = new(get_turf(user), "grey") + var/mob/living/simple_animal/slime/S = new(get_turf(user), SLIME_TYPE_GREY) playsound(user, 'sound/effects/splat.ogg', 50, TRUE) to_chat(user, span_notice("You spit out [S].")) return 350 diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm index a3e8d74c508..21664265b68 100644 --- a/code/modules/security_levels/keycard_authentication.dm +++ b/code/modules/security_levels/keycard_authentication.dm @@ -17,7 +17,7 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new) req_access = list(ACCESS_KEYCARD_AUTH) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - var/datum/callback/ev + var/datum/callback/activated var/event = "" var/obj/machinery/keycard_auth/event_source var/mob/triggerer = null @@ -29,11 +29,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/keycard_auth, 26) /obj/machinery/keycard_auth/Initialize(mapload) . = ..() - ev = GLOB.keycard_events.addEvent("triggerEvent", CALLBACK(src, PROC_REF(triggerEvent))) + activated = GLOB.keycard_events.addEvent("triggerEvent", CALLBACK(src, PROC_REF(triggerEvent))) /obj/machinery/keycard_auth/Destroy() - GLOB.keycard_events.clearEvent("triggerEvent", ev) - QDEL_NULL(ev) + GLOB.keycard_events.clearEvent("triggerEvent", activated) + activated = null return ..() /obj/machinery/keycard_auth/ui_state(mob/user) diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm index 4035b5d46f2..4065591582e 100644 --- a/code/modules/shuttle/computer.dm +++ b/code/modules/shuttle/computer.dm @@ -160,8 +160,11 @@ validdest = TRUE //Found our destination, we can skip ahead now break if(!validdest) //Didn't find our destination in the list of valid destinations, something bad happening - log_admin("[user] attempted to href dock exploit on [src] with target location \"[dest_id]\"") - message_admins("[user] just attempted to href dock exploit on [src] with target location \"[url_encode(dest_id)]\"") + if(!isnull(user.client)) + log_admin("Warning: possible href exploit by [key_name(user)] - Attempted to dock [src] to illegal target location \"[url_encode(dest_id)]\"") + message_admins("Warning: possible href exploit by [key_name_admin(user)] [ADMIN_FLW(user)] - Attempted to dock [src] to illegal target location \"[url_encode(dest_id)]\"") + else + stack_trace("[user] ([user.type]) tried to send the shuttle [src] to the target location [dest_id], but the target location was not found in the list of valid destinations.") return SHUTTLE_CONSOLE_DESTINVALID switch(SSshuttle.moveShuttle(shuttleId, dest_id, TRUE)) if(DOCKING_SUCCESS) diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 87e85842c81..8569e8fd350 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -526,12 +526,15 @@ priority_announce("The Emergency Shuttle has left the station. Estimate [timeLeft(600)] minutes until the shuttle docks at Central Command.", null, ANNOUNCER_SHUTTLELEFT, "Priority") INVOKE_ASYNC(SSticker, TYPE_PROC_REF(/datum/controller/subsystem/ticker, poll_hearts)) bolt_all_doors() //SKYRAT EDIT ADDITION + SSmapping.mapvote() //If no map vote has been run yet, start one. + + if(!is_reserved_level(z)) + CRASH("Emergency shuttle did not move to transit z-level!") + //Tell the events we're starting, so they can time their spawns or do some other stuff for(var/datum/shuttle_event/event as anything in event_list) event.start_up_event(SSshuttle.emergency_escape_time * engine_coeff) - SSmapping.mapvote() //If no map vote has been run yet, start one. - if(SHUTTLE_STRANDED, SHUTTLE_DISABLED) SSshuttle.checkHostileEnvironment() diff --git a/code/modules/shuttle/shuttle_events/_shuttle_events.dm b/code/modules/shuttle/shuttle_events/_shuttle_events.dm index 6736428c02a..35b00ac3e79 100644 --- a/code/modules/shuttle/shuttle_events/_shuttle_events.dm +++ b/code/modules/shuttle/shuttle_events/_shuttle_events.dm @@ -136,5 +136,5 @@ ///Do any post-spawn edits you need to do /datum/shuttle_event/simple_spawner/proc/post_spawn(atom/movable/spawnee) - ADD_TRAIT(spawnee, TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT, REF(src)) //Lets us spawn and move further away from the shuttle without being teleported into space - ADD_TRAIT(spawnee, TRAIT_DEL_ON_SPACE_DUMP, REF(src)) //if we hit the cordon, we get deleted. If the shuttle can make you, it can qdel you + ADD_TRAIT(spawnee, TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT, INNATE_TRAIT) //Lets us spawn and move further away from the shuttle without being teleported into space + ADD_TRAIT(spawnee, TRAIT_DEL_ON_SPACE_DUMP, INNATE_TRAIT) //if we hit the cordon, we get deleted. If the shuttle can make you, it can qdel you diff --git a/code/modules/shuttle/shuttle_events/meteors.dm b/code/modules/shuttle/shuttle_events/meteors.dm index d1ded58cbad..ef0b6002e57 100644 --- a/code/modules/shuttle/shuttle_events/meteors.dm +++ b/code/modules/shuttle/shuttle_events/meteors.dm @@ -2,8 +2,8 @@ spawning_list = list(/obj/effect/meteor) /datum/shuttle_event/simple_spawner/meteor/post_spawn(atom/movable/spawnee) - ADD_TRAIT(spawnee, TRAIT_FREE_HYPERSPACE_MOVEMENT, src) - ..() + . = ..() + ADD_TRAIT(spawnee, TRAIT_FREE_HYPERSPACE_MOVEMENT, INNATE_TRAIT) /datum/shuttle_event/simple_spawner/meteor/spawn_movable(spawn_type) var/turf/spawn_turf = get_spawn_turf() diff --git a/code/modules/shuttle/shuttle_events/misc.dm b/code/modules/shuttle/shuttle_events/misc.dm index 9f6db855a76..f65eddadf7c 100644 --- a/code/modules/shuttle/shuttle_events/misc.dm +++ b/code/modules/shuttle/shuttle_events/misc.dm @@ -38,3 +38,24 @@ while(islist(spawn_list)) spawn_list = pick_weight(spawn_list) return spawn_list + +///Sensors indicate that a black hole's gravitational field is affecting the region of space we were headed through +/datum/shuttle_event/simple_spawner/black_hole + name = "Black Hole (Oh no!)" + event_probability = 0 // only admin spawnable + spawn_probability_per_process = 10 + activation_fraction = 0.35 + spawning_flags = SHUTTLE_EVENT_HIT_SHUTTLE + spawning_list = list(/obj/singularity/shuttle_event = 1) + // only spawn it once + remove_from_list_when_spawned = TRUE + self_destruct_when_empty = TRUE + +///Kobayashi Maru version +/datum/shuttle_event/simple_spawner/black_hole/adminbus + name = "Black Holes (OH GOD!)" + event_probability = 0 + spawn_probability_per_process = 50 + activation_fraction = 0.2 + spawning_list = list(/obj/singularity/shuttle_event = 10) + remove_from_list_when_spawned = TRUE diff --git a/code/modules/shuttle/spaceship_navigation_beacon.dm b/code/modules/shuttle/spaceship_navigation_beacon.dm index 0c27f5486b6..4ae91af588a 100644 --- a/code/modules/shuttle/spaceship_navigation_beacon.dm +++ b/code/modules/shuttle/spaceship_navigation_beacon.dm @@ -1,60 +1,109 @@ -/obj/item/circuitboard/machine/spaceship_navigation_beacon - name = "Bluespace Navigation Gigabeacon (Machine Board)" - build_path = /obj/machinery/spaceship_navigation_beacon - req_components = list() - - -/obj/machinery/spaceship_navigation_beacon//SKYRAT EDIT - ICON OVERRIDEN BY AESTHETICS - SEE MODULE - name = "Bluespace Navigation Gigabeacon" - desc = "A device that creates a bluespace anchor that allow ships jump near to it." - icon = 'icons/obj/antags/abductor.dmi' - icon_state = "core" - base_icon_state = "core" +/obj/machinery/spaceship_navigation_beacon + name = "radio navigation gigabeacon" + desc = "A device that constantly transmits its position over several different commonly used maritime navigation frequencies. Used to create shuttle navigation waypoints in unexplored or undeveloped areas." + icon = 'icons/obj/machines/navigation_beacon.dmi' + icon_state = "beacon_active" + base_icon_state = "beacon" density = TRUE - circuit = /obj/item/circuitboard/machine/spaceship_navigation_beacon - - var/locked = FALSE //Locked beacons don't allow to jump to it. + flags_1 = NODECONSTRUCT_1 + /// Locked beacons cannot be jumped to by ships. + var/locked = FALSE + /// Time between automated messages. + var/automatic_message_cooldown = 5 MINUTES + /// Next world tick to send an automatic message. + var/next_automatic_message_time + /// Our internal radio. + var/obj/item/radio/radio /obj/machinery/spaceship_navigation_beacon/Initialize(mapload) . = ..() SSshuttle.beacon_list |= src + name = "[initial(src.name)] [z]-[rand(0, 999)]" + + var/static/list/multitool_tips = list( + TOOL_MULTITOOL = list( + SCREENTIP_CONTEXT_LMB = "Edit beacon name", + SCREENTIP_CONTEXT_RMB = "Lock/Unlock beacon", + ) + ) + AddElement(/datum/element/contextual_screentip_tools, multitool_tips) + + radio = new(src) + radio.set_listening(FALSE) + radio.set_frequency(FREQ_RADIO_NAV_BEACON) + radio.freqlock = RADIO_FREQENCY_LOCKED + radio.recalculateChannels() + + START_PROCESSING(SSmachines, src) + COOLDOWN_START(src, next_automatic_message_time, automatic_message_cooldown) + /obj/machinery/spaceship_navigation_beacon/emp_act() locked = TRUE + update_icon_state() /obj/machinery/spaceship_navigation_beacon/Destroy() SSshuttle.beacon_list -= src return ..() -// update the icon_state /obj/machinery/spaceship_navigation_beacon/update_icon_state() - icon_state = "[base_icon_state][powered() ? null : "-open"]" + icon_state = "[base_icon_state][locked ? "_locked" : "_active"]" return ..() -/obj/machinery/spaceship_navigation_beacon/multitool_act(mob/living/user, obj/item/multitool/I) +/obj/machinery/spaceship_navigation_beacon/multitool_act(mob/living/user, obj/item/tool) ..() - if(panel_open) - var/chosen_tag = tgui_input_text(user, "Enter the custom name for this beacon", "Beacon Reclassification", max_length = MAX_NAME_LEN) - if(!chosen_tag) - return - var/new_name = "Beacon_[chosen_tag]" - if(new_name && Adjacent(user)) - name = new_name - to_chat(user, span_notice("You change beacon name to [name].")) - else - locked =!locked - to_chat(user, span_notice("You [locked ? "" : "un"]lock [src].")) + + var/chosen_tag = tgui_input_text(user, "Enter the custom name for this beacon", "Beacon Reclassification", max_length = MAX_NAME_LEN) + if(!chosen_tag) + return + + var/new_name = "[initial(src.name)] [chosen_tag]" + if(new_name && Adjacent(user)) + name = new_name + balloon_alert_to_viewers("beacon renamed") + + return TRUE + +/obj/machinery/spaceship_navigation_beacon/multitool_act_secondary(mob/living/user, obj/item/tool) + ..() + + locked = !locked + + balloon_alert_to_viewers("[!locked ? "unlocked" : "locked"]") + update_icon_state() + return TRUE /obj/machinery/spaceship_navigation_beacon/examine() .=..() - . += "Status: [locked ? "LOCKED" : "Stable"] " + . += span_notice("'[FREQ_RADIO_NAV_BEACON / 10] kHz' is printed on the side.") + if(locked) + . += span_warning("The blinking red light on the front indicates that this beacon is LOCKED.") + else + . += span_notice("The blinking green light on the front indicates that this beacon is operating normally.") -/obj/machinery/spaceship_navigation_beacon/attackby(obj/item/W, mob/user, params) - if(default_deconstruction_screwdriver(user, "core-open", "core", W)) - return - if(default_deconstruction_crowbar(W)) - return +/obj/machinery/spaceship_navigation_beacon/process(seconds_per_tick) + if(COOLDOWN_FINISHED(src, next_automatic_message_time) && radio) + var/automatic_nav_message = "[src], Sector [z], [locked ? "Beacon Locked" : "Beacon Operational"], Grid Coordinates, [x] East, [y] North." - return ..() + radio.talk_into(src, "[automatic_nav_message]") + + COOLDOWN_START(src, next_automatic_message_time, automatic_message_cooldown) + +// Item used to actually make nav beacons + +/obj/item/folded_navigation_gigabeacon + name = "compact radio navigation gigabeacon" + desc = "A compact radio navigation gigabeacon, a device used to provide shuttle navigation waypoints in unexplored areas. Must be deployed before use." + icon = 'icons/obj/machines/navigation_beacon.dmi' + icon_state = "beacon_folded" + +/obj/item/folded_navigation_gigabeacon/Initialize(mapload) + . = ..() + AddComponent(/datum/component/deployable, 3 SECONDS, /obj/machinery/spaceship_navigation_beacon, delete_on_use = TRUE) + +/obj/item/folded_navigation_gigabeacon/examine() + .=..() + . += span_notice("The backside has instructions in various galactic languages detailing how this can be deployed in hand without any special tools.") + . += span_notice("'[FREQ_RADIO_NAV_BEACON / 10] kHz' is printed on the side.") diff --git a/code/modules/shuttle/white_ship.dm b/code/modules/shuttle/white_ship.dm index e451844f8ce..b222fde787b 100644 --- a/code/modules/shuttle/white_ship.dm +++ b/code/modules/shuttle/white_ship.dm @@ -15,19 +15,6 @@ . = ..() AddComponent(/datum/component/gps, SPACE_SIGNAL_GPSTAG) -/obj/machinery/computer/shuttle/white_ship/pod - name = "Salvage Pod Console" - desc = "Used to control the Salvage Pod." - circuit = /obj/item/circuitboard/computer/white_ship/pod - shuttleId = "whiteship_pod" - possible_destinations = "whiteship_pod_home;whiteship_pod_custom" - -/obj/machinery/computer/shuttle/white_ship/pod/recall - name = "Salvage Pod Recall Console" - desc = "Used to recall the Salvage Pod." - circuit = /obj/item/circuitboard/computer/white_ship/pod/recall - possible_destinations = "whiteship_pod_home" - /obj/machinery/computer/camera_advanced/shuttle_docker/whiteship name = "White Ship Navigation Computer" desc = "Used to designate a precise transit location for the White Ship." @@ -40,17 +27,6 @@ y_offset = -10 designate_time = 100 -/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship/pod - name = "Salvage Pod Navigation Computer" - desc = "Used to designate a precise transit location for the Salvage Pod." - shuttleId = "whiteship_pod" - shuttlePortId = "whiteship_pod_custom" - jump_to_ports = list("whiteship_pod_home" = 1) - view_range = 0 - x_offset = -2 - y_offset = 0 - designate_time = 0 - /obj/machinery/computer/camera_advanced/shuttle_docker/whiteship/Initialize(mapload) . = ..() GLOB.jam_on_wardec += src diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index bcedf1073f2..aad6135c45a 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -191,7 +191,7 @@ if(ishuman(owner)) if(spell_requirements & SPELL_REQUIRES_WIZARD_GARB) var/mob/living/carbon/human/human_owner = owner - if(!(human_owner.wear_suit?.clothing_flags & CASTING_CLOTHES)) + if(!(human_owner.wear_suit?.clothing_flags & CASTING_CLOTHES) && !ismonkey(human_owner)) // Monkeys don't need robes to cast as they are inherently imbued with power from the banana dimension if(feedback) to_chat(owner, span_warning("You don't feel strong enough without your robe!")) return FALSE @@ -201,12 +201,21 @@ return FALSE else - // If the spell requires wizard equipment and we're not a human (can't wear robes or hats), that's just a given - if(spell_requirements & (SPELL_REQUIRES_WIZARD_GARB|SPELL_REQUIRES_HUMAN)) + // If you strictly need to be a human, well, goodbye. + if(spell_requirements & SPELL_REQUIRES_HUMAN) if(feedback) to_chat(owner, span_warning("[src] can only be cast by humans!")) return FALSE + // Otherwise, we can check for contents if they have wizardly apparel. This isn't *quite* perfect, but it'll do, especially since many of the edge cases (gorilla holding a wizard hat) still more or less make sense. + if(spell_requirements & SPELL_REQUIRES_WIZARD_GARB) + for(var/atom/movable/item in owner.contents) + var/obj/item/clothing/clothem = item + if(istype(clothem) && clothem.clothing_flags & CASTING_CLOTHES) + return TRUE + to_chat(owner, span_warning("You don't feel strong enough without your hat!")) + return FALSE + if(!(spell_requirements & SPELL_CASTABLE_AS_BRAIN) && isbrain(owner)) if(feedback) to_chat(owner, span_warning("[src] can't be cast in this state!")) diff --git a/code/modules/spells/spell_types/conjure/simian.dm b/code/modules/spells/spell_types/conjure/simian.dm new file mode 100644 index 00000000000..556a78e5012 --- /dev/null +++ b/code/modules/spells/spell_types/conjure/simian.dm @@ -0,0 +1,98 @@ +/datum/action/cooldown/spell/conjure/simian + name = "Summon Simians" + desc = "This spell reaches deep into the elemental plane of bananas (the monkey one, not the clown one), and \ + summons monkeys and gorillas that will promptly flip out and attack everything in sight. Fun! \ + Their lesser, easily manipulable minds will be convinced you are one of their allies, but only for a minute. Unless you also are a monkey." + button_icon_state = "simian" + sound = 'sound/ambience/antag/monkey.ogg' + + school = SCHOOL_CONJURATION + cooldown_time = 1.5 MINUTES + cooldown_reduction_per_rank = 15 SECONDS + + invocation = "OOGA OOGA OOGA!!!!" + invocation_type = INVOCATION_SHOUT + + summon_radius = 2 + summon_type = list(/mob/living/carbon/human/species/monkey/angry, /mob/living/carbon/human/species/monkey/angry, /mob/living/simple_animal/hostile/gorilla/lesser) + summon_amount = 4 + +/datum/action/cooldown/spell/conjure/simian/level_spell(bypass_cap) + . = ..() + summon_amount++ // MORE, MOOOOORE + if(spell_level == spell_max_level) // We reward the faithful. + summon_type = list(/mob/living/carbon/human/species/monkey/angry, /mob/living/simple_animal/hostile/gorilla) + spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC // Max level lets you cast it naked, for monkey larp. + to_chat(owner, span_notice("Your simian power has reached maximum capacity! You can now cast this spell naked, and you will create adult Gorillas with each cast.")) + +/datum/action/cooldown/spell/conjure/simian/cast(atom/cast_on) + . = ..() + var/mob/living/cast_mob = cast_on + if(!istype(cast_mob)) + return + if(FACTION_MONKEY in cast_mob.faction) + return + cast_mob.faction |= FACTION_MONKEY + addtimer(CALLBACK(src, PROC_REF(remove_monky_faction), cast_mob), 1 MINUTES) + +/datum/action/cooldown/spell/conjure/simian/proc/remove_monky_faction(mob/cast_mob) + cast_mob.faction -= FACTION_MONKEY + +/datum/action/cooldown/spell/conjure/simian/post_summon(atom/summoned_object, atom/cast_on) + var/mob/living/alive_dude = summoned_object + alive_dude.faction |= list(FACTION_MONKEY) + if(ismonkey(alive_dude)) + equip_monky(alive_dude) + return + +/** Equips summoned monky with gear depending on how the roll plays out, affected by spell lvl. + * Can give them bananas and garland or gatfruit and axes. Monkeys are comically inept, which balances out what might otherwise be a little crazy. + */ +/datum/action/cooldown/spell/conjure/simian/proc/equip_monky(mob/living/carbon/human/species/monkey/summoned_monkey) + + // These are advanced monkeys we're talking about + var/datum/ai_controller/monkey/monky_controller = summoned_monkey.ai_controller + monky_controller.set_trip_mode(mode = FALSE) + summoned_monkey.fully_replace_character_name(summoned_monkey.real_name, "primal " + summoned_monkey.name) + + // Monkeys get a random gear tier, but it's more likely to be good the more leveled the spell is! + var/monkey_gear_tier = rand(0, 5) + (spell_level - 1) + monkey_gear_tier = min(monkey_gear_tier, 5) + + // Monkey weapons, ordered by tier + var/static/list/monky_weapon = list( + list(/obj/item/food/grown/banana, /obj/item/grown/bananapeel), + list(/obj/item/tailclub, /obj/item/knife/combat/bone), + list(/obj/item/shovel/serrated, /obj/item/spear/bamboospear), + list(/obj/item/spear/bonespear, /obj/item/fireaxe/boneaxe), + list(/obj/item/gun/syringe/blowgun, /obj/item/gun/ballistic/revolver), + ) + + var/list/options = monky_weapon[min(monkey_gear_tier, length(monky_weapon))] + + var/obj/item/weapon + if(monkey_gear_tier != 0) + var/weapon_type = pick(options) + weapon = new weapon_type(summoned_monkey) + summoned_monkey.equip_to_slot_or_del(weapon, ITEM_SLOT_HANDS) + + // Load the ammo + if(istype(weapon, /obj/item/gun/syringe/blowgun)) + var/obj/item/reagent_containers/syringe/crude/tribal/syring = new(summoned_monkey) + weapon.attackby(syring, summoned_monkey) + + // Wield the weapon! + if(is_type_in_list(weapon, list(/obj/item/spear, /obj/item/fireaxe))) + weapon.attack_self(summoned_monkey) + + // Fashionable ape wear, organised by tier + var/list/static/monky_hats = list( + null, // nothin here + /obj/item/clothing/head/costume/garland, + /obj/item/clothing/head/helmet/durathread, + /obj/item/clothing/head/helmet/skull, + ) + + var/stylish_monkey_hat = monky_hats[min(monkey_gear_tier, length(monky_hats))] + if(!isnull(stylish_monkey_hat)) + summoned_monkey.equip_to_slot_or_del(new stylish_monkey_hat(summoned_monkey), ITEM_SLOT_HEAD) diff --git a/code/modules/spells/spell_types/jaunt/_jaunt.dm b/code/modules/spells/spell_types/jaunt/_jaunt.dm index 20271cd71ba..4a94f03c041 100644 --- a/code/modules/spells/spell_types/jaunt/_jaunt.dm +++ b/code/modules/spells/spell_types/jaunt/_jaunt.dm @@ -19,6 +19,12 @@ /// What dummy mob type do we put jaunters in on jaunt? var/jaunt_type = /obj/effect/dummy/phased_mob +/datum/action/cooldown/spell/jaunt/get_caster_from_target(atom/target) + if(istype(target.loc, jaunt_type)) + return target + + return ..() + /datum/action/cooldown/spell/jaunt/before_cast(atom/cast_on) return ..() | SPELL_NO_FEEDBACK // Don't do the feedback until after we're jaunting diff --git a/code/modules/spells/spell_types/jaunt/shadow_walk.dm b/code/modules/spells/spell_types/jaunt/shadow_walk.dm index 29bb8063367..de03f8e15e0 100644 --- a/code/modules/spells/spell_types/jaunt/shadow_walk.dm +++ b/code/modules/spells/spell_types/jaunt/shadow_walk.dm @@ -9,6 +9,9 @@ spell_requirements = NONE jaunt_type = /obj/effect/dummy/phased_mob/shadow + /// The max amount of lumens on a turf allowed before we can no longer enter jaunt with this + var/light_threshold = SHADOW_SPECIES_LIGHT_THRESHOLD + /datum/action/cooldown/spell/jaunt/shadow_walk/Grant(mob/grant_to) . = ..() RegisterSignal(grant_to, COMSIG_MOVABLE_MOVED, PROC_REF(update_status_on_signal)) @@ -17,6 +20,12 @@ . = ..() UnregisterSignal(remove_from, COMSIG_MOVABLE_MOVED) +/datum/action/cooldown/spell/jaunt/shadow_walk/enter_jaunt(mob/living/jaunter, turf/loc_override) + var/obj/effect/dummy/phased_mob/shadow/shadow = ..() + if(istype(shadow)) + shadow.light_max = light_threshold + return shadow + /datum/action/cooldown/spell/jaunt/shadow_walk/can_cast_spell(feedback = TRUE) . = ..() if(!.) @@ -24,7 +33,7 @@ if(is_jaunting(owner)) return TRUE var/turf/cast_turf = get_turf(owner) - if(cast_turf.get_lumcount() >= SHADOW_SPECIES_LIGHT_THRESHOLD) + if(cast_turf.get_lumcount() >= light_threshold) if(feedback) to_chat(owner, span_warning("It isn't dark enough here!")) return FALSE @@ -44,6 +53,8 @@ /obj/effect/dummy/phased_mob/shadow name = "shadows" + /// Max amount of light permitted before being kicked out + var/light_max = SHADOW_SPECIES_LIGHT_THRESHOLD /// The amount that shadow heals us per SSobj tick (times seconds_per_tick) var/healing_rate = 1.5 /// When cooldown is active, you are prevented from moving into tiles that would eject you from your jaunt @@ -109,11 +120,9 @@ * * location_to_check - The location to have its light level checked. */ -/obj/effect/dummy/phased_mob/shadow/proc/check_light_level(location_to_check) - var/turf/T = get_turf(location_to_check) - var/light_amount = T.get_lumcount() - if(light_amount > 0.2) // jaunt ends - return TRUE +/obj/effect/dummy/phased_mob/shadow/proc/check_light_level(atom/location_to_check) + var/turf/light_turf = get_turf(location_to_check) + return light_turf.get_lumcount() > light_max // jaunt ends on TRUE /** * Checks if the user should recieve a warning that they're moving into light. diff --git a/code/modules/spells/spell_types/self/mutate.dm b/code/modules/spells/spell_types/self/mutate.dm index e432d55c701..4908a37053d 100644 --- a/code/modules/spells/spell_types/self/mutate.dm +++ b/code/modules/spells/spell_types/self/mutate.dm @@ -38,7 +38,7 @@ /datum/action/cooldown/spell/apply_mutations/mutate name = "Mutate" - desc = "This spell causes you to turn into a hulk and gain laser vision for a short while." + desc = "This spell causes you to turn into a gigantic hulk and gain laser vision for a short while. Unlike the lesser nonmagical version, it works on non-humans and mantains hand dexterity as well!" cooldown_time = 40 SECONDS cooldown_reduction_per_rank = 5 SECONDS spell_max_level = 3 @@ -46,5 +46,18 @@ invocation = "BIRUZ BENNAR" invocation_type = INVOCATION_SHOUT - mutations_to_add = list(/datum/mutation/human/laser_eyes, /datum/mutation/human/hulk) + mutations_to_add = list(/datum/mutation/human/laser_eyes, /datum/mutation/human/hulk/wizardly, /datum/mutation/human/gigantism) mutation_duration = 30 SECONDS + +/datum/action/cooldown/spell/apply_mutations/mutate/cast(mob/living/carbon/human/cast_on) + ..() + if(HAS_TRAIT(cast_on, TRAIT_USES_SKINTONES) || HAS_TRAIT(cast_on, TRAIT_MUTANT_COLORS)) + return + // Our caster has a species that doesn't greenify when hulked, so we will do it manually. + cast_on.add_atom_colour("#00FF00", TEMPORARY_COLOUR_PRIORITY) + +/datum/action/cooldown/spell/apply_mutations/mutate/remove_mutations(mob/living/carbon/human/cast_on) + if(QDELETED(cast_on) || !is_valid_target(cast_on)) + return + + cast_on.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY) diff --git a/code/modules/spells/spell_types/shapeshift/shapechange.dm b/code/modules/spells/spell_types/shapeshift/shapechange.dm index 3177191d49a..2e890eed632 100644 --- a/code/modules/spells/spell_types/shapeshift/shapechange.dm +++ b/code/modules/spells/spell_types/shapeshift/shapechange.dm @@ -16,6 +16,6 @@ /mob/living/basic/pet/dog/corgi, /mob/living/basic/carp/magic/chaos, /mob/living/simple_animal/bot/secbot/ed209, - /mob/living/basic/giant_spider/viper/wizard, + /mob/living/basic/spider/giant/viper/wizard, /mob/living/simple_animal/hostile/construct/juggernaut/mystic, ) diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm index eb277b9f681..9ac99c86b3c 100644 --- a/code/modules/station_goals/bsa.dm +++ b/code/modules/station_goals/bsa.dm @@ -56,7 +56,7 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE) if(!multitool_check_buffer(user, I)) //make sure it has a data buffer return var/obj/item/multitool/M = I - M.buffer = src + M.set_buffer(src) to_chat(user, span_notice("You store linkage information in [I]'s buffer.")) return TRUE @@ -73,7 +73,7 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE) if(!multitool_check_buffer(user, I)) //make sure it has a data buffer return var/obj/item/multitool/M = I - M.buffer = src + M.set_buffer(src) to_chat(user, span_notice("You store linkage information in [I]'s buffer.")) return TRUE @@ -96,11 +96,11 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE) if(istype(M.buffer, /obj/machinery/bsa/back)) back_ref = WEAKREF(M.buffer) to_chat(user, span_notice("You link [src] with [M.buffer].")) - M.buffer = null + M.set_buffer(null) else if(istype(M.buffer, /obj/machinery/bsa/front)) front_ref = WEAKREF(M.buffer) to_chat(user, span_notice("You link [src] with [M.buffer].")) - M.buffer = null + M.set_buffer(null) else to_chat(user, span_warning("[I]'s data buffer is empty!")) return TRUE diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 46490d14655..2b85e7843ff 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -274,14 +274,10 @@ if(burn_dam > DAMAGE_PRECISION) . += span_warning("This limb has [burn_dam > 30 ? "severe" : "minor"] burns.") - if(locate(/datum/wound/blunt) in wounds) - . += span_warning("The bones in this limb appear badly cracked.") - if(locate(/datum/wound/slash) in wounds) - . += span_warning("The flesh on this limb appears badly lacerated.") - if(locate(/datum/wound/pierce) in wounds) - . += span_warning("The flesh on this limb appears badly perforated.") - if(locate(/datum/wound/burn) in wounds) - . += span_warning("The flesh on this limb appears badly cooked.") + for(var/datum/wound/wound as anything in wounds) + var/wound_desc = wound.get_limb_examine_description() + if(wound_desc) + . += wound_desc /** * Called when a bodypart is checked for injuries. diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index c722ea43987..850bfc7b9e7 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -20,7 +20,7 @@ limb_owner.visible_message(span_danger("[limb_owner]'s [name] is violently dismembered!")) INVOKE_ASYNC(limb_owner, TYPE_PROC_REF(/mob, emote), "scream") playsound(get_turf(limb_owner), 'sound/effects/dismember.ogg', 80, TRUE) - limb_owner.add_mood_event("dismembered", /datum/mood_event/dismembered) + limb_owner.add_mood_event("dismembered_[body_zone]", /datum/mood_event/dismembered, src) limb_owner.add_mob_memory(/datum/memory/was_dismembered, lost_limb = src) drop_limb() @@ -95,9 +95,6 @@ bodypart_flags &= ~BODYPART_IMPLANTED //limb is out and about, it can't really be considered an implant owner.remove_bodypart(src) - for(var/datum/wound/wound as anything in wounds) - wound.remove_wound(TRUE) - for(var/datum/scar/scar as anything in scars) scar.victim = null LAZYREMOVE(owner.all_scars, scar) @@ -107,6 +104,9 @@ var/mob/living/carbon/phantom_owner = set_owner(null) // so we can still refer to the guy who lost their limb after said limb forgets 'em + for(var/datum/wound/wound as anything in wounds) + wound.remove_wound(TRUE) + for(var/datum/surgery/surgery as anything in phantom_owner.surgeries) //if we had an ongoing surgery on that limb, we stop it. if(surgery.operated_bodypart == src) phantom_owner.surgeries -= surgery @@ -236,10 +236,9 @@ /obj/item/bodypart/arm/drop_limb(special) var/mob/living/carbon/arm_owner = owner - . = ..() if(special || !arm_owner) - return + return ..() if(arm_owner.hand_bodyparts[held_index] == src) // We only want to do this if the limb being removed is the active hand part. @@ -256,6 +255,7 @@ if(arm_owner.gloves) arm_owner.dropItemToGround(arm_owner.gloves, TRUE) arm_owner.update_worn_gloves() //to remove the bloody hands overlay + return ..() /obj/item/bodypart/leg/drop_limb(special) if(owner && !special) @@ -351,6 +351,10 @@ scar.victim = new_limb_owner LAZYADD(new_limb_owner.all_scars, scar) + if(!special && new_limb_owner.mob_mood.has_mood_of_category("dismembered_[body_zone]")) + new_limb_owner.clear_mood_event("dismembered_[body_zone]") + new_limb_owner.add_mood_event("phantom_pain_[body_zone]", /datum/mood_event/reattachment, src) + update_bodypart_damage_state() if(can_be_disabled) update_disabled() diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 0872ccbebb5..73e7d4207e5 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -93,7 +93,7 @@ var/datum/worn_feature_offset/worn_face_offset /obj/item/bodypart/head/Destroy() - QDEL_NULL(brainmob) //order is sensitive, see warning in handle_atom_del() below + QDEL_NULL(brainmob) //order is sensitive, see warning in Exited() below QDEL_NULL(brain) QDEL_NULL(eyes) QDEL_NULL(ears) @@ -106,21 +106,21 @@ QDEL_NULL(worn_face_offset) return ..() -/obj/item/bodypart/head/handle_atom_del(atom/head_atom) - if(head_atom == brain) +/obj/item/bodypart/head/Exited(atom/movable/gone, direction) + if(gone == brain) brain = null update_icon_dropped() if(!QDELETED(brainmob)) //this shouldn't happen without badminnery. message_admins("Brainmob: ([ADMIN_LOOKUPFLW(brainmob)]) was left stranded in [src] at [ADMIN_VERBOSEJMP(src)] without a brain!") brainmob.log_message(", brainmob, was left stranded in [src] without a brain", LOG_GAME) - if(head_atom == brainmob) + if(gone == brainmob) brainmob = null - if(head_atom == eyes) + if(gone == eyes) eyes = null update_icon_dropped() - if(head_atom == ears) + if(gone == ears) ears = null - if(head_atom == tongue) + if(gone == tongue) tongue = null return ..() @@ -165,7 +165,6 @@ user.visible_message(span_warning("[user] saws [src] open and pulls out a brain!"), span_notice("You saw [src] open and pull out a brain.")) if(brainmob) brainmob.container = null - brainmob.forceMove(brain) brain.brainmob = brainmob brainmob = null if(violent_removal && prob(rand(80, 100))) //ghetto surgery can damage the brain. @@ -191,7 +190,8 @@ /obj/item/bodypart/head/update_limb(dropping_limb, is_creating) . = ..() - real_name = owner.real_name + if(!isnull(owner)) + real_name = owner.real_name if(HAS_TRAIT(owner, TRAIT_HUSK)) real_name = "Unknown" update_hair_and_lips(dropping_limb, is_creating) diff --git a/code/modules/surgery/bodyparts/head_hair_and_lips.dm b/code/modules/surgery/bodyparts/head_hair_and_lips.dm index e29a2b8b657..607c8ad73c9 100644 --- a/code/modules/surgery/bodyparts/head_hair_and_lips.dm +++ b/code/modules/surgery/bodyparts/head_hair_and_lips.dm @@ -299,6 +299,10 @@ return /mob/living/carbon/human/set_hair_gradient_style(new_style, update = TRUE) + if(new_style == "None") + new_style = null + if(LAZYACCESS(grad_style, GRADIENT_HAIR_KEY) == new_style) + return var/obj/item/bodypart/head/my_head = get_bodypart(BODY_ZONE_HEAD) LAZYSETLEN(grad_style, GRADIENTS_LEN) @@ -320,6 +324,8 @@ return /mob/living/carbon/human/set_hair_gradient_color(new_color, update = TRUE) + if(LAZYACCESS(grad_color, GRADIENT_HAIR_KEY) == new_color) + return var/obj/item/bodypart/head/my_head = get_bodypart(BODY_ZONE_HEAD) @@ -379,6 +385,10 @@ return /mob/living/carbon/human/set_facial_hair_gradient_style(new_style, update = TRUE) + if(new_style == "None") + new_style = null + if(LAZYACCESS(grad_style, GRADIENT_FACIAL_HAIR_KEY) == new_style) + return var/obj/item/bodypart/head/my_head = get_bodypart(BODY_ZONE_HEAD) LAZYSETLEN(grad_style, GRADIENTS_LEN) @@ -400,6 +410,8 @@ return /mob/living/carbon/human/set_facial_hair_gradient_color(new_color, update = TRUE) + if(LAZYACCESS(grad_color, GRADIENT_FACIAL_HAIR_KEY) == new_color) + return var/obj/item/bodypart/head/my_head = get_bodypart(BODY_ZONE_HEAD) LAZYSETLEN(grad_style, GRADIENTS_LEN) diff --git a/code/modules/surgery/healing.dm b/code/modules/surgery/healing.dm index cd54bf7252f..37441897527 100644 --- a/code/modules/surgery/healing.dm +++ b/code/modules/surgery/healing.dm @@ -18,10 +18,6 @@ /datum/surgery/healing/can_start(mob/user, mob/living/patient) . = ..() - if(isanimal(patient)) - var/mob/living/simple_animal/critter = patient - if(!critter.healable) - return FALSE if(!(patient.mob_biotypes & (MOB_ORGANIC|MOB_HUMANOID))) return FALSE diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm index c194c150d6d..17a8e147fb3 100644 --- a/code/modules/surgery/organ_manipulation.dm +++ b/code/modules/surgery/organ_manipulation.dm @@ -293,7 +293,7 @@ ///only operate on internal organs /datum/surgery_step/manipulate_organs/internal/can_use_organ(mob/user, obj/item/organ/organ) - return isinternalorgan(organ) + return isinternalorgan(organ) && !(organ.organ_flags & ORGAN_UNREMOVABLE) // SKYRAT EDIT - Don't show unremovable organs - ORIGINAL: return isinternalorgan(organ) ///prosthetic surgery gives full effectiveness to crowbars (and hemostats) /datum/surgery_step/manipulate_organs/internal/mechanic @@ -307,7 +307,7 @@ ///Only operate on external organs /datum/surgery_step/manipulate_organs/external/can_use_organ(mob/user, obj/item/organ/organ) - return isexternalorgan(organ) + return isexternalorgan(organ) && !(organ.organ_flags & ORGAN_UNREMOVABLE) // SKYRAT EDIT - Don't show unremovable organs - ORIGINAL: return isexternalorgan(organ) ///prosthetic surgery gives full effectiveness to crowbars (and hemostats) /datum/surgery_step/manipulate_organs/external/mechanic diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm index 089f5f0dc1c..86cdf855134 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm @@ -124,12 +124,17 @@ /obj/item/organ/internal/cyberimp/arm/proc/Retract() if(!active_item || (active_item in src)) return FALSE + if(owner) + owner.visible_message( + span_notice("[owner] retracts [active_item] back into [owner.p_their()] [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm."), + span_notice("[active_item] snaps back into your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm."), + span_hear("You hear a short mechanical noise."), + ) - owner?.visible_message(span_notice("[owner] retracts [active_item] back into [owner.p_their()] [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm."), - span_notice("[active_item] snaps back into your [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm."), - span_hear("You hear a short mechanical noise.")) + owner.transferItemToLoc(active_item, src, TRUE) + else + active_item.forceMove(src) - owner.transferItemToLoc(active_item, src, TRUE) UnregisterSignal(active_item, COMSIG_ITEM_ATTACK_SELF) active_item = null playsound(get_turf(owner), retract_sound, 50, TRUE) diff --git a/code/modules/surgery/organs/internal/eyes/_eyes.dm b/code/modules/surgery/organs/internal/eyes/_eyes.dm index a4e8a524753..704fb9e9e5b 100644 --- a/code/modules/surgery/organs/internal/eyes/_eyes.dm +++ b/code/modules/surgery/organs/internal/eyes/_eyes.dm @@ -40,7 +40,9 @@ var/eye_color_left = "" //set to a hex code to override a mob's left eye color var/eye_color_right = "" //set to a hex code to override a mob's right eye color var/eye_icon_state = "eyes" + /// The color of the previous left eye before this one was inserted var/old_eye_color_left = "fff" + /// The color of the previous right eye before this one was inserted var/old_eye_color_right = "fff" /// Glasses cannot be worn over these eyes. Currently unused @@ -51,16 +53,24 @@ var/native_fov = FOV_180_DEGREES //SKYRAT EDIT CHANGE /obj/item/organ/internal/eyes/Insert(mob/living/carbon/eye_recipient, special = FALSE, drop_if_replaced = FALSE) + // If we don't do this before everything else, heterochromia will be reset leading to eye_color_right no longer being accurate + if(ishuman(eye_recipient)) + var/mob/living/carbon/human/human_recipient = eye_recipient + old_eye_color_left = human_recipient.eye_color_left + old_eye_color_right = human_recipient.eye_color_right + . = ..() + if(!.) return + eye_recipient.cure_blind(NO_EYES) apply_damaged_eye_effects() - refresh(eye_recipient, inserting = TRUE, call_update = TRUE) + refresh(eye_recipient, call_update = TRUE) /// Refreshes the visuals of the eyes /// If call_update is TRUE, we also will call update_body -/obj/item/organ/internal/eyes/proc/refresh(mob/living/carbon/eye_owner = owner, inserting = FALSE, call_update = TRUE) +/obj/item/organ/internal/eyes/proc/refresh(mob/living/carbon/eye_owner = owner, call_update = TRUE) owner.update_sight() owner.update_tint() @@ -68,9 +78,6 @@ return var/mob/living/carbon/human/affected_human = eye_owner - if(inserting) // we only want to be setting old_eye_color the one time - old_eye_color_left = affected_human.eye_color_left - old_eye_color_right = affected_human.eye_color_right if(initial(eye_color_left)) affected_human.eye_color_left = eye_color_left else @@ -139,7 +146,6 @@ if(overlay_ignore_lighting && !(obscured & ITEM_SLOT_EYES)) eye_overlays += emissive_appearance(eye_left.icon, eye_left.icon_state, parent, -eyes_layer, alpha = eye_left.alpha) //SKYRAT EDIT CHANGE - TODO fix upstream eye_overlays += emissive_appearance(eye_right.icon, eye_right.icon_state, parent, -eyes_layer, alpha = eye_right.alpha) //SKYRAT EDIT CHANGE - TODO fix upstream - var/obj/item/bodypart/head/my_head = parent.get_bodypart(BODY_ZONE_HEAD) if(my_head) if(my_head.head_flags & HEAD_EYECOLOR) @@ -417,12 +423,8 @@ actions_types = list(/datum/action/item_action/organ_action/use, /datum/action/item_action/organ_action/toggle) var/max_light_beam_distance = 5 var/obj/item/flashlight/eyelight/glow/eye - /// The overlay that is used when both eyes are set to match the light color - var/mutable_appearance/eyes_overlay - /// The overlay that is used when custom color selection is enabled, for the left eye - var/mutable_appearance/eyes_overlay_left - /// The overlay that is used when custom color selection is enabled, for the right eye - var/mutable_appearance/eyes_overlay_right + /// base icon state for eye overlays + var/base_eye_state = "eyes_glow_gs" /// Whether or not to match the eye color to the light or use a custom selection var/eye_color_mode = MATCH_LIGHT_COLOR /// The selected color for the light beam itself @@ -447,9 +449,10 @@ return deactivate(close_ui = TRUE) -/// We have to do this here because on_insert gets called before refresh(), which we need to have been called for old_eye_color vars to be set +/// Set the initial color of the eyes on insert to be the mob's previous eye color. /obj/item/organ/internal/eyes/robotic/glow/Insert(mob/living/carbon/eye_recipient, special = FALSE, drop_if_replaced = FALSE) . = ..() + current_color_string = old_eye_color_left current_left_color_string = old_eye_color_left current_right_color_string = old_eye_color_right @@ -460,9 +463,6 @@ /obj/item/organ/internal/eyes/robotic/glow/on_remove(mob/living/carbon/eye_owner) deactivate(eye_owner, close_ui = TRUE) - QDEL_NULL(eyes_overlay) - QDEL_NULL(eyes_overlay_left) - QDEL_NULL(eyes_overlay_right) eye.forceMove(src) return ..() @@ -549,14 +549,14 @@ eye.on = TRUE if(eye.light_range) // at range 0 we are just going to make the eyes glow emissively, no light overlay eye.set_light_on(TRUE) - update_mob_eyes_overlay() + update_mob_eye_color() /** * Deactivates the light * * Turns off the attached flashlight object, closes UIs, updates the mob overlay to be removed. * Arguments: - * * mob/living/carbon/eye_owner - the mob who the eyes belong to, for passing to update_mob_eyes_overlay + * * mob/living/carbon/eye_owner - the mob who the eyes belong to * * close_ui - whether or not to close the ui */ /obj/item/organ/internal/eyes/robotic/glow/proc/deactivate(mob/living/carbon/eye_owner = owner, close_ui = FALSE) @@ -564,7 +564,7 @@ SStgui.close_uis(src) eye.on = FALSE eye.set_light_on(FALSE) - update_mob_eyes_overlay(eye_owner) + update_mob_eye_color(eye_owner) /** * Randomizes the light color @@ -656,44 +656,19 @@ if(QDELETED(eye_owner) || !ishuman(eye_owner)) //Other carbon mobs don't have eye color. return - - eye_owner.dna.species.handle_body(eye_owner) - update_mob_eyes_overlay() - -/** - * Updates the emissive mob eye overlay - * - * When the light is on, the overlay(s) are added. When it is disabled, they are cut. - * Adds one or two overlays depending on what the eye_color_mode toggle is set to. - * Arguments: - * * mob/living/carbon/eye_owner - the mob to add the overlay to - */ -/obj/item/organ/internal/eyes/robotic/glow/proc/update_mob_eyes_overlay(mob/living/carbon/eye_owner = owner) - if(QDELETED(eye_owner)) - return - - if(!ishuman(eye_owner)) - return - - eye_owner.cut_overlay(eyes_overlay) - eye_owner.cut_overlay(eyes_overlay_left) - eye_owner.cut_overlay(eyes_overlay_right) - + if(!eye.on) - return + eye_icon_state = initial(eye_icon_state) + overlay_ignore_lighting = FALSE + else + overlay_ignore_lighting = TRUE + eye_icon_state = base_eye_state - switch(eye_color_mode) - if(MATCH_LIGHT_COLOR) - eyes_overlay = emissive_appearance('icons/mob/human/human_face.dmi', "eyes_glow_gs", eye_owner, layer = -BODY_LAYER, alpha = owner.alpha) - eyes_overlay.color = current_color_string - eye_owner.add_overlay(eyes_overlay) - if(USE_CUSTOM_COLOR) - eyes_overlay_left = emissive_appearance('icons/mob/human/human_face.dmi', "eyes_glow_gs_left", eye_owner, layer = -BODY_LAYER, alpha = owner.alpha) - eyes_overlay_right = emissive_appearance('icons/mob/human/human_face.dmi', "eyes_glow_gs_right", eye_owner, layer = -BODY_LAYER, alpha = owner.alpha) - eyes_overlay_left.color = eye_color_left - eyes_overlay_right.color = eye_color_right - eye_owner.add_overlay(eyes_overlay_left) - eye_owner.add_overlay(eyes_overlay_right) + var/obj/item/bodypart/head/head = eye_owner.get_bodypart(BODY_ZONE_HEAD) //if we have eyes we definently have a head anyway + var/previous_flags = head.head_flags + head.head_flags = previous_flags | HEAD_EYECOLOR + eye_owner.dna.species.handle_body(eye_owner) + head.head_flags = previous_flags #undef MATCH_LIGHT_COLOR #undef USE_CUSTOM_COLOR @@ -708,6 +683,44 @@ icon_state = "eyeballs-moth" flash_protect = FLASH_PROTECTION_SENSITIVE +/obj/item/organ/internal/eyes/robotic/moth + name = "robotic moth eyes" + eye_icon_state = "motheyes" + icon_state = "eyeballs-cybermoth" + desc = "Your vision is augmented. Much like actual moth eyes, very sensitive to bright lights." + flash_protect = FLASH_PROTECTION_SENSITIVE + +/obj/item/organ/internal/eyes/robotic/basic/moth + name = "basic robotic moth eyes" + eye_icon_state = "motheyes" + icon_state = "eyeballs-cybermoth" + flash_protect = FLASH_PROTECTION_SENSITIVE + +/obj/item/organ/internal/eyes/robotic/xray/moth + name = "robotic eyes" + eye_icon_state = "motheyes" + icon_state = "eyeballs-cybermoth" + desc = "These cybernetic imitation moth eyes will give you X-ray vision. Blinking is futile. Much like actual moth eyes, very sensitive to bright lights." + flash_protect = FLASH_PROTECTION_SENSITIVE + +/obj/item/organ/internal/eyes/robotic/shield/moth + name = "shielded robotic moth eyes" + eye_icon_state = "motheyes" + icon_state = "eyeballs-cybermoth" + +/obj/item/organ/internal/eyes/robotic/glow/moth + name = "High Luminosity Moth Eyes" + eye_icon_state = "motheyes" + base_eye_state = "eyes_mothglow" + icon_state = "eyeballs-cybermoth" + desc = "Special glowing eyes, to be one with the lamp. Much like actual moth eyes, very sensitive to bright lights." + flash_protect = FLASH_PROTECTION_SENSITIVE + +/obj/item/organ/internal/eyes/robotic/thermals/moth //we inherit flash weakness from thermals + name = "thermal moth eyes" + eye_icon_state = "motheyes" + icon_state = "eyeballs-cybermoth" + /obj/item/organ/internal/eyes/snail name = "snail eyes" desc = "These eyes seem to have a large range, but might be cumbersome with glasses." diff --git a/code/modules/surgery/organs/internal/heart/_heart.dm b/code/modules/surgery/organs/internal/heart/_heart.dm index 78c95dadd25..ce4b948c653 100644 --- a/code/modules/surgery/organs/internal/heart/_heart.dm +++ b/code/modules/surgery/organs/internal/heart/_heart.dm @@ -194,7 +194,7 @@ /datum/client_colour/cursed_heart_blood priority = 100 //it's an indicator you're dying, so it's very high priority - colour = "red" + colour = "#FF0000" /obj/item/organ/internal/heart/cybernetic name = "basic cybernetic heart" diff --git a/code/modules/surgery/organs/internal/liver/_liver.dm b/code/modules/surgery/organs/internal/liver/_liver.dm index 78cebab11b7..f871fbd84db 100644 --- a/code/modules/surgery/organs/internal/liver/_liver.dm +++ b/code/modules/surgery/organs/internal/liver/_liver.dm @@ -147,7 +147,7 @@ amount += belly.reagents.get_reagent_amount(toxin.type) // a 15u syringe is a nice baseline to scale lethality by - liver_damage += ((amount/15) * toxin.toxpwr) / liver_resistance + liver_damage += ((amount/15) * toxin.toxpwr * toxin.liver_damage_multiplier) / liver_resistance if(provide_pain_message != HAS_PAINFUL_TOXIN) provide_pain_message = toxin.silent_toxin ? HAS_SILENT_TOXIN : HAS_PAINFUL_TOXIN diff --git a/code/modules/surgery/organs/internal/liver/liver_plasmaman.dm b/code/modules/surgery/organs/internal/liver/liver_plasmaman.dm index 0ed71c32445..be21968d659 100644 --- a/code/modules/surgery/organs/internal/liver/liver_plasmaman.dm +++ b/code/modules/surgery/organs/internal/liver/liver_plasmaman.dm @@ -8,6 +8,7 @@ icon_state = "liver-p" organ_flags = ORGAN_MINERAL organ_traits = list(TRAIT_PLASMA_LOVER_METABOLISM) + milk_burn_healing = 0 /obj/item/organ/internal/liver/bone/plasmaman/handle_chemical(mob/living/carbon/organ_owner, datum/reagent/chem, seconds_per_tick, times_fired) . = ..() diff --git a/code/modules/surgery/organs/internal/liver/liver_skeleton.dm b/code/modules/surgery/organs/internal/liver/liver_skeleton.dm index 050afbbdc5d..f9b41741b4a 100644 --- a/code/modules/surgery/organs/internal/liver/liver_skeleton.dm +++ b/code/modules/surgery/organs/internal/liver/liver_skeleton.dm @@ -8,6 +8,10 @@ desc = "You have no idea what this strange ball of bones does." icon_state = "liver-bone" organ_traits = list(TRAIT_STABLELIVER) + ///Var for brute healing via milk + var/milk_brute_healing = 2.5 + ///Var for burn healing via milk + var/milk_burn_healing = 2.5 /obj/item/organ/internal/liver/bone/handle_chemical(mob/living/carbon/organ_owner, datum/reagent/chem, seconds_per_tick, times_fired) . = ..() @@ -43,7 +47,7 @@ if(chem.volume > 50) organ_owner.reagents.remove_reagent(chem.type, (chem.volume - 50)) to_chat(organ_owner, span_warning("The excess milk is dripping off your bones!")) - organ_owner.heal_bodypart_damage(2.5 * REM * seconds_per_tick) + organ_owner.heal_bodypart_damage(milk_brute_healing * REM * seconds_per_tick, milk_burn_healing * REM * seconds_per_tick) for(var/datum/wound/iter_wound as anything in organ_owner.all_wounds) iter_wound.on_xadone(1 * REM * seconds_per_tick) return // Do normal metabolism diff --git a/code/modules/surgery/organs/internal/lungs/_lungs.dm b/code/modules/surgery/organs/internal/lungs/_lungs.dm index 0280ab1878d..035551bf190 100644 --- a/code/modules/surgery/organs/internal/lungs/_lungs.dm +++ b/code/modules/surgery/organs/internal/lungs/_lungs.dm @@ -417,9 +417,8 @@ else healium_euphoria = EUPHORIA_INACTIVE // Stun/Sleep side-effects. - if(healium_pp > healium_para_min) - // Random chance to stun mob. Timing not in seconds to have a much higher variation - breather.Unconscious(rand(3 SECONDS, 5 SECONDS)) + if(healium_pp > healium_para_min && !breather.IsSleeping() && prob(30)) + breather.Sleeping(rand(3 SECONDS, 5 SECONDS)) // Metabolize to reagent when concentration is high enough. if(healium_pp > healium_sleep_min) breather.reagents.add_reagent(/datum/reagent/healium, max(0, 1 - breather.reagents.get_reagent_amount(/datum/reagent/healium))) diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index a0ff0e6bb61..074bff3152c 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -85,10 +85,6 @@ #define TRAIT_SOURCE_UNIT_TESTS "unit_tests" // BEGIN_INCLUDE -// SKYRAT EDIT START -#include "~skyrat/opposing_force.dm" -#include "~skyrat/automapper.dm" -//SKYRAT EDIT END #include "abductor_baton_spell.dm" #include "ablative_hud.dm" #include "achievements.dm" @@ -108,12 +104,14 @@ #include "bloody_footprints.dm" #include "breath.dm" #include "burning.dm" +#include "byond_status.dm" #include "cable_powernets.dm" #include "card_mismatch.dm" #include "cardboard_cutouts.dm" #include "chain_pull_through_space.dm" #include "chat_filter.dm" #include "circuit_component_category.dm" +#include "client_colours.dm" #include "closets.dm" #include "clothing_under_armor_subtype_check.dm" #include "combat.dm" @@ -126,6 +124,7 @@ #include "dcs_check_list_arguments.dm" #include "dcs_get_id_from_elements.dm" #include "designs.dm" +#include "dismemberment.dm" #include "door_access.dm" #include "dragon_expiration.dm" #include "drink_icons.dm" @@ -133,6 +132,7 @@ #include "dynamic_ruleset_sanity.dm" #include "egg_glands.dm" #include "emoting.dm" +#include "ensure_subtree_operational_datum.dm" #include "explosion_action.dm" #include "fish_unit_tests.dm" #include "focus_only_tests.dm" @@ -177,6 +177,7 @@ #include "missing_icons.dm" #include "mob_faction.dm" #include "mob_spawn.dm" +#include "modify_fantasy_variable.dm" #include "modsuit.dm" #include "modular_map_loader.dm" #include "monkey_business.dm" @@ -188,8 +189,8 @@ #include "objectives.dm" #include "operating_table.dm" #include "orderable_items.dm" -#include "organs.dm" #include "organ_set_bonus.dm" +#include "organs.dm" #include "outfit_sanity.dm" #include "paintings.dm" #include "pills.dm" @@ -218,8 +219,8 @@ #include "screenshot_humanoids.dm" #include "screenshot_husk.dm" #include "screenshot_saturnx.dm" -#include "security_officer_distribution.dm" #include "security_levels.dm" +#include "security_officer_distribution.dm" #include "serving_tray.dm" #include "simple_animal_freeze.dm" #include "siunit.dm" @@ -233,6 +234,7 @@ #include "species_unique_id.dm" #include "species_whitelists.dm" #include "spell_invocations.dm" +#include "spell_jaunt.dm" #include "spell_mindswap.dm" #include "spell_names.dm" #include "spell_shapeshift.dm" @@ -261,6 +263,11 @@ #include "verify_emoji_names.dm" #include "wizard_loadout.dm" #include "worn_icons.dm" +// SKYRAT EDIT START +#include "~skyrat\automapper.dm" +#include "~skyrat\opposing_force.dm" +// SKYRAT EDIT END +// END_INCLUDE #ifdef REFERENCE_TRACKING_DEBUG //Don't try and parse this file if ref tracking isn't turned on. IE: don't parse ref tracking please mr linter #include "find_reference_sanity.dm" #endif diff --git a/code/modules/unit_tests/achievements.dm b/code/modules/unit_tests/achievements.dm index 652d65898fa..44e1384c2e0 100644 --- a/code/modules/unit_tests/achievements.dm +++ b/code/modules/unit_tests/achievements.dm @@ -10,4 +10,7 @@ if(!init_icon || !(init_icon in award_icons)) TEST_FAIL("Award [initial(award.name)] has an unexistent icon: \"[init_icon || "null"]\"") if(length(initial(award.database_id)) > 32) //sql schema limit - TEST_FAIL("Award [initial(award.name)] database id is is too long") + TEST_FAIL("Award [initial(award.name)] database id is too long") + var/init_category = initial(award.category) + if(!(init_category in GLOB.achievement_categories)) + TEST_FAIL("Award [initial(award.name)] has unsupported category: \"[init_category || "null"]\". Update GLOB.achievement_categories") diff --git a/code/modules/unit_tests/byond_status.dm b/code/modules/unit_tests/byond_status.dm new file mode 100644 index 00000000000..e2788831556 --- /dev/null +++ b/code/modules/unit_tests/byond_status.dm @@ -0,0 +1,9 @@ +/// Tests the SUPPOSED TO BE TEMPORARY byond_status() proc for a useful format +/datum/unit_test/byond_status + +/datum/unit_test/byond_status/Run() + if (world.system_type != UNIX) + return + + var/status = byond_status() + TEST_ASSERT(findtext(status, "Sleeping procs"), "Invalid byond_status: [status]") diff --git a/code/modules/unit_tests/client_colours.dm b/code/modules/unit_tests/client_colours.dm new file mode 100644 index 00000000000..55b6e0b24ad --- /dev/null +++ b/code/modules/unit_tests/client_colours.dm @@ -0,0 +1,9 @@ +///Checks that client colours have valid colour variables values at least when inited. +/datum/unit_test/client_colours + +/datum/unit_test/client_colours/Run() + for(var/datum/client_colour/colour as anything in subtypesof(/datum/client_colour)) + // colours can be color matrices (lists), which initial() cannot read. + colour = new colour + if(!color_to_full_rgba_matrix(colour.colour, FALSE)) + TEST_FAIL("[colour.type] has an invalid default colour value: [colour.colour]") diff --git a/code/modules/unit_tests/create_and_destroy.dm b/code/modules/unit_tests/create_and_destroy.dm index 83aa15b51fb..e0e763ebb85 100644 --- a/code/modules/unit_tests/create_and_destroy.dm +++ b/code/modules/unit_tests/create_and_destroy.dm @@ -7,121 +7,6 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE) /datum/unit_test/create_and_destroy/Run() //We'll spawn everything here var/turf/spawn_at = run_loc_floor_bottom_left - var/list/ignore = list( - //Never meant to be created, errors out the ass for mobcode reasons - /mob/living/carbon, - //Nother template type, doesn't like being created with no seed - /obj/item/food/grown, - //And another - /obj/item/slimecross/recurring, - //This should be obvious - /obj/machinery/doomsday_device, - //Yet more templates - /obj/machinery/restaurant_portal, - //Template type - /obj/effect/mob_spawn, - //Template type - /obj/structure/holosign/robot_seat, - //Singleton - /mob/dview, - //Template type - /obj/item/bodypart, - //This is meant to fail extremely loud every single time it occurs in any environment in any context, and it falsely alarms when this unit test iterates it. Let's not spawn it in. - /obj/merge_conflict_marker, - //briefcase launchpads erroring - /obj/machinery/launchpad/briefcase, - //Both are abstract types meant to scream bloody murder if spawned in raw - /obj/item/organ/external, - /obj/item/organ/external/wings, - ) - //Say it with me now, type template - ignore += typesof(/obj/effect/mapping_helpers) - //This turf existing is an error in and of itself - ignore += typesof(/turf/baseturf_skipover) - ignore += typesof(/turf/baseturf_bottom) - //This demands a borg, so we'll let if off easy - ignore += typesof(/obj/item/modular_computer/pda/silicon) - //This one demands a computer, ditto - ignore += typesof(/obj/item/modular_computer/processor) - //Very finiky, blacklisting to make things easier - ignore += typesof(/obj/item/poster/wanted) - //This expects a seed, we can't pass it - ignore += typesof(/obj/item/food/grown) - //Needs clients / mobs to observe it to exist. Also includes hallucinations. - ignore += typesof(/obj/effect/client_image_holder) - //Same to above. Needs a client / mob / hallucination to observe it to exist. - ignore += typesof(/obj/projectile/hallucination) - ignore += typesof(/obj/item/hallucinated) - //We don't have a pod - ignore += typesof(/obj/effect/pod_landingzone_effect) - ignore += typesof(/obj/effect/pod_landingzone) - //We have a baseturf limit of 10, adding more than 10 baseturf helpers will kill CI, so here's a future edge case to fix. - ignore += typesof(/obj/effect/baseturf_helper) - //No tauma to pass in - ignore += typesof(/mob/camera/imaginary_friend) - //No pod to gondola - ignore += typesof(/mob/living/simple_animal/pet/gondola/gondolapod) - //No heart to give - ignore += typesof(/obj/structure/ethereal_crystal) - //No linked console - ignore += typesof(/mob/camera/ai_eye/remote/base_construction) - //See above - ignore += typesof(/mob/camera/ai_eye/remote/shuttle_docker) - //Hangs a ref post invoke async, which we don't support. Could put a qdeleted check but it feels hacky - ignore += typesof(/obj/effect/anomaly/grav/high) - //See above - ignore += typesof(/obj/effect/timestop) - //Invoke async in init, skippppp - ignore += typesof(/mob/living/silicon/robot/model) - //This lad also sleeps - ignore += typesof(/obj/item/hilbertshotel) - //this boi spawns turf changing stuff, and it stacks and causes pain. Let's just not - ignore += typesof(/obj/effect/sliding_puzzle) - //Stacks baseturfs, can't be tested here - ignore += typesof(/obj/effect/temp_visual/lava_warning) - //Stacks baseturfs, can't be tested here - ignore += typesof(/obj/effect/landmark/ctf) - //Our system doesn't support it without warning spam from unregister calls on things that never registered - ignore += typesof(/obj/docking_port) - //Asks for a shuttle that may not exist, let's leave it alone - ignore += typesof(/obj/item/pinpointer/shuttle) - //This spawns beams as a part of init, which can sleep past an async proc. This hangs a ref, and fucks us. It's only a problem here because the beam sleeps with CHECK_TICK - ignore += typesof(/obj/structure/alien/resin/flower_bud) - //Needs a linked mecha - ignore += typesof(/obj/effect/skyfall_landingzone) - //Expects a mob to holderize, we have nothing to give - ignore += typesof(/obj/item/clothing/head/mob_holder) - //Needs cards passed into the initilazation args - ignore += typesof(/obj/item/toy/cards/cardhand) - - //SKYRAT EDIT ADDITION - OUR IGNORES DOWN HERE - //Not designed to be spawned without a turf. - ignore += typesof(/obj/effect/abstract/liquid_turf) - //Not designed to be spawned individually. - ignore += typesof(/obj/structure/mold) - //Unused - not supposed to be spawned without SSliquids - ignore += typesof(/turf/open/openspace/ocean) - //Baseturf editors can only go up to ten, stop this. - ignore += typesof(/obj/effect/baseturf_helper) - // It's the abstract base type, it shouldn't be spawned. - ignore += /obj/item/organ/external/genital - // These two are locked to one type only, and shouldn't be widely available, hence why they runtime otherwise. - // Can't be bothered adding more to them. - ignore += list(/obj/item/organ/external/neck_accessory, /obj/item/organ/external/head_accessory) - //SKYRAT EDIT END - //Needs cards passed into the initilazation args - ignore += typesof(/obj/item/toy/cards/cardhand) - //Needs a holodeck area linked to it which is not guarenteed to exist and technically is supposed to have a 1:1 relationship with computer anyway. - ignore += typesof(/obj/machinery/computer/holodeck) - //runtimes if not paired with a landmark - ignore += typesof(/obj/structure/industrial_lift) - // Runtimes if the associated machinery does not exist, but not the base type - ignore += subtypesof(/obj/machinery/airlock_controller) - // Always ought to have an associated escape menu. Any references it could possibly hold would need one regardless. - ignore += subtypesof(/atom/movable/screen/escape_menu) - // Can't spawn openspace above nothing, it'll get pissy at me - ignore += typesof(/turf/open/space/openspace) - ignore += typesof(/turf/open/openspace) var/list/cached_contents = spawn_at.contents.Copy() var/original_turf_type = spawn_at.type @@ -129,7 +14,7 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE) var/original_baseturf_count = length(original_baseturfs) GLOB.running_create_and_destroy = TRUE - for(var/type_path in typesof(/atom/movable, /turf) - ignore) //No areas please + for(var/type_path in typesof(/atom/movable, /turf) - uncreatables) //No areas please if(ispath(type_path, /turf)) spawn_at.ChangeTurf(type_path) //We change it back to prevent baseturfs stacking and hitting the limit @@ -159,14 +44,12 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE) // Drastically lower the amount of time it takes to GC, since we don't have clients that can hold it up. SSgarbage.collection_timeout[GC_QUEUE_CHECK] = 10 SECONDS - //Prevent the garbage subsystem from harddeling anything, if only to save time - SSgarbage.collection_timeout[GC_QUEUE_HARDDELETE] = 10000 HOURS //Clear it, just in case cached_contents.Cut() var/list/queues_we_care_about = list() - // All up to harddel - for(var/i in 1 to GC_QUEUE_HARDDELETE - 1) + // All of em, I want hard deletes too, since we rely on the debug info from them + for(var/i in 1 to GC_QUEUE_HARDDELETE) queues_we_care_about += i //Now that we've qdel'd everything, let's sleep until the gc has processed all the shit we care about @@ -176,6 +59,7 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE) time_needed += SSgarbage.collection_timeout[index] var/start_time = world.time + var/real_start_time = REALTIMEOFDAY var/garbage_queue_processed = FALSE sleep(time_needed) @@ -193,11 +77,12 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE) oldest_packet_creation = min(qdeld_at, oldest_packet_creation) //If we've found a packet that got del'd later then we finished, then all our shit has been processed - if(oldest_packet_creation > start_time) + //That said, if there are any pending hard deletes you may NOT sleep, we gotta handle that shit + if(oldest_packet_creation > start_time && !length(SSgarbage.queues[GC_QUEUE_HARDDELETE])) garbage_queue_processed = TRUE break - if(world.time > start_time + time_needed + 30 MINUTES) //If this gets us gitbanned I'm going to laugh so hard + if(REALTIMEOFDAY > real_start_time + time_needed + 50 MINUTES) //If this gets us gitbanned I'm going to laugh so hard TEST_FAIL("Something has gone horribly wrong, the garbage queue has been processing for well over 30 minutes. What the hell did you do") break @@ -232,4 +117,3 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE) //This shouldn't be needed, but let's be polite SSgarbage.collection_timeout[GC_QUEUE_CHECK] = GC_CHECK_QUEUE - SSgarbage.collection_timeout[GC_QUEUE_HARDDELETE] = GC_DEL_QUEUE diff --git a/code/modules/unit_tests/dismemberment.dm b/code/modules/unit_tests/dismemberment.dm new file mode 100644 index 00000000000..d8ce43b960e --- /dev/null +++ b/code/modules/unit_tests/dismemberment.dm @@ -0,0 +1,38 @@ +/** + * Unit test to check that held items are dropped correctly when we are dismembered. + * + * Also tests for edge cases such as undroppable items. + */ +/datum/unit_test/dismemberment/Run() + var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) + + var/obj/item/testing_item = allocate(/obj/item/analyzer) + testing_item.name = "testing item" + + // Standard situation: We're holding a normal item and get dismembered. + test_item(dummy, testing_item) + + // Abnormal situation: We're holding an undroppable item and get dismembered. + ADD_TRAIT(testing_item, TRAIT_NODROP, TRAIT_GENERIC) + test_item(dummy, testing_item, status_text = "after applying TRAIT_NODROP to the testing item") + + +/datum/unit_test/dismemberment/proc/test_item(mob/living/carbon/human/dummy, obj/item/testing_item, status_text = "") + //Check both to make sure being the active hand doesn't make a difference. + dummy.put_in_l_hand(testing_item) + check_dismember(dummy, BODY_ZONE_L_ARM, status_text) + + dummy.put_in_r_hand(testing_item) + check_dismember(dummy, BODY_ZONE_R_ARM, status_text) + + +/datum/unit_test/dismemberment/proc/check_dismember(mob/living/carbon/human/dummy, which_arm, status_text) + var/obj/item/bodypart/dismembered_limb = dummy.get_bodypart(which_arm) + var/obj/item/held_item = dummy.get_item_for_held_index(dismembered_limb.held_index) + + dismembered_limb.dismember() + TEST_ASSERT(held_item in dummy.loc, "Dummy did not drop [held_item] when [dismembered_limb] was dismembered [status_text].") + // Clean up after ourselves + qdel(dismembered_limb) + dummy.fully_heal(HEAL_ALL) + diff --git a/code/modules/unit_tests/ensure_subtree_operational_datum.dm b/code/modules/unit_tests/ensure_subtree_operational_datum.dm new file mode 100644 index 00000000000..9ca78fbc674 --- /dev/null +++ b/code/modules/unit_tests/ensure_subtree_operational_datum.dm @@ -0,0 +1,64 @@ +/// The subtree that requires the operational datum. +#define REQUIRED_SUBTREE "required_subtree" +/// The list of typepaths of applicable operational datums that would satisfy the requirement. +#define REQUIRED_OPERATIONAL_DATUMS "required_operational_datums" + +/// Unit Test that ensure that if we add a specific planning subtree to a basic mob's planning tree, that we also have the operational datum needed for it (component/element). +/// This can be extended to other "mandatory" operational datums for certain subtrees to work. +/datum/unit_test/ensure_subtree_operational_datum + /// Associated list of mobs that we need to test this on. Key is the typepath of the mob, value is a list of the planning subtree and the operational datums that are required for it. + var/list/testable_mobs = list() + +/datum/unit_test/ensure_subtree_operational_datum/Run() + gather_testable_mobs() + test_applicable_mobs() + +/// First, look for all mobs that have a planning subtree that requires an element, then add it to the list for stuff to test afterwards. Done like this to not have one mumbo proc that's hard to read. +/datum/unit_test/ensure_subtree_operational_datum/proc/gather_testable_mobs() + for(var/mob/living/basic/checkable_mob as anything in subtypesof(/mob/living/basic)) + var/datum/ai_controller/testable_controller = initial(checkable_mob.ai_controller) + if(isnull(testable_controller)) + continue + + // we can't do inital() memes on lists so it's allocation time + testable_controller = allocate(testable_controller) + var/list/ai_planning_subtrees = testable_controller.planning_subtrees // list of instantiated datums. easy money + if(!length(ai_planning_subtrees)) + continue + + for(var/datum/ai_planning_subtree/testable_subtree as anything in ai_planning_subtrees) + var/list/necessary_datums = testable_subtree.operational_datums + if(isnull(necessary_datums)) + continue + + testable_mobs[checkable_mob] = list( + REQUIRED_OPERATIONAL_DATUMS = necessary_datums, + REQUIRED_SUBTREE = testable_subtree.type, + ) + +/// Then, test the mobs that we've found +/datum/unit_test/ensure_subtree_operational_datum/proc/test_applicable_mobs() + for(var/mob/living/basic/checkable_mob as anything in testable_mobs) + var/list/checkable_mob_data = testable_mobs[checkable_mob] + checkable_mob = allocate(checkable_mob) + + var/datum/ai_planning_subtree/test_subtree = checkable_mob_data[REQUIRED_SUBTREE] + var/list/trait_sources = GET_TRAIT_SOURCES(checkable_mob, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM) + if(!length(trait_sources)) // yes yes we could use `COUNT_TRAIT_SOURCES` but why invoke the same macro twice + TEST_FAIL("The mob [checkable_mob] ([checkable_mob.type]) does not have ANY instances of TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, but has a planning subtree ([test_subtree]) that requires it!") + continue + + var/has_element = FALSE + var/list/testable_operational_datums = checkable_mob_data[REQUIRED_OPERATIONAL_DATUMS] + for(var/iterable in trait_sources) + if(iterable in testable_operational_datums) + has_element = TRUE + break + + if(!has_element) + var/list/message_list = list("The mob [checkable_mob] ([checkable_mob.type]) has a planning subtree ([test_subtree]) that requires a component/element, but does not have any!") + message_list += "Needs one of the following to satisfy the requirement: ([testable_operational_datums.Join(", ")])" + TEST_FAIL(message_list.Join(" ")) + +#undef REQUIRED_SUBTREE +#undef REQUIRED_OPERATIONAL_DATUMS diff --git a/code/modules/unit_tests/font_awesome_icons.dm b/code/modules/unit_tests/font_awesome_icons.dm index 4dde17b7c36..9ebba765791 100644 --- a/code/modules/unit_tests/font_awesome_icons.dm +++ b/code/modules/unit_tests/font_awesome_icons.dm @@ -85,7 +85,7 @@ for(var/icon in allowed_icons) var/icon_name = replacetext(icon, "fa-", "") - output += "#define FA_ICON_[uppertext(replacetext(icon_name, "-", "_"))] \"[icon]\"" + output += "#define FA_ICON_[uppertext(replacetext(icon_name, "-", "_"))] \"[icon]\"" // #undef FA_ICON_ // we have this here to avoid define_sanity throwing a fit var/output_file = "[output.Join("\n")]\n" rustg_file_write(output_file, "data/font_awesome_icons.dm") diff --git a/code/modules/unit_tests/heretic_knowledge.dm b/code/modules/unit_tests/heretic_knowledge.dm index 46545ef2ed5..f75fff24cee 100644 --- a/code/modules/unit_tests/heretic_knowledge.dm +++ b/code/modules/unit_tests/heretic_knowledge.dm @@ -24,12 +24,12 @@ while(i < length(list_to_check)) var/datum/heretic_knowledge/path_to_create = list_to_check[++i] if(!ispath(path_to_create)) - TEST_FAIL("Heretic Knowlege: Got a non-heretic knowledge datum (Got: [path_to_create]) in the list knowledges!") + TEST_FAIL("Heretic Knowledge: Got a non-heretic knowledge datum (Got: [path_to_create]) in the list knowledges!") var/datum/heretic_knowledge/instantiated_knowledge = new path_to_create() // Next knowledge is a list of typepaths. for(var/datum/heretic_knowledge/next_knowledge as anything in instantiated_knowledge.next_knowledge) if(!ispath(next_knowledge)) - TEST_FAIL("Heretic Knowlege: [next_knowledge.type] has a [isnull(next_knowledge) ? "null":"invalid path"] in its next_knowledge list!") + TEST_FAIL("Heretic Knowledge: [next_knowledge.type] has a [isnull(next_knowledge) ? "null":"invalid path"] in its next_knowledge list!") continue if(next_knowledge in list_to_check) continue @@ -44,7 +44,7 @@ // Unreachables is a list of typepaths - all paths that cannot be obtained. var/list/unreachables = all_possible_knowledge - list_to_check for(var/datum/heretic_knowledge/lost_knowledge as anything in unreachables) - TEST_FAIL("Heretic Knowlege: [lost_knowledge] is unreachable by players! Add it to another knowledge's 'next_knowledge' list. If it is purposeful, set its route to 'null'.") + TEST_FAIL("Heretic Knowledge: [lost_knowledge] is unreachable by players! Add it to another knowledge's 'next_knowledge' list. If it is purposeful, set its route to 'null'.") /* diff --git a/code/modules/unit_tests/modify_fantasy_variable.dm b/code/modules/unit_tests/modify_fantasy_variable.dm index d78c1d1dac7..72dc776af32 100644 --- a/code/modules/unit_tests/modify_fantasy_variable.dm +++ b/code/modules/unit_tests/modify_fantasy_variable.dm @@ -1,21 +1,46 @@ // Unit test to make sure that there are no duplicate keys when modify_fantasy_variable is called when applying fantasy bonuses. // Also to make sure the fantasy_modifications list is null when fantasy bonuses are removed. -/datum/unit_test/modify_fantasy_variable/Run() +/datum/unit_test/modify_fantasy_variable + priority = TEST_LONGER - for(var/obj/item/path as anything in subtypesof(/obj/item)) +/datum/unit_test/modify_fantasy_variable/Run() + var/list/applicable_types = subtypesof(/obj/item) - uncreatables + + for(var/obj/item/path as anything in applicable_types) var/obj/item/object = allocate(path) + // objects will have fantasy bonuses inherent to their type (like butterdogs and the slippery component), so we need to take this into account + var/number_of_extant_bonuses = LAZYLEN(object.fantasy_modifications) + +#define TEST_SUCCESS LAZYLEN(object.fantasy_modifications) == number_of_extant_bonuses + // Try positive object.apply_fantasy_bonuses(bonus = 5) object.remove_fantasy_bonuses(bonus = 5) - TEST_ASSERT_NULL(object.fantasy_modifications) + TEST_ASSERT(TEST_SUCCESS, generate_failure_message(object)) + // Then negative object.apply_fantasy_bonuses(bonus = -5) object.remove_fantasy_bonuses(bonus = -5) - TEST_ASSERT_NULL(object.fantasy_modifications) + TEST_ASSERT(TEST_SUCCESS, generate_failure_message(object)) + // Now try the extremes of each object.apply_fantasy_bonuses(bonus = 500) object.remove_fantasy_bonuses(bonus = 500) - TEST_ASSERT_NULL(object.fantasy_modifications) + TEST_ASSERT(TEST_SUCCESS, generate_failure_message(object)) + object.apply_fantasy_bonuses(bonus = -500) object.remove_fantasy_bonuses(bonus = -500) - TEST_ASSERT_NULL(object.fantasy_modifications) + TEST_ASSERT(TEST_SUCCESS, generate_failure_message(object)) + +/// Returns a string that we use to describe the failure of the test. +/datum/unit_test/modify_fantasy_variable/proc/generate_failure_message(obj/item/failed_object) + var/list/cached_modifications = failed_object.fantasy_modifications + var/length_of_modifications = LAZYLEN(cached_modifications) + var/list/failure_messages = list("Error found when adding+removing fantasy bonuses for [failed_object.type].") + failure_messages += "The length of the fantasy_modifications list was [length_of_modifications]." + if(length_of_modifications) + failure_messages += "The fantasy_modifications list was [cached_modifications.Join(", ")]." + + return failure_messages.Join(" ") + +#undef TEST_SUCCESS diff --git a/code/modules/unit_tests/preferences.dm b/code/modules/unit_tests/preferences.dm index 950b1dc281c..626d5b48466 100644 --- a/code/modules/unit_tests/preferences.dm +++ b/code/modules/unit_tests/preferences.dm @@ -49,3 +49,29 @@ continue TEST_ASSERT(!isnull(preference.main_feature_name), "Preference [preference_type] does not have a main_feature_name set!") + +/// Validates that every choiced preference with should_generate_icons implements icon_for, +/// and that every one that doesn't, doesn't. +/datum/unit_test/preferences_should_generate_icons_sanity + +/datum/unit_test/preferences_should_generate_icons_sanity/Run() + for (var/preference_type in GLOB.preference_entries) + var/datum/preference/choiced/choiced_preference = GLOB.preference_entries[preference_type] + if (!istype(choiced_preference) || choiced_preference.abstract_type == preference_type) + continue + + var/list/values = choiced_preference.get_choices() + + if (choiced_preference.should_generate_icons) + for (var/value in values) + var/icon = choiced_preference.icon_for(value) + TEST_ASSERT(istype(icon, /icon) || ispath(icon), "[preference_type] gave [icon] as an icon for [value], which is not a valid value") + else + var/errored = FALSE + + try + choiced_preference.icon_for(values[1]) + catch + errored = TRUE + + TEST_ASSERT(errored, "[preference_type] implemented icon_for, but does not have should_generate_icons = TRUE") diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_bloodbrother.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_bloodbrother.png index ea311025f84..2742f0fb8f8 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_bloodbrother.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_bloodbrother.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_driftingcontractor.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_driftingcontractor.png index d051bfffb5a..d75bf8fffec 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_driftingcontractor.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_driftingcontractor.png differ diff --git a/code/modules/unit_tests/simple_animal_freeze.dm b/code/modules/unit_tests/simple_animal_freeze.dm index 51786449404..b3717b85d27 100644 --- a/code/modules/unit_tests/simple_animal_freeze.dm +++ b/code/modules/unit_tests/simple_animal_freeze.dm @@ -16,6 +16,7 @@ /mob/living/simple_animal/bot/medbot/autopatrol, /mob/living/simple_animal/bot/medbot/derelict, /mob/living/simple_animal/bot/medbot/mysterious, + /mob/living/simple_animal/bot/medbot/nukie, /mob/living/simple_animal/bot/medbot/stationary, /mob/living/simple_animal/bot/mulebot, /mob/living/simple_animal/bot/mulebot/paranormal, @@ -50,12 +51,6 @@ /mob/living/simple_animal/hostile/alien/queen/large, /mob/living/simple_animal/hostile/alien/sentinel, /mob/living/simple_animal/hostile/asteroid, - /mob/living/simple_animal/hostile/asteroid/basilisk, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/magmawing, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril, /mob/living/simple_animal/hostile/asteroid/brimdemon, /mob/living/simple_animal/hostile/asteroid/curseblob, /mob/living/simple_animal/hostile/asteroid/elite, @@ -66,7 +61,6 @@ /mob/living/simple_animal/hostile/asteroid/elite/legionnaire, /mob/living/simple_animal/hostile/asteroid/elite/legionnairehead, /mob/living/simple_animal/hostile/asteroid/elite/pandora, - /mob/living/simple_animal/hostile/asteroid/goldgrub, /mob/living/simple_animal/hostile/asteroid/gutlunch, /mob/living/simple_animal/hostile/asteroid/gutlunch/grublunch, /mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck, @@ -75,7 +69,6 @@ /mob/living/simple_animal/hostile/asteroid/hivelord/legion, /mob/living/simple_animal/hostile/asteroid/hivelord/legion/advanced, /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/random, /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow, /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/portal, /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril, @@ -84,7 +77,6 @@ /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced, /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow, /mob/living/simple_animal/hostile/asteroid/ice_demon, - /mob/living/simple_animal/hostile/asteroid/ice_whelp, /mob/living/simple_animal/hostile/asteroid/polarbear, /mob/living/simple_animal/hostile/asteroid/polarbear/lesser, /mob/living/simple_animal/hostile/asteroid/wolf, @@ -116,8 +108,8 @@ /mob/living/simple_animal/hostile/construct/wraith/mystic, /mob/living/simple_animal/hostile/construct/wraith/noncult, /mob/living/simple_animal/hostile/dark_wizard, - /mob/living/simple_animal/hostile/eyeball, /mob/living/simple_animal/hostile/gorilla, + /mob/living/simple_animal/hostile/gorilla/lesser, /mob/living/simple_animal/hostile/gorilla/cargo_domestic, /mob/living/simple_animal/hostile/guardian, /mob/living/simple_animal/hostile/guardian/assassin, @@ -144,7 +136,6 @@ /mob/living/simple_animal/hostile/illusion/mirage, /mob/living/simple_animal/hostile/jungle, /mob/living/simple_animal/hostile/jungle/leaper, - /mob/living/simple_animal/hostile/jungle/mega_arachnid, /mob/living/simple_animal/hostile/jungle/mook, /mob/living/simple_animal/hostile/jungle/seedling, /mob/living/simple_animal/hostile/megafauna, @@ -174,7 +165,6 @@ /mob/living/simple_animal/hostile/mimic/crate, /mob/living/simple_animal/hostile/mimic/xenobio, /mob/living/simple_animal/hostile/mining_drone, - /mob/living/simple_animal/hostile/morph, /mob/living/simple_animal/hostile/nanotrasen, /mob/living/simple_animal/hostile/nanotrasen/elite, /mob/living/simple_animal/hostile/nanotrasen/ranged, @@ -189,8 +179,6 @@ /mob/living/simple_animal/hostile/pirate/melee/space, /mob/living/simple_animal/hostile/pirate/ranged, /mob/living/simple_animal/hostile/pirate/ranged/space, - /mob/living/simple_animal/hostile/regalrat, - /mob/living/simple_animal/hostile/regalrat/controlled, /mob/living/simple_animal/hostile/retaliate, /mob/living/simple_animal/hostile/retaliate/clown, /mob/living/simple_animal/hostile/retaliate/clown/banana, diff --git a/code/modules/unit_tests/spell_jaunt.dm b/code/modules/unit_tests/spell_jaunt.dm new file mode 100644 index 00000000000..41446b71a59 --- /dev/null +++ b/code/modules/unit_tests/spell_jaunt.dm @@ -0,0 +1,21 @@ +/// Tests Shadow Walk can be entered and exited +/datum/unit_test/shadow_jaunt + +/datum/unit_test/shadow_jaunt/Run() + var/mob/living/carbon/human/jaunter = allocate(/mob/living/carbon/human/consistent) + var/datum/action/cooldown/spell/jaunt/shadow_walk/walk = allocate(/datum/action/cooldown/spell/jaunt/shadow_walk, jaunter) + walk.Grant(jaunter) + + var/turf/jaunt_turf = jaunter.loc + TEST_ASSERT(istype(jaunt_turf), "Jaunter was not allocated to a turf, instead to [jaunt_turf || "nullspace"].") + TEST_ASSERT(walk.IsAvailable(), "Unit test room is not suitable to test [walk].") + + walk.Trigger() + + TEST_ASSERT_NOTEQUAL(jaunter.loc, jaunt_turf, "Jaunter's loc did not change on casting [walk].") + TEST_ASSERT(istype(jaunter.loc, walk.jaunt_type), "Jaunter failed to enter jaunt on casting [walk].") + + walk.next_use_time = -1 + walk.Trigger() + + TEST_ASSERT_EQUAL(jaunter.loc, jaunt_turf, "Jaunter failed to exit jaunt on exiting [walk].") diff --git a/code/modules/unit_tests/unit_test.dm b/code/modules/unit_tests/unit_test.dm index 3fef3d985f7..c552902775a 100644 --- a/code/modules/unit_tests/unit_test.dm +++ b/code/modules/unit_tests/unit_test.dm @@ -50,6 +50,9 @@ GLOBAL_VAR_INIT(focused_tests, focused_tests()) /// Do not instantiate if type matches this var/abstract_type = /datum/unit_test + /// List of atoms that we don't want to ever initialize in an agnostic context, like for Create and Destroy. Stored on the base datum for usability in other relevant tests that need this data. + var/static/list/uncreatables = null + var/static/datum/space_level/reservation /proc/cmp_unit_test_priority(datum/unit_test/a, datum/unit_test/b) @@ -60,6 +63,9 @@ GLOBAL_VAR_INIT(focused_tests, focused_tests()) var/datum/map_template/unit_tests/template = new reservation = template.load_new_z() + if (isnull(uncreatables)) + uncreatables = build_list_of_uncreatables() + allocated = new run_loc_floor_bottom_left = get_turf(locate(/obj/effect/landmark/unit_test_bottom_left) in GLOB.landmarks_list) run_loc_floor_top_right = get_turf(locate(/obj/effect/landmark/unit_test_top_right) in GLOB.landmarks_list) @@ -209,6 +215,129 @@ GLOBAL_VAR_INIT(focused_tests, focused_tests()) qdel(test) +/// Builds (and returns) a list of atoms that we shouldn't initialize in generic testing, like Create and Destroy. +/// It is appreciated to add the reason why the atom shouldn't be initialized if you add it to this list. +/datum/unit_test/proc/build_list_of_uncreatables() + RETURN_TYPE(/list) + var/list/returnable_list = list() + // The following are just generic, singular types. + returnable_list = list( + //Never meant to be created, errors out the ass for mobcode reasons + /mob/living/carbon, + //And another + /obj/item/slimecross/recurring, + //This should be obvious + /obj/machinery/doomsday_device, + //Yet more templates + /obj/machinery/restaurant_portal, + //Template type + /obj/effect/mob_spawn, + //Template type + /obj/structure/holosign/robot_seat, + //Singleton + /mob/dview, + //Template type + /obj/item/bodypart, + //This is meant to fail extremely loud every single time it occurs in any environment in any context, and it falsely alarms when this unit test iterates it. Let's not spawn it in. + /obj/merge_conflict_marker, + //briefcase launchpads erroring + /obj/machinery/launchpad/briefcase, + //Both are abstract types meant to scream bloody murder if spawned in raw + /obj/item/organ/external, + /obj/item/organ/external/wings, + ) + + // Everything that follows is a typesof() check. + + //Say it with me now, type template + returnable_list += typesof(/obj/effect/mapping_helpers) + //This turf existing is an error in and of itself + returnable_list += typesof(/turf/baseturf_skipover) + returnable_list += typesof(/turf/baseturf_bottom) + //This demands a borg, so we'll let if off easy + returnable_list += typesof(/obj/item/modular_computer/pda/silicon) + //This one demands a computer, ditto + returnable_list += typesof(/obj/item/modular_computer/processor) + //Very finiky, blacklisting to make things easier + returnable_list += typesof(/obj/item/poster/wanted) + //This expects a seed, we can't pass it + returnable_list += typesof(/obj/item/food/grown) + //Needs clients / mobs to observe it to exist. Also includes hallucinations. + returnable_list += typesof(/obj/effect/client_image_holder) + //Same to above. Needs a client / mob / hallucination to observe it to exist. + returnable_list += typesof(/obj/projectile/hallucination) + returnable_list += typesof(/obj/item/hallucinated) + //We don't have a pod + returnable_list += typesof(/obj/effect/pod_landingzone_effect) + returnable_list += typesof(/obj/effect/pod_landingzone) + //We have a baseturf limit of 10, adding more than 10 baseturf helpers will kill CI, so here's a future edge case to fix. + returnable_list += typesof(/obj/effect/baseturf_helper) + //No tauma to pass in + returnable_list += typesof(/mob/camera/imaginary_friend) + //No pod to gondola + returnable_list += typesof(/mob/living/simple_animal/pet/gondola/gondolapod) + //No heart to give + returnable_list += typesof(/obj/structure/ethereal_crystal) + //No linked console + returnable_list += typesof(/mob/camera/ai_eye/remote/base_construction) + //See above + returnable_list += typesof(/mob/camera/ai_eye/remote/shuttle_docker) + //Hangs a ref post invoke async, which we don't support. Could put a qdeleted check but it feels hacky + returnable_list += typesof(/obj/effect/anomaly/grav/high) + //See above + returnable_list += typesof(/obj/effect/timestop) + //Invoke async in init, skippppp + returnable_list += typesof(/mob/living/silicon/robot/model) + //This lad also sleeps + returnable_list += typesof(/obj/item/hilbertshotel) + //this boi spawns turf changing stuff, and it stacks and causes pain. Let's just not + returnable_list += typesof(/obj/effect/sliding_puzzle) + //Stacks baseturfs, can't be tested here + returnable_list += typesof(/obj/effect/temp_visual/lava_warning) + //Stacks baseturfs, can't be tested here + returnable_list += typesof(/obj/effect/landmark/ctf) + //Our system doesn't support it without warning spam from unregister calls on things that never registered + returnable_list += typesof(/obj/docking_port) + //Asks for a shuttle that may not exist, let's leave it alone + returnable_list += typesof(/obj/item/pinpointer/shuttle) + //This spawns beams as a part of init, which can sleep past an async proc. This hangs a ref, and fucks us. It's only a problem here because the beam sleeps with CHECK_TICK + returnable_list += typesof(/obj/structure/alien/resin/flower_bud) + //Needs a linked mecha + returnable_list += typesof(/obj/effect/skyfall_landingzone) + //Expects a mob to holderize, we have nothing to give + returnable_list += typesof(/obj/item/clothing/head/mob_holder) + //Needs cards passed into the initilazation args + returnable_list += typesof(/obj/item/toy/cards/cardhand) + //Needs a holodeck area linked to it which is not guarenteed to exist and technically is supposed to have a 1:1 relationship with computer anyway. + returnable_list += typesof(/obj/machinery/computer/holodeck) + //runtimes if not paired with a landmark + returnable_list += typesof(/obj/structure/industrial_lift) + // Runtimes if the associated machinery does not exist, but not the base type + returnable_list += subtypesof(/obj/machinery/airlock_controller) + // Always ought to have an associated escape menu. Any references it could possibly hold would need one regardless. + returnable_list += subtypesof(/atom/movable/screen/escape_menu) + // Can't spawn openspace above nothing, it'll get pissy at me + returnable_list += typesof(/turf/open/space/openspace) + returnable_list += typesof(/turf/open/openspace) + + //SKYRAT EDIT ADDITION START - OUR UNCREATABLES DOWN HERE + //Not designed to be spawned without a turf. + returnable_list += typesof(/obj/effect/abstract/liquid_turf) + //Not designed to be spawned individually. + returnable_list += typesof(/obj/structure/mold) + //Unused - not supposed to be spawned without SSliquids + returnable_list += typesof(/turf/open/openspace/ocean) + //Baseturf editors can only go up to ten, stop this. + returnable_list += typesof(/obj/effect/baseturf_helper) + // It's the abstract base type, it shouldn't be spawned. + returnable_list += /obj/item/organ/external/genital + // These two are locked to one type only, and shouldn't be widely available, hence why they runtime otherwise. + // Can't be bothered adding more to them. + returnable_list += list(/obj/item/organ/external/neck_accessory, /obj/item/organ/external/head_accessory) + //SKYRAT EDIT ADDITION END + + return returnable_list + /proc/RunUnitTests() CHECK_TICK diff --git a/code/modules/unit_tests/~skyrat/automapper.dm b/code/modules/unit_tests/~skyrat/automapper.dm index 572de811915..543eacca5b7 100644 --- a/code/modules/unit_tests/~skyrat/automapper.dm +++ b/code/modules/unit_tests/~skyrat/automapper.dm @@ -29,4 +29,5 @@ /datum/unit_test/area_spawn/Run() for(var/datum/area_spawn/area_spawn as anything in SSarea_spawn.failed_area_spawns) - TEST_FAIL("[area_spawn.type] could not find any suitable turfs among [english_list(area_spawn.target_areas)].") + TEST_FAIL("[area_spawn] could not find any suitable turfs among [english_list(initial(area_spawn.target_areas))].") + diff --git a/code/modules/uplink/uplink_items/badass.dm b/code/modules/uplink/uplink_items/badass.dm index 2469fe22104..93087be9dd0 100644 --- a/code/modules/uplink/uplink_items/badass.dm +++ b/code/modules/uplink/uplink_items/badass.dm @@ -90,3 +90,16 @@ desc = "Contains 8 random stickers precisely engineered to resemble suspicious objects, which may or may not be useful for fooling crew." item = /obj/item/storage/box/syndie_kit/stickers cost = 1 + +/datum/uplink_item/badass/demotivational_posters + name = "Syndicate Demotivational Poster Pack" + desc = "Contains a selection of demotivational posters to minimise productivity and maximise apathy in the workplace." + item = /obj/item/storage/box/syndie_kit/poster_box + cost = 1 + +/datum/uplink_item/badass/syndie_spraycan + name = "Syndicate Spraycan" + desc = "A stylish Syndicate spraycan. \ + Contains enough special solution to spray a single super-size seditious symbol, subjecting station staff to slippery suffering." + item = /obj/item/traitor_spraycan + cost = 1 diff --git a/code/modules/uplink/uplink_items/device_tools.dm b/code/modules/uplink/uplink_items/device_tools.dm index 8a045fb72b0..816f88b8057 100644 --- a/code/modules/uplink/uplink_items/device_tools.dm +++ b/code/modules/uplink/uplink_items/device_tools.dm @@ -83,11 +83,10 @@ item = /obj/item/storage/box/syndie_kit/syndicate_teleporter cost = 8 -/datum/uplink_item/device_tools/camera_bug - name = "Camera Bug" - desc = "Enables you to view all cameras on the main network, set up motion alerts and track a target. \ - Bugging cameras allows you to disable them remotely." - item = /obj/item/camera_bug +/datum/uplink_item/device_tools/camera_app + name = "SyndEye Program" + desc = "A data disk containing a unique PC app that allows you to watch cameras and track crewmembers." + item = /obj/item/computer_disk/syndicate/camera_app cost = 1 surplus = 90 purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) @@ -254,7 +253,7 @@ desc = "When screwed to wiring attached to a power grid and activated, this large device lights up and places excessive \ load on the grid, causing a station-wide blackout. The sink is large and cannot be stored in most \ traditional bags and boxes. Caution: Will explode if the powernet contains sufficient amounts of energy." - progression_minimum = 30 MINUTES + progression_minimum = 20 MINUTES item = /obj/item/powersink cost = 11 diff --git a/code/modules/uplink/uplink_items/nukeops.dm b/code/modules/uplink/uplink_items/nukeops.dm index f03bbe6a5d3..e31421bdde4 100644 --- a/code/modules/uplink/uplink_items/nukeops.dm +++ b/code/modules/uplink/uplink_items/nukeops.dm @@ -334,7 +334,7 @@ /datum/uplink_item/weapon_kits/high_cost/cqc name = "CQC Equipment Case (Very Hard)" desc = "Contains a manual that instructs you in the ways of CQC, or Close Quarters Combat. Comes with a stealth implant and a snazzy bandana (and a hat stabilizer to go with it)." - item = /obj/item/book/granter/martial/cqc + item = /obj/item/storage/toolbox/guncase/cqc purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS surplus = 0 @@ -597,6 +597,24 @@ cost = 2 purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS +/datum/uplink_item/suits/syndi_intellicard + name = "Pre-Loaded Syndicate Intellicard" + desc = "A syndicate intellicard that can be activated to download a captured Nanotrasen AI, modified with the standard syndicate lawset. You can slot it into your modsuit for a conversational partner! It can additionally control the MODsuit's modules at will, and move your body around even if you're in critical condition or dead. \ + However, due to failsafes activated during the extraction process, the AI is unable to interact with electronics from anywhere but direct proximity..." + item = /obj/item/aicard/syndie/loaded + cost = 12 + purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + refundable = TRUE + +/datum/uplink_item/suits/synd_ai_upgrade + name = "Syndicate AI Upgrade" + desc = "...unless you buy the Syndicate Upgrade! This data chip allows the captured AI to increase its interaction range by two tiles per application. The Syndicate recommends three or four purchases at most, for a total of seven or infinite meters of range." + item = /obj/item/computer_disk/syndie_ai_upgrade + cost = 4 + purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + cant_discount = TRUE + refundable = TRUE + // Devices /datum/uplink_item/device_tools/assault_pod diff --git a/code/modules/vehicles/cars/car.dm b/code/modules/vehicles/cars/car.dm index 603bdb73152..46a9c6f7f56 100644 --- a/code/modules/vehicles/cars/car.dm +++ b/code/modules/vehicles/cars/car.dm @@ -16,7 +16,8 @@ /obj/vehicle/sealed/car/generate_actions() . = ..() - initialize_controller_action_type(/datum/action/vehicle/sealed/remove_key, VEHICLE_CONTROL_DRIVE) + if(!isnull(key_type)) + initialize_controller_action_type(/datum/action/vehicle/sealed/remove_key, VEHICLE_CONTROL_DRIVE) if(car_traits & CAN_KIDNAP) initialize_controller_action_type(/datum/action/vehicle/sealed/dump_kidnapped_mobs, VEHICLE_CONTROL_DRIVE) @@ -29,15 +30,16 @@ mob_try_forced_enter(M, kidnapped) return ..() -/obj/vehicle/sealed/car/mob_try_exit(mob/M, mob/user, silent = FALSE) - if(M != user || !(LAZYACCESS(occupants, M) & VEHICLE_CONTROL_KIDNAPPED)) - mob_exit(M, silent) +/obj/vehicle/sealed/car/mob_try_exit(mob/future_pedestrian, mob/user, silent = FALSE) + if(future_pedestrian != user || !(LAZYACCESS(occupants, future_pedestrian) & VEHICLE_CONTROL_KIDNAPPED)) + mob_exit(future_pedestrian, silent) return TRUE - to_chat(user, span_notice("You push against the back of \the [src]'s trunk to try and get out.")) - if(!do_after(user, escape_time, target = src)) - return FALSE + if (escape_time > 0) + to_chat(user, span_notice("You push against the back of \the [src]'s trunk to try and get out.")) + if(!do_after(user, escape_time, target = src)) + return FALSE to_chat(user,span_danger("[user] gets out of [src].")) - mob_exit(M, silent) + mob_exit(future_pedestrian, silent) return TRUE /obj/vehicle/sealed/car/attack_hand(mob/living/user, list/modifiers) @@ -58,7 +60,8 @@ if(occupant_amount() >= max_occupants) return FALSE var/atom/old_loc = loc - if(do_after(forcer, get_enter_delay(kidnapped), kidnapped, extra_checks=CALLBACK(src, TYPE_PROC_REF(/obj/vehicle/sealed/car, is_car_stationary), old_loc))) + var/enter_delay = get_enter_delay(kidnapped) + if(enter_delay == 0 || do_after(forcer, enter_delay, kidnapped, extra_checks=CALLBACK(src, TYPE_PROC_REF(/obj/vehicle/sealed/car, is_car_stationary), old_loc))) mob_forced_enter(kidnapped, silent) return TRUE return FALSE diff --git a/code/modules/vehicles/cars/speedwagon.dm b/code/modules/vehicles/cars/speedwagon.dm new file mode 100644 index 00000000000..1fa9e2dcc6c --- /dev/null +++ b/code/modules/vehicles/cars/speedwagon.dm @@ -0,0 +1,51 @@ +/// Big 3x3 car only available to admins which can run people over +/obj/vehicle/sealed/car/speedwagon + name = "BM Speedwagon" + desc = "Push it to the limit, walk along the razor's edge." + icon = 'icons/obj/toys/car.dmi' + icon_state = "speedwagon" + layer = LYING_MOB_LAYER + max_occupants = 4 + pixel_y = -48 + pixel_x = -48 + enter_delay = 0 SECONDS + escape_time = 0 SECONDS // Just get out dumbass + vehicle_move_delay = 0 + ///Determines whether we throw all things away when ramming them or just mobs, varedit only + var/crash_all = FALSE + +/obj/vehicle/sealed/car/speedwagon/Initialize(mapload) + . = ..() + add_overlay(image(icon, "speedwagon_cover", ABOVE_MOB_LAYER)) + +/obj/vehicle/sealed/car/speedwagon/Bump(atom/bumped) + . = ..() + if(!bumped.density || occupant_amount() == 0) + return + + if(crash_all) + if(ismovable(bumped)) + var/atom/movable/flying_debris = bumped + flying_debris.throw_at(get_edge_target_turf(bumped, dir), 4, 3) + visible_message(span_danger("[src] crashes into [bumped]!")) + playsound(src, 'sound/effects/bang.ogg', 50, TRUE) + if(!ishuman(bumped)) + return + var/mob/living/carbon/human/rammed = bumped + rammed.Paralyze(100) + rammed.adjustStaminaLoss(30) + rammed.apply_damage(rand(20,35), BRUTE) + if(!crash_all) + rammed.throw_at(get_edge_target_turf(bumped, dir), 4, 3) + visible_message(span_danger("[src] crashes into [rammed]!")) + playsound(src, 'sound/effects/bang.ogg', 50, TRUE) + +/obj/vehicle/sealed/car/speedwagon/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) + . = ..() + if(occupant_amount() == 0) + return + for(var/atom/future_statistic in range(2, src)) + if(future_statistic == src) + continue + if(!LAZYACCESS(occupants, future_statistic)) + Bump(future_statistic) diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index 1d18c23f074..fdb53c47572 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -35,14 +35,12 @@ generic_canpass = FALSE hud_possible = list(DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_TRACK_HUD, DIAG_CAMERA_HUD) mouse_pointer = 'icons/effects/mouse_pointers/mecha_mouse.dmi' - ///How much energy the mech will consume each time it moves. This variable is a backup for when leg actuators affect the energy drain. - var/normal_step_energy_drain = 10 ///How much energy the mech will consume each time it moves. this is the current active energy consumed - var/step_energy_drain = 10 + var/step_energy_drain = 8 ///How much energy we drain each time we mechpunch someone var/melee_energy_drain = 15 - ///The minimum amount of energy charge consumed by leg overload - var/overload_step_energy_drain_min = 100 + ///Power we use to have the lights on + var/light_energy_drain = 2 ///Modifiers for directional damage reduction var/list/facing_modifiers = list(MECHA_FRONT_ARMOUR = 0.5, MECHA_SIDE_ARMOUR = 1, MECHA_BACK_ARMOUR = 1.5) ///if we cant use our equipment(such as due to EMP) @@ -53,12 +51,11 @@ var/obj/item/stock_parts/scanning_module/scanmod /// Keeps track of the mech's capacitor var/obj/item/stock_parts/capacitor/capacitor - ///Whether the mechs maintenance protocols are on or off - var/construction_state = MECHA_LOCKED + /// Keeps track of the mech's servo motor + var/obj/item/stock_parts/servo/servo ///Contains flags for the mecha - var/mecha_flags = ADDING_ACCESS_POSSIBLE | CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE - ///Stores the DNA enzymes of a carbon so tht only they can access the mech - var/dna_lock + var/mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE + ///Spark effects are handled by this datum var/datum/effect_system/spark_spread/spark_system ///How powerful our lights are @@ -73,19 +70,15 @@ var/bumpsmash = FALSE ///////////ATMOS - ///Whether we are currrently drawing from the internal tank - var/use_internal_tank = FALSE - ///The setting of the valve on the internal tank - var/internal_tank_valve = ONE_ATMOSPHERE - ///The internal air tank obj of the mech - var/obj/machinery/portable_atmospherics/canister/air/internal_tank + ///Whether the pilot is hidden from the outside viewers and whether the cabin can be sealed to be airtight + var/enclosed = TRUE + ///Whether the cabin exchanges gases with the environment + var/cabin_sealed = FALSE ///Internal air mix datum var/datum/gas_mixture/cabin_air - ///The connected air port, if we have one - var/obj/machinery/atmospherics/components/unary/portables_connector/connected_port + ///Volume of the cabin + var/cabin_volume = TANK_STANDARD_VOLUME * 3 - ///Special version of the radio, which is unsellable - var/obj/item/radio/mech/radio ///List of installed remote tracking beacons, including AI control beacons var/list/trackers = list() ///Camera installed into the mech @@ -102,14 +95,16 @@ /// % chance for internal damage to occur var/internal_damage_probability = 20 /// list of possibly dealt internal damage for this mech type - var/possible_int_damage = MECHA_INT_FIRE|MECHA_INT_TEMP_CONTROL|MECHA_INT_TANK_BREACH|MECHA_INT_CONTROL_LOST|MECHA_INT_SHORT_CIRCUIT + var/possible_int_damage = MECHA_INT_FIRE|MECHA_INT_TEMP_CONTROL|MECHA_CABIN_AIR_BREACH|MECHA_INT_CONTROL_LOST|MECHA_INT_SHORT_CIRCUIT /// damage threshold above which we take component damage var/component_damage_threshold = 10 - ///required access level for mecha operation - var/list/operation_req_access = list() - ///required access to change internal components - var/list/internals_req_access = list(ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE) + ///Stores the DNA enzymes of a carbon so tht only they can access the mech + var/dna_lock + /// A list of all granted accesses + var/list/accesses = list() + /// If the mech should require ALL or only ONE of the listed accesses + var/one_access = TRUE ///Typepath for the wreckage it spawns when destroyed var/wreckage @@ -124,9 +119,11 @@ MECHA_POWER = list(), MECHA_ARMOR = list(), ) - ///assoc list: max equips for non-arm modules key-count + ///assoc list: max equips for modules key-count var/list/max_equip_by_category = list( - MECHA_UTILITY = 0, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 2, MECHA_POWER = 1, MECHA_ARMOR = 0, ) @@ -150,8 +147,6 @@ var/exit_delay = 2 SECONDS ///Time you get slept for if you get forcible ejected by the mech exploding var/destruction_sleep_duration = 2 SECONDS - ///Whether outside viewers can see the pilot inside - var/enclosed = TRUE ///In case theres a different iconstate for AI/MMI pilot(currently only used for ripley) var/silicon_icon_state = null ///Currently ejecting, and unable to do things @@ -169,11 +164,15 @@ var/defense_mode = FALSE ///Bool for leg overload on/off - var/leg_overload_mode = FALSE - ///Energy use modifier for leg overload - var/leg_overload_coeff = 100 - ///stores value that we will add and remove from the mecha when toggling leg overload - var/speed_mod = 0 + var/overclock_mode = FALSE + ///Whether it is possible to toggle overclocking from the cabin + var/can_use_overclock = FALSE + ///Speed and energy usage modifier for leg overload + var/overclock_coeff = 1.5 + ///Current leg actuator temperature. Increases when overloaded, decreases when not. + var/overclock_temp = 0 + ///Temperature threshold at which actuators may start causing internal damage + var/overclock_temp_danger = 15 //Bool for zoom on/off var/zoom_mode = FALSE @@ -199,13 +198,14 @@ ///Bool for whether this mech can only be used on lavaland var/lavaland_only = FALSE - /// Ui size, so you can make the UI bigger if you let it load a lot of stuff - var/ui_x = 1100 - /// Ui size, so you can make the UI bigger if you let it load a lot of stuff - var/ui_y = 600 /// ref to screen object that displays in the middle of the UI var/atom/movable/screen/map_view/ui_view + /// Theme of the mech TGUI + var/ui_theme = "ntos" + /// Module selected by default when mech UI is opened + var/ui_selected_module_index + /datum/armor/sealed_mecha melee = 20 bullet = 10 @@ -213,16 +213,10 @@ fire = 100 acid = 100 -/obj/item/radio/mech //this has to go somewhere - subspace_transmission = TRUE - -/obj/vehicle/sealed/mecha/Initialize(mapload) +/obj/vehicle/sealed/mecha/Initialize(mapload, built_manually) . = ..() ui_view = new() ui_view.generate_view("mech_view_[REF(src)]") - if(enclosed) - internal_tank = new (src) - RegisterSignal(src, COMSIG_MOVABLE_PRE_MOVE , PROC_REF(disconnect_air)) RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) RegisterSignal(src, COMSIG_LIGHT_EATER_ACT, PROC_REF(on_light_eater)) @@ -234,19 +228,12 @@ smoke_system.set_up(3, holder = src, location = src) smoke_system.attach(src) - radio = new(src) - radio.name = "[src] radio" + cabin_air = new(cabin_volume) - cabin_air = new - cabin_air.volume = 200 - cabin_air.temperature = T20C - cabin_air.add_gases(/datum/gas/oxygen, /datum/gas/nitrogen) - cabin_air.gases[/datum/gas/oxygen][MOLES] = O2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) - cabin_air.gases[/datum/gas/nitrogen][MOLES] = N2STANDARD*cabin_air.volume/(R_IDEAL_GAS_EQUATION*cabin_air.temperature) - - add_cell() - add_scanmod() - add_capacitor() + if(!built_manually) + populate_parts() + update_access() + set_wires(new /datum/wires/mecha(src)) START_PROCESSING(SSobj, src) SSpoints_of_interest.make_point_of_interest(src) log_message("[src.name] created.", LOG_MECHA) @@ -285,7 +272,6 @@ for(var/obj/item/mecha_parts/mecha_equipment/equip as anything in flat_equipment) equip.detach(loc) qdel(equip) - radio = null STOP_PROCESSING(SSobj, src) LAZYCLEARLIST(flat_equipment) @@ -295,19 +281,37 @@ QDEL_NULL(cell) QDEL_NULL(scanmod) QDEL_NULL(capacitor) - QDEL_NULL(internal_tank) + QDEL_NULL(servo) QDEL_NULL(cabin_air) QDEL_NULL(spark_system) QDEL_NULL(smoke_system) QDEL_NULL(ui_view) QDEL_NULL(trackers) QDEL_NULL(chassis_camera) + QDEL_NULL(wires) GLOB.mechas_list -= src //global mech list for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) diag_hud.remove_atom_from_hud(src) //YEET return ..() +///Add parts on mech spawning. Skipped in manual construction. +/obj/vehicle/sealed/mecha/proc/populate_parts() + cell = new /obj/item/stock_parts/cell/high(src) + scanmod = new /obj/item/stock_parts/scanning_module(src) + capacitor = new /obj/item/stock_parts/capacitor(src) + servo = new /obj/item/stock_parts/servo(src) + update_part_values() + +/obj/vehicle/sealed/mecha/CheckParts(list/parts_list) + . = ..() + cell = locate(/obj/item/stock_parts/cell) in contents + diag_hud_set_mechcell() + scanmod = locate(/obj/item/stock_parts/scanning_module) in contents + capacitor = locate(/obj/item/stock_parts/capacitor) in contents + servo = locate(/obj/item/stock_parts/servo) in contents + update_part_values() + /obj/vehicle/sealed/mecha/atom_destruction() spark_system?.start() loc.assume_air(cabin_air) @@ -333,7 +337,7 @@ if(E.detachable && prob(30)) WR.crowbar_salvage += E E.detach(WR) //detaches from src into WR - E.activated = TRUE + E.active = TRUE else E.detach(loc) qdel(E) @@ -388,7 +392,10 @@ /obj/vehicle/sealed/mecha/generate_actions() initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_eject) - initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_internals, VEHICLE_CONTROL_SETTINGS) + if(enclosed) + initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_cabin_seal, VEHICLE_CONTROL_SETTINGS) + if(can_use_overclock) + initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_overclock) initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_lights, VEHICLE_CONTROL_SETTINGS) initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_safeties, VEHICLE_CONTROL_SETTINGS) initialize_controller_action_type(/datum/action/vehicle/sealed/mecha/mech_view_stats, VEHICLE_CONTROL_SETTINGS) @@ -426,32 +433,36 @@ to_chat(mob_occupant, span_notice("Equipment control unit has been rebooted successfully.")) set_mouse_pointer() -/obj/vehicle/sealed/mecha/CheckParts(list/parts_list) - . = ..() - cell = locate(/obj/item/stock_parts/cell) in contents - scanmod = locate(/obj/item/stock_parts/scanning_module) in contents - capacitor = locate(/obj/item/stock_parts/capacitor) in contents - update_part_values() - /obj/vehicle/sealed/mecha/proc/update_part_values() ///Updates the values given by scanning module and capacitor tier, called when a part is removed or inserted. - if(scanmod) - normal_step_energy_drain = 20 - (5 * scanmod.rating) //10 is normal, so on lowest part its worse, on second its ok and on higher its real good up to 0 on best - step_energy_drain = normal_step_energy_drain - else - normal_step_energy_drain = 500 - step_energy_drain = normal_step_energy_drain + update_energy_drain() if(capacitor) var/datum/armor/stock_armor = get_armor_by_type(armor_type) var/initial_energy = stock_armor.get_rating(ENERGY) set_armor_rating(ENERGY, initial_energy + (capacitor.rating * 5)) + overclock_temp_danger = initial(overclock_temp_danger) * capacitor.rating + else + overclock_temp_danger = initial(overclock_temp_danger) /obj/vehicle/sealed/mecha/examine(mob/user) . = ..() if(LAZYLEN(flat_equipment)) . += span_notice("It's equipped with:") for(var/obj/item/mecha_parts/mecha_equipment/ME as anything in flat_equipment) + if(istype(ME, /obj/item/mecha_parts/mecha_equipment/concealed_weapon_bay)) + continue . += span_notice("[icon2html(ME, user)] \A [ME].") + if(mecha_flags & PANEL_OPEN) + if(servo) + . += span_notice("Micro-servos reduce movement power usage by [100 - round(100 / servo.rating)]%") + else + . += span_warning("It's missing a micro-servo.") + if(capacitor) + . += span_notice("Capacitor increases armor against energy attacks by [capacitor.rating * 5].") + else + . += span_warning("It's missing a capacitor.") + if(!scanmod) + . += span_warning("It's missing a scanning module.") if(enclosed) return if(mecha_flags & SILICON_PILOT) @@ -485,69 +496,74 @@ return examine_text +///Locate an internal tack in the utility modules +/obj/vehicle/sealed/mecha/proc/get_internal_tank() + var/obj/item/mecha_parts/mecha_equipment/air_tank/module = locate(/obj/item/mecha_parts/mecha_equipment/air_tank) in equip_by_category[MECHA_UTILITY] + return module?.internal_tank + //processing internal damage, temperature, air regulation, alert updates, lights power use. /obj/vehicle/sealed/mecha/process(seconds_per_tick) + if(overclock_mode || overclock_temp > 0) + process_overclock_effects(seconds_per_tick) if(internal_damage) - if(internal_damage & MECHA_INT_FIRE) - if(!(internal_damage & MECHA_INT_TEMP_CONTROL) && SPT_PROB(2.5, seconds_per_tick)) - clear_internal_damage(MECHA_INT_FIRE) - if(internal_tank) - var/datum/gas_mixture/int_tank_air = internal_tank.return_air() - if(int_tank_air.return_pressure() > internal_tank.maximum_pressure && !(internal_damage & MECHA_INT_TANK_BREACH)) - set_internal_damage(MECHA_INT_TANK_BREACH) - if(int_tank_air && int_tank_air.return_volume() > 0) //heat the air_contents - int_tank_air.temperature = min(6000+T0C, int_tank_air.temperature+rand(5,7.5)*seconds_per_tick) - if(cabin_air && cabin_air.return_volume()>0) - cabin_air.temperature = min(6000+T0C, cabin_air.return_temperature()+rand(5,7.5)*seconds_per_tick) - if(cabin_air.return_temperature() > max_temperature/2) - take_damage(seconds_per_tick*2/round(max_temperature/cabin_air.return_temperature(),0.1), BURN, 0, 0) + process_internal_damage_effects(seconds_per_tick) + if(cabin_sealed) + process_cabin_air(seconds_per_tick) + if(length(occupants)) + process_occupants(seconds_per_tick) + process_constant_power_usage(seconds_per_tick) +/obj/vehicle/sealed/mecha/proc/process_overclock_effects(seconds_per_tick) + if(!overclock_mode && overclock_temp > 0) + overclock_temp -= seconds_per_tick + return + overclock_temp = min(overclock_temp + seconds_per_tick, overclock_temp_danger * 2) + if(overclock_temp < overclock_temp_danger) + return + var/damage_chance = 100 * ((overclock_temp - overclock_temp_danger) / (overclock_temp_danger * 2)) + if(SPT_PROB(damage_chance, seconds_per_tick)) + do_sparks(5, TRUE, src) + try_deal_internal_damage(damage_chance) + take_damage(seconds_per_tick, BURN, 0, 0) - if(internal_damage & MECHA_INT_TANK_BREACH) //remove some air from internal tank - if(internal_tank) - var/datum/gas_mixture/int_tank_air = internal_tank.return_air() - var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(SPT_PROB_RATE(0.05, seconds_per_tick)) - if(loc) - loc.assume_air(leaked_gas) - else - qdel(leaked_gas) +/obj/vehicle/sealed/mecha/proc/process_internal_damage_effects(seconds_per_tick) + if(internal_damage & MECHA_INT_FIRE) + if(!(internal_damage & MECHA_INT_TEMP_CONTROL) && SPT_PROB(2.5, seconds_per_tick)) + clear_internal_damage(MECHA_INT_FIRE) + if(cabin_air && cabin_sealed && cabin_air.return_volume()>0) + if(cabin_air.return_pressure() > (PUMP_DEFAULT_PRESSURE * 30) && !(internal_damage & MECHA_CABIN_AIR_BREACH)) + set_internal_damage(MECHA_CABIN_AIR_BREACH) + cabin_air.temperature = min(6000+T0C, cabin_air.temperature+rand(5,7.5)*seconds_per_tick) + if(cabin_air.return_temperature() > max_temperature/2) + take_damage(seconds_per_tick*2/round(max_temperature/cabin_air.return_temperature(),0.1), BURN, 0, 0) - if(internal_damage & MECHA_INT_SHORT_CIRCUIT) - if(get_charge()) - spark_system.start() - cell.charge -= min(10 * seconds_per_tick, cell.charge) - cell.maxcharge -= min(10 * seconds_per_tick, cell.maxcharge) + if(internal_damage & MECHA_CABIN_AIR_BREACH && cabin_air && cabin_sealed) //remove some air from cabin_air + var/datum/gas_mixture/leaked_gas = cabin_air.remove_ratio(SPT_PROB_RATE(0.05, seconds_per_tick)) + if(loc) + loc.assume_air(leaked_gas) + else + qdel(leaked_gas) - if(!(internal_damage & MECHA_INT_TEMP_CONTROL)) - if(cabin_air && cabin_air.return_volume() > 0) - var/delta = cabin_air.temperature - T20C - cabin_air.temperature -= clamp(round(delta / 8, 0.1), -5, 5) * seconds_per_tick + if(internal_damage & MECHA_INT_SHORT_CIRCUIT && get_charge()) + spark_system.start() + use_power(min(10 * seconds_per_tick, cell.charge)) + cell.maxcharge -= min(10 * seconds_per_tick, cell.maxcharge) - if(internal_tank) - var/datum/gas_mixture/tank_air = internal_tank.return_air() - - var/release_pressure = internal_tank_valve - var/cabin_pressure = cabin_air.return_pressure() - var/pressure_delta = min(release_pressure - cabin_pressure, (tank_air.return_pressure() - cabin_pressure)/2) - var/transfer_moles = 0 - if(pressure_delta > 0) //cabin pressure lower than release pressure - if(tank_air.return_temperature() > 0) - transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = tank_air.remove(transfer_moles) - cabin_air.merge(removed) - else if(pressure_delta < 0) //cabin pressure higher than release pressure - var/datum/gas_mixture/t_air = return_air() - pressure_delta = cabin_pressure - release_pressure - if(t_air) - pressure_delta = min(cabin_pressure - t_air.return_pressure(), pressure_delta) - if(pressure_delta > 0) //if location pressure is lower than cabin pressure - transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = cabin_air.remove(transfer_moles) - if(t_air) - t_air.merge(removed) - else //just delete the cabin gas, we're in space or some shit - qdel(removed) +/obj/vehicle/sealed/mecha/proc/process_cabin_air(seconds_per_tick) + if(!(internal_damage & MECHA_INT_TEMP_CONTROL) && cabin_air && cabin_air.return_volume() > 0) + var/heat_capacity = cabin_air.heat_capacity() + var/required_energy = abs(T20C - cabin_air.temperature) * heat_capacity + required_energy = min(required_energy, 1000) + if(required_energy < 1) + return + var/delta_temperature = required_energy / heat_capacity + if(delta_temperature) + if(cabin_air.temperature < T20C) + cabin_air.temperature += delta_temperature + else + cabin_air.temperature -= delta_temperature +/obj/vehicle/sealed/mecha/proc/process_occupants(seconds_per_tick) for(var/mob/living/occupant as anything in occupants) if(!enclosed && occupant?.incapacitated()) //no sides mean it's easy to just sorta fall out if you're incapacitated. mob_exit(occupant, randomstep = TRUE) //bye bye @@ -565,7 +581,6 @@ occupant.throw_alert(ALERT_CHARGE, /atom/movable/screen/alert/lowcell/mech, 3) else occupant.throw_alert(ALERT_CHARGE, /atom/movable/screen/alert/emptycell/mech) - var/integrity = atom_integrity/max_integrity*100 switch(integrity) if(30 to 45) @@ -589,15 +604,18 @@ else if (checking == src) break // all good checking = checking.loc - - if(mecha_flags & LIGHTS_ON) - use_power(2*seconds_per_tick) - -//Diagnostic HUD updates + //Diagnostic HUD updates diag_hud_set_mechhealth() diag_hud_set_mechcell() diag_hud_set_mechstat() +/obj/vehicle/sealed/mecha/proc/process_constant_power_usage(seconds_per_tick) + if(mecha_flags & LIGHTS_ON && !use_power(light_energy_drain * seconds_per_tick)) + mecha_flags &= ~LIGHTS_ON + set_light_on(mecha_flags & LIGHTS_ON) + playsound(src,'sound/machines/clockcult/brass_skewer.ogg', 40, TRUE) + log_message("Toggled lights off due to the lack of power.", LOG_MECHA) + ///Called when a driver clicks somewhere. Handles everything like equipment, punches, etc. /obj/vehicle/sealed/mecha/proc/on_mouseclick(mob/user, atom/target, list/modifiers) SIGNAL_HANDLER @@ -619,9 +637,6 @@ return if(user.incapacitated()) return - if(construction_state) - balloon_alert(user, "end maintenance first!") - return if(!get_charge()) return if(src == target) @@ -673,6 +688,7 @@ return use_power(melee_energy_drain) + SEND_SIGNAL(user, COMSIG_MOB_USED_MECH_MELEE, src) target.mech_melee_attack(src, user) TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MELEE_ATTACK, melee_cooldown) @@ -693,33 +709,17 @@ var/image/mech_speech = image('icons/mob/effects/talk.dmi', src, "machine[say_test(speech_args[SPEECH_MESSAGE])]",MOB_LAYER+1) INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(flick_overlay_global), mech_speech, speech_bubble_recipients, 3 SECONDS) - -///////////////////////// -////// Access stuff ///// -///////////////////////// - -/obj/vehicle/sealed/mecha/proc/operation_allowed(mob/M) - req_access = operation_req_access - req_one_access = list() - return allowed(M) - -/obj/vehicle/sealed/mecha/proc/internals_access_allowed(mob/M) - req_one_access = internals_req_access - req_access = list() - return allowed(M) - - ///////////////////////////////////// //////// Atmospheric stuff //////// ///////////////////////////////////// /obj/vehicle/sealed/mecha/remove_air(amount) - if(use_internal_tank) + if(enclosed && cabin_sealed) return cabin_air.remove(amount) return ..() /obj/vehicle/sealed/mecha/return_air() - if(use_internal_tank) + if(enclosed && cabin_sealed) return cabin_air return ..() @@ -736,6 +736,49 @@ var/datum/gas_mixture/air = return_air() return air?.return_temperature() +///makes cabin unsealed, dumping cabin air outside or airtight filling the cabin with external air mix +/obj/vehicle/sealed/mecha/proc/set_cabin_seal(mob/user, cabin_sealed) + if(!enclosed) + balloon_alert(user, "cabin can't be sealed!") + log_message("Tried to seal cabin. This mech can't be airtight.", LOG_MECHA) + return + if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_CABIN_SEAL)) + balloon_alert(user, "on cooldown!") + return + TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_CABIN_SEAL, 1 SECONDS) + + src.cabin_sealed = cabin_sealed + + var/datum/gas_mixture/environment_air = loc.return_air() + if(!isnull(environment_air)) + if(cabin_sealed) + // Fill cabin with air + environment_air.pump_gas_to(cabin_air, environment_air.return_pressure()) + else + // Dump cabin air + var/datum/gas_mixture/removed_gases = cabin_air.remove_ratio(1) + if(loc) + loc.assume_air(removed_gases) + else + qdel(removed_gases) + + var/obj/item/mecha_parts/mecha_equipment/air_tank/tank = locate(/obj/item/mecha_parts/mecha_equipment/air_tank) in equip_by_category[MECHA_UTILITY] + for(var/mob/occupant as anything in occupants) + var/datum/action/action = locate(/datum/action/vehicle/sealed/mecha/mech_toggle_cabin_seal) in occupant.actions + if(!isnull(tank) && cabin_sealed && tank.auto_pressurize_on_seal) + if(!tank.active) + tank.set_active(TRUE) + else + action.button_icon_state = "mech_cabin_pressurized" + action.build_all_button_icons() + else + action.button_icon_state = "mech_cabin_[cabin_sealed ? "closed" : "open"]" + action.build_all_button_icons() + + balloon_alert(occupant, "cabin [cabin_sealed ? "sealed" : "unsealed"]") + log_message("Cabin [cabin_sealed ? "sealed" : "unsealed"].", LOG_MECHA) + playsound(src, 'sound/machines/airlock.ogg', 50, TRUE) + /// Special light eater handling /obj/vehicle/sealed/mecha/proc/on_light_eater(obj/vehicle/sealed/source, datum/light_eater) SIGNAL_HANDLER @@ -746,3 +789,73 @@ for(var/occupant in occupants) remove_action_type_from_mob(/datum/action/vehicle/sealed/mecha/mech_toggle_lights, occupant) return COMPONENT_BLOCK_LIGHT_EATER + +/// Apply corresponding accesses +/obj/vehicle/sealed/mecha/proc/update_access() + req_access = one_access ? list() : accesses + req_one_access = one_access ? accesses : list() + +/// Electrocute user from power celll +/obj/vehicle/sealed/mecha/proc/shock(mob/living/user) + if(!istype(user) || get_charge() < 1) + return FALSE + do_sparks(5, TRUE, src) + return electrocute_mob(user, cell, src, 0.7, TRUE) + +/// Toggle mech overclock with a button or by hacking +/obj/vehicle/sealed/mecha/proc/toggle_overclock(forced_state = null) + if(!isnull(forced_state)) + if(overclock_mode == forced_state) + return + overclock_mode = forced_state + else + overclock_mode = !overclock_mode + log_message("Toggled overclocking.", LOG_MECHA) + if(overclock_mode) + movedelay = movedelay / overclock_coeff + visible_message(span_notice("[src] starts heating up, making humming sounds.")) + else + movedelay = initial(movedelay) + visible_message(span_notice("[src] cools down and the humming stops.")) + update_energy_drain() + +/// Update the energy drain according to parts and status +/obj/vehicle/sealed/mecha/proc/update_energy_drain() + if(servo) + step_energy_drain = initial(step_energy_drain) / servo.rating + else + step_energy_drain = 2 * initial(step_energy_drain) + if(overclock_mode) + step_energy_drain *= overclock_coeff + + if(capacitor) + phasing_energy_drain = initial(phasing_energy_drain) / capacitor.rating + melee_energy_drain = initial(melee_energy_drain) / capacitor.rating + light_energy_drain = initial(light_energy_drain) / capacitor.rating + else + phasing_energy_drain = initial(phasing_energy_drain) + melee_energy_drain = initial(melee_energy_drain) + light_energy_drain = initial(light_energy_drain) + +/// Toggle lights on/off +/obj/vehicle/sealed/mecha/proc/toggle_lights(forced_state = null, mob/user) + if(!(mecha_flags & HAS_LIGHTS)) + if(user) + balloon_alert(user, "mech has no lights!") + return + if((!(mecha_flags & LIGHTS_ON) && forced_state != FALSE) && get_charge() < light_energy_drain) + if(user) + balloon_alert(user, "no power for lights!") + return + mecha_flags ^= LIGHTS_ON + set_light_on(mecha_flags & LIGHTS_ON) + playsound(src,'sound/machines/clockcult/brass_skewer.ogg', 40, TRUE) + log_message("Toggled lights [(mecha_flags & LIGHTS_ON)?"on":"off"].", LOG_MECHA) + for(var/mob/occupant as anything in occupants) + var/datum/action/act = locate(/datum/action/vehicle/sealed/mecha/mech_toggle_lights) in occupant.actions + if(mecha_flags & LIGHTS_ON) + act.button_icon_state = "mech_lights_on" + else + act.button_icon_state = "mech_lights_off" + balloon_alert(occupant, "toggled lights [mecha_flags & LIGHTS_ON ? "on":"off"]") + act.build_all_button_icons() diff --git a/code/modules/vehicles/mecha/combat/durand.dm b/code/modules/vehicles/mecha/combat/durand.dm index 78b3a219a3c..4ac13b8dd64 100644 --- a/code/modules/vehicles/mecha/combat/durand.dm +++ b/code/modules/vehicles/mecha/combat/durand.dm @@ -5,7 +5,7 @@ base_icon_state = "durand" movedelay = 4 max_integrity = 400 - internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY) + accesses = list(ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY) armor_type = /datum/armor/mecha_durand max_temperature = 30000 force = 40 @@ -14,7 +14,9 @@ wreckage = /obj/structure/mecha_wreckage/durand mech_type = EXOSUIT_MODULE_DURAND max_equip_by_category = list( - MECHA_UTILITY = 1, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 3, MECHA_POWER = 1, MECHA_ARMOR = 3, ) diff --git a/code/modules/vehicles/mecha/combat/gygax.dm b/code/modules/vehicles/mecha/combat/gygax.dm index 161ad437cdd..204739cd7fc 100644 --- a/code/modules/vehicles/mecha/combat/gygax.dm +++ b/code/modules/vehicles/mecha/combat/gygax.dm @@ -5,21 +5,23 @@ base_icon_state = "gygax" movedelay = 3 max_integrity = 250 - internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY) + accesses = list(ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY) armor_type = /datum/armor/mecha_gygax max_temperature = 25000 - leg_overload_coeff = 80 force = 25 destruction_sleep_duration = 40 exit_delay = 40 wreckage = /obj/structure/mecha_wreckage/gygax mech_type = EXOSUIT_MODULE_GYGAX max_equip_by_category = list( - MECHA_UTILITY = 1, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 3, MECHA_POWER = 1, MECHA_ARMOR = 2, ) - step_energy_drain = 3 + step_energy_drain = 4 + can_use_overclock = TRUE /datum/armor/mecha_gygax melee = 25 @@ -29,57 +31,32 @@ fire = 100 acid = 100 -/obj/vehicle/sealed/mecha/gygax/generate_actions() - . = ..() - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_overload_mode) - -/datum/action/vehicle/sealed/mecha/mech_overload_mode - name = "Toggle leg actuators overload" - button_icon_state = "mech_overload_off" - -/datum/action/vehicle/sealed/mecha/mech_overload_mode/Trigger(trigger_flags, forced_state = null) - if(!owner || !chassis || !(owner in chassis.occupants)) - return - if(!isnull(forced_state)) - chassis.leg_overload_mode = forced_state - else - chassis.leg_overload_mode = !chassis.leg_overload_mode - button_icon_state = "mech_overload_[chassis.leg_overload_mode ? "on" : "off"]" - chassis.log_message("Toggled leg actuators overload.", LOG_MECHA) - if(chassis.leg_overload_mode) - chassis.speed_mod = min(chassis.movedelay-1, round(chassis.movedelay * 0.5)) - chassis.movedelay -= chassis.speed_mod - chassis.step_energy_drain = max(chassis.overload_step_energy_drain_min,chassis.step_energy_drain*chassis.leg_overload_coeff) - chassis.balloon_alert(owner,"leg actuators overloaded") - else - chassis.movedelay += chassis.speed_mod - chassis.step_energy_drain = chassis.normal_step_energy_drain - chassis.balloon_alert(owner, "you disable the overload") - build_all_button_icons() - /obj/vehicle/sealed/mecha/gygax/dark desc = "A lightweight exosuit, painted in a dark scheme. This model appears to have some modifications." name = "\improper Dark Gygax" + ui_theme = "syndicate" icon_state = "darkgygax" base_icon_state = "darkgygax" max_integrity = 300 armor_type = /datum/armor/gygax_dark max_temperature = 35000 - leg_overload_coeff = 70 + overclock_coeff = 2 + overclock_temp_danger = 20 force = 30 - operation_req_access = list(ACCESS_SYNDICATE) - internals_req_access = list(ACCESS_SYNDICATE) + accesses = list(ACCESS_SYNDICATE) wreckage = /obj/structure/mecha_wreckage/gygax/dark - mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE + mecha_flags = ID_LOCK_ON | CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE max_equip_by_category = list( - MECHA_UTILITY = 2, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 4, MECHA_POWER = 1, MECHA_ARMOR = 3, ) equip_by_category = list( MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot, MECHA_R_ARM = null, - MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/thrusters/ion), + MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/radio, /obj/item/mecha_parts/mecha_equipment/air_tank/full, /obj/item/mecha_parts/mecha_equipment/thrusters/ion), MECHA_POWER = list(), MECHA_ARMOR = list(/obj/item/mecha_parts/mecha_equipment/armor/anticcw_armor_booster, /obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster), ) @@ -98,11 +75,9 @@ . = ..() max_ammo() -/obj/vehicle/sealed/mecha/gygax/dark/add_cell() +/obj/vehicle/sealed/mecha/gygax/dark/loaded/populate_parts() cell = new /obj/item/stock_parts/cell/bluespace(src) - -/obj/vehicle/sealed/mecha/gygax/dark/add_scanmod() scanmod = new /obj/item/stock_parts/scanning_module/triphasic(src) - -/obj/vehicle/sealed/mecha/gygax/dark/add_capacitor() capacitor = new /obj/item/stock_parts/capacitor/quadratic(src) + servo = new /obj/item/stock_parts/servo/femto(src) + update_part_values() diff --git a/code/modules/vehicles/mecha/combat/honker.dm b/code/modules/vehicles/mecha/combat/honker.dm index dd01492f19d..dddcb7e8225 100644 --- a/code/modules/vehicles/mecha/combat/honker.dm +++ b/code/modules/vehicles/mecha/combat/honker.dm @@ -1,6 +1,7 @@ /obj/vehicle/sealed/mecha/honker desc = "Produced by \"Tyranny of Honk, INC\", this exosuit is designed as heavy clown-support. Used to spread the fun and joy of life. HONK!" name = "\improper H.O.N.K" + ui_theme = "neutral" icon_state = "honker" base_icon_state = "honker" movedelay = 3 @@ -10,13 +11,14 @@ max_temperature = 25000 destruction_sleep_duration = 40 exit_delay = 40 - operation_req_access = list(ACCESS_THEATRE) - internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_THEATRE) + accesses = list(ACCESS_MECH_SCIENCE, ACCESS_THEATRE) wreckage = /obj/structure/mecha_wreckage/honker mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE mech_type = EXOSUIT_MODULE_HONK max_equip_by_category = list( - MECHA_UTILITY = 2, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 4, MECHA_POWER = 1, MECHA_ARMOR = 0, ) @@ -38,15 +40,18 @@ /obj/vehicle/sealed/mecha/honker/dark desc = "Produced by \"Tyranny of Honk, INC\", this exosuit is designed as heavy clown-support. This one has been painted black for maximum fun. HONK!" name = "\improper Dark H.O.N.K" + ui_theme = "syndicate" icon_state = "darkhonker" max_integrity = 300 armor_type = /datum/armor/honker_dark max_temperature = 35000 - operation_req_access = list(ACCESS_SYNDICATE) - internals_req_access = list(ACCESS_SYNDICATE) + accesses = list(ACCESS_SYNDICATE) wreckage = /obj/structure/mecha_wreckage/honker/dark + mecha_flags = ID_LOCK_ON | CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE max_equip_by_category = list( - MECHA_UTILITY = 1, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 3, MECHA_POWER = 1, MECHA_ARMOR = 3, ) @@ -55,7 +60,7 @@ equip_by_category = list( MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/honker, MECHA_R_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar/bombanana, - MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/thrusters/ion), + MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/radio, /obj/item/mecha_parts/mecha_equipment/air_tank/full, /obj/item/mecha_parts/mecha_equipment/thrusters/ion), MECHA_POWER = list(), MECHA_ARMOR = list(), ) @@ -69,14 +74,12 @@ fire = 100 acid = 100 -/obj/vehicle/sealed/mecha/honker/dark/add_cell() +/obj/vehicle/sealed/mecha/honker/dark/loaded/populate_parts() cell = new /obj/item/stock_parts/cell/hyper(src) - -/obj/vehicle/sealed/mecha/honker/dark/add_scanmod() scanmod = new /obj/item/stock_parts/scanning_module/phasic(src) - -/obj/vehicle/sealed/mecha/honker/dark/add_capacitor() capacitor = new /obj/item/stock_parts/capacitor/super(src) + servo = new /obj/item/stock_parts/servo/pico(src) + update_part_values() /obj/structure/mecha_wreckage/honker/dark name = "\improper Dark H.O.N.K wreckage" diff --git a/code/modules/vehicles/mecha/combat/marauder.dm b/code/modules/vehicles/mecha/combat/marauder.dm index bf0138d2c30..79b09568994 100644 --- a/code/modules/vehicles/mecha/combat/marauder.dm +++ b/code/modules/vehicles/mecha/combat/marauder.dm @@ -10,15 +10,16 @@ destruction_sleep_duration = 40 exit_delay = 40 resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - operation_req_access = list(ACCESS_CENT_SPECOPS) - internals_req_access = list(ACCESS_CENT_SPECOPS) + accesses = list(ACCESS_CENT_SPECOPS) wreckage = /obj/structure/mecha_wreckage/marauder mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE mech_type = EXOSUIT_MODULE_MARAUDER force = 45 max_equip_by_category = list( - MECHA_UTILITY = 3, - MECHA_POWER = 2, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 5, + MECHA_POWER = 1, MECHA_ARMOR = 3, ) bumpsmash = TRUE @@ -41,17 +42,17 @@ equip_by_category = list( MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse, MECHA_R_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack, - MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/thrusters/ion), + MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/radio, /obj/item/mecha_parts/mecha_equipment/air_tank/full, /obj/item/mecha_parts/mecha_equipment/thrusters/ion), MECHA_POWER = list(), MECHA_ARMOR = list(/obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster), ) -/obj/vehicle/sealed/mecha/marauder/add_cell(obj/item/stock_parts/cell/C=null) - if(C) - C.forceMove(src) - cell = C - return +/obj/vehicle/sealed/mecha/marauder/loaded/populate_parts() cell = new /obj/item/stock_parts/cell/bluespace(src) + scanmod = new /obj/item/stock_parts/scanning_module/triphasic(src) + capacitor = new /obj/item/stock_parts/capacitor/quadratic(src) + servo = new /obj/item/stock_parts/servo/femto(src) + update_part_values() /datum/action/vehicle/sealed/mecha/mech_smoke name = "Smoke" @@ -88,21 +89,22 @@ name = "\improper Seraph" icon_state = "seraph" base_icon_state = "seraph" - operation_req_access = list(ACCESS_CENT_SPECOPS) - internals_req_access = list(ACCESS_CENT_SPECOPS) + accesses = list(ACCESS_CENT_SPECOPS) movedelay = 3 max_integrity = 550 wreckage = /obj/structure/mecha_wreckage/seraph force = 55 max_equip_by_category = list( - MECHA_UTILITY = 3, - MECHA_POWER = 2, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 5, + MECHA_POWER = 1, MECHA_ARMOR = 3, ) equip_by_category = list( MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse, MECHA_R_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack, - MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/thrusters/ion), + MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/radio, /obj/item/mecha_parts/mecha_equipment/air_tank/full, /obj/item/mecha_parts/mecha_equipment/thrusters/ion), MECHA_POWER = list(), MECHA_ARMOR = list(/obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster), ) @@ -110,20 +112,23 @@ /obj/vehicle/sealed/mecha/marauder/mauler desc = "Heavy-duty, combat exosuit, developed off of the existing Marauder model." name = "\improper Mauler" + ui_theme = "syndicate" icon_state = "mauler" base_icon_state = "mauler" - operation_req_access = list(ACCESS_SYNDICATE) - internals_req_access = list(ACCESS_SYNDICATE) + accesses = list(ACCESS_SYNDICATE) wreckage = /obj/structure/mecha_wreckage/mauler + mecha_flags = ID_LOCK_ON | CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE max_equip_by_category = list( - MECHA_UTILITY = 3, - MECHA_POWER = 2, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 4, + MECHA_POWER = 1, MECHA_ARMOR = 4, ) equip_by_category = list( MECHA_L_ARM = null, MECHA_R_ARM = null, - MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/thrusters/ion), + MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/radio, /obj/item/mecha_parts/mecha_equipment/air_tank/full, /obj/item/mecha_parts/mecha_equipment/thrusters/ion), MECHA_POWER = list(), MECHA_ARMOR = list(), ) @@ -133,16 +138,18 @@ equip_by_category = list( MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg, MECHA_R_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack, - MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/thrusters/ion), + MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/radio, /obj/item/mecha_parts/mecha_equipment/air_tank/full, /obj/item/mecha_parts/mecha_equipment/thrusters/ion), MECHA_POWER = list(), MECHA_ARMOR = list(/obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster), ) -/obj/vehicle/sealed/mecha/marauder/add_cell() +/obj/vehicle/sealed/mecha/marauder/mauler/loaded/Initialize(mapload) + . = ..() + max_ammo() + +/obj/vehicle/sealed/mecha/marauder/mauler/loaded/populate_parts() cell = new /obj/item/stock_parts/cell/bluespace(src) - -/obj/vehicle/sealed/mecha/marauder/add_scanmod() scanmod = new /obj/item/stock_parts/scanning_module/triphasic(src) - -/obj/vehicle/sealed/mecha/marauder/add_capacitor() capacitor = new /obj/item/stock_parts/capacitor/quadratic(src) + servo = new /obj/item/stock_parts/servo/femto(src) + update_part_values() diff --git a/code/modules/vehicles/mecha/combat/phazon.dm b/code/modules/vehicles/mecha/combat/phazon.dm index 9303d04c945..9c80339bde4 100644 --- a/code/modules/vehicles/mecha/combat/phazon.dm +++ b/code/modules/vehicles/mecha/combat/phazon.dm @@ -4,18 +4,20 @@ icon_state = "phazon" base_icon_state = "phazon" movedelay = 2 - step_energy_drain = 3 + step_energy_drain = 4 max_integrity = 200 armor_type = /datum/armor/mecha_phazon max_temperature = 25000 - internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY) + accesses = list(ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY) destruction_sleep_duration = 40 exit_delay = 40 wreckage = /obj/structure/mecha_wreckage/phazon mech_type = EXOSUIT_MODULE_PHAZON force = 15 max_equip_by_category = list( - MECHA_UTILITY = 1, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 3, MECHA_POWER = 1, MECHA_ARMOR = 2, ) diff --git a/code/modules/vehicles/mecha/combat/reticence.dm b/code/modules/vehicles/mecha/combat/reticence.dm index 17f933b4504..bff5ecbd97b 100644 --- a/code/modules/vehicles/mecha/combat/reticence.dm +++ b/code/modules/vehicles/mecha/combat/reticence.dm @@ -11,16 +11,17 @@ destruction_sleep_duration = 40 exit_delay = 40 wreckage = /obj/structure/mecha_wreckage/reticence - operation_req_access = list(ACCESS_THEATRE) - internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_THEATRE) + accesses = list(ACCESS_MECH_SCIENCE, ACCESS_THEATRE) mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS | QUIET_STEPS | QUIET_TURNS | MMI_COMPATIBLE mech_type = EXOSUIT_MODULE_RETICENCE max_equip_by_category = list( - MECHA_UTILITY = 1, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 3, MECHA_POWER = 1, MECHA_ARMOR = 1, ) - step_energy_drain = 3 + step_energy_drain = 4 color = "#87878715" /datum/armor/mecha_reticence @@ -40,11 +41,9 @@ MECHA_ARMOR = list(), ) -/obj/vehicle/sealed/mecha/reticence/add_cell() - cell = new /obj/item/stock_parts/cell/bluespace(src) - -/obj/vehicle/sealed/mecha/reticence/add_scanmod() - scanmod = new /obj/item/stock_parts/scanning_module/triphasic(src) - -/obj/vehicle/sealed/mecha/reticence/add_capacitor() - capacitor = new /obj/item/stock_parts/capacitor/quadratic(src) +/obj/vehicle/sealed/mecha/reticence/loaded/populate_parts() + cell = new /obj/item/stock_parts/cell/hyper(src) + scanmod = new /obj/item/stock_parts/scanning_module/phasic(src) + capacitor = new /obj/item/stock_parts/capacitor/super(src) + servo = new /obj/item/stock_parts/servo/pico(src) + update_part_values() diff --git a/code/modules/vehicles/mecha/combat/savannah_ivanov.dm b/code/modules/vehicles/mecha/combat/savannah_ivanov.dm index 798cae231de..dae449d8388 100644 --- a/code/modules/vehicles/mecha/combat/savannah_ivanov.dm +++ b/code/modules/vehicles/mecha/combat/savannah_ivanov.dm @@ -19,7 +19,7 @@ base_icon_state = "savannah_ivanov" icon_state = "savannah_ivanov_0_0" //does not include mmi compatibility - mecha_flags = ADDING_ACCESS_POSSIBLE | CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS + mecha_flags = CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS mech_type = EXOSUIT_MODULE_SAVANNAH movedelay = 3 max_integrity = 450 //really tanky, like damn @@ -31,7 +31,9 @@ wreckage = /obj/structure/mecha_wreckage/savannah_ivanov max_occupants = 2 max_equip_by_category = list( - MECHA_UTILITY = 1, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 3, MECHA_POWER = 1, MECHA_ARMOR = 3, ) diff --git a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm b/code/modules/vehicles/mecha/equipment/mecha_equipment.dm index 4c03034e99b..f9ee84ba4b8 100644 --- a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm +++ b/code/modules/vehicles/mecha/equipment/mecha_equipment.dm @@ -12,8 +12,14 @@ var/equipment_slot = MECHA_WEAPON ///Cooldown in ticks required between activations of the equipment var/equip_cooldown = 0 - ///used for equipment that can be turned on/off, boolean - var/activated = TRUE + ///Whether you can turn this module on/off with a button + var/can_be_toggled = FALSE + ///Whether you can trigger this module with a button (activation only) + var/can_be_triggered = FALSE + ///Whether the module is currently active + var/active = TRUE + ///Label used in the ui next to the Activate/Enable/Disable buttons + var/active_label = "Status" ///Chassis power cell quantity used on activation var/energy_drain = 0 ///Reference to mecha that this equipment is currently attached to @@ -31,11 +37,11 @@ /obj/item/mecha_parts/mecha_equipment/Destroy() if(chassis) - detach(get_turf(src)) - log_message("[src] is destroyed.", LOG_MECHA) if(LAZYLEN(chassis.occupants)) to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_danger("[src] is destroyed!")]") playsound(chassis, destroy_sound, 50) + detach(get_turf(src)) + log_message("[src] is destroyed.", LOG_MECHA) chassis = null return ..() @@ -52,13 +58,16 @@ /obj/item/mecha_parts/mecha_equipment/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() + if(.) + return switch(action) if("detach") + chassis.ui_selected_module_index = null detach(get_turf(src)) - return TRUE + . = TRUE if("toggle") - activated = !activated - return TRUE + set_active(!active) + . = TRUE if("repair") ui.close() // allow watching for baddies and the ingame effects chassis.balloon_alert(usr, "starting repair") @@ -66,10 +75,17 @@ repair_damage(30) if(get_integrity() == max_integrity) balloon_alert(usr, "repair complete") - return FALSE + . = FALSE + var/result = handle_ui_act(action,params,ui,state) + if(result) //if handle_ui_act returned anything at all lets just return that instead + . = result + +/// called after ui_act, for custom ui act handling +/obj/item/mecha_parts/mecha_equipment/proc/handle_ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + SHOULD_CALL_PARENT(FALSE) /** - * Checks whether this mecha equipment can be activated + * Checks whether this mecha equipment can be active * Returns a bool * Arguments: * * target: atom we are activating/clicked on @@ -79,7 +95,7 @@ return FALSE if(!chassis) return FALSE - if(!activated) + if(!active) return FALSE if(energy_drain && !chassis?.has_charge(energy_drain)) return FALSE @@ -97,6 +113,7 @@ /obj/item/mecha_parts/mecha_equipment/proc/action(mob/source, atom/target, list/modifiers) TIMER_COOLDOWN_START(chassis, COOLDOWN_MECHA_EQUIPMENT(type), equip_cooldown)//Cooldown is on the MECH so people dont bypass it by switching equipment + SEND_SIGNAL(source, COMSIG_MOB_USED_MECH_EQUIPMENT, chassis) chassis.use_power(energy_drain) return TRUE @@ -183,6 +200,7 @@ /obj/item/mecha_parts/mecha_equipment/proc/detach(atom/moveto) moveto = moveto || get_turf(chassis) forceMove(moveto) + playsound(chassis, 'sound/weapons/tap.ogg', 50, TRUE) LAZYREMOVE(chassis.flat_equipment, src) var/to_unequip_slot = equipment_slot if(equipment_slot == MECHA_WEAPON) @@ -198,6 +216,9 @@ log_message("[src] removed from equipment.", LOG_MECHA) chassis = null +/obj/item/mecha_parts/mecha_equipment/proc/set_active(active) + src.active = active + /obj/item/mecha_parts/mecha_equipment/log_message(message, message_type=LOG_GAME, color=null, log_globally) if(chassis) return chassis.log_message("ATTACHMENT: [src] [message]", message_type, color) diff --git a/code/modules/vehicles/mecha/equipment/tools/air_tank.dm b/code/modules/vehicles/mecha/equipment/tools/air_tank.dm new file mode 100644 index 00000000000..3062d9923bc --- /dev/null +++ b/code/modules/vehicles/mecha/equipment/tools/air_tank.dm @@ -0,0 +1,158 @@ +///Mech air tank module +/obj/item/mecha_parts/mecha_equipment/air_tank + name = "mounted air tank" + desc = "An internal air tank used to pressurize mech cabin, scrub CO2 and power RCS thrusters. Comes with a pump and a set of sensors." + icon_state = "mecha_air_tank" + equipment_slot = MECHA_UTILITY + can_be_toggled = TRUE + ///Whether the pressurization should start automatically when the cabin is sealed airtight + var/auto_pressurize_on_seal = TRUE + ///The internal air tank obj of the mech + var/obj/machinery/portable_atmospherics/canister/internal_tank + ///Volume of this air tank + var/volume = TANK_STANDARD_VOLUME * 10 + ///Maximum pressure of this air tank + var/maximum_pressure = ONE_ATMOSPHERE * 30 + ///Whether the tank starts pressurized + var/start_full = FALSE + ///Pumping + ///The connected air port, if we have one + var/obj/machinery/atmospherics/components/unary/portables_connector/connected_port + ///Whether the pump is moving the air from/to the connected port + var/tank_pump_active = FALSE + ///Direction of the pump - into the tank from the port or the air (PUMP_IN) or from the tank (PUMP_OUT) + var/tank_pump_direction = PUMP_IN + ///Target pressure of the pump + var/tank_pump_pressure = ONE_ATMOSPHERE + +/obj/item/mecha_parts/mecha_equipment/air_tank/Initialize(mapload) + . = ..() + internal_tank = new(src) + internal_tank.air_contents.volume = volume + internal_tank.maximum_pressure = maximum_pressure + if(start_full) + internal_tank.air_contents.temperature = T20C + internal_tank.air_contents.add_gases(/datum/gas/oxygen) + internal_tank.air_contents.gases[/datum/gas/oxygen][MOLES] = maximum_pressure * volume / (R_IDEAL_GAS_EQUATION * internal_tank.air_contents.temperature) + +/obj/item/mecha_parts/mecha_equipment/air_tank/Destroy() + if(chassis) + UnregisterSignal(chassis, COMSIG_MOVABLE_PRE_MOVE) + STOP_PROCESSING(SSobj, src) + qdel(internal_tank) + return ..() + +/obj/item/mecha_parts/mecha_equipment/air_tank/attach(obj/vehicle/sealed/mecha/new_mecha, attach_right) + . = ..() + START_PROCESSING(SSobj, src) + RegisterSignal(new_mecha, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(disconnect_air)) + +/obj/item/mecha_parts/mecha_equipment/air_tank/detach(atom/moveto) + disconnect_air() + if(tank_pump_active) + tank_pump_active = FALSE + UnregisterSignal(chassis, COMSIG_MOVABLE_PRE_MOVE) + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/mecha_parts/mecha_equipment/air_tank/set_active(active) + . = ..() + if(active) + var/datum/action/action = locate(/datum/action/vehicle/sealed/mecha/mech_toggle_cabin_seal) in usr.actions + action.button_icon_state = "mech_cabin_[chassis.cabin_sealed ? "pressurized" : "open"]" + action.build_all_button_icons() + else + var/datum/action/action = locate(/datum/action/vehicle/sealed/mecha/mech_toggle_cabin_seal) in usr.actions + action.button_icon_state = "mech_cabin_[chassis.cabin_sealed ? "closed" : "open"]" + action.build_all_button_icons() + +/obj/item/mecha_parts/mecha_equipment/air_tank/process(seconds_per_tick) + if(!chassis) + return + process_cabin_pressure() + process_pump() + +/obj/item/mecha_parts/mecha_equipment/air_tank/proc/process_cabin_pressure(seconds_per_tick) + if(!chassis.cabin_sealed || !active) + return + var/datum/gas_mixture/external_air = chassis.loc.return_air() + var/datum/gas_mixture/tank_air = internal_tank.return_air() + var/datum/gas_mixture/cabin_air = chassis.cabin_air + var/release_pressure = internal_tank.release_pressure + var/cabin_pressure = cabin_air.return_pressure() + if(cabin_pressure < release_pressure) + tank_air.release_gas_to(cabin_air, release_pressure) + if(cabin_pressure) + cabin_air.pump_gas_to(external_air, PUMP_MAX_PRESSURE, GAS_CO2) + +/obj/item/mecha_parts/mecha_equipment/air_tank/proc/process_pump(seconds_per_tick) + if(!tank_pump_active) + return + var/turf/local_turf = get_turf(chassis) + var/datum/gas_mixture/sending = (tank_pump_direction == PUMP_IN ? local_turf.return_air() : internal_tank.air_contents) + var/datum/gas_mixture/receiving = (tank_pump_direction == PUMP_IN ? internal_tank.air_contents : local_turf.return_air()) + if(sending.pump_gas_to(receiving, tank_pump_pressure)) + air_update_turf(FALSE, FALSE) + +/obj/item/mecha_parts/mecha_equipment/air_tank/proc/disconnect_air() + SIGNAL_HANDLER + if(connected_port && internal_tank.disconnect()) + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_warning("Air port connection has been severed!")]") + log_message("Lost connection to gas port.", LOG_MECHA) + +/obj/item/mecha_parts/mecha_equipment/air_tank/get_snowflake_data() + var/datum/gas_mixture/tank_air = internal_tank.return_air() + return list( + "snowflake_id" = MECHA_SNOWFLAKE_ID_AIR_TANK, + "auto_pressurize_on_seal" = auto_pressurize_on_seal, + "port_connected" = internal_tank?.connected_port ? TRUE : FALSE, + "tank_release_pressure" = round(internal_tank.release_pressure), + "tank_release_pressure_min" = internal_tank.can_min_release_pressure, + "tank_release_pressure_max" = internal_tank.can_max_release_pressure, + "tank_pump_active" = tank_pump_active, + "tank_pump_direction" = tank_pump_direction, + "tank_pump_pressure" = round(tank_pump_pressure), + "tank_pump_pressure_min" = PUMP_MIN_PRESSURE, + "tank_pump_pressure_max" = min(PUMP_MAX_PRESSURE, internal_tank.maximum_pressure), + "tank_air" = gas_mixture_parser(tank_air, "tank"), + "cabin_air" = gas_mixture_parser(chassis.cabin_air, "cabin"), + ) + +/obj/item/mecha_parts/mecha_equipment/air_tank/handle_ui_act(action, list/params) + switch(action) + if("set_cabin_pressure") + var/new_pressure = text2num(params["new_pressure"]) + internal_tank.release_pressure = clamp(round(new_pressure), internal_tank.can_min_release_pressure, internal_tank.can_max_release_pressure) + return TRUE + if("toggle_port") + if(internal_tank.connected_port) + if(internal_tank.disconnect()) + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_notice("Disconnected from the air system port.")]") + log_message("Disconnected from gas port.", LOG_MECHA) + return TRUE + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_warning("Unable to disconnect from the air system port!")]") + return + var/obj/machinery/atmospherics/components/unary/portables_connector/possible_port = locate() in chassis.loc + if(internal_tank.connect(possible_port)) + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_notice("Connected to the air system port.")]") + log_message("Connected to gas port.", LOG_MECHA) + return TRUE + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_warning("Unable to connect with air system port!")]") + return FALSE + if("toggle_auto_pressurize") + auto_pressurize_on_seal = !auto_pressurize_on_seal + return TRUE + if("toggle_tank_pump") + tank_pump_active = !tank_pump_active + return TRUE + if("toggle_tank_pump_direction") + tank_pump_direction = !tank_pump_direction + return TRUE + if("set_tank_pump_pressure") + var/new_pressure = text2num(params["new_pressure"]) + tank_pump_pressure = clamp(round(new_pressure), PUMP_MIN_PRESSURE, min(PUMP_MAX_PRESSURE, internal_tank.maximum_pressure)) + return TRUE + return FALSE + +/obj/item/mecha_parts/mecha_equipment/air_tank/full + start_full = TRUE diff --git a/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm b/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm index 71e103e3e51..3546d7853b3 100644 --- a/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm @@ -18,8 +18,7 @@ /obj/item/mecha_parts/mecha_equipment/medical/sleeper name = "mounted sleeper" desc = "Equipment for medical exosuits. A mounted sleeper that stabilizes patients and can inject reagents in the exosuit's reserves." - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" + icon_state = "mecha_sleeper" energy_drain = 20 range = MECHA_MELEE equip_cooldown = 20 @@ -44,10 +43,7 @@ ) return data -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/ui_act(action, list/params) - . = ..() - if(.) - return +/obj/item/mecha_parts/mecha_equipment/medical/sleeper/handle_ui_act(action, list/params) switch(action) if("eject") go_out() @@ -244,8 +240,7 @@ /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun name = "exosuit syringe gun" desc = "Equipment for medical exosuits. A chem synthesizer with syringe gun. Reagents inside are held in stasis, so no reactions will occur." - icon = 'icons/obj/weapons/guns/ballistic.dmi' - icon_state = "syringegun" + icon_state = "mecha_syringegun" range = MECHA_MELEE|MECHA_RANGED equip_cooldown = 10 energy_drain = 10 @@ -292,16 +287,14 @@ return list( "snowflake_id" = MECHA_SNOWFLAKE_ID_SYRINGE, "mode" = mode == FIRE_SYRINGE_MODE ? "Launch" : "Analyze", + "mode_label" = "Action", "syringe" = LAZYLEN(syringes), "max_syringe" = max_syringes, "reagents" = reagents.total_volume, "total_reagents" = reagents.maximum_volume, ) -/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/ui_act(action, list/params) - . = ..() - if(.) - return +/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/handle_ui_act(action, list/params) if(action == "change_mode") mode = !mode return TRUE diff --git a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm index f0da97cc85f..4b62478fa02 100644 --- a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm @@ -134,14 +134,11 @@ /obj/item/mecha_parts/mecha_equipment/gravcatapult/get_snowflake_data() return list( "snowflake_id" = MECHA_SNOWFLAKE_ID_MODE, - "name" = "Gravity catapult", "mode" = mode == GRAVPUSH_MODE ? "Push" : "Sling", + "mode_label" = "Gravity Catapult", ) -/obj/item/mecha_parts/mecha_equipment/gravcatapult/ui_act(action, list/params) - . = ..() - if(.) - return +/obj/item/mecha_parts/mecha_equipment/gravcatapult/handle_ui_act(action, list/params) if(action == "change_mode") mode++ if(mode > GRAVPUSH_MODE) @@ -170,7 +167,7 @@ return ..() /obj/item/mecha_parts/mecha_equipment/armor/anticcw_armor_booster - name = "armor booster module (Close Combat Weaponry)" + name = "Impact Cushion Plates" desc = "Boosts exosuit armor against melee attacks" icon_state = "mecha_abooster_ccw" iconstate_name = "melee" @@ -181,8 +178,8 @@ melee = 15 /obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster - name = "armor booster module (Ranged Weaponry)" - desc = "Boosts exosuit armor against ranged attacks. Completely blocks taser shots." + name = "Projectile Shielding" + desc = "Boosts exosuit armor against ranged kinetic and energy projectiles. Completely blocks taser shots." icon_state = "mecha_abooster_proj" iconstate_name = "range" protect_name = "Ranged Armor" @@ -201,12 +198,13 @@ icon_state = "repair_droid" energy_drain = 50 range = 0 - activated = FALSE + can_be_toggled = TRUE + active = FALSE equipment_slot = MECHA_UTILITY /// Repaired health per second var/health_boost = 0.5 var/icon/droid_overlay - var/list/repairable_damage = list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH) + var/list/repairable_damage = list(MECHA_INT_TEMP_CONTROL,MECHA_CABIN_AIR_BREACH) /obj/item/mecha_parts/mecha_equipment/repair_droid/Destroy() STOP_PROCESSING(SSobj, src) @@ -223,12 +221,11 @@ STOP_PROCESSING(SSobj, src) return ..() -/obj/item/mecha_parts/mecha_equipment/repair_droid/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() +/obj/item/mecha_parts/mecha_equipment/repair_droid/handle_ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) if(action != "toggle") return chassis.cut_overlay(droid_overlay) - if(activated) + if(active) START_PROCESSING(SSobj, src) droid_overlay = new(src.icon, icon_state = "repair_droid_a") log_message("Activated.", LOG_MECHA) @@ -258,13 +255,13 @@ repaired = TRUE if(repaired) if(!chassis.use_power(energy_drain)) - activated = FALSE + active = FALSE return PROCESS_KILL else //no repair needed, we turn off chassis.cut_overlay(droid_overlay) droid_overlay = new(src.icon, icon_state = "repair_droid") chassis.add_overlay(droid_overlay) - activated = FALSE + active = FALSE return PROCESS_KILL @@ -277,7 +274,8 @@ icon_state = "tesla" range = MECHA_MELEE equipment_slot = MECHA_POWER - activated = FALSE + can_be_toggled = TRUE + active = FALSE ///Type of fuel the generator is using. Is set in generator_init() to add the starting amount of fuel var/obj/item/stack/sheet/fuel = null ///Fuel used per second while idle, not generating, in units @@ -299,19 +297,18 @@ /obj/item/mecha_parts/mecha_equipment/generator/detach() STOP_PROCESSING(SSobj, src) - activated = FALSE + active = FALSE return ..() /obj/item/mecha_parts/mecha_equipment/generator/get_snowflake_data() return list( - "active" = activated, + "snowflake_id" = MECHA_SNOWFLAKE_ID_GENERATOR, "fuel" = fuel.amount, ) -/obj/item/mecha_parts/mecha_equipment/generator/ui_act(action, list/params) - . = ..() +/obj/item/mecha_parts/mecha_equipment/generator/handle_ui_act(action, list/params) if(action == "toggle") - if(activated) + if(active) to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_warning("Power generation enabled.")]") START_PROCESSING(SSobj, src) log_message("Activated.", LOG_MECHA) @@ -329,16 +326,16 @@ /obj/item/mecha_parts/mecha_equipment/generator/process(seconds_per_tick) if(!chassis) - activated = FALSE + active = FALSE return PROCESS_KILL if(fuel.amount <= 0) - activated = FALSE + active = FALSE log_message("Deactivated - no fuel.", LOG_MECHA) to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_notice("Fuel reserves depleted.")]") return PROCESS_KILL var/current_charge = chassis.get_charge() if(isnull(current_charge)) - activated = FALSE + active = FALSE to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)][span_notice("No power cell detected.")]") log_message("Deactivated.", LOG_MECHA) return PROCESS_KILL @@ -376,6 +373,8 @@ desc = "A generic set of thrusters, from an unknown source. Uses not-understood methods to propel exosuits seemingly for free." icon_state = "thrusters" equipment_slot = MECHA_UTILITY + can_be_toggled = TRUE + active_label = "Thrusters" var/effect_type = /obj/effect/particle_effect/sparks /obj/item/mecha_parts/mecha_equipment/thrusters/try_attach_part(mob/user, obj/vehicle/sealed/mecha/M, attach_right) @@ -394,17 +393,16 @@ chassis.active_thrusters = null return ..() -/obj/item/mecha_parts/mecha_equipment/thrusters/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) +/obj/item/mecha_parts/mecha_equipment/thrusters/set_active(active) . = ..() - if(params["toggle"]) - if(activated) //inactive - START_PROCESSING(SSobj, src) - enable() - log_message("Activated.", LOG_MECHA) - else - STOP_PROCESSING(SSobj, src) - disable() - log_message("Deactivated.", LOG_MECHA) + if(active) + START_PROCESSING(SSobj, src) + enable() + log_message("Activated.", LOG_MECHA) + else + STOP_PROCESSING(SSobj, src) + disable() + log_message("Deactivated.", LOG_MECHA) /obj/item/mecha_parts/mecha_equipment/thrusters/proc/enable() if (chassis.active_thrusters == src) @@ -430,23 +428,19 @@ step(E, REVERSE_DIR(movement_dir)) QDEL_IN(E, 5) - /obj/item/mecha_parts/mecha_equipment/thrusters/gas name = "RCS thruster package" desc = "A set of thrusters that allow for exosuit movement in zero-gravity environments, by expelling gas from the internal life support tank." effect_type = /obj/effect/particle_effect/fluid/smoke - var/move_cost = 20 //moles per step - -/obj/item/mecha_parts/mecha_equipment/thrusters/gas/try_attach_part(mob/user, obj/vehicle/sealed/mecha/M, attach_right = FALSE) - if(!M.internal_tank) - to_chat(user, span_warning("[M] does not have an internal tank and cannot support this upgrade!")) - return FALSE - return ..() + var/move_cost = 0.05 //moles per step (5 times more than human jetpacks) /obj/item/mecha_parts/mecha_equipment/thrusters/gas/thrust(movement_dir) - if(!chassis || !chassis.internal_tank) + if(!chassis) return FALSE - var/datum/gas_mixture/our_mix = chassis.internal_tank.return_air() + var/obj/machinery/portable_atmospherics/canister/internal_tank = chassis.get_internal_tank() + if(!internal_tank) + return FALSE + var/datum/gas_mixture/our_mix = internal_tank.return_air() var/moles = our_mix.total_moles() if(moles < move_cost) our_mix.remove(moles) @@ -528,3 +522,4 @@ mech.chassis_camera = new /obj/machinery/camera/exosuit (mech) mech.chassis_camera.update_c_tag(mech) mech.diag_hud_set_camera() + diff --git a/code/modules/vehicles/mecha/equipment/tools/radio.dm b/code/modules/vehicles/mecha/equipment/tools/radio.dm new file mode 100644 index 00000000000..33a113a8274 --- /dev/null +++ b/code/modules/vehicles/mecha/equipment/tools/radio.dm @@ -0,0 +1,50 @@ +///Mech radio module +/obj/item/mecha_parts/mecha_equipment/radio + name = "mounted radio" + desc = "A basic component of every vehicle." + icon_state = "mecha_radio" + equipment_slot = MECHA_UTILITY + ///Internal radio item + var/obj/item/radio/mech/radio + +/obj/item/mecha_parts/mecha_equipment/radio/Initialize(mapload) + . = ..() + radio = new(src) + RegisterSignal(radio, COMSIG_QDELETING, PROC_REF(radio_deleted)) + +/obj/item/mecha_parts/mecha_equipment/radio/Destroy() + qdel(radio) + return ..() + +/obj/item/mecha_parts/mecha_equipment/radio/get_snowflake_data() + return list( + "snowflake_id" = MECHA_SNOWFLAKE_ID_RADIO, + "microphone" = radio.get_broadcasting(), + "speaker" = radio.get_listening(), + "frequency" = radio.get_frequency(), + "minFrequency" = radio.freerange ? MIN_FREE_FREQ : MIN_FREQ, + "maxFrequency" = radio.freerange ? MAX_FREE_FREQ : MAX_FREQ, + ) + +/obj/item/mecha_parts/mecha_equipment/radio/handle_ui_act(action, list/params) + switch(action) + if("toggle_microphone") + radio.set_broadcasting(!radio.get_broadcasting()) + return TRUE + if("toggle_speaker") + radio.set_listening(!radio.get_listening()) + return TRUE + if("set_frequency") + var/new_frequency = text2num(params["new_frequency"]) + radio.set_frequency(sanitize_frequency(new_frequency, radio.freerange, radio.syndie)) + return TRUE + return FALSE + +///Internal radio got deleted, somehow +/obj/item/mecha_parts/mecha_equipment/radio/proc/radio_deleted() + SIGNAL_HANDLER + if(!QDELETED(src)) + qdel(src) + +/obj/item/radio/mech + subspace_transmission = TRUE diff --git a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm index 7d5126b31d6..0c8fad8a255 100644 --- a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm @@ -63,7 +63,7 @@ if(istype(clamptarget, /obj/machinery/door/airlock/)) var/obj/machinery/door/airlock/targetairlock = clamptarget playsound(chassis, clampsound, 50, FALSE, -6) - targetairlock.try_to_crowbar(src, source) + targetairlock.try_to_crowbar(src, source, TRUE) return if(clamptarget.anchored) to_chat(source, "[icon2html(src, source)][span_warning("[target] is firmly secured!")]") @@ -207,13 +207,10 @@ "snowflake_id" = MECHA_SNOWFLAKE_ID_EXTINGUISHER, "reagents" = reagents.total_volume, "total_reagents" = reagents.maximum_volume, - "minimum_requ" = required_amount, + "reagents_required" = required_amount, ) -/obj/item/mecha_parts/mecha_equipment/extinguisher/ui_act(action, list/params) - . = ..() - if(.) - return TRUE +/obj/item/mecha_parts/mecha_equipment/extinguisher/handle_ui_act(action, list/params) switch(action) if("activate") spray_extinguisher(usr) @@ -248,8 +245,8 @@ /obj/item/mecha_parts/mecha_equipment/rcd/get_snowflake_data() return list( "snowflake_id" = MECHA_SNOWFLAKE_ID_MODE, - "name" = "RCD control", "mode" = get_mode_name(), + "mode_label" = "RCD control", ) /// fetches the mode name to display in the UI @@ -264,10 +261,7 @@ else return "Someone didnt set this" -/obj/item/mecha_parts/mecha_equipment/rcd/ui_act(action, list/params) - . = ..() - if(.) - return +/obj/item/mecha_parts/mecha_equipment/rcd/handle_ui_act(action, list/params) if(action == "change_mode") mode++ if(mode > MODE_AIRLOCK) @@ -351,8 +345,8 @@ if(LAZYLEN(mecha.cargo)) to_chat(user, span_warning("[mecha]'s cargo hold must be empty before this conversion kit can be applied.")) return FALSE - if(!(mecha.mecha_flags & ADDING_MAINT_ACCESS_POSSIBLE)) //non-removable upgrade, so lets make sure the pilot or owner has their say. - to_chat(user, span_warning("[mecha] must have maintenance protocols active in order to allow this conversion kit.")) + if(!(mecha.mecha_flags & PANEL_OPEN)) //non-removable upgrade, so lets make sure the pilot or owner has their say. + to_chat(user, span_warning("[mecha] panel must be open in order to allow this conversion kit.")) return FALSE if(LAZYLEN(mecha.occupants)) //We're actualy making a new mech and swapping things over, it might get weird if players are involved to_chat(user, span_warning("[mecha] must be unoccupied before this conversion kit can be applied.")) @@ -381,6 +375,11 @@ marktwo.capacitor = markone.capacitor markone.capacitor.forceMove(marktwo) markone.capacitor = null + QDEL_NULL(marktwo.servo) + if (markone.servo) + marktwo.servo = markone.servo + markone.servo.forceMove(marktwo) + markone.servo = null marktwo.update_part_values() for(var/obj/item/mecha_parts/mecha_equipment/equipment in markone.flat_equipment) //Move the equipment over... if(istype(equipment, /obj/item/mecha_parts/mecha_equipment/ejector)) diff --git a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm index 2fbe84101de..fe97c5f2b89 100644 --- a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm +++ b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm @@ -227,6 +227,17 @@ var/disabledreload //For weapons with no cache (like the rockets) which are reloaded by hand var/ammo_type +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/get_snowflake_data() + return list( + "snowflake_id" = MECHA_SNOWFLAKE_ID_WEAPON_BALLISTIC, + "projectiles" = projectiles, + "max_magazine" = initial(projectiles), + "projectiles_cache" = projectiles_cache, + "projectiles_cache_max" = projectiles_cache_max, + "disabledreload" = disabledreload, + "ammo_type" = ammo_type, + ) + /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/action_checks(target) if(!..()) return FALSE @@ -234,8 +245,7 @@ return FALSE return TRUE -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/handle_ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) if(action == "reload") rearm() return TRUE @@ -357,12 +367,18 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/action(mob/source, atom/target, list/modifiers) if(!action_checks(target)) return + TIMER_COOLDOWN_START(chassis, COOLDOWN_MECHA_EQUIPMENT(type), equip_cooldown) + chassis.use_power(energy_drain) + var/newtonian_target = turn(chassis.dir,180) var/obj/O = new projectile(chassis.loc) playsound(chassis, fire_sound, 50, TRUE) log_message("Launched a [O.name] from [name], targeting [target].", LOG_MECHA) projectiles-- proj_init(O, source) O.throw_at(target, missile_range, missile_speed, source, FALSE, diagonals_first = diags_first) + sleep(max(0, projectile_delay)) + if(kickback) + chassis.newtonian_move(newtonian_target) return TRUE //used for projectile initilisation (priming flashbang) and additional logging @@ -411,8 +427,10 @@ projectiles = 15 missile_speed = 1.5 projectiles_cache = 999 + projectiles_cache_max = 999 equip_cooldown = 20 mech_flags = EXOSUIT_MODULE_HONK + ammo_type = MECHA_AMMO_BANANA_PEEL /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/mousetrap_mortar name = "mousetrap mortar" @@ -423,13 +441,14 @@ projectiles = 15 missile_speed = 1.5 projectiles_cache = 999 + projectiles_cache_max = 999 equip_cooldown = 10 mech_flags = EXOSUIT_MODULE_HONK + ammo_type = MECHA_AMMO_MOUSETRAP /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/mousetrap_mortar/proj_init(obj/item/assembly/mousetrap/armed/M) M.secured = TRUE - //Classic extending punching glove, but weaponised! /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove name = "\improper Oingo Boingo Punch-face" @@ -443,19 +462,20 @@ fire_sound = 'sound/items/bikehorn.ogg' projectiles = 10 projectiles_cache = 999 + projectiles_cache_max = 999 harmful = TRUE diags_first = TRUE /// Damage done by the glove on contact. Also used to determine throw distance (damage / 5) var/punch_damage = 35 mech_flags = EXOSUIT_MODULE_HONK + ammo_type = MECHA_AMMO_PUNCHING_GLOVE /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove/get_snowflake_data() - return list( - "snowflake_id" = MECHA_SNOWFLAKE_ID_MODE, - "mode" = harmful ? "LETHAL FISTING" : "Cuddles", - ) + . = ..() + .["mode"] = harmful ? "LETHAL FISTING" : "Cuddles" + .["mode_label"] = "Honk Severity" -/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove/ui_act(action, list/params) +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove/handle_ui_act(action, list/params) . = ..() if(action == "change_mode") harmful = !harmful diff --git a/code/modules/vehicles/mecha/mech_fabricator.dm b/code/modules/vehicles/mecha/mech_fabricator.dm index 033378d496b..618ad33d1db 100644 --- a/code/modules/vehicles/mecha/mech_fabricator.dm +++ b/code/modules/vehicles/mecha/mech_fabricator.dm @@ -28,9 +28,6 @@ /// The job ID of the part currently being processed. This is used for ordering list items for the client UI. var/top_job_id = 0 - /// Reference to all materials used in the creation of the item being_built. - var/list/build_materials - /// Part currently stored in the Exofab. var/obj/item/stored_part @@ -221,12 +218,11 @@ say("Not enough resources. Processing stopped.") return FALSE - materials.use_materials(D.materials, component_coeff) + rmat.use_materials(D.materials, component_coeff, 1, "built", "[D.name]") being_built = D build_finish = world.time + get_construction_time_w_coeff(initial(D.construction_time)) build_start = world.time desc = "It's building \a [D.name]." - rmat.silo_log(src, "built", -1, "[D.name]", build_materials) return TRUE diff --git a/code/modules/vehicles/mecha/mecha_actions.dm b/code/modules/vehicles/mecha/mecha_actions.dm index 75b38a7082b..f42e89aa1d5 100644 --- a/code/modules/vehicles/mecha/mecha_actions.dm +++ b/code/modules/vehicles/mecha/mecha_actions.dm @@ -30,25 +30,15 @@ return chassis.container_resist_act(owner) -/datum/action/vehicle/sealed/mecha/mech_toggle_internals - name = "Toggle Internal Airtank Usage" - button_icon_state = "mech_internals_off" +/datum/action/vehicle/sealed/mecha/mech_toggle_cabin_seal + name = "Toggle Cabin Airtight" + button_icon_state = "mech_cabin_open" + desc = "Airtight cabin preserves internal air and can be pressurized with a mounted air tank." -/datum/action/vehicle/sealed/mecha/mech_toggle_internals/Trigger(trigger_flags) +/datum/action/vehicle/sealed/mecha/mech_toggle_cabin_seal/Trigger(trigger_flags) if(!owner || !chassis || !(owner in chassis.occupants)) return - - if(!chassis.internal_tank) //Just in case. - chassis.use_internal_tank = FALSE - chassis.balloon_alert(owner, "no tank available!") - chassis.log_message("Switch to internal tank failed. No tank available.", LOG_MECHA) - return - - chassis.use_internal_tank = !chassis.use_internal_tank - button_icon_state = "mech_internals_[chassis.use_internal_tank ? "on" : "off"]" - chassis.balloon_alert(owner, "taking air from [chassis.use_internal_tank ? "internal airtank" : "environment"]") - chassis.log_message("Now taking air from [chassis.use_internal_tank?"internal airtank":"environment"].", LOG_MECHA) - build_all_button_icons() + chassis.set_cabin_seal(owner, !chassis.cabin_sealed) /datum/action/vehicle/sealed/mecha/mech_toggle_lights name = "Toggle Lights" @@ -57,20 +47,7 @@ /datum/action/vehicle/sealed/mecha/mech_toggle_lights/Trigger(trigger_flags) if(!owner || !chassis || !(owner in chassis.occupants)) return - - if(!(chassis.mecha_flags & HAS_LIGHTS)) - chassis.balloon_alert(owner, "the mech lights are broken!") - return - chassis.mecha_flags ^= LIGHTS_ON - if(chassis.mecha_flags & LIGHTS_ON) - button_icon_state = "mech_lights_on" - else - button_icon_state = "mech_lights_off" - chassis.set_light_on(chassis.mecha_flags & LIGHTS_ON) - chassis.balloon_alert(owner, "toggled lights [chassis.mecha_flags & LIGHTS_ON ? "on":"off"]") - playsound(chassis,'sound/machines/clockcult/brass_skewer.ogg', 40, TRUE) - chassis.log_message("Toggled lights [(chassis.mecha_flags & LIGHTS_ON)?"on":"off"].", LOG_MECHA) - build_all_button_icons() + chassis.toggle_lights(user = owner) /datum/action/vehicle/sealed/mecha/mech_view_stats name = "View Stats" @@ -166,3 +143,15 @@ chassis.remove_control_flags(owner, VEHICLE_CONTROL_MELEE|VEHICLE_CONTROL_EQUIPMENT) chassis.add_control_flags(owner, VEHICLE_CONTROL_DRIVE|VEHICLE_CONTROL_SETTINGS) chassis.update_icon_state() + +/datum/action/vehicle/sealed/mecha/mech_overclock + name = "Toggle overclocking" + button_icon_state = "mech_overload_off" + +/datum/action/vehicle/sealed/mecha/mech_overclock/Trigger(trigger_flags, forced_state = null) + if(!owner || !chassis || !(owner in chassis.occupants)) + return + chassis.toggle_overclock(forced_state) + chassis.balloon_alert(owner, chassis.overclock_mode ? "started overclocking" : "stopped overclocking") + button_icon_state = "mech_overload_[chassis.overclock_mode ? "on" : "off"]" + build_all_button_icons() diff --git a/code/modules/vehicles/mecha/mecha_ai_interaction.dm b/code/modules/vehicles/mecha/mecha_ai_interaction.dm index 9c0570004fe..22db0771809 100644 --- a/code/modules/vehicles/mecha/mecha_ai_interaction.dm +++ b/code/modules/vehicles/mecha/mecha_ai_interaction.dm @@ -33,7 +33,7 @@ //Transfer from core or card to mech. Proc is called by mech. switch(interaction) if(AI_TRANS_TO_CARD) //Upload AI from mech to AI card. - if(!construction_state) //Mech must be in maint mode to allow carding. + if(!(mecha_flags & PANEL_OPEN)) //Mech must be in maint mode to allow carding. to_chat(user, span_warning("[name] must have maintenance protocols active in order to allow a transfer.")) return var/list/ai_pilots = list() diff --git a/code/modules/vehicles/mecha/mecha_construction_paths.dm b/code/modules/vehicles/mecha/mecha_construction_paths.dm index 8938ee8f0de..fb572f7d128 100644 --- a/code/modules/vehicles/mecha/mecha_construction_paths.dm +++ b/code/modules/vehicles/mecha/mecha_construction_paths.dm @@ -29,15 +29,10 @@ if(!result) return // Remove default mech power cell, as we replace it with a new one. - var/obj/vehicle/sealed/mecha/M = new result(drop_location()) - QDEL_NULL(M.cell) - QDEL_NULL(M.scanmod) - QDEL_NULL(M.capacitor) - + var/obj/vehicle/sealed/mecha/mech = new result(drop_location(), /* built_manually = */ TRUE) var/obj/item/mecha_parts/chassis/parent_chassis = parent - M.CheckParts(parent_chassis.contents) - - SSblackbox.record_feedback("tally", "mechas_created", 1, M.name) + mech.CheckParts(parent_chassis.contents) + SSblackbox.record_feedback("tally", "mechas_created", 1, mech.name) QDEL_NULL(parent) // Default proc to generate mech steps. @@ -197,13 +192,28 @@ "forward_message" = "secured capacitor", "backward_message" = "removed capacitor" ), + list( + "key" = /obj/item/stock_parts/servo, + "action" = ITEM_MOVE_INSIDE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "Scanning module is secured, the micro-servo can be added.", + "forward_message" = "added micro-servo", + "backward_message" = "unsecured capacitor" + ), + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "Micro-servo is installed, and can be screwed into place.", + "forward_message" = "secured micro-servo", + "backward_message" = "removed micro-servo" + ), list( "key" = /obj/item/stock_parts/cell, "action" = ITEM_MOVE_INSIDE, "back_key" = TOOL_SCREWDRIVER, - "desc" = "Capacitor is secured, and the power cell can be added.", + "desc" = "Micro-servo is secured, and the power cell can be added.", "forward_message" = "added power cell", - "backward_message" = "unsecured capacitor" + "backward_message" = "unsecured micro-servo" ), list( "key" = TOOL_SCREWDRIVER, @@ -520,6 +530,16 @@ "key" = /obj/item/bikehorn, "desc" = "HONK!!!!!!" ), + list( + "key" = /obj/item/stock_parts/servo, + "action" = ITEM_MOVE_INSIDE, + "desc" = "Humor micro-servo can be added!", + "forward_message" = "added smile" + ), + list( + "key" = /obj/item/bikehorn, + "desc" = "HONK!!!!!!" + ), list( "key" = /obj/item/stock_parts/cell, "action" = ITEM_MOVE_INSIDE, @@ -655,13 +675,28 @@ "forward_message" = "secured capacitor", "backward_message" = "removed capacitor" ), + list( + "key" = /obj/item/stock_parts/servo, + "action" = ITEM_MOVE_INSIDE, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "Capacitor is secured, the micro-servo can be added.", + "forward_message" = "added micro-servo", + "backward_message" = "unsecured capacitor" + ), + list( + "key" = TOOL_SCREWDRIVER, + "back_key" = TOOL_CROWBAR, + "desc" = "Micro-servo is installed, and can be screwed into place.", + "forward_message" = "secured micro-servo", + "backward_message" = "removed micro-servo" + ), list( "key" = /obj/item/stack/ore/bluespace_crystal, "amount" = 1, "back_key" = TOOL_SCREWDRIVER, - "desc" = "Capacitor is secured, and the bluespace crystal can be added.", + "desc" = "Micro-servo is secured, and the bluespace crystal can be added.", "forward_message" = "added bluespace crystal", - "backward_message" = "unsecured capacitor" + "backward_message" = "unsecured micro-servo" ), list( "key" = /obj/item/stack/cable_coil, @@ -692,7 +727,7 @@ "desc" = "The power cell is installed, and can be screwed into place.",, "forward_message" = "secured power cell", "backward_message" = "removed power cell", - "icon_state" = "phazon17" + "icon_state" = "phazon19" // This is the point where a step icon is skipped, so "icon_state" had to be set manually starting from here. ) ) @@ -727,7 +762,7 @@ "action" = ITEM_DELETE, "back_key" = TOOL_WELDER, "desc" = "The external armor is welded, and the bluespace anomaly core socket is open.", - "icon_state" = "phazon24", + "icon_state" = "phazon26", "forward_message" = "inserted bluespace anomaly core", "backward_message" = "cut off external armor" ) diff --git a/code/modules/vehicles/mecha/mecha_control_console.dm b/code/modules/vehicles/mecha/mecha_control_console.dm index 2d6d777a835..771ed97268b 100644 --- a/code/modules/vehicles/mecha/mecha_control_console.dm +++ b/code/modules/vehicles/mecha/mecha_control_console.dm @@ -29,7 +29,7 @@ name = M.name, integrity = round((M.get_integrity() / M.max_integrity) * 100), charge = M.cell ? round(M.cell.percent()) : null, - airtank = M.internal_tank ? M.return_pressure() : null, + airtank = M.enclosed ? M.return_pressure() : null, pilot = M.return_drivers(), location = get_area_name(M, TRUE), emp_recharging = MT.recharging, @@ -97,7 +97,7 @@ var/answer = {"Name: [chassis.name]
Integrity: [round((chassis.get_integrity()/chassis.max_integrity * 100), 0.01)]%
Cell Charge: [isnull(cell_charge) ? "Not Found":"[chassis.cell.percent()]%"]
- Airtank: [chassis.internal_tank ? "[round(chassis.return_pressure(), 0.01)]" : "Not Equipped"] kPa
+ Cabin Pressure: [chassis.enclosed ? "[round(chassis.return_pressure(), 0.01)] kPa" : "Not Sealed"]
Pilot: [english_list(chassis.return_drivers(), nothing_text = "None")]
Location: [get_area_name(chassis, TRUE) || "Unknown"]"} if(istype(chassis, /obj/vehicle/sealed/mecha/ripley)) diff --git a/code/modules/vehicles/mecha/mecha_damage.dm b/code/modules/vehicles/mecha/mecha_damage.dm index 9f9f194060b..08f294f202f 100644 --- a/code/modules/vehicles/mecha/mecha_damage.dm +++ b/code/modules/vehicles/mecha/mecha_damage.dm @@ -29,7 +29,7 @@ if(!prob(internal_damage_probability)) return var/internal_damage_to_deal = possible_int_damage - internal_damage_to_deal &= ~mecha_flags + internal_damage_to_deal &= ~internal_damage if(internal_damage_to_deal) set_internal_damage(pick(bitfield_to_list(internal_damage_to_deal))) @@ -52,8 +52,8 @@ return "activating internal fire supression..." if(MECHA_INT_TEMP_CONTROL) return "resetting temperature module..." - if(MECHA_INT_TANK_BREACH) - return "activating tank sealant..." + if(MECHA_CABIN_AIR_BREACH) + return "activating cabin breach sealant..." if(MECHA_INT_CONTROL_LOST) return "recalibrating coordination system..." if(MECHA_INT_SHORT_CIRCUIT) @@ -66,8 +66,8 @@ return "internal fire supressed" if(MECHA_INT_TEMP_CONTROL) return "temperature chip reactivated" - if(MECHA_INT_TANK_BREACH) - return "air tank sealed" + if(MECHA_CABIN_AIR_BREACH) + return "cabin breach sealed" if(MECHA_INT_CONTROL_LOST) return "coordination re-established" if(MECHA_INT_SHORT_CIRCUIT) @@ -80,7 +80,7 @@ return "fire supression canceled" if(MECHA_INT_TEMP_CONTROL) return "reset aborted" - if(MECHA_INT_TANK_BREACH) + if(MECHA_CABIN_AIR_BREACH) return "sealant deactivated" if(MECHA_INT_CONTROL_LOST) return "recalibration failed" @@ -100,8 +100,8 @@ to_chat(occupants, "[icon2html(src, occupants)][span_boldnotice("Life support system reactivated.")]") if(MECHA_INT_FIRE) to_chat(occupants, "[icon2html(src, occupants)][span_boldnotice("Internal fire extinguished.")]") - if(MECHA_INT_TANK_BREACH) - to_chat(occupants, "[icon2html(src, occupants)][span_boldnotice("Damaged internal tank has been sealed.")]") + if(MECHA_CABIN_AIR_BREACH) + to_chat(occupants, "[icon2html(src, occupants)][span_boldnotice("Cabin breach has been sealed.")]") if(MECHA_INT_CONTROL_LOST) to_chat(occupants, "[icon2html(src, occupants)][span_boldnotice("Control module reactivated.")]") if(MECHA_INT_SHORT_CIRCUIT) diff --git a/code/modules/vehicles/mecha/mecha_defense.dm b/code/modules/vehicles/mecha/mecha_defense.dm index d858e195cd0..37fe73f4a2d 100644 --- a/code/modules/vehicles/mecha/mecha_defense.dm +++ b/code/modules/vehicles/mecha/mecha_defense.dm @@ -204,77 +204,104 @@ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN return ..() -/obj/vehicle/sealed/mecha/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/mmi)) - if(mmi_move_inside(W,user)) - to_chat(user, span_notice("[src]-[W] interface initialized successfully.")) +/obj/vehicle/sealed/mecha/attackby(obj/item/weapon, mob/living/user, params) + if(user.combat_mode) + return ..() + if(istype(weapon, /obj/item/mmi)) + if(mmi_move_inside(weapon,user)) + balloon_alert(user, "weapon initialized.") else - to_chat(user, span_warning("[src]-[W] interface initialization failed.")) + balloon_alert(user, "weapon initialization failed!") return - if(istype(W, /obj/item/mecha_ammo)) - ammo_resupply(W, user) + if(istype(weapon, /obj/item/mecha_ammo)) + ammo_resupply(weapon, user) return - if(W.GetID()) - if((mecha_flags & ADDING_ACCESS_POSSIBLE) || (mecha_flags & ADDING_MAINT_ACCESS_POSSIBLE)) - if(internals_access_allowed(user)) - ui_interact(user) - return - to_chat(user, span_warning("Invalid ID: Access denied.")) + if(weapon.GetID()) + if(!allowed(user)) + if(mecha_flags & ID_LOCK_ON) + balloon_alert(user, "access denied!") + else + balloon_alert(user, "unable to set id lock!") return - to_chat(user, span_warning("Maintenance protocols disabled by operator.")) + mecha_flags ^= ID_LOCK_ON + balloon_alert(user, "[mecha_flags & ID_LOCK_ON ? "enabled" : "disabled"] id lock !") return - if(istype(W, /obj/item/stock_parts/cell)) - if(construction_state == MECHA_OPEN_HATCH) - if(!cell) - if(!user.transferItemToLoc(W, src, silent = FALSE)) - return - var/obj/item/stock_parts/cell/C = W - to_chat(user, span_notice("You install the power cell.")) - playsound(src, 'sound/items/screwdriver2.ogg', 50, FALSE) - cell = C - log_message("Power cell installed", LOG_MECHA) - else - to_chat(user, span_warning("There's already a power cell installed!")) + if(istype(weapon, /obj/item/mecha_parts)) + var/obj/item/mecha_parts/part = weapon + part.try_attach_part(user, src, FALSE) return - if(istype(W, /obj/item/stock_parts/scanning_module)) - if(construction_state == MECHA_OPEN_HATCH) - if(!scanmod) - if(!user.transferItemToLoc(W, src, silent = FALSE)) - return - to_chat(user, span_notice("You install the scanning module.")) - playsound(src, 'sound/items/screwdriver2.ogg', 50, FALSE) - scanmod = W - log_message("[W] installed", LOG_MECHA) - update_part_values() - else - to_chat(user, span_warning("There's already a scanning module installed!")) + if(is_wire_tool(weapon) && (mecha_flags & PANEL_OPEN)) + wires.interact(user) return - if(istype(W, /obj/item/stock_parts/capacitor)) - if(construction_state == MECHA_OPEN_HATCH) - if(!capacitor) - if(!user.transferItemToLoc(W, src, silent = FALSE)) - return - to_chat(user, span_notice("You install the capacitor.")) - playsound(src, 'sound/items/screwdriver2.ogg', 50, FALSE) - capacitor = W - log_message("[W] installed", LOG_MECHA) - update_part_values() - else - to_chat(user, span_warning("There's already a capacitor installed!")) - return - - if(istype(W, /obj/item/mecha_parts)) - var/obj/item/mecha_parts/P = W - P.try_attach_part(user, src, FALSE) + if(istype(weapon, /obj/item/stock_parts)) + try_insert_part(weapon, user) return return ..() +/// Try to insert a stock part into the mech +/obj/vehicle/sealed/mecha/proc/try_insert_part(obj/item/stock_parts/weapon, mob/living/user) + if(!(mecha_flags & PANEL_OPEN)) + balloon_alert(user, "open the panel first!") + return + + if(istype(weapon, /obj/item/stock_parts/cell)) + if(!cell) + if(!user.transferItemToLoc(weapon, src, silent = FALSE)) + return + cell = weapon + balloon_alert(user, "installed power cell") + diag_hud_set_mechcell() + playsound(src, 'sound/items/screwdriver2.ogg', 50, FALSE) + log_message("Power cell installed", LOG_MECHA) + else + balloon_alert(user, "already installed!") + return + + if(istype(weapon, /obj/item/stock_parts/scanning_module)) + if(!scanmod) + if(!user.transferItemToLoc(weapon, src, silent = FALSE)) + return + scanmod = weapon + balloon_alert(user, "installed scanning module") + playsound(src, 'sound/items/screwdriver2.ogg', 50, FALSE) + log_message("[weapon] installed", LOG_MECHA) + update_part_values() + else + balloon_alert(user, "already installed!") + return + + if(istype(weapon, /obj/item/stock_parts/capacitor)) + if(!capacitor) + if(!user.transferItemToLoc(weapon, src, silent = FALSE)) + return + capacitor = weapon + balloon_alert(user, "installed capacitor") + playsound(src, 'sound/items/screwdriver2.ogg', 50, FALSE) + log_message("[weapon] installed", LOG_MECHA) + update_part_values() + else + balloon_alert(user, "already installed!") + return + + if(istype(weapon, /obj/item/stock_parts/servo)) + if(!servo) + if(!user.transferItemToLoc(weapon, src, silent = FALSE)) + return + servo = weapon + balloon_alert(user, "installed servo") + playsound(src, 'sound/items/screwdriver2.ogg', 50, FALSE) + log_message("[weapon] installed", LOG_MECHA) + update_part_values() + else + balloon_alert(user, "already installed!") + return + /obj/vehicle/sealed/mecha/attacked_by(obj/item/attacking_item, mob/living/user) if(!attacking_item.force) return @@ -299,28 +326,35 @@ try_damage_component(., user.zone_selected) /obj/vehicle/sealed/mecha/examine(mob/user) - .=..() - if(construction_state > MECHA_LOCKED) - switch(construction_state) - if(MECHA_SECURE_BOLTS) - . += span_notice("Use a wrench to adjust bolts securing the cover.") - if(MECHA_LOOSE_BOLTS) - . += span_notice("Use a crowbar to unlock the hatch to the power unit.") - if(MECHA_OPEN_HATCH) - . += span_notice("Use interface to eject stock parts from the mech.") + . = ..() + if(mecha_flags & PANEL_OPEN) + . += span_notice("The panel is open. You could use a crowbar to eject parts or lock the panel back with a screwdriver.") + else + . += span_notice("You could unlock the maintenance cover with a screwdriver.") -/obj/vehicle/sealed/mecha/wrench_act(mob/living/user, obj/item/tool) +/obj/vehicle/sealed/mecha/screwdriver_act(mob/living/user, obj/item/tool) ..() . = TRUE - if(construction_state == MECHA_SECURE_BOLTS) - construction_state = MECHA_LOOSE_BOLTS - to_chat(user, span_notice("You undo the securing bolts.")) - tool.play_tool_sound(src) - return - if(construction_state == MECHA_LOOSE_BOLTS) - construction_state = MECHA_SECURE_BOLTS - to_chat(user, span_notice("You tighten the securing bolts.")) - tool.play_tool_sound(src) + + if(!(mecha_flags & PANEL_OPEN) && LAZYLEN(occupants)) + for(var/mob/occupant as anything in occupants) + occupant.show_message( + span_userdanger("[user] is trying to open the maintenance panel of [src]!"), MSG_VISUAL, + span_userdanger("You hear someone trying to open the maintenance panel of [src]!"), MSG_AUDIBLE, + ) + visible_message(span_danger("[user] is trying to open the maintenance panel of [src]!")) + if(!do_after(user, 5 SECONDS, src)) + return + for(var/mob/occupant as anything in occupants) + occupant.show_message( + span_userdanger("[user] has opened the maintenance panel of [src]!"), MSG_VISUAL, + span_userdanger("You hear someone opening the maintenance panel of [src]!"), MSG_AUDIBLE, + ) + visible_message(span_danger("[user] has opened the maintenance panel of [src]!")) + + mecha_flags ^= PANEL_OPEN + balloon_alert(user, (mecha_flags & PANEL_OPEN) ? "panel open" : "panel closed") + tool.play_tool_sound(src) /obj/vehicle/sealed/mecha/crowbar_act(mob/living/user, obj/item/tool) ..() @@ -329,15 +363,38 @@ var/obj/item/crowbar/mechremoval/remover = tool remover.empty_mech(src, user) return - if(construction_state == MECHA_LOOSE_BOLTS) - construction_state = MECHA_OPEN_HATCH - to_chat(user, span_notice("You open the hatch to the power unit.")) + if(!(mecha_flags & PANEL_OPEN)) + balloon_alert(user, "open the panel first!") + return + if(dna_lock && user.has_dna()) + var/mob/living/carbon/user_carbon = user + if(user_carbon.dna.unique_enzymes != dna_lock) + balloon_alert(user, "access with this DNA denied!") + return + if((mecha_flags & ID_LOCK_ON) && !allowed(user)) + balloon_alert(user, "access denied!") + return + + var/list/stock_parts = list() + if(cell) + stock_parts += cell + if(scanmod) + stock_parts += scanmod + if(capacitor) + stock_parts += capacitor + if(servo) + stock_parts += servo + + if(length(stock_parts)) + var/obj/item/stock_parts/part_to_remove = tgui_input_list(user, "Which part to remove?", "Part Removal", stock_parts) + if(!(locate(part_to_remove) in contents)) + return + user.put_in_hands(part_to_remove) + CheckParts() + diag_hud_set_mechcell() tool.play_tool_sound(src) return - if(construction_state == MECHA_OPEN_HATCH) - construction_state = MECHA_LOOSE_BOLTS - to_chat(user, span_notice("You close the hatch to the power unit.")) - tool.play_tool_sound(src) + balloon_alert(user, "no parts!") /obj/vehicle/sealed/mecha/welder_act(mob/living/user, obj/item/W) if(user.combat_mode) @@ -377,8 +434,8 @@ clear_internal_damage(MECHA_INT_TEMP_CONTROL) if(internal_damage & MECHA_INT_SHORT_CIRCUIT) clear_internal_damage(MECHA_INT_SHORT_CIRCUIT) - if(internal_damage & MECHA_INT_TANK_BREACH) - clear_internal_damage(MECHA_INT_TANK_BREACH) + if(internal_damage & MECHA_CABIN_AIR_BREACH) + clear_internal_damage(MECHA_CABIN_AIR_BREACH) if(internal_damage & MECHA_INT_CONTROL_LOST) clear_internal_damage(MECHA_INT_CONTROL_LOST) @@ -398,7 +455,7 @@ /obj/vehicle/sealed/mecha/proc/ammo_resupply(obj/item/mecha_ammo/A, mob/user,fail_chat_override = FALSE) if(!A.rounds) if(!fail_chat_override) - to_chat(user, span_warning("This box of ammo is empty!")) + balloon_alert(user, "the box is empty!") return FALSE var/ammo_needed var/found_gun @@ -450,7 +507,7 @@ return TRUE if(!fail_chat_override) if(found_gun) - to_chat(user, span_notice("You can't fit any more ammo of this type!")) + balloon_alert(user, "ammo storage is full!") else - to_chat(user, span_notice("None of the equipment on this exosuit can use this ammo!")) + balloon_alert(user, "can't use this ammo!") return FALSE diff --git a/code/modules/vehicles/mecha/mecha_helpers.dm b/code/modules/vehicles/mecha/mecha_helpers.dm index f949860dc0b..ad012386df3 100644 --- a/code/modules/vehicles/mecha/mecha_helpers.dm +++ b/code/modules/vehicles/mecha/mecha_helpers.dm @@ -1,30 +1,3 @@ -///Adds a cell, for use in Map-spawned mechs, Nuke Ops mechs, and admin-spawned mechs. Mechs built by hand will replace this. -/obj/vehicle/sealed/mecha/proc/add_cell(obj/item/stock_parts/cell/new_cell) - QDEL_NULL(cell) - if(new_cell) - new_cell.forceMove(src) - cell = new_cell - return - cell = new /obj/item/stock_parts/cell/high(src) - -///Adds a scanning module, for use in Map-spawned mechs, Nuke Ops mechs, and admin-spawned mechs. Mechs built by hand will replace this. -/obj/vehicle/sealed/mecha/proc/add_scanmod(obj/item/stock_parts/scanning_module/new_scanmod) - QDEL_NULL(scanmod) - if(new_scanmod) - new_scanmod.forceMove(src) - scanmod = new_scanmod - return - scanmod = new /obj/item/stock_parts/scanning_module(src) - -///Adds a capacitor, for use in Map-spawned mechs, Nuke Ops mechs, and admin-spawned mechs. Mechs built by hand will replace this. -/obj/vehicle/sealed/mecha/proc/add_capacitor(obj/item/stock_parts/capacitor/new_capacitor) - QDEL_NULL(capacitor) - if(new_capacitor) - new_capacitor.forceMove(src) - capacitor = new_capacitor - else - capacitor = new /obj/item/stock_parts/capacitor(src) - /////////////////////// ///// Power stuff ///// /////////////////////// diff --git a/code/modules/vehicles/mecha/mecha_mob_interaction.dm b/code/modules/vehicles/mecha/mecha_mob_interaction.dm index c3571d62c6a..c5f440ac97e 100644 --- a/code/modules/vehicles/mecha/mecha_mob_interaction.dm +++ b/code/modules/vehicles/mecha/mecha_mob_interaction.dm @@ -11,7 +11,7 @@ to_chat(M, span_warning("Access denied. [name] is secured with a DNA lock.")) log_message("Permission denied (DNA LOCK).", LOG_MECHA) return - if(!operation_allowed(M)) + if((mecha_flags & ID_LOCK_ON) && !allowed(M)) to_chat(M, span_warning("Access denied. Insufficient operation keycodes.")) log_message("Permission denied (No keycode).", LOG_MECHA) return @@ -183,6 +183,8 @@ is_currently_ejecting = TRUE if(do_after(user, has_gravity() ? exit_delay : 0 , target = src)) to_chat(user, span_notice("You exit the mech.")) + if(cabin_sealed) + set_cabin_seal(user, FALSE) mob_exit(user, silent = TRUE) else to_chat(user, span_notice("You stop exiting the mech. Weapons are enabled again.")) diff --git a/code/modules/vehicles/mecha/mecha_movement.dm b/code/modules/vehicles/mecha/mecha_movement.dm index 82e11fcac8b..d6c8feed4b3 100644 --- a/code/modules/vehicles/mecha/mecha_movement.dm +++ b/code/modules/vehicles/mecha/mecha_movement.dm @@ -26,13 +26,6 @@ return playsound(src, stepsound, 40, TRUE) -///Disconnects air tank- air port connection on mecha move -/obj/vehicle/sealed/mecha/proc/disconnect_air() - SIGNAL_HANDLER - if(internal_tank.disconnect()) // Something moved us and broke connection - to_chat(occupants, "[icon2html(src, occupants)][span_warning("Air port connection has been severed!")]") - log_message("Lost connection to gas port.", LOG_MECHA) - // Do whatever you do to mobs to these fuckers too /obj/vehicle/sealed/mecha/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) . = ..() @@ -60,7 +53,9 @@ . = TRUE if(!canmove || !(user in return_drivers())) return - vehicle_move(direction) + if (!vehicle_move(direction)) + return + SEND_SIGNAL(user, COMSIG_MOB_DROVE_MECH, src) /obj/vehicle/sealed/mecha/vehicle_move(direction, forcerotate = FALSE) if(!COOLDOWN_FINISHED(src, cooldown_vehicle_move)) @@ -70,17 +65,15 @@ return FALSE if(!direction) return FALSE + if(ismovable(loc)) //Mech is inside an object, tell it we moved + var/atom/loc_atom = loc + return loc_atom.relaymove(src, direction) + var/obj/machinery/portable_atmospherics/canister/internal_tank = get_internal_tank() if(internal_tank?.connected_port) if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_MESSAGE)) to_chat(occupants, "[icon2html(src, occupants)][span_warning("Unable to move while connected to the air system port!")]") TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS) return FALSE - if(construction_state) - if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_MESSAGE)) - to_chat(occupants, "[icon2html(src, occupants)][span_danger("Maintenance protocols in effect.")]") - TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS) - return FALSE - if(!Process_Spacemove(direction)) return FALSE if(zoom_mode) @@ -88,14 +81,16 @@ to_chat(occupants, "[icon2html(src, occupants)][span_warning("Unable to move while in zoom mode!")]") TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS) return FALSE - if(!cell) + var/list/missing_parts = list() + if(isnull(cell)) + missing_parts += "power cell" + if(isnull(capacitor)) + missing_parts += "capacitor" + if(isnull(servo)) + missing_parts += "micro-servo" + if(length(missing_parts)) if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_MESSAGE)) - to_chat(occupants, "[icon2html(src, occupants)][span_warning("Missing power cell.")]") - TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS) - return FALSE - if(!scanmod || !capacitor) - if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_MESSAGE)) - to_chat(occupants, "[icon2html(src, occupants)][span_warning("Missing [scanmod? "capacitor" : "scanning module"].")]") + to_chat(occupants, "[icon2html(src, occupants)][span_warning("Missing [english_list(missing_parts)].")]") TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS) return FALSE if(!use_power(step_energy_drain)) diff --git a/code/modules/vehicles/mecha/mecha_ui.dm b/code/modules/vehicles/mecha/mecha_ui.dm index 698cefb706d..815770875ea 100644 --- a/code/modules/vehicles/mecha/mecha_ui.dm +++ b/code/modules/vehicles/mecha/mecha_ui.dm @@ -5,7 +5,7 @@ /obj/vehicle/sealed/mecha/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, "Mecha", name, ui_x, ui_y) + ui = new(user, src, "Mecha", name) ui.open() ui_view.display_to(user) @@ -24,218 +24,162 @@ ) /obj/vehicle/sealed/mecha/ui_assets(mob/user) - return list(get_asset_datum(/datum/asset/spritesheet/mechaarmor)) + return list( + get_asset_datum(/datum/asset/spritesheet/mecha_equipment), + ) /obj/vehicle/sealed/mecha/ui_static_data(mob/user) var/list/data = list() - data["cabin_dangerous_highpressure"] = WARNING_HIGH_PRESSURE + data["ui_theme"] = ui_theme + //same thresholds as in air alarm + data["cabin_pressure_warning_min"] = WARNING_LOW_PRESSURE + data["cabin_pressure_hazard_min"] = HAZARD_LOW_PRESSURE + data["cabin_pressure_warning_max"] = WARNING_HIGH_PRESSURE + data["cabin_pressure_hazard_max"] = HAZARD_HIGH_PRESSURE + data["cabin_temp_warning_min"] = BODYTEMP_COLD_WARNING_1 + 10 - T0C + data["cabin_temp_hazard_min"] = BODYTEMP_COLD_WARNING_1 - T0C + data["cabin_temp_warning_max"] = BODYTEMP_HEAT_WARNING_1 - 27 - T0C + data["cabin_temp_hazard_max"] = BODYTEMP_HEAT_WARNING_1 - T0C + data["one_atmosphere"] = ONE_ATMOSPHERE + data["sheet_material_amount"] = SHEET_MATERIAL_AMOUNT //map of relevant flags to check tgui side, not every flag needs to be here data["mechflag_keys"] = list( - "ADDING_ACCESS_POSSIBLE" = ADDING_ACCESS_POSSIBLE, - "ADDING_MAINT_ACCESS_POSSIBLE" = ADDING_MAINT_ACCESS_POSSIBLE, + "ID_LOCK_ON" = ID_LOCK_ON, "LIGHTS_ON" = LIGHTS_ON, "HAS_LIGHTS" = HAS_LIGHTS, ) data["internal_damage_keys"] = list( "MECHA_INT_FIRE" = MECHA_INT_FIRE, "MECHA_INT_TEMP_CONTROL" = MECHA_INT_TEMP_CONTROL, - "MECHA_INT_TANK_BREACH" = MECHA_INT_TANK_BREACH, + "MECHA_CABIN_AIR_BREACH" = MECHA_CABIN_AIR_BREACH, "MECHA_INT_CONTROL_LOST" = MECHA_INT_CONTROL_LOST, "MECHA_INT_SHORT_CIRCUIT" = MECHA_INT_SHORT_CIRCUIT, ) - data["mech_electronics"] = list( - "minfreq" = MIN_FREE_FREQ, - "maxfreq" = MAX_FREE_FREQ, - ) + + var/list/regions = list() + var/list/tgui_region_data = SSid_access.all_region_access_tgui + for(var/region in SSid_access.station_regions) + regions += tgui_region_data[region] + data["regions"] = regions return data /obj/vehicle/sealed/mecha/ui_data(mob/user) var/list/data = list() var/isoperator = (user in occupants) //maintenance mode outside of mech data["isoperator"] = isoperator - if(!isoperator) - data["name"] = name - data["mecha_flags"] = mecha_flags - data["internal_tank_valve"] = internal_tank_valve - data["cell"] = cell?.name - data["scanning"] = scanmod?.name - data["capacitor"] = capacitor?.name - data["operation_req_access"] = list() - data["idcard_access"] = list() - for(var/code in operation_req_access) - data["operation_req_access"] += list(list("name" = SSid_access.get_access_desc(code), "number" = code)) - if(!isliving(user)) - return data - var/mob/living/living_user = user - var/obj/item/card/id/card = living_user.get_idcard(TRUE) - if(!card) - return data - for(var/idcode in card.access) - if(idcode in operation_req_access) - continue - var/accessname = SSid_access.get_access_desc(idcode) - if(!accessname) - continue //there's some strange access without a name - data["idcard_access"] += list(list("name" = accessname, "number" = idcode)) - return data + data["cell"] = cell?.name + data["scanning"] = scanmod?.name + data["capacitor"] = capacitor?.name + data["servo"] = servo?.name ui_view.appearance = appearance - var/datum/gas_mixture/int_tank_air = internal_tank?.return_air() data["name"] = name - data["integrity"] = atom_integrity/max_integrity + data["integrity"] = atom_integrity + data["integrity_max"] = max_integrity data["power_level"] = cell?.charge data["power_max"] = cell?.maxcharge data["mecha_flags"] = mecha_flags data["internal_damage"] = internal_damage - data["airtank_present"] = !!internal_tank - data["air_source"] = use_internal_tank ? "Internal Airtank" : "Environment" - data["airtank_pressure"] = int_tank_air ? round(int_tank_air.return_pressure(), 0.01) : null - data["airtank_temp"] = int_tank_air?.temperature - data["port_connected"] = internal_tank?.connected_port ? TRUE : FALSE - data["cabin_pressure"] = round(return_pressure(), 0.01) - data["cabin_temp"] = return_temperature() + + data["can_use_overclock"] = can_use_overclock + data["overclock_mode"] = overclock_mode + data["overclock_temp_percentage"] = overclock_temp / overclock_temp_danger + data["dna_lock"] = dna_lock + + data["one_access"] = one_access + data["accesses"] = accesses + + data["servo_rating"] = servo?.rating + data["scanmod_rating"] = scanmod?.rating + data["capacitor_rating"] = capacitor?.rating + data["weapons_safety"] = weapons_safety + data["enclosed"] = enclosed + data["cabin_sealed"] = cabin_sealed + data["cabin_temp"] = round(cabin_air.temperature - T0C) + data["cabin_pressure"] = round(cabin_air.return_pressure()) data["mech_view"] = ui_view.assigned_map - if(radio) - data["mech_electronics"] = list( - "microphone" = radio.get_broadcasting(), - "speaker" = radio.get_listening(), - "frequency" = radio.get_frequency(), - ) - if(equip_by_category[MECHA_L_ARM]) - var/obj/item/mecha_parts/mecha_equipment/l_gun = equip_by_category[MECHA_L_ARM] - var/isballisticweapon = istype(l_gun, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic) - data["left_arm_weapon"] = list( - "name" = l_gun.name, - "desc" = l_gun.desc, - "ref" = REF(l_gun), - "integrity" = (l_gun.get_integrity()/l_gun.max_integrity), - "isballisticweapon" = isballisticweapon, - "energy_per_use" = l_gun.energy_drain, - "snowflake" = l_gun.get_snowflake_data(), - ) - if(isballisticweapon) - var/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/weapon = l_gun - data["left_arm_weapon"] += list( - "projectiles" = weapon.projectiles, - "max_magazine" = initial(weapon.projectiles), - "projectiles_cache" = weapon.projectiles_cache, - "projectiles_cache_max" = weapon.projectiles_cache_max, - "disabledreload" = weapon.disabledreload, - "ammo_type" = weapon.ammo_type, - ) - if(equip_by_category[MECHA_R_ARM]) - var/obj/item/mecha_parts/mecha_equipment/r_gun = equip_by_category[MECHA_R_ARM] - var/isballisticweapon = istype(r_gun, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic) - data["right_arm_weapon"] = list( - "name" = r_gun.name, - "desc" = r_gun.desc, - "ref" = REF(r_gun), - "integrity" = (r_gun.get_integrity()/r_gun.max_integrity), - "isballisticweapon" = isballisticweapon, - "energy_per_use" = r_gun.energy_drain, - "snowflake" = r_gun.get_snowflake_data(), - ) - if(isballisticweapon) - var/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/weapon = r_gun - data["right_arm_weapon"] += list( - "projectiles" = weapon.projectiles, - "max_magazine" = initial(weapon.projectiles), - "projectiles_cache" = weapon.projectiles_cache, - "projectiles_cache_max" = weapon.projectiles_cache_max, - "disabledreload" = weapon.disabledreload, - "ammo_type" = weapon.ammo_type, - ) - data["mech_equipment"] = list("utility" = list(), "power" = list(), "armor" = list()) - for(var/obj/item/mecha_parts/mecha_equipment/utility as anything in equip_by_category[MECHA_UTILITY]) - data["mech_equipment"]["utility"] += list(list( - "name" = utility.name, - "activated" = utility.activated, - "snowflake" = utility.get_snowflake_data(), - "ref" = REF(utility), - )) - for(var/obj/item/mecha_parts/mecha_equipment/power as anything in equip_by_category[MECHA_POWER]) - data["mech_equipment"]["power"] += list(list( - "name" = power.name, - "activated" = power.activated, - "snowflake" = power.get_snowflake_data(), - "ref" = REF(power), - )) - for(var/obj/item/mecha_parts/mecha_equipment/armor/armor as anything in equip_by_category[MECHA_ARMOR]) - data["mech_equipment"]["armor"] += list(list( - "protect_name" = armor.protect_name, - "iconstate_name" = armor.iconstate_name, - "ref" = REF(armor), - )) + data["modules"] = get_module_ui_data() + data["selected_module_index"] = ui_selected_module_index + return data + +/obj/vehicle/sealed/mecha/proc/get_module_ui_data() + var/list/data = list() + var/module_index = 0 + for(var/category in max_equip_by_category) + var/max_per_category = max_equip_by_category[category] + for(var/i = 1 to max_per_category) + var/equipment = equip_by_category[category] + var/is_slot_free = islist(equipment) ? i > length(equipment) : isnull(equipment) + if(is_slot_free) + data += list(list( + "slot" = category + )) + if(ui_selected_module_index == module_index) + ui_selected_module_index = null + else + var/obj/item/mecha_parts/mecha_equipment/module = islist(equipment) ? equipment[i] : equipment + data += list(list( + "slot" = category, + "icon" = module.icon_state, + "name" = module.name, + "desc" = module.desc, + "detachable" = module.detachable, + "integrity" = (module.get_integrity()/module.max_integrity), + "can_be_toggled" = module.can_be_toggled, + "can_be_triggered" = module.can_be_triggered, + "active" = module.active, + "active_label" = module.active_label, + "equip_cooldown" = module.equip_cooldown && DisplayTimeText(module.equip_cooldown), + "energy_per_use" = module.energy_drain, + "snowflake" = module.get_snowflake_data(), + "ref" = REF(module), + )) + if(isnull(ui_selected_module_index)) + ui_selected_module_index = module_index + module_index++ return data /obj/vehicle/sealed/mecha/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return - if(!(usr in occupants)) - switch(action) - if("stopmaint") - if(construction_state > MECHA_LOCKED) - to_chat(usr, span_warning("You must end Maintenance Procedures first!")) - return - mecha_flags &= ~ADDING_MAINT_ACCESS_POSSIBLE - ui.close() - return FALSE - if("togglemaint") - if(!(mecha_flags & ADDING_MAINT_ACCESS_POSSIBLE)) - return FALSE - if(construction_state == MECHA_LOCKED) - construction_state = MECHA_SECURE_BOLTS - to_chat(usr, span_notice("The securing bolts are now exposed.")) - else if(construction_state == MECHA_SECURE_BOLTS) - construction_state = MECHA_LOCKED - to_chat(usr, span_notice("The securing bolts are now hidden.")) - if("drop_cell") - if(construction_state != MECHA_OPEN_HATCH) - return - usr.put_in_hands(cell) - cell = null - if("drop_scanning") - if(construction_state != MECHA_OPEN_HATCH) - return - usr.put_in_hands(scanmod) - scanmod = null - if("drop_capacitor") - if(construction_state != MECHA_OPEN_HATCH) - return - usr.put_in_hands(capacitor) - capacitor = null - if("set_pressure") - var/new_pressure = tgui_input_number(usr, "Enter new pressure", "Cabin pressure change", internal_tank_valve) - if(isnull(new_pressure) || !construction_state) - return - internal_tank_valve = new_pressure - to_chat(usr, span_notice("The internal pressure valve has been set to [internal_tank_valve]kPa.")) - if("add_req_access") - if(!(mecha_flags & ADDING_ACCESS_POSSIBLE)) - return - if(!(params["added_access"] == "all")) - operation_req_access += params["added_access"] - else - var/mob/living/living_user = usr - var/obj/item/card/id/card = living_user.get_idcard(TRUE) - operation_req_access += card.access - if("del_req_access") - if(!(mecha_flags & ADDING_ACCESS_POSSIBLE)) - return - if(!(params["removed_access"] == "all")) - operation_req_access -= params["removed_access"] - else - operation_req_access = list() - if("lock_req_edit") - mecha_flags &= ~ADDING_ACCESS_POSSIBLE - return TRUE - //usr is in occupants switch(action) + if("clear_all") + accesses = list() + one_access = 0 + update_access() + if("grant_all") + accesses = SSid_access.get_region_access_list(list(REGION_ALL_STATION)) + update_access() + if("one_access") + one_access = !one_access + update_access() + if("set") + var/access = params["access"] + if (!(access in accesses)) + accesses += access + else + accesses -= access + update_access() + if("grant_region") + var/region = params["region"] + if(isnull(region)) + return + accesses |= SSid_access.get_region_access_list(list(region)) + update_access() + if("deny_region") + var/region = params["region"] + if(isnull(region)) + return + accesses -= SSid_access.get_region_access_list(list(region)) + update_access() + if("select_module") + ui_selected_module_index = text2num(params["index"]) + return TRUE if("changename") - var/userinput = tgui_input_text(usr, "Choose a new exosuit name", "Rename exosuit", max_length = MAX_NAME_LEN) + var/userinput = tgui_input_text(usr, "Choose a new exosuit name", "Rename exosuit", max_length = MAX_NAME_LEN, default = name) if(!userinput) return if(is_ic_filtered(userinput) || is_soft_ic_filtered(userinput)) @@ -258,47 +202,22 @@ to_chat(user, "[icon2html(src, occupants)][span_notice("You feel a prick as the needle takes your DNA sample.")]") if("reset_dna") dna_lock = null - if("view_dna") - tgui_alert(usr, "Enzymes detected: " + dna_lock) - return FALSE - if("toggle_airsource") - if(!internal_tank) - return - use_internal_tank = !use_internal_tank - balloon_alert(usr, "taking air from [use_internal_tank ? "internal airtank" : "environment"]") - log_message("Now taking air from [use_internal_tank?"internal airtank":"environment"].", LOG_MECHA) - if("toggle_port") - if(internal_tank.connected_port) - if(internal_tank.disconnect()) - to_chat(occupants, "[icon2html(src, occupants)][span_notice("Disconnected from the air system port.")]") - log_message("Disconnected from gas port.", LOG_MECHA) - return TRUE - to_chat(occupants, "[icon2html(src, occupants)][span_warning("Unable to disconnect from the air system port!")]") - return - var/obj/machinery/atmospherics/components/unary/portables_connector/possible_port = locate() in loc - if(internal_tank.connect(possible_port)) - to_chat(occupants, "[icon2html(src, occupants)][span_notice("Connected to the air system port.")]") - log_message("Connected to gas port.", LOG_MECHA) - return TRUE - to_chat(occupants, "[icon2html(src, occupants)][span_warning("Unable to connect with air system port!")]") - if("toggle_maintenance") - if(construction_state) - to_chat(occupants, "[icon2html(src, occupants)][span_danger("Maintenance protocols in effect")]") - return - mecha_flags ^= ADDING_MAINT_ACCESS_POSSIBLE - if("toggle_id_panel") - mecha_flags ^= ADDING_ACCESS_POSSIBLE - if("toggle_microphone") - radio.set_broadcasting(!radio.get_broadcasting()) - if("toggle_speaker") - radio.set_listening(!radio.get_listening()) - if("set_frequency") - radio.set_frequency(sanitize_frequency(params["new_frequency"], radio.freerange, radio.syndie)) + if("toggle_cabin_seal") + set_cabin_seal(usr, !cabin_sealed) + if("toggle_id_lock") + mecha_flags ^= ID_LOCK_ON + if("toggle_lights") + toggle_lights(user = usr) + if("toggle_overclock") + toggle_overclock() + var/datum/action/act = locate(/datum/action/vehicle/sealed/mecha/mech_overclock) in usr.actions + act.button_icon_state = "mech_overload_[overclock_mode ? "on" : "off"]" + act.build_all_button_icons() if("repair_int_damage") - ui.close() //if doing this you're likely want to watch for bad people so close the UI try_repair_int_damage(usr, params["flag"]) return FALSE if("equip_act") var/obj/item/mecha_parts/mecha_equipment/gear = locate(params["ref"]) in flat_equipment return gear?.ui_act(params["gear_action"], params, ui, state) return TRUE + diff --git a/code/modules/vehicles/mecha/medical/odysseus.dm b/code/modules/vehicles/mecha/medical/odysseus.dm index 272ac518d03..90a46f54f58 100644 --- a/code/modules/vehicles/mecha/medical/odysseus.dm +++ b/code/modules/vehicles/mecha/medical/odysseus.dm @@ -9,7 +9,7 @@ wreckage = /obj/structure/mecha_wreckage/odysseus mech_type = EXOSUIT_MODULE_ODYSSEUS step_energy_drain = 6 - internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_MECH_MEDICAL) + accesses = list(ACCESS_MECH_SCIENCE, ACCESS_MECH_MEDICAL) pivot_step = TRUE /obj/vehicle/sealed/mecha/odysseus/moved_inside(mob/living/carbon/human/H) diff --git a/code/modules/vehicles/mecha/working/clarke.dm b/code/modules/vehicles/mecha/working/clarke.dm index cf5b372a90a..e31690f65b9 100644 --- a/code/modules/vehicles/mecha/working/clarke.dm +++ b/code/modules/vehicles/mecha/working/clarke.dm @@ -9,7 +9,7 @@ movedelay = 1.25 resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF lights_power = 7 - step_energy_drain = 15 //slightly higher energy drain since you movin those wheels FAST + step_energy_drain = 12 //slightly higher energy drain since you movin those wheels FAST armor_type = /datum/armor/mecha_clarke equip_by_category = list( MECHA_L_ARM = null, @@ -19,15 +19,17 @@ MECHA_ARMOR = list(), ) max_equip_by_category = list( - MECHA_UTILITY = 3, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 5, MECHA_POWER = 1, MECHA_ARMOR = 1, ) wreckage = /obj/structure/mecha_wreckage/clarke mech_type = EXOSUIT_MODULE_CLARKE enter_delay = 40 - mecha_flags = ADDING_ACCESS_POSSIBLE | IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE | OMNIDIRECTIONAL_ATTACKS - internals_req_access = list(ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE, ACCESS_MECH_MINING) + mecha_flags = IS_ENCLOSED | HAS_LIGHTS | MMI_COMPATIBLE | OMNIDIRECTIONAL_ATTACKS + accesses = list(ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE, ACCESS_MECH_MINING) allow_diagonal_movement = FALSE pivot_step = TRUE @@ -59,8 +61,7 @@ /obj/item/mecha_parts/mecha_equipment/orebox_manager name = "ore storage module" desc = "An automated ore box management device." - icon = 'icons/obj/mining.dmi' - icon_state = "bin" + icon_state = "mecha_bin" equipment_slot = MECHA_UTILITY detachable = FALSE @@ -73,8 +74,21 @@ return ..() /obj/item/mecha_parts/mecha_equipment/orebox_manager/get_snowflake_data() - var/list/data = list("snowflake_id" = MECHA_SNOWFLAKE_ID_OREBOX_MANAGER) - data["cargo"] = length(chassis.ore_box?.contents) + var/list/contents = chassis.ore_box?.contents + var/list/contents_grouped = list() + for(var/obj/item/stack/ore/item as anything in contents) + if(isnull(contents_grouped[item.icon_state])) + var/ore_data = list() + ore_data["name"] = item.name + ore_data["icon"] = item.icon_state + ore_data["amount"] = item.amount + contents_grouped[item.icon_state] = ore_data + else + contents_grouped[item.icon_state]["amount"] += item.amount + var/list/data = list( + "snowflake_id" = MECHA_SNOWFLAKE_ID_OREBOX_MANAGER, + "contents" = contents_grouped, + ) return data /obj/item/mecha_parts/mecha_equipment/orebox_manager/ui_act(action, list/params) @@ -86,6 +100,7 @@ if(isnull(cached_ore_box)) return FALSE cached_ore_box.dump_box_contents() + playsound(chassis, 'sound/weapons/tap.ogg', 50, TRUE) log_message("Dumped [cached_ore_box].", LOG_MECHA) return TRUE diff --git a/code/modules/vehicles/mecha/working/ripley.dm b/code/modules/vehicles/mecha/working/ripley.dm index 3405ff4663c..9db12624125 100644 --- a/code/modules/vehicles/mecha/working/ripley.dm +++ b/code/modules/vehicles/mecha/working/ripley.dm @@ -7,18 +7,19 @@ movedelay = 1.5 //Move speed, lower is faster. max_temperature = 20000 max_integrity = 200 - ui_x = 1200 lights_power = 7 armor_type = /datum/armor/mecha_ripley max_equip_by_category = list( - MECHA_UTILITY = 2, + MECHA_L_ARM = 1, + MECHA_R_ARM = 1, + MECHA_UTILITY = 4, MECHA_POWER = 1, MECHA_ARMOR = 1, ) wreckage = /obj/structure/mecha_wreckage/ripley mech_type = EXOSUIT_MODULE_RIPLEY possible_int_damage = MECHA_INT_FIRE|MECHA_INT_CONTROL_LOST|MECHA_INT_SHORT_CIRCUIT - internals_req_access = list(ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE, ACCESS_MECH_MINING) + accesses = list(ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE, ACCESS_MECH_MINING) enclosed = FALSE //Normal ripley has an open cockpit design enter_delay = 10 //can enter in a quarter of the time of other mechs exit_delay = 10 @@ -56,13 +57,6 @@ . = ..() update_pressure() -/obj/vehicle/sealed/mecha/ripley/generate_actions() //isnt allowed to have internal air - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_eject) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_lights) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_view_stats) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_safeties) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/strafe) - /obj/vehicle/sealed/mecha/ripley/Initialize(mapload) . = ..() AddComponent(/datum/component/armor_plate, 3, /obj/item/stack/sheet/animalhide/goliath_hide, /datum/armor/armor_plate_ripley_goliath) @@ -89,7 +83,7 @@ movedelay = 4 max_temperature = 30000 max_integrity = 250 - possible_int_damage = MECHA_INT_FIRE|MECHA_INT_TEMP_CONTROL|MECHA_INT_TANK_BREACH|MECHA_INT_CONTROL_LOST|MECHA_INT_SHORT_CIRCUIT + possible_int_damage = MECHA_INT_FIRE|MECHA_INT_TEMP_CONTROL|MECHA_CABIN_AIR_BREACH|MECHA_INT_CONTROL_LOST|MECHA_INT_SHORT_CIRCUIT armor_type = /datum/armor/mecha_ripley_mk2 wreckage = /obj/structure/mecha_wreckage/ripley/mk2 enclosed = TRUE @@ -105,14 +99,6 @@ fire = 100 acid = 100 -/obj/vehicle/sealed/mecha/ripley/mk2/generate_actions() - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_eject) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_internals) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_lights) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_safeties) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_view_stats) - initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/strafe) - /obj/vehicle/sealed/mecha/ripley/deathripley desc = "OH SHIT IT'S THE DEATHSQUAD WE'RE ALL GONNA DIE" name = "\improper DEATH-RIPLEY" @@ -200,6 +186,13 @@ GLOBAL_DATUM(cargo_ripley, /obj/vehicle/sealed/mecha/ripley/cargo) return ..() +/obj/vehicle/sealed/mecha/ripley/cargo/populate_parts() + cell = new /obj/item/stock_parts/cell/high(src) + //No scanmod for Big Bess + capacitor = new /obj/item/stock_parts/capacitor(src) + servo = new /obj/item/stock_parts/servo(src) + update_part_values() + /obj/vehicle/sealed/mecha/ripley/Exit(atom/movable/leaving, direction) if(leaving in cargo) return FALSE @@ -215,12 +208,18 @@ GLOBAL_DATUM(cargo_ripley, /obj/vehicle/sealed/mecha/ripley/cargo) /obj/item/mecha_parts/mecha_equipment/ejector name = "Cargo compartment" + desc = "Holds cargo loaded with a hydraulic clamp." + icon_state = "mecha_bin" equipment_slot = MECHA_UTILITY detachable = FALSE /obj/item/mecha_parts/mecha_equipment/ejector/get_snowflake_data() - var/list/data = list("snowflake_id" = MECHA_SNOWFLAKE_ID_EJECTOR, "cargo" = list()) var/obj/vehicle/sealed/mecha/ripley/miner = chassis + var/list/data = list( + "snowflake_id" = MECHA_SNOWFLAKE_ID_EJECTOR, + "cargo_capacity" = miner.cargo_capacity, + "cargo" = list() + ) for(var/obj/crate in miner.cargo) data["cargo"] += list(list( "name" = crate.name, @@ -242,6 +241,7 @@ GLOBAL_DATUM(cargo_ripley, /obj/vehicle/sealed/mecha/ripley/cargo) LAZYREMOVE(miner.cargo, crate) if(crate == miner.ore_box) miner.ore_box = null + playsound(chassis, 'sound/weapons/tap.ogg', 50, TRUE) log_message("Unloaded [crate]. Cargo compartment capacity: [miner.cargo_capacity - LAZYLEN(miner.cargo)]", LOG_MECHA) return TRUE diff --git a/code/modules/vehicles/sealed.dm b/code/modules/vehicles/sealed.dm index 207fbc7262b..dc49f6b5dbe 100644 --- a/code/modules/vehicles/sealed.dm +++ b/code/modules/vehicles/sealed.dm @@ -46,16 +46,17 @@ REMOVE_TRAIT(M, TRAIT_HANDS_BLOCKED, VEHICLE_TRAIT) -/obj/vehicle/sealed/proc/mob_try_enter(mob/M) - if(!istype(M)) +/obj/vehicle/sealed/proc/mob_try_enter(mob/rider) + if(!istype(rider)) return FALSE - //SKYRAT EDIT ADDITION - /*if(HAS_TRAIT(M, TRAIT_OVERSIZED)) - to_chat(M, span_warning("You are far too big for this!")) - return FALSE*/ //BUBBER EDIT: commented out this Skyrat change. - //SKYRAT EDIT END - if(do_after(M, get_enter_delay(M), src, timed_action_flags = IGNORE_HELD_ITEM, extra_checks = CALLBACK(src, PROC_REF(enter_checks), M))) - mob_enter(M) + var/enter_delay = get_enter_delay(rider) + if (enter_delay == 0) + if (enter_checks(rider)) + mob_enter(rider) + return TRUE + return FALSE + if (do_after(rider, enter_delay, src, timed_action_flags = IGNORE_HELD_ITEM, extra_checks = CALLBACK(src, PROC_REF(enter_checks), rider))) + mob_enter(rider) return TRUE return FALSE diff --git a/code/modules/vehicles/speedbike.dm b/code/modules/vehicles/speedbike.dm index 61a4a265091..3e375b59c2e 100644 --- a/code/modules/vehicles/speedbike.dm +++ b/code/modules/vehicles/speedbike.dm @@ -18,52 +18,3 @@ /obj/vehicle/ridden/speedbike/red icon_state = "speedbike_red" cover_iconstate = "cover_red" - -//BM SPEEDWAGON - -/obj/vehicle/ridden/speedwagon - name = "BM Speedwagon" - desc = "Push it to the limit, walk along the razor's edge." - icon = 'icons/obj/toys/car.dmi' - icon_state = "speedwagon" - layer = LYING_MOB_LAYER - max_buckled_mobs = 4 - pixel_y = -48 - pixel_x = -48 - ///Determines whether we throw all things away when ramming them or just mobs, varedit only - var/crash_all = FALSE - -/obj/vehicle/ridden/speedwagon/Initialize(mapload) - . = ..() - add_overlay(image(icon, "speedwagon_cover", ABOVE_MOB_LAYER)) - AddElement(/datum/element/ridable, /datum/component/riding/vehicle/speedwagon) - -/obj/vehicle/ridden/speedwagon/Bump(atom/A) - . = ..() - if(!A.density || !has_buckled_mobs()) - return - - if(crash_all) - if(ismovable(A)) - var/atom/movable/AM = A - AM.throw_at(get_edge_target_turf(A, dir), 4, 3) - visible_message(span_danger("[src] crashes into [A]!")) - playsound(src, 'sound/effects/bang.ogg', 50, TRUE) - if(!ishuman(A)) - return - var/mob/living/carbon/human/rammed = A - rammed.Paralyze(100) - rammed.adjustStaminaLoss(30) - rammed.apply_damage(rand(20,35), BRUTE) - if(!crash_all) - rammed.throw_at(get_edge_target_turf(A, dir), 4, 3) - visible_message(span_danger("[src] crashes into [rammed]!")) - playsound(src, 'sound/effects/bang.ogg', 50, TRUE) - -/obj/vehicle/ridden/speedwagon/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - . = ..() - if(!has_buckled_mobs()) - return - for(var/atom/A in range(2, src)) - if(!(A in buckled_mobs)) - Bump(A) diff --git a/code/modules/vehicles/wheelchair.dm b/code/modules/vehicles/wheelchair.dm index 2003412d748..6dbc3c93a59 100644 --- a/code/modules/vehicles/wheelchair.dm +++ b/code/modules/vehicles/wheelchair.dm @@ -30,7 +30,6 @@ if(!bell_attached) return initialize_controller_action_type(/datum/action/vehicle/ridden/wheelchair/bell, VEHICLE_CONTROL_DRIVE) - AddElement(/datum/element/noisy_movement, volume = 75) /obj/vehicle/ridden/wheelchair/Initialize(mapload) . = ..() @@ -38,6 +37,7 @@ wheels_overlay = image(icon, overlay_icon, ABOVE_MOB_LAYER) ADD_TRAIT(src, TRAIT_NO_IMMOBILIZE, INNATE_TRAIT) AddComponent(/datum/component/simple_rotation) //Since it's technically a chair I want it to have chair properties + AddElement(/datum/element/noisy_movement, volume = 75) /obj/vehicle/ridden/wheelchair/atom_destruction(damage_flag) new /obj/item/stack/rods(drop_location(), 1) diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 909e00bcc1c..c68d70f5164 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -14,6 +14,7 @@ premium = list() */ +/// Maximum amount of items in a storage bag that we're transferring items to the vendor from. #define MAX_VENDING_INPUT_AMOUNT 30 /** * # vending record datum @@ -74,16 +75,21 @@ var/purchase_message_cooldown ///The ref of the last mob to shop with us var/last_shopper + ///Whether the vendor is tilted or not var/tilted = FALSE /// If tilted, this variable should always be the rotation that was applied when we were tilted. Stored for the purposes of unapplying it. var/tilted_rotation = 0 + ///Whether this vendor can be tilted over or not var/tiltable = TRUE + ///Damage this vendor does when tilting onto an atom var/squish_damage = 75 /// The chance, in percent, of this vendor performing a critical hit on anything it crushes via [tilt]. var/crit_chance = 15 /// If set to a critical define in crushing.dm, anything this vendor crushes will always be hit with that effect. var/forcecrit = null + ///Number of glass shards the vendor creates and tries to embed into an atom it tilted onto var/num_shards = 7 + ///List of mobs stuck under the vendor var/list/pinned_mobs = list() ///Icon for the maintenance panel overlay var/panel_type = "panel1" @@ -117,7 +123,7 @@ /** * List of premium products this machine sells * - * form should be list(/type/path, /type/path2) as there is only ever one in stock + * form should be list(/type/path = amount, /type/path2 = amount2) */ var/list/premium = list() @@ -126,12 +132,14 @@ ///String of small ad messages in the vending screen - random chance var/product_ads = "" + ///List of standard product records var/list/product_records = list() + ///List of contraband product records var/list/hidden_records = list() + ///List of premium product records var/list/coin_records = list() + ///List of slogans to scream at potential customers; built upon Iniitialize() of the vendor from product_slogans var/list/slogan_list = list() - ///Small ad messages in the vending screen - random chance of popping up whenever you open it - var/list/small_ads = list() ///Message sent post vend (Thank you for shopping!) var/vend_reply ///Last world tick we sent a vent reply @@ -139,7 +147,7 @@ ///Last world tick we sent a slogan message out var/last_slogan = 0 ///How many ticks until we can send another - var/slogan_delay = 6000 + var/slogan_delay = 10 MINUTES ///Icon when vending an item to the user var/icon_vend ///Icon to flash when user is denied a vend @@ -164,6 +172,10 @@ var/default_price = 25 ///Default price of premium items if not overridden var/extra_price = 50 + ///fontawesome icon name to use in to display the user's balance in the vendor UI + var/displayed_currency_icon = "coins" + ///String of the used currency to display in the vendor UI + var/displayed_currency_name = " cr" ///Whether our age check is currently functional var/age_restrictions = TRUE /** @@ -180,6 +192,7 @@ */ var/onstation_override = FALSE + ///Items that the players have loaded into the vendor var/list/vending_machine_input = list() ///Display header on the input view var/input_display_header = "Custom Vendor" @@ -196,6 +209,11 @@ /// used for narcing on underages var/obj/item/radio/sec_radio +/datum/armor/machinery_vending + melee = 20 + fire = 50 + acid = 70 + /** * Initialize the vending machine * @@ -205,11 +223,6 @@ * * FALSE - if the machine was maploaded on a zlevel that doesn't pass the is_station_level check * * TRUE - all other cases */ -/datum/armor/machinery_vending - melee = 20 - fire = 50 - acid = 70 - /obj/machinery/vending/Initialize(mapload) var/build_inv = FALSE if(!refill_canister) @@ -284,16 +297,15 @@ build_inventories(start_empty = TRUE) - for(var/obj/item/vending_refill/VR in component_parts) - restock(VR) + for(var/obj/item/vending_refill/installed_refill in component_parts) + restock(installed_refill) /obj/machinery/vending/deconstruct(disassembled = TRUE) - if(!refill_canister) //the non constructable vendors drop metal instead of a machine frame. - if(!(flags_1 & NODECONSTRUCT_1)) - new /obj/item/stack/sheet/iron(loc, 3) - qdel(src) - else - ..() + if(refill_canister) + return ..() + if(!(flags_1 & NODECONSTRUCT_1)) //the non constructable vendors drop metal instead of a machine frame. + new /obj/item/stack/sheet/iron(loc, 3) + qdel(src) /obj/machinery/vending/update_appearance(updates=ALL) . = ..() @@ -302,7 +314,6 @@ return set_light(powered() ? MINIMUM_USEFUL_LIGHT_RANGE : 0) - /obj/machinery/vending/update_icon_state() if(machine_stat & BROKEN) icon_state = "[initial(icon_state)]-broken" @@ -310,7 +321,6 @@ icon_state = "[initial(icon_state)][powered() ? null : "-off"]" return ..() - /obj/machinery/vending/update_overlays() . = ..() if(panel_open) @@ -327,22 +337,20 @@ var/found_anything = TRUE while (found_anything) found_anything = FALSE - for(var/record in shuffle(product_records)) - var/datum/data/vending_product/R = record - + for(var/datum/data/vending_product/record as anything in shuffle(product_records)) //first dump any of the items that have been returned, in case they contain the nuke disk or something - for(var/obj/returned_obj_to_dump in R.returned_products) - LAZYREMOVE(R.returned_products, returned_obj_to_dump) + for(var/obj/returned_obj_to_dump in record.returned_products) + LAZYREMOVE(record.returned_products, returned_obj_to_dump) returned_obj_to_dump.forceMove(get_turf(src)) step(returned_obj_to_dump, pick(GLOB.alldirs)) - R.amount-- + record.amount-- - if(R.amount <= 0) //Try to use a record that actually has something to dump. + if(record.amount <= 0) //Try to use a record that actually has something to dump. continue - var/dump_path = R.product_path + var/dump_path = record.product_path if(!dump_path) continue - R.amount-- + record.amount-- // busting open a vendor will destroy some of the contents if(found_anything && prob(80)) continue @@ -383,35 +391,47 @@ amount = 0 var/obj/item/temp = typepath - var/datum/data/vending_product/R = new /datum/data/vending_product() - R.name = initial(temp.name) - R.product_path = typepath + var/datum/data/vending_product/new_record = new /datum/data/vending_product() + new_record.name = initial(temp.name) + new_record.product_path = typepath if(!start_empty) - R.amount = amount - R.max_amount = amount + new_record.amount = amount + new_record.max_amount = amount ///Prices of vending machines are all increased uniformly. - R.custom_price = round(initial(temp.custom_price)) - R.custom_premium_price = round(initial(temp.custom_premium_price)) + new_record.custom_price = round(initial(temp.custom_price)) + new_record.custom_premium_price = round(initial(temp.custom_premium_price)) if(HAS_TRAIT(SSeconomy, TRAIT_MARKET_CRASHING)) - R.custom_price = round(initial(temp.custom_price) * SSeconomy.inflation_value()) - R.custom_premium_price = round(initial(temp.custom_premium_price) * SSeconomy.inflation_value()) - R.age_restricted = initial(temp.age_restricted) - R.colorable = !!(initial(temp.greyscale_config) && initial(temp.greyscale_colors) && (initial(temp.flags_1) & IS_PLAYER_COLORABLE_1)) - R.category = product_to_category[typepath] - recordlist += R + new_record.custom_price = round(initial(temp.custom_price) * SSeconomy.inflation_value()) + new_record.custom_premium_price = round(initial(temp.custom_premium_price) * SSeconomy.inflation_value()) + new_record.age_restricted = initial(temp.age_restricted) + new_record.colorable = !!(initial(temp.greyscale_config) && initial(temp.greyscale_colors) && (initial(temp.flags_1) & IS_PLAYER_COLORABLE_1)) + new_record.category = product_to_category[typepath] + recordlist += new_record +/**Builds all available inventories for the vendor - standard, contraband and premium + * Arguments: + * start_empty - bool to pass into build_inventory that determines whether a product entry starts with available stock or not +*/ /obj/machinery/vending/proc/build_inventories(start_empty) build_inventory(products, product_records, product_categories, start_empty) - build_inventory(contraband, hidden_records, create_categories_from(contraband, "mask", "Contraband"), start_empty) - build_inventory(premium, coin_records, create_categories_from(premium, "coins", "Premium"), start_empty) + build_inventory(contraband, hidden_records, create_categories_from("Contraband", "mask", contraband), start_empty) + build_inventory(premium, coin_records, create_categories_from("Premium", "coins", premium), start_empty) -/obj/machinery/vending/proc/create_categories_from(products, icon, name) +/** + * Returns a list of data about the category + * Arguments: + * name - string for the name of the category + * icon - string for the fontawesome icon to use in the UI for the category + * products - list of products available in the category +*/ +/obj/machinery/vending/proc/create_categories_from(name, icon, products) return list(list( "name" = name, "icon" = icon, "products" = products, )) +///Populates list of products with categorized products /obj/machinery/vending/proc/build_products_from_categories() if (isnull(product_categories)) return @@ -439,30 +459,28 @@ default_price *= SSeconomy.inflation_value() extra_price *= SSeconomy.inflation_value() - for(var/R in recordlist) - var/datum/data/vending_product/record = R + for(var/datum/data/vending_product/record as anything in recordlist) var/obj/item/potential_product = record.product_path record.custom_price = round(initial(potential_product.custom_price)) if(crash_status) record.custom_price = round(initial(potential_product.custom_price) * SSeconomy.inflation_value()) - for(var/R in premiumlist) - var/datum/data/vending_product/record = R - var/obj/item/potential_product = record.product_path + for(var/datum/data/vending_product/premium_record as anything in premiumlist) + var/obj/item/potential_product = premium_record.product_path var/premium_sanity = round(initial(potential_product.custom_premium_price)) if(premium_sanity) - record.custom_premium_price = round(premium_sanity) + premium_record.custom_premium_price = round(premium_sanity) if(crash_status) - record.custom_premium_price = round(premium_sanity * SSeconomy.inflation_value()) + premium_record.custom_premium_price = round(premium_sanity * SSeconomy.inflation_value()) continue //For some ungodly reason, some premium only items only have a custom_price - record.custom_premium_price = round(extra_price + (initial(potential_product.custom_price))) + premium_record.custom_premium_price = round(extra_price + (initial(potential_product.custom_price))) if(crash_status) - record.custom_premium_price = round(extra_price + (initial(potential_product.custom_price) * (SSeconomy.inflation_value() - 1))) + premium_record.custom_premium_price = round(extra_price + (initial(potential_product.custom_price) * (SSeconomy.inflation_value() - 1))) /** * Refill a vending machine from a refill canister * - * This takes the products from the refill canister and then fills the products,contraband and premium product categories + * This takes the products from the refill canister and then fills the products, contraband and premium product categories * * Arguments: * * canister - the vending canister we are refilling from @@ -505,8 +523,7 @@ */ /obj/machinery/vending/proc/refill_inventory(list/productlist, list/recordlist) . = 0 - for(var/R in recordlist) - var/datum/data/vending_product/record = R + for(var/datum/data/vending_product/record as anything in recordlist) var/diff = min(record.max_amount - record.amount, productlist[record.product_path]) if (diff) productlist[record.product_path] -= diff @@ -514,7 +531,7 @@ . += diff /** - * Set up a refill canister that matches this machines products + * Set up a refill canister that matches this machine's products * * This is used when the machine is deconstructed, so the items aren't "lost" */ @@ -522,25 +539,34 @@ if (!component_parts) return - var/obj/item/vending_refill/R = locate() in component_parts - if (!R) + var/obj/item/vending_refill/installed_refill = locate() in component_parts + if (!installed_refill) CRASH("Constructible vending machine did not have a refill canister") - unbuild_inventory_into(product_records, R.products, R.product_categories) + unbuild_inventory_into(product_records, installed_refill.products, installed_refill.product_categories) - R.contraband = unbuild_inventory(hidden_records) - R.premium = unbuild_inventory(coin_records) + installed_refill.contraband = unbuild_inventory(hidden_records) + installed_refill.premium = unbuild_inventory(coin_records) /** - * Given a record list, go through and and return a list of type -> amount + * Given a record list, go through and return a list of products in format of type -> amount + * Arguments: + * recordlist - list of records to unbuild products from */ /obj/machinery/vending/proc/unbuild_inventory(list/recordlist) . = list() - for(var/R in recordlist) - var/datum/data/vending_product/record = R + for(var/datum/data/vending_product/record as anything in recordlist) .[record.product_path] += record.amount -/// Put stuff in product_categories if the products have a category, otherwise put them in products +/** + * Unbuild product_records into categorized product lists to the machine's refill canister. + * Does not handle contraband/premium products, only standard stock and any other categories used by the vendor(see: ClothesMate). + * If a product has no category, puts it into standard stock category. + * Arguments: + * product_records - list of products of the vendor + * products - list of products of the refill canister + * product_categories - list of product categories of the refill canister +*/ /obj/machinery/vending/proc/unbuild_inventory_into(list/product_records, list/products, list/product_categories) products?.Cut() product_categories?.Cut() @@ -552,7 +578,7 @@ for (var/datum/data/vending_product/record as anything in product_records) var/list/category = record.category var/has_category = !isnull(category) - + //check if there're any uncategorized products if (isnull(others_have_category)) others_have_category = has_category else if (others_have_category != has_category) @@ -566,11 +592,11 @@ if (has_category) var/index = categories_to_index.Find(category) - if (index) + if (index) //if we've already established a category, add the product there var/list/category_in_list = product_categories[index] var/list/products_in_category = category_in_list["products"] products_in_category[record.product_path] += record.amount - else + else //create a category that the product is supposed to have and put it there categories_to_index += list(category) index = categories_to_index.len @@ -581,13 +607,13 @@ category_clone["products"] = initial_product_list product_categories += list(category_clone) - else + else //no category found - dump it into standard stock products[record.product_path] = record.amount -/obj/machinery/vending/crowbar_act(mob/living/user, obj/item/I) +/obj/machinery/vending/crowbar_act(mob/living/user, obj/item/attack_item) if(!component_parts) return FALSE - default_deconstruction_crowbar(I) + default_deconstruction_crowbar(attack_item) return TRUE /obj/machinery/vending/wrench_act(mob/living/user, obj/item/tool) @@ -599,29 +625,29 @@ return TOOL_ACT_TOOLTYPE_SUCCESS return FALSE -/obj/machinery/vending/screwdriver_act(mob/living/user, obj/item/I) +/obj/machinery/vending/screwdriver_act(mob/living/user, obj/item/attack_item) if(..()) return TRUE if(anchored) - default_deconstruction_screwdriver(user, icon_state, icon_state, I) + default_deconstruction_screwdriver(user, icon_state, icon_state, attack_item) update_appearance() else to_chat(user, span_warning("You must first secure [src].")) return TRUE -/obj/machinery/vending/attackby(obj/item/I, mob/living/user, params) - if(panel_open && is_wire_tool(I)) +/obj/machinery/vending/attackby(obj/item/attack_item, mob/living/user, params) + if(panel_open && is_wire_tool(attack_item)) wires.interact(user) return - if(refill_canister && istype(I, refill_canister)) + if(refill_canister && istype(attack_item, refill_canister)) if (!panel_open) to_chat(user, span_warning("You should probably unscrew the service panel first!")) else if (machine_stat & (BROKEN|NOPOWER)) to_chat(user, span_notice("[src] does not respond.")) else //if the panel is open we attempt to refill the machine - var/obj/item/vending_refill/canister = I + var/obj/item/vending_refill/canister = attack_item if(canister.get_part_rating() == 0) to_chat(user, span_warning("[canister] is empty!")) else @@ -632,20 +658,21 @@ else to_chat(user, span_warning("There's nothing to restock!")) return - if(compartmentLoadAccessCheck(user) && !user.combat_mode) - if(canLoadItem(I)) - loadingAttempt(I,user) - if(istype(I, /obj/item/storage/bag)) //trays USUALLY - var/obj/item/storage/T = I + if(compartmentLoadAccessCheck(user) && !user.combat_mode) + if(canLoadItem(attack_item)) + loadingAttempt(attack_item, user) + + if(istype(attack_item, /obj/item/storage/bag)) //trays USUALLY + var/obj/item/storage/storage_item = attack_item var/loaded = 0 var/denied_items = 0 - for(var/obj/item/the_item in T.contents) + for(var/obj/item/the_item in storage_item.contents) if(contents.len >= MAX_VENDING_INPUT_AMOUNT) // no more than 30 item can fit inside, legacy from snack vending although not sure why it exists to_chat(user, span_warning("[src]'s compartment is full.")) break - if(canLoadItem(the_item) && loadingAttempt(the_item,user)) - T.atom_storage?.attempt_remove(the_item, src) + if(canLoadItem(the_item) && loadingAttempt(the_item, user)) + storage_item.atom_storage?.attempt_remove(the_item, src) loaded++ else denied_items++ @@ -655,7 +682,7 @@ to_chat(user, span_notice("You insert [loaded] dishes into [src]'s compartment.")) else . = ..() - if(tiltable && !tilted && I.force) + if(tiltable && !tilted && attack_item.force) if(isclosedturf(get_turf(user))) //If the attacker is inside of a wall, immediately fall in the other direction, with no chance for goodies. var/opposite_direction = REVERSE_DIR(get_dir(src, user)) var/target = get_step(src, opposite_direction) @@ -663,38 +690,49 @@ return switch(rand(1, 100)) if(1 to 5) - freebie(user, 3) + freebie(3) if(6 to 15) - freebie(user, 2) + freebie(2) if(16 to 25) - freebie(user, 1) + freebie(1) if(26 to 75) return if(76 to 100) tilt(user) -/obj/machinery/vending/proc/freebie(mob/fatty, freebies) +/** + * Dispenses free items from the standard stock. + * Arguments: + * freebies - number of free items to vend + */ +/obj/machinery/vending/proc/freebie(freebies) visible_message(span_notice("[src] yields [freebies > 1 ? "several free goodies" : "a free goody"]!")) for(var/i in 1 to freebies) playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = -3) - for(var/datum/data/vending_product/R in shuffle(product_records)) + for(var/datum/data/vending_product/record in shuffle(product_records)) - if(R.amount <= 0) //Try to use a record that actually has something to dump. + if(record.amount <= 0) //Try to use a record that actually has something to dump. continue - var/dump_path = R.product_path + var/dump_path = record.product_path if(!dump_path) continue - if(R.amount > LAZYLEN(R.returned_products)) //always give out new stuff that costs before free returned stuff, because of the risk getting gibbed involved + if(record.amount > LAZYLEN(record.returned_products)) //always give out new stuff that costs before free returned stuff, because of the risk getting gibbed involved new dump_path(get_turf(src)) else - var/obj/returned_obj_to_dump = LAZYACCESS(R.returned_products, LAZYLEN(R.returned_products)) //first in, last out - LAZYREMOVE(R.returned_products, returned_obj_to_dump) + var/obj/returned_obj_to_dump = LAZYACCESS(record.returned_products, LAZYLEN(record.returned_products)) //first in, last out + LAZYREMOVE(record.returned_products, returned_obj_to_dump) returned_obj_to_dump.forceMove(get_turf(src)) - R.amount-- + record.amount-- break -/// Tilts ontop of the atom supplied, if crit is true some extra shit can happen. See [fall_and_crush] for return values. +/** + * Tilts ontop of the atom supplied, if crit is true some extra shit can happen. See [fall_and_crush] for return values. + * Arguments: + * fatty - atom to tilt the vendor onto + * local_crit_chance - percent chance of a critical hit + * forced_crit - specific critical hit case to use, if any +*/ /obj/machinery/vending/proc/tilt(atom/fatty, local_crit_chance = crit_chance, forced_crit = forcecrit) if(QDELETED(src) || !has_gravity(src)) return @@ -968,6 +1006,11 @@ return FALSE +/** + * Rights the vendor up, unpinning mobs under it, if any. + * Arguments: + * user - mob that has untilted the vendor + */ /obj/machinery/vending/proc/untilt(mob/user) if(user) user.visible_message(span_notice("[user] rights [src]."), \ @@ -983,22 +1026,29 @@ animate(src, transform = to_turn, 0.2 SECONDS) tilted_rotation = 0 -/obj/machinery/vending/proc/loadingAttempt(obj/item/I, mob/user) +/** + * Tries to insert the item into the vendor, and depending on whether the product is a part of the vendor's + * stock or not, increments an already present product entry's available amount or creates a new entry. + * arguments: + * inserted_item - the item we're trying to insert + * user - mob who's trying to insert the item + */ +/obj/machinery/vending/proc/loadingAttempt(obj/item/inserted_item, mob/user) . = TRUE - if(!user.transferItemToLoc(I, src)) + if(!user.transferItemToLoc(inserted_item, src)) return FALSE - to_chat(user, span_notice("You insert [I] into [src]'s input compartment.")) + to_chat(user, span_notice("You insert [inserted_item] into [src]'s input compartment.")) for(var/datum/data/vending_product/product_datum in product_records + coin_records + hidden_records) - if(ispath(I.type, product_datum.product_path)) + if(ispath(inserted_item.type, product_datum.product_path)) product_datum.amount++ - LAZYADD(product_datum.returned_products, I) + LAZYADD(product_datum.returned_products, inserted_item) return - if(vending_machine_input[format_text(I.name)]) - vending_machine_input[format_text(I.name)]++ + if(vending_machine_input[format_text(inserted_item.name)]) + vending_machine_input[format_text(inserted_item.name)]++ else - vending_machine_input[format_text(I.name)] = 1 + vending_machine_input[format_text(inserted_item.name)] = 1 loaded_items++ /obj/machinery/vending/unbuckle_mob(mob/living/buckled_mob, force = FALSE, can_fall = TRUE) @@ -1019,26 +1069,26 @@ to_chat(user, span_warning("[src]'s input compartment blinks red: Access denied.")) return FALSE -/obj/machinery/vending/exchange_parts(mob/user, obj/item/storage/part_replacer/W) - if(!istype(W)) +/obj/machinery/vending/exchange_parts(mob/user, obj/item/storage/part_replacer/replacer) + if(!istype(replacer)) return FALSE - if((flags_1 & NODECONSTRUCT_1) && !W.works_from_distance) + if((flags_1 & NODECONSTRUCT_1) && !replacer.works_from_distance) return FALSE if(!component_parts || !refill_canister) return FALSE var/moved = 0 - if(panel_open || W.works_from_distance) - if(W.works_from_distance) + if(panel_open || replacer.works_from_distance) + if(replacer.works_from_distance) display_parts(user) - for(var/I in W) - if(istype(I, refill_canister)) - moved += restock(I) + for(var/replacer_item in replacer) + if(istype(replacer, refill_canister)) + moved += restock(replacer_item) else display_parts(user) if(moved) to_chat(user, span_notice("[moved] items restocked.")) - W.play_rped_sound() + replacer.play_rped_sound() return TRUE /obj/machinery/vending/on_deconstruction() @@ -1088,6 +1138,8 @@ data["department"] = payment_department data["jobDiscount"] = DEPARTMENT_DISCOUNT data["product_records"] = list() + data["displayed_currency_icon"] = displayed_currency_icon + data["displayed_currency_name"] = displayed_currency_name var/list/categories = list() @@ -1099,6 +1151,13 @@ return data +/** + * Returns a list of given product records of the vendor to be used in UI. + * arguments: + * records - list of records available + * categories - list of categories available + * premium - bool of whether a record should be priced by a custom/premium price or not + */ /obj/machinery/vending/proc/collect_records_for_static_data(list/records, list/categories, premium) var/static/list/default_category = list( "name" = "Products", @@ -1134,17 +1193,17 @@ /obj/machinery/vending/ui_data(mob/user) . = list() - var/obj/item/card/id/C + var/obj/item/card/id/card_used if(isliving(user)) - var/mob/living/L = user - C = L.get_idcard(TRUE) - if(C?.registered_account) + var/mob/living/living_user = user + card_used = living_user.get_idcard(TRUE) + if(card_used?.registered_account) .["user"] = list() - .["user"]["name"] = C.registered_account.account_holder - .["user"]["cash"] = C.registered_account.account_balance - if(C.registered_account.account_job) - .["user"]["job"] = C.registered_account.account_job.title - .["user"]["department"] = C.registered_account.account_job.paycheck_department + .["user"]["name"] = card_used.registered_account.account_holder + .["user"]["cash"] = fetch_balance_to_use(card_used) + if(card_used.registered_account.account_job) + .["user"]["job"] = card_used.registered_account.account_job.title + .["user"]["department"] = card_used.registered_account.account_job.paycheck_department else .["user"]["job"] = "No Job" .["user"]["department"] = DEPARTMENT_UNASSIGNED @@ -1171,7 +1230,12 @@ if("select_colors") . = select_colors(params) -/obj/machinery/vending/proc/can_vend(user, silent=FALSE) +/** + * Whether this vendor can vend items or not. + * arguments: + * user - current customer + */ +/obj/machinery/vending/proc/can_vend(user) . = FALSE if(!vend_ready) return @@ -1180,6 +1244,9 @@ return return TRUE +/** + * Brings up a color config menu for the picked greyscaled item + */ /obj/machinery/vending/proc/select_colors(list/params) . = TRUE if(!can_vend(usr)) @@ -1209,89 +1276,85 @@ ) menu.ui_interact(usr) +/** + * Vends a greyscale modified item. + * arguments: + * menu - greyscale config menu that has been used to vend the item + */ /obj/machinery/vending/proc/vend_greyscale(list/params, datum/greyscale_modify_menu/menu) if(usr != menu.user) return vend(params, menu.split_colors) +/** + * The entire shebang of vending the picked item. Processes the vending and initiates the payment for the item. + * arguments: + * greyscale_colors - greyscale config for the item we're about to vend, if any + */ /obj/machinery/vending/proc/vend(list/params, list/greyscale_colors) . = TRUE if(!can_vend(usr)) return vend_ready = FALSE //One thing at a time!! - var/datum/data/vending_product/R = locate(params["ref"]) + var/datum/data/vending_product/item_record = locate(params["ref"]) var/list/record_to_check = product_records + coin_records if(extended_inventory) record_to_check = product_records + coin_records + hidden_records - if(!R || !istype(R) || !R.product_path) + if(!item_record || !istype(item_record) || !item_record.product_path) vend_ready = TRUE return var/price_to_use = default_price - if(R.custom_price) - price_to_use = R.custom_price - if(R in hidden_records) + if(item_record.custom_price) + price_to_use = item_record.custom_price + if(item_record in hidden_records) if(!extended_inventory) vend_ready = TRUE return - else if (!(R in record_to_check)) + else if (!(item_record in record_to_check)) vend_ready = TRUE message_admins("Vending machine exploit attempted by [ADMIN_LOOKUPFLW(usr)]!") return - if (R.amount <= 0) - speak("Sold out of [R.name].") + if (item_record.amount <= 0) + speak("Sold out of [item_record.name].") flick(icon_deny,src) vend_ready = TRUE return if(onstation) - var/obj/item/card/id/C + var/obj/item/card/id/card_used if(isliving(usr)) - var/mob/living/L = usr - C = L.get_idcard(TRUE) - if(!C) + var/mob/living/living_user = usr + card_used = living_user.get_idcard(TRUE) + if(!card_used) speak("No card found.") flick(icon_deny,src) vend_ready = TRUE return - else if (!C.registered_account) + else if (!card_used.registered_account) speak("No account found.") flick(icon_deny,src) vend_ready = TRUE return - else if(!C.registered_account.account_job) + else if(!card_used.registered_account.account_job) speak("Departmental accounts have been blacklisted from personal expenses due to embezzlement.") flick(icon_deny, src) vend_ready = TRUE return - else if(age_restrictions && R.age_restricted && (!C.registered_age || C.registered_age < AGE_MINOR)) - speak("You are not of legal age to purchase [R.name].") + else if(age_restrictions && item_record.age_restricted && (!card_used.registered_age || card_used.registered_age < AGE_MINOR)) + speak("You are not of legal age to purchase [item_record.name].") if(!(usr in GLOB.narcd_underages)) if (isnull(sec_radio)) sec_radio = new (src) sec_radio.set_listening(FALSE) sec_radio.set_frequency(FREQ_SECURITY) - sec_radio.talk_into(src, "SECURITY ALERT: [usr] recorded attempting to purchase [R.name] in [get_area(src)]. Please watch for substance abuse.", FREQ_SECURITY) // SKYRAT EDIT CHANGE + sec_radio.talk_into(src, "SECURITY ALERT: [usr] recorded attempting to purchase [item_record.name] in [get_area(src)]. Please watch for substance abuse.", FREQ_SECURITY) // SKYRAT EDIT CHANGE GLOB.narcd_underages += usr flick(icon_deny,src) vend_ready = TRUE return - var/datum/bank_account/account = C.registered_account - if(account.account_job && account.account_job.paycheck_department == payment_department) - price_to_use = max(round(price_to_use * DEPARTMENT_DISCOUNT), 1) //No longer free, but signifigantly cheaper. - if(coin_records.Find(R) || hidden_records.Find(R)) - price_to_use = R.custom_premium_price ? R.custom_premium_price : extra_price - if(LAZYLEN(R.returned_products)) - price_to_use = 0 //returned items are free - if(price_to_use && !account.adjust_money(-price_to_use, "Vending: [R.name]")) - speak("You do not possess the funds to purchase [R.name].") - flick(icon_deny,src) - vend_ready = TRUE + + if(!proceed_payment(card_used, item_record, price_to_use)) return - var/datum/bank_account/D = SSeconomy.get_dep_account(payment_department) - if(D) - D.adjust_money(price_to_use) - SSblackbox.record_feedback("amount", "vending_spent", price_to_use) - SSeconomy.track_purchase(account, price_to_use, name) - log_econ("[price_to_use] credits were inserted into [src] by [account.account_holder] to buy [R].") + if(last_shopper != REF(usr) || purchase_message_cooldown < world.time) var/vend_response = vend_reply || "Thank you for shopping with [src]!" speak(vend_response) @@ -1303,22 +1366,60 @@ flick(icon_vend,src) playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = -3) var/obj/item/vended_item - if(!LAZYLEN(R.returned_products)) //always give out free returned stuff first, e.g. to avoid walling a traitor objective in a bag behind paid items - vended_item = new R.product_path(get_turf(src)) + if(!LAZYLEN(item_record.returned_products)) //always give out free returned stuff first, e.g. to avoid walling a traitor objective in a bag behind paid items + vended_item = new item_record.product_path(get_turf(src)) else - vended_item = LAZYACCESS(R.returned_products, LAZYLEN(R.returned_products)) //first in, last out - LAZYREMOVE(R.returned_products, vended_item) + vended_item = LAZYACCESS(item_record.returned_products, LAZYLEN(item_record.returned_products)) //first in, last out + LAZYREMOVE(item_record.returned_products, vended_item) vended_item.forceMove(get_turf(src)) if(greyscale_colors) vended_item.set_greyscale(colors=greyscale_colors) - R.amount-- + item_record.amount-- if(usr.CanReach(src) && usr.put_in_hands(vended_item)) - to_chat(usr, span_notice("You take [R.name] out of the slot.")) + to_chat(usr, span_notice("You take [item_record.name] out of the slot.")) else - to_chat(usr, span_warning("[capitalize(R.name)] falls onto the floor!")) - SSblackbox.record_feedback("nested tally", "vending_machine_usage", 1, list("[type]", "[R.product_path]")) + to_chat(usr, span_warning("[capitalize(item_record.name)] falls onto the floor!")) + SSblackbox.record_feedback("nested tally", "vending_machine_usage", 1, list("[type]", "[item_record.product_path]")) vend_ready = TRUE +/** + * Returns the balance that the vendor will use for proceeding payment. Most vendors would want to use the user's + * card's account credits balance. + * arguments: + * passed_id - the id card that will be billed for the product + */ +/obj/machinery/vending/proc/fetch_balance_to_use(obj/item/card/id/passed_id) + return passed_id.registered_account.account_balance + +/** + * Handles payment processing: discounts, logging, balance change etc. + * arguments: + * paying_id_card - the id card that will be billed for the product + * product_to_vend - the product record of the item we're trying to vend + * price_to_use - price of the item we're trying to vend + */ +/obj/machinery/vending/proc/proceed_payment(obj/item/card/id/paying_id_card, datum/data/vending_product/product_to_vend, price_to_use) + var/datum/bank_account/account = paying_id_card.registered_account + if(account.account_job && account.account_job.paycheck_department == payment_department) + price_to_use = max(round(price_to_use * DEPARTMENT_DISCOUNT), 1) //No longer free, but signifigantly cheaper. + if(coin_records.Find(product_to_vend) || hidden_records.Find(product_to_vend)) + price_to_use = product_to_vend.custom_premium_price ? product_to_vend.custom_premium_price : extra_price + if(LAZYLEN(product_to_vend.returned_products)) + price_to_use = 0 //returned items are free + if(price_to_use && !account.adjust_money(-price_to_use, "Vending: [product_to_vend.name]")) + speak("You do not possess the funds to purchase [product_to_vend.name].") + flick(icon_deny,src) + vend_ready = TRUE + return FALSE + //actual payment here + var/datum/bank_account/paying_id_account = SSeconomy.get_dep_account(payment_department) + if(paying_id_account) + paying_id_account.adjust_money(price_to_use) + SSblackbox.record_feedback("amount", "vending_spent", price_to_use) + SSeconomy.track_purchase(account, price_to_use, name) + log_econ("[price_to_use] credits were inserted into [src] by [account.account_holder] to buy [product_to_vend].") + return TRUE + /obj/machinery/vending/process(seconds_per_tick) if(machine_stat & (BROKEN|NOPOWER)) return PROCESS_KILL @@ -1336,6 +1437,7 @@ if(shoot_inventory && SPT_PROB(shoot_inventory_chance, seconds_per_tick)) throw_item() + /** * Speak the given message verbally * @@ -1370,19 +1472,19 @@ if(!target) return FALSE - for(var/datum/data/vending_product/R in shuffle(product_records)) - if(R.amount <= 0) //Try to use a record that actually has something to dump. + for(var/datum/data/vending_product/record in shuffle(product_records)) + if(record.amount <= 0) //Try to use a record that actually has something to dump. continue - var/dump_path = R.product_path + var/dump_path = record.product_path if(!dump_path) continue - if(R.amount > LAZYLEN(R.returned_products)) //always throw new stuff that costs before free returned stuff, because of the hacking effort and time between throws involved + if(record.amount > LAZYLEN(record.returned_products)) //always throw new stuff that costs before free returned stuff, because of the hacking effort and time between throws involved throw_item = new dump_path(loc) else - throw_item = LAZYACCESS(R.returned_products, LAZYLEN(R.returned_products)) //first in, last out + throw_item = LAZYACCESS(record.returned_products, LAZYLEN(record.returned_products)) //first in, last out throw_item.forceMove(loc) - LAZYREMOVE(R.returned_products, throw_item) - R.amount-- + LAZYREMOVE(record.returned_products, throw_item) + record.amount-- break if(!throw_item) return FALSE @@ -1392,16 +1494,18 @@ throw_item.throw_at(target, 16, 3) visible_message(span_danger("[src] launches [throw_item] at [target]!")) return TRUE + /** * A callback called before an item is tossed out * * Override this if you need to do any special case handling * * Arguments: - * * I - obj/item being thrown + * * thrown_item - obj/item being thrown */ -/obj/machinery/vending/proc/pre_throw(obj/item/I) +/obj/machinery/vending/proc/pre_throw(obj/item/thrown_item) return + /** * Shock the passed in user * @@ -1410,16 +1514,15 @@ * * Arguments: * * user - the user to shock - * * prb - probability the shock happens + * * shock_chance - probability the shock happens */ -/obj/machinery/vending/proc/shock(mob/living/user, prb) +/obj/machinery/vending/proc/shock(mob/living/user, shock_chance) if(!istype(user) || machine_stat & (BROKEN|NOPOWER)) // unpowered, no shock return FALSE - if(!prob(prb)) + if(!prob(shock_chance)) return FALSE do_sparks(5, TRUE, src) - var/check_range = TRUE - if(electrocute_mob(user, get_area(src), src, 0.7, check_range)) + if(electrocute_mob(user, get_area(src), src, 0.7, dist_check = TRUE)) return TRUE else return FALSE @@ -1427,22 +1530,22 @@ * Are we able to load the item passed in * * Arguments: - * * I - the item being loaded + * * loaded_item - the item being loaded * * user - the user doing the loading */ -/obj/machinery/vending/proc/canLoadItem(obj/item/I, mob/user) - if((I.type in products) || (I.type in premium) || (I.type in contraband)) +/obj/machinery/vending/proc/canLoadItem(obj/item/loaded_item, mob/user) + if((loaded_item.type in products) || (loaded_item.type in premium) || (loaded_item.type in contraband)) return TRUE - to_chat(user, span_warning("[src] does not accept [I]!")) + to_chat(user, span_warning("[src] does not accept [loaded_item]!")) return FALSE -/obj/machinery/vending/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) +/obj/machinery/vending/hitby(atom/movable/hitting_atom, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) . = ..() - var/mob/living/L = AM - if(tilted || !istype(L) || !prob(20 * (throwingdatum.speed - L.throw_speed))) // hulk throw = +20%, neckgrab throw = +20% + var/mob/living/living_mob = hitting_atom + if(tilted || !istype(living_mob) || !prob(20 * (throwingdatum.speed - living_mob.throw_speed))) // hulk throw = +20%, neckgrab throw = +20% return - tilt(L) + tilt(living_mob) /obj/machinery/vending/attack_tk_grab(mob/user) to_chat(user, span_warning("[src] seems to resist your mental grasp!")) @@ -1478,23 +1581,23 @@ if(id_card?.registered_account && id_card.registered_account == linked_account) return TRUE -/obj/machinery/vending/custom/canLoadItem(obj/item/I, mob/user) +/obj/machinery/vending/custom/canLoadItem(obj/item/loaded_item, mob/user) . = FALSE - if(I.flags_1 & HOLOGRAM_1) + if(loaded_item.flags_1 & HOLOGRAM_1) speak("This vendor cannot accept nonexistent items.") return if(loaded_items >= max_loaded_items) speak("There are too many items in stock.") return - if(isstack(I)) + if(isstack(loaded_item)) speak("Loose items may cause problems, try to use it inside wrapping paper.") return - if(I.custom_price) + if(loaded_item.custom_price) return TRUE /obj/machinery/vending/custom/ui_interact(mob/user) if(!linked_account) - balloon_alert(user, "no registered owner") + balloon_alert(user, "no registered owner!") return FALSE return ..() @@ -1502,25 +1605,25 @@ . = ..() .["access"] = compartmentLoadAccessCheck(user) .["vending_machine_input"] = list() - for (var/O in vending_machine_input) - if(vending_machine_input[O] > 0) + for (var/stocked_item in vending_machine_input) + if(vending_machine_input[stocked_item] > 0) var/base64 var/price = 0 - for(var/obj/item/T in contents) - if(format_text(T.name) == O) - price = T.custom_price - if(!base64) - if(base64_cache[T.type]) - base64 = base64_cache[T.type] + for(var/obj/item/stored_item in contents) + if(format_text(stored_item.name) == stocked_item) + price = stored_item.custom_price + if(!base64) //generate an icon of the item to use in UI + if(base64_cache[stored_item.type]) + base64 = base64_cache[stored_item.type] else - base64 = icon2base64(getFlatIcon(T, no_anim=TRUE)) - base64_cache[T.type] = base64 + base64 = icon2base64(getFlatIcon(stored_item, no_anim=TRUE)) + base64_cache[stored_item.type] = base64 break var/list/data = list( - name = O, + name = stocked_item, price = price, img = base64, - amount = vending_machine_input[O], + amount = vending_machine_input[stocked_item], colorable = FALSE ) .["vending_machine_input"] += list(data) @@ -1536,16 +1639,16 @@ vend_ready = TRUE return TRUE -/obj/machinery/vending/custom/attackby(obj/item/I, mob/user, params) +/obj/machinery/vending/custom/attackby(obj/item/attack_item, mob/user, params) if(!linked_account && isliving(user)) - var/mob/living/L = user - var/obj/item/card/id/C = L.get_idcard(TRUE) - if(C?.registered_account) - linked_account = C.registered_account - speak("\The [src] has been linked to [C].") + var/mob/living/living_user = user + var/obj/item/card/id/card_used = living_user.get_idcard(TRUE) + if(card_used?.registered_account) + linked_account = card_used.registered_account + speak("\The [src] has been linked to [card_used].") if(compartmentLoadAccessCheck(user)) - if(istype(I, /obj/item/pen)) + if(istype(attack_item, /obj/item/pen)) name = tgui_input_text(user, "Set name", "Name", name, 20) desc = tgui_input_text(user, "Set description", "Description", desc, 60) slogan_list += tgui_input_text(user, "Set slogan", "Slogan", "Epic", 60) @@ -1554,7 +1657,7 @@ return ..() -/obj/machinery/vending/custom/crowbar_act(mob/living/user, obj/item/I) +/obj/machinery/vending/custom/crowbar_act(mob/living/user, obj/item/attack_item) return FALSE /obj/machinery/vending/custom/deconstruct(disassembled) @@ -1578,7 +1681,7 @@ var/obj/item/card/id/id_card = user.get_idcard(TRUE) vend_ready = FALSE if(!id_card || !id_card.registered_account || !id_card.registered_account.account_job) - balloon_alert(usr, "no card found") + balloon_alert(usr, "no card found!") flick(icon_deny, src) return TRUE var/datum/bank_account/payee = id_card.registered_account @@ -1591,7 +1694,7 @@ /// Charges the user if its not the owner if(!compartmentLoadAccessCheck(user)) if(!payee.has_money(dispensed_item.custom_price)) - balloon_alert(user, "insufficient funds") + balloon_alert(user, "insufficient funds!") return TRUE /// Make the transaction payee.adjust_money(-dispensed_item.custom_price, , "Vending: [dispensed_item]") diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index e88e31b678e..55e19152528 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -96,6 +96,7 @@ /obj/item/clothing/under/rank/civilian/mime/skirt = 1, /obj/item/clothing/under/rank/civilian/clown/jester = 1, /obj/item/clothing/head/costume/jester = 1, + /obj/item/clothing/shoes/jester_shoes = 1, /obj/item/clothing/under/costume/villain = 1, /obj/item/clothing/suit/costume/joker = 1, /obj/item/clothing/under/costume/joker = 1, @@ -161,6 +162,7 @@ "products" = list( /obj/item/clothing/under/costume/buttondown/slacks/service = 1, /obj/item/clothing/under/costume/buttondown/skirt/service = 1, + /obj/item/clothing/neck/bowtie = 2, /obj/item/clothing/accessory/waistcoat = 1, /obj/item/clothing/under/suit/waiter = 1, /obj/item/clothing/suit/apron = 1, diff --git a/code/modules/vending/boozeomat.dm b/code/modules/vending/boozeomat.dm index 55ebae147f6..791b1c6f715 100644 --- a/code/modules/vending/boozeomat.dm +++ b/code/modules/vending/boozeomat.dm @@ -32,6 +32,11 @@ /obj/item/reagent_containers/cup/glass/bottle/beer = 6, /obj/item/reagent_containers/cup/glass/bottle/vodka = 5, /obj/item/reagent_containers/cup/glass/bottle/whiskey = 5, + /obj/item/reagent_containers/cup/glass/bottle/coconut_rum = 5, + /obj/item/reagent_containers/cup/glass/bottle/yuyake = 5, + /obj/item/reagent_containers/cup/glass/bottle/shochu = 5, + /obj/item/reagent_containers/cup/soda_cans/beer = 10, + /obj/item/reagent_containers/cup/soda_cans/beer/rice = 10, ), ), @@ -49,6 +54,8 @@ /obj/item/reagent_containers/cup/soda_cans/sol_dry = 8, /obj/item/reagent_containers/cup/soda_cans/cola = 8, /obj/item/reagent_containers/cup/soda_cans/tonic = 8, + /obj/item/reagent_containers/cup/glass/bottle/hakka_mate = 5, + /obj/item/reagent_containers/cup/soda_cans/melon_soda = 5, ), ), diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index 266b61fa7f3..0d2f63597b6 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -25,6 +25,7 @@ /obj/item/clothing/neck/large_scarf/blue = 6, /obj/item/clothing/neck/infinity_scarf = 6, /obj/item/clothing/neck/tie = 6, + /obj/item/clothing/neck/bowtie = 6, /obj/item/clothing/head/rasta = 3, /obj/item/clothing/head/chaplain/kippah = 3, /obj/item/clothing/head/chaplain/taqiyah/red = 3, @@ -81,7 +82,6 @@ /obj/item/clothing/under/dress/striped = 1, /obj/item/clothing/under/dress/sailor = 1, /obj/item/clothing/under/dress/redeveninggown = 1, - /obj/item/clothing/suit/apron/purple_bartender = 2, /obj/item/clothing/under/misc/pj/blue = 2, /obj/item/clothing/under/misc/pj/red = 2, ), @@ -94,6 +94,7 @@ /obj/item/clothing/suit/toggle/jacket/sweater = 4, /obj/item/clothing/suit/jacket/oversized = 4, /obj/item/clothing/suit/jacket/fancy = 4, + /obj/item/clothing/suit/toggle/lawyer/greyscale = 4, /obj/item/clothing/suit/hooded/wintercoat/custom = 2, /obj/item/clothing/suit/hooded/wintercoat = 2, /obj/item/clothing/under/suit/navy = 1, @@ -114,8 +115,9 @@ /obj/item/clothing/under/suit/white/skirt = 2, /obj/item/clothing/under/rank/captain/suit/skirt = 2, /obj/item/clothing/under/rank/civilian/head_of_personnel/suit/skirt = 2, - /obj/item/clothing/under/rank/civilian/bartender/purple = 2, + /obj/item/clothing/under/rank/civilian/purple_bartender = 2, /obj/item/clothing/suit/jacket/miljacket = 1, + /obj/item/clothing/suit/apron/overalls = 2, ), ), diff --git a/code/modules/vending/cola.dm b/code/modules/vending/cola.dm index 4aa932e4b10..dd4a4dd4b99 100644 --- a/code/modules/vending/cola.dm +++ b/code/modules/vending/cola.dm @@ -17,6 +17,7 @@ /obj/item/reagent_containers/cup/soda_cans/sol_dry = 10, /obj/item/reagent_containers/cup/glass/waterbottle = 10, /obj/item/reagent_containers/cup/glass/bottle/mushi_kombucha = 3, + /obj/item/reagent_containers/cup/soda_cans/volt_energy = 3, ) contraband = list( /obj/item/reagent_containers/cup/soda_cans/thirteenloko = 6, diff --git a/code/modules/vending/snack.dm b/code/modules/vending/snack.dm index 22d17761bf1..ec633084fd8 100644 --- a/code/modules/vending/snack.dm +++ b/code/modules/vending/snack.dm @@ -24,6 +24,11 @@ /obj/item/reagent_containers/cup/glass/dry_ramen = 3, /obj/item/storage/box/gum = 3, /obj/item/food/energybar = 6, + /obj/item/food/hot_shots = 6, + /obj/item/food/sticko = 6, + /obj/item/food/sticko/random = 3, + /obj/item/food/shok_roks = 6, + /obj/item/food/shok_roks/random = 3, ) contraband = list( /obj/item/food/syndicake = 6, diff --git a/code/modules/vending/sustenance.dm b/code/modules/vending/sustenance.dm index b6cd5c511a3..1a2589fcdf1 100644 --- a/code/modules/vending/sustenance.dm +++ b/code/modules/vending/sustenance.dm @@ -29,3 +29,45 @@ /obj/item/vending_refill/sustenance machine_name = "Sustenance Vendor" icon_state = "refill_snack" + +//Labor camp subtype that uses labor points obtained from mining and processing ore +/obj/machinery/vending/sustenance/labor_camp + name = "\improper Labor Camp Sustenance Vendor" + desc = "A vending machine which vends food, as required by section 47-C of the NT's Prisoner Ethical Treatment Agreement. \ + This one, however, processes labor points for its products if the user is incarcerated." + icon_state = "sustenance_labor" + onstation_override = TRUE + displayed_currency_icon = "digging" + displayed_currency_name = " LP" + +/obj/machinery/vending/sustenance/interact(mob/user) + if(isliving(user)) + var/mob/living/living_user = user + if(!(machine_stat & NOPOWER) && !istype(living_user.get_idcard(TRUE), /obj/item/card/id/advanced/prisoner)) + speak("No valid labor points account found. Vending is not permitted.") + return + return ..() + +/obj/machinery/vending/sustenance/proceed_payment(obj/item/card/id/paying_id_card, datum/data/vending_product/product_to_vend, price_to_use) + if(!istype(paying_id_card, /obj/item/card/id/advanced/prisoner)) + speak("I don't take bribes! Pay with labor points!") + return FALSE + var/obj/item/card/id/advanced/prisoner/paying_scum_id = paying_id_card + if(coin_records.Find(product_to_vend) || hidden_records.Find(product_to_vend)) + price_to_use = product_to_vend.custom_premium_price ? product_to_vend.custom_premium_price : extra_price + if(LAZYLEN(product_to_vend.returned_products)) + price_to_use = 0 //returned items are free + if(price_to_use && !(paying_scum_id.points >= price_to_use)) //not enough good prisoner points + speak("You do not possess enough points to purchase [product_to_vend.name].") + flick(icon_deny, src) + vend_ready = TRUE + return FALSE + + paying_scum_id.points -= price_to_use + return TRUE + +/obj/machinery/vending/sustenance/fetch_balance_to_use(obj/item/card/id/passed_id) + if(!istype(passed_id, /obj/item/card/id/advanced/prisoner)) + return null //no points balance - no balance at all + var/obj/item/card/id/advanced/prisoner/paying_scum_id = passed_id + return paying_scum_id.points diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 49861498095..01a62672230 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -32,6 +32,7 @@ /obj/item/storage/backpack/security = 3, /obj/item/storage/backpack/satchel/sec = 3, /obj/item/storage/backpack/duffelbag/sec = 3, + /obj/item/storage/backpack/messenger/sec = 3, ) premium = list( /obj/item/clothing/under/rank/security/officer/formal = 3, @@ -82,6 +83,7 @@ /obj/item/storage/backpack/duffelbag/med = 4, /obj/item/storage/backpack/medic = 4, /obj/item/storage/backpack/satchel/med = 4, + /obj/item/storage/backpack/messenger/med = 4, /obj/item/radio/headset/headset_med = 4, ) refill_canister = /obj/item/vending_refill/wardrobe/medi_wardrobe @@ -111,6 +113,7 @@ /obj/item/storage/backpack/industrial = 3, /obj/item/storage/backpack/satchel/eng = 3, /obj/item/storage/backpack/duffelbag/engineering = 3, + /obj/item/storage/backpack/messenger/eng = 3, ) refill_canister = /obj/item/vending_refill/wardrobe/engi_wardrobe payment_department = ACCOUNT_ENG @@ -134,6 +137,7 @@ /obj/item/storage/backpack/satchel/eng = 3, /obj/item/storage/backpack/industrial = 3, /obj/item/storage/backpack/duffelbag/engineering = 3, + /obj/item/storage/backpack/messenger/eng = 3, ) refill_canister = /obj/item/vending_refill/wardrobe/atmos_wardrobe payment_department = ACCOUNT_ENG @@ -153,7 +157,9 @@ /obj/item/clothing/mask/bandana/striped/cargo = 3, /obj/item/clothing/head/soft = 3, /obj/item/clothing/under/rank/cargo/tech = 3, + /obj/item/clothing/under/rank/cargo/tech/alt = 3, /obj/item/clothing/under/rank/cargo/tech/skirt = 3, + /obj/item/clothing/suit/toggle/cargo_tech = 3, /obj/item/clothing/suit/hooded/wintercoat/cargo = 3, /obj/item/clothing/gloves/fingerless = 3, /obj/item/clothing/shoes/sneakers/black = 3, @@ -161,6 +167,7 @@ /obj/item/storage/backpack/satchel = 3, /obj/item/storage/backpack/satchel/leather = 3, /obj/item/storage/backpack/duffelbag = 3, + /obj/item/storage/backpack/messenger = 3, /obj/item/storage/bag/mail = 3, /obj/item/radio/headset/headset_cargo = 3, ) @@ -194,6 +201,7 @@ /obj/item/storage/backpack/science = 3, /obj/item/storage/backpack/satchel/science = 3, /obj/item/storage/backpack/duffelbag/science = 3, + /obj/item/storage/backpack/messenger/science = 3, /obj/item/radio/headset/headset_sci = 2, ) contraband = list( @@ -228,6 +236,7 @@ /obj/item/storage/backpack/science = 3, /obj/item/storage/backpack/satchel/science = 3, /obj/item/storage/backpack/duffelbag/science = 3, + /obj/item/storage/backpack/messenger/science = 3, /obj/item/radio/headset/headset_sci = 3, ) refill_canister = /obj/item/vending_refill/wardrobe/science_wardrobe @@ -253,6 +262,7 @@ /obj/item/storage/backpack/botany = 3, /obj/item/storage/backpack/satchel/hyd = 3, /obj/item/storage/backpack/duffelbag/hydroponics = 3, + /obj/item/storage/backpack/messenger/hyd = 3, /obj/item/radio/headset/headset_srv = 3, ) refill_canister = /obj/item/vending_refill/wardrobe/hydro_wardrobe @@ -283,7 +293,9 @@ /obj/item/clothing/under/rank/captain/suit/skirt = 1, /obj/item/clothing/under/rank/civilian/head_of_personnel/suit = 1, /obj/item/clothing/under/rank/civilian/head_of_personnel/suit/skirt = 1, + /obj/item/clothing/suit/toggle/lawyer/greyscale = 1, /obj/item/storage/backpack/satchel/explorer = 1, + /obj/item/storage/backpack/messenger/explorer = 1, /obj/item/storage/bag/books = 1, /obj/item/radio/headset/headset_srv = 2, ) @@ -314,6 +326,7 @@ /obj/item/storage/backpack/coroner = 1, /obj/item/storage/backpack/satchel/coroner = 1, /obj/item/storage/backpack/duffelbag/coroner = 1, + /obj/item/storage/backpack/messenger/coroner = 1, /obj/item/storage/box/bodybags = 3, /obj/item/scalpel/cruel = 1, /obj/item/retractor/cruel = 1, @@ -350,11 +363,11 @@ /obj/item/clothing/head/hats/tophat = 2, /obj/item/clothing/head/soft/black = 2, /obj/item/clothing/neck/petcollar = 1, + /obj/item/clothing/neck/bowtie = 2, /obj/item/clothing/under/costume/buttondown/slacks/service = 2, - /obj/item/clothing/under/rank/civilian/bartender = 2, - /obj/item/clothing/under/rank/civilian/bartender/purple = 2, - /obj/item/clothing/under/rank/civilian/bartender/skirt = 2, - /obj/item/clothing/suit/apron/purple_bartender = 2, + /obj/item/clothing/under/costume/buttondown/skirt/service = 2, + /obj/item/clothing/under/rank/civilian/purple_bartender = 2, + /obj/item/clothing/suit/toggle/lawyer/greyscale = 1, /obj/item/clothing/suit/armor/vest/alt = 1, /obj/item/clothing/shoes/sneakers/black = 2, /obj/item/storage/belt/bandolier = 1, @@ -384,8 +397,8 @@ /obj/item/clothing/accessory/waistcoat = 2, /obj/item/clothing/head/soft/mime = 2, /obj/item/clothing/head/utility/chefhat = 2, - /obj/item/clothing/under/rank/civilian/chef = 2, - /obj/item/clothing/under/rank/civilian/chef/skirt = 2, + /obj/item/clothing/under/costume/buttondown/slacks/service = 2, + /obj/item/clothing/under/costume/buttondown/skirt/service = 2, /obj/item/clothing/under/rank/civilian/cookjorts = 2, /obj/item/clothing/under/suit/waiter = 2, /obj/item/clothing/suit/apron/chef = 2, @@ -458,9 +471,12 @@ /obj/item/clothing/under/rank/civilian/lawyer/purpsuit = 1, /obj/item/clothing/under/rank/civilian/lawyer/purpsuit/skirt = 1, /obj/item/clothing/suit/toggle/lawyer/purple = 1, + /obj/item/clothing/under/costume/buttondown/slacks/service = 1, + /obj/item/clothing/under/costume/buttondown/skirt/service = 1, + /obj/item/clothing/suit/toggle/lawyer/black = 1, + /obj/item/clothing/suit/toggle/lawyer/greyscale = 1, /obj/item/clothing/under/suit/black = 1, /obj/item/clothing/under/suit/black/skirt = 1, - /obj/item/clothing/suit/toggle/lawyer/black = 1, /obj/item/clothing/under/rank/civilian/lawyer/beige = 1, /obj/item/clothing/under/rank/civilian/lawyer/beige/skirt = 1, /obj/item/clothing/under/suit/black_really = 1, @@ -541,6 +557,7 @@ /obj/item/storage/backpack/chemistry = 2, /obj/item/storage/backpack/satchel/chem = 2, /obj/item/storage/backpack/duffelbag/chemistry = 2, + /obj/item/storage/backpack/messenger/chem = 2, /obj/item/storage/bag/chemistry = 2, /obj/item/ph_booklet = 3, /obj/item/radio/headset/headset_med = 2, @@ -570,6 +587,7 @@ /obj/item/storage/backpack/genetics = 2, /obj/item/storage/backpack/satchel/gen = 2, /obj/item/storage/backpack/duffelbag/genetics = 2, + /obj/item/storage/backpack/messenger/gen = 2, /obj/item/radio/headset/headset_sci = 2, ) refill_canister = /obj/item/vending_refill/wardrobe/gene_wardrobe @@ -596,6 +614,7 @@ /obj/item/storage/backpack/virology = 2, /obj/item/storage/backpack/satchel/vir = 2, /obj/item/storage/backpack/duffelbag/virology = 2, + /obj/item/storage/backpack/messenger/vir = 2, /obj/item/radio/headset/headset_med = 2, ) refill_canister = /obj/item/vending_refill/wardrobe/viro_wardrobe diff --git a/code/modules/wiremod/components/abstract/assoc_list_variable.dm b/code/modules/wiremod/components/abstract/assoc_list_variable.dm new file mode 100644 index 00000000000..9ad489a6ee5 --- /dev/null +++ b/code/modules/wiremod/components/abstract/assoc_list_variable.dm @@ -0,0 +1,5 @@ +/obj/item/circuit_component/variable/assoc_list + circuit_size = 1 + +/obj/item/circuit_component/variable/assoc_list/get_variable_list(obj/item/integrated_circuit/integrated_circuit) + return integrated_circuit.assoc_list_variables diff --git a/code/modules/wiremod/components/list/assoc_list_remove.dm b/code/modules/wiremod/components/list/assoc_list_remove.dm new file mode 100644 index 00000000000..04b3b489d68 --- /dev/null +++ b/code/modules/wiremod/components/list/assoc_list_remove.dm @@ -0,0 +1,25 @@ +/** + * # Associative List Remove Component + * + * Removes an element from an assoc list. + */ +/obj/item/circuit_component/variable/assoc_list/list_remove + display_name = "Associative List Remove" + desc = "Removes a key from an associative list variable." + category = "List" + + /// Key to remove to the list + var/datum/port/input/to_remove + + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + +/obj/item/circuit_component/variable/assoc_list/list_remove/populate_ports() + to_remove = add_input_port("To Remove", PORT_TYPE_STRING) + +/obj/item/circuit_component/variable/assoc_list/list_remove/input_received(datum/port/input/port, list/return_values) + if(!current_variable) + return + var/list/info = current_variable.value + var/value_to_remove = to_remove.value + + info -= value_to_remove diff --git a/code/modules/wiremod/components/list/assoc_list_set.dm b/code/modules/wiremod/components/list/assoc_list_set.dm new file mode 100644 index 00000000000..098212df8e1 --- /dev/null +++ b/code/modules/wiremod/components/list/assoc_list_set.dm @@ -0,0 +1,54 @@ +/** + * # Assoc List Set Component + * + * Sets a string value on an assoc list. + */ +/obj/item/circuit_component/variable/assoc_list/list_set + display_name = "Associative List Set" + desc = "Sets a string key on an associative list to a specific value." + category = "List" + + /// Key to set + var/datum/port/input/key + /// Value to set the key to. + var/datum/port/input/value + /// For when the list is too long, a signal is sent here. + var/datum/port/output/failed + + var/max_list_size = 500 + + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + +/obj/item/circuit_component/variable/assoc_list/list_set/get_ui_notices() + . = ..() + . += create_ui_notice("Max List Size: [max_list_size]", "orange", "sitemap") + +/obj/item/circuit_component/variable/assoc_list/list_set/populate_ports() + key = add_input_port("Key", PORT_TYPE_STRING) + value = add_input_port("Value", PORT_TYPE_ANY) + failed = add_output_port("Failed", PORT_TYPE_SIGNAL) + +/obj/item/circuit_component/variable/assoc_list/list_set/pre_input_received(datum/port/input/port) + . = ..() + if(current_variable) + value.set_datatype(current_variable.datatype_handler.get_datatype(2)) + +/obj/item/circuit_component/variable/assoc_list/list_set/input_received(datum/port/input/port, list/return_values) + if(!current_variable) + return + var/list/info = current_variable.value + var/key_to_set = key.value + var/value_to_set = value.value + + if(!key_to_set) + failed.set_output(COMPONENT_SIGNAL) + return + + if(length(info) >= max_list_size) + failed.set_output(COMPONENT_SIGNAL) + return + + if(isdatum(value_to_set)) + value_to_set = WEAKREF(value_to_set) + + info[key_to_set] = value_to_set diff --git a/code/modules/wiremod/components/list/list_in.dm b/code/modules/wiremod/components/list/list_find.dm similarity index 76% rename from code/modules/wiremod/components/list/list_in.dm rename to code/modules/wiremod/components/list/list_find.dm index 1c95979354b..995b6c5247a 100644 --- a/code/modules/wiremod/components/list/list_in.dm +++ b/code/modules/wiremod/components/list/list_find.dm @@ -1,11 +1,11 @@ /** - * # List Add Component + * # List Find Component * - * Adds an element to a list. + * Finds an element in a list and returns the index. */ /obj/item/circuit_component/listin display_name = "Element Find" - desc = "Checks if an element is in a list." + desc = "Checks if an element is in a list and returns the index it is as if it is. Index is set to 0 on failure." category = "List" /// The list type we're checking @@ -22,6 +22,8 @@ var/datum/port/output/not_found /// Result of the search var/datum/port/output/result + /// Index of the element if found. + var/datum/port/output/index circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL @@ -35,6 +37,7 @@ found = add_output_port("Succeeded", PORT_TYPE_SIGNAL) not_found = add_output_port("Failed", PORT_TYPE_SIGNAL) result = add_output_port("Result", PORT_TYPE_NUMBER) + index = add_output_port("Index", PORT_TYPE_NUMBER) /obj/item/circuit_component/listin/pre_input_received(datum/port/input/port) . = ..() @@ -50,9 +53,11 @@ if(isdatum(data_to_check)) data_to_check = WEAKREF(data_to_check) - var/actual_result = (data_to_check in info) - if(actual_result) + var/actual_result = info.Find(data_to_check) + index.set_output(actual_result) + if(actual_result != 0) + result.set_output(TRUE) found.set_output(COMPONENT_SIGNAL) else + result.set_output(FALSE) not_found.set_output(COMPONENT_SIGNAL) - result.set_output(actual_result) diff --git a/code/modules/wiremod/components/list/get_column.dm b/code/modules/wiremod/components/table/get_column.dm similarity index 100% rename from code/modules/wiremod/components/list/get_column.dm rename to code/modules/wiremod/components/table/get_column.dm diff --git a/code/modules/wiremod/components/list/index_table.dm b/code/modules/wiremod/components/table/index_table.dm similarity index 100% rename from code/modules/wiremod/components/list/index_table.dm rename to code/modules/wiremod/components/table/index_table.dm diff --git a/code/modules/wiremod/components/list/select.dm b/code/modules/wiremod/components/table/select.dm similarity index 100% rename from code/modules/wiremod/components/list/select.dm rename to code/modules/wiremod/components/table/select.dm diff --git a/code/modules/wiremod/core/component_printer.dm b/code/modules/wiremod/core/component_printer.dm index 0671d347e58..cf791ffdad6 100644 --- a/code/modules/wiremod/core/component_printer.dm +++ b/code/modules/wiremod/core/component_printer.dm @@ -112,8 +112,7 @@ if (!materials.mat_container.has_materials(design.materials, efficiency_coeff)) return - materials.mat_container.use_materials(design.materials, efficiency_coeff) - materials.silo_log(src, "printed", -1, design.name, design.materials) + materials.use_materials(design.materials, efficiency_coeff, 1, "printed", "[design.name]") return new design.build_path(drop_location()) /obj/machinery/component_printer/ui_act(action, list/params) @@ -140,8 +139,8 @@ return TRUE balloon_alert_to_viewers("printed [design.name]") - materials.mat_container.use_materials(design.materials, efficiency_coeff) - materials.silo_log(src, "printed", -1, design.name, design.materials) + + materials.use_materials(design.materials, efficiency_coeff, 1, "printed", "[design.name]") var/atom/printed_design = new design.build_path(drop_location()) printed_design.pixel_x = printed_design.base_pixel_x + rand(-5, 5) printed_design.pixel_y = printed_design.base_pixel_y + rand(-5, 5) @@ -381,10 +380,9 @@ say("Not enough materials.") return TRUE - balloon_alert_to_viewers("printed [design["name"]]") - materials.mat_container.use_materials(design["materials"], efficiency_coeff) - materials.silo_log(src, "printed", -1, design["name"], design["materials"]) + materials.use_materials(design["materials"], efficiency_coeff, 1, design["name"], design["materials"]) print_module(design) + balloon_alert_to_viewers("printed [design["name"]]") if ("remove_mat") var/datum/material/material = locate(params["ref"]) var/amount = text2num(params["amount"]) diff --git a/code/modules/wiremod/core/duplicator.dm b/code/modules/wiremod/core/duplicator.dm index a784f4030bc..7b373db6e35 100644 --- a/code/modules/wiremod/core/duplicator.dm +++ b/code/modules/wiremod/core/duplicator.dm @@ -21,7 +21,10 @@ GLOBAL_LIST_INIT(circuit_dupe_whitelisted_types, list( var/variable_name = variable["name"] var/datum/circuit_variable/variable_datum = new /datum/circuit_variable(variable_name, variable["datatype"]) circuit_variables[variable_name] = variable_datum - if(variable["is_list"]) + if(variable["is_assoc_list"]) + assoc_list_variables[variable_name] = variable_datum + variable_datum.set_value(list()) + else if(variable["is_list"]) list_variables[variable_name] = variable_datum variable_datum.set_value(list()) else @@ -191,10 +194,10 @@ GLOBAL_LIST_INIT(circuit_dupe_whitelisted_types, list( var/datum/circuit_variable/variable = circuit_variables[variable_identifier] new_data["name"] = variable.name new_data["datatype"] = variable.datatype - if(variable_identifier in list_variables) + if(variable_identifier in assoc_list_variables) + new_data["is_assoc_list"] = TRUE + else if(variable_identifier in list_variables) new_data["is_list"] = TRUE - else - new_data["is_list"] = FALSE variables += list(new_data) general_data["variables"] = variables diff --git a/code/modules/wiremod/core/integrated_circuit.dm b/code/modules/wiremod/core/integrated_circuit.dm index 6b153e637d4..4a04da3480e 100644 --- a/code/modules/wiremod/core/integrated_circuit.dm +++ b/code/modules/wiremod/core/integrated_circuit.dm @@ -59,6 +59,9 @@ GLOBAL_LIST_EMPTY_TYPED(integrated_circuits, /obj/item/integrated_circuit) /// List variables stored on this integrated circuit, with a `variable_name = value` structure var/list/datum/circuit_variable/list_variables = list() + /// Assoc list variables stored on this integrated circuit, with a `variable_name = value` structure + var/list/datum/circuit_variable/assoc_list_variables = list() + /// The maximum amount of setters and getters a circuit can have var/max_setters_and_getters = 30 @@ -598,8 +601,13 @@ GLOBAL_LIST_EMPTY_TYPED(integrated_circuits, /obj/item/integrated_circuit) return if(params["is_list"]) variable_datatype = PORT_TYPE_LIST(variable_datatype) + else if(params["is_assoc_list"]) + variable_datatype = PORT_TYPE_ASSOC_LIST(PORT_TYPE_STRING, variable_datatype) var/datum/circuit_variable/variable = new /datum/circuit_variable(variable_identifier, variable_datatype) - if(params["is_list"]) + if(params["is_assoc_list"]) + variable.set_value(list()) + assoc_list_variables[variable_identifier] = variable + else if(params["is_list"]) variable.set_value(list()) list_variables[variable_identifier] = variable else diff --git a/code/modules/wiremod/datatypes/composite/assoc_list.dm b/code/modules/wiremod/datatypes/composite/assoc_list.dm index 1a603a5ff9c..760658aa7d2 100644 --- a/code/modules/wiremod/datatypes/composite/assoc_list.dm +++ b/code/modules/wiremod/datatypes/composite/assoc_list.dm @@ -4,7 +4,10 @@ expected_types = 2 /datum/circuit_composite_template/assoc_list/generate_name(list/composite_datatypes) - return "[composite_datatypes[1]], [composite_datatypes[2]] assoc. list" + if(composite_datatypes[1] == PORT_TYPE_STRING) + return "[composite_datatypes[2]] associative list" + else + return "[composite_datatypes[1]], [composite_datatypes[2]] assoc. list" /datum/circuit_datatype/composite_instance/assoc_list color = "white" diff --git a/config/config.txt b/config/config.txt index 0faef89ca40..27cfed87b26 100644 --- a/config/config.txt +++ b/config/config.txt @@ -592,3 +592,9 @@ TOAST_NOTIFICATION_ON_INIT ## Causes configuration errors to spit out runtimes CONFIG_ERRORS_RUNTIME + +## Restricts client uploads to the server, defined in bytes, default is 0.5MB +UPLOAD_LIMIT 524288 + +## Restricts admin client uploads to the server, defined in bytes, default is 5MB +UPLOAD_LIMIT_ADMIN 5242880 diff --git a/config/maps.txt b/config/maps.txt index 7c75a4f3e94..23393d2003a 100644 --- a/config/maps.txt +++ b/config/maps.txt @@ -13,18 +13,14 @@ Format: votable (is this map votable) endmap +# Production-level maps. + map birdshot #default maxplayers 66 votable endmap -map metastation - minplayers 25 - #voteweight 0.5 - votable -endmap - map deltastation votable endmap @@ -33,8 +29,10 @@ map icebox votable endmap -map tramstation - minplayers 35 +map metastation + minplayers 25 + #voteweight 0.5 + votable endmap map northstar @@ -42,13 +40,22 @@ map northstar votable endmap +map tramstation + minplayers 35 + votable +endmap -map runtimestation +# Debug-only maps. + +map gateway_test endmap map multiz_debug endmap +map runtimestation +endmap + ##SKYRAT MAPS## map blueshift diff --git a/config/skyrat/skyrat_config.txt b/config/skyrat/skyrat_config.txt index e563bf5c082..bda23f49b1f 100644 --- a/config/skyrat/skyrat_config.txt +++ b/config/skyrat/skyrat_config.txt @@ -25,11 +25,6 @@ PLAYER_SOFT_CAP 0 ## The non-IC name we send to OOC and adminsay. #CROSS_SERVER_NAME -## Comment this out if you want to use the SQL based mentor system, the legacy system uses mentors.txt. -## You need to set up your database to use the SQL based system. -## This flag is automatically enabled if SQL_ENABLED isn't -## But currently the SQL system is not implemented and it'll read from mentors.txt nonetheless -MENTOR_LEGACY_SYSTEM ALERT_AMBER_UPTO A major security emergency has developed. Security staff may have weapons unholstered at all times. Random searches are allowed and advised. ALERT_AMBER_DOWNTO A major security emergency is still underway. Non-security personnel are required to obey all relevant instructions from security staff. @@ -80,6 +75,9 @@ ROLE_ASSIGN_CHANNEL_ID ##Rockplanet Ruins Budget ROCKPLANET_BUDGET 60 +## Splits the rounds threat budget between midrounds and roundstart +#SPLIT_THREAT_BUDGET + ##Player controlled mob spawn text PC_MOB_TEXT As a player controlled mob you are expected to play the role to the best of your ability. This means if you're an animal, act like one. You shouldn't display much intelligence if any. This also means if you're engaging in combat you should refrain from mercing people fully. Play not to win but to create a challenge. You're there to replace AI, make others enjoy the situation as well. If your simple mob is not above simple or mute intelligence, using structures such as welding tanks/canisters/boxes to hinder your opponent is entirely forbidden. Do not do this. @@ -138,3 +136,10 @@ SIZE_COLLAR_MINIMUM 15 ## Don't ever set this to 0, just disable MIN_FLAVOR_TEXT #FLAVOR_TEXT_CHARACTER_REQUIREMENT 150 +## Comment these out if you want to use the SQL-based player rank system, the +## legacy system uses the .txt files in the data folder instead. +## You need to set up your database to use the SQL-based system. +## These flags are automatically enabled if SQL_ENABLED isn't. +DONATOR_LEGACY_SYSTEM +MENTOR_LEGACY_SYSTEM +VETERAN_LEGACY_SYSTEM diff --git a/html/changelogs/archive/2023-08.yml b/html/changelogs/archive/2023-08.yml index 5f52c01039a..8639a230c99 100644 --- a/html/changelogs/archive/2023-08.yml +++ b/html/changelogs/archive/2023-08.yml @@ -508,3 +508,885 @@ vinylspiders: - bugfix: quirks list will now be displayed normally in examine text again instead of duplicating itself +2023-08-11: + Melbert: + - bugfix: Fix some missing wizard spellbook flavor + - bugfix: Fixed latejoiners being affected by certain things twice, such as Summon + Guns and Summon Magic + SkyratBot: + - bugfix: The bulbs of lights will now have an emissive glow when on, making it + so they appear active no matter how dark the area surrounding them happens to + be. + - bugfix: crafting recipes without a name, such as the mothic pizzas, will inherit + the name of the item they make + - balance: Space Ninja's energy net uses a projectile to catch people now. + - bugfix: Fixed an oddity with morgue corpses being shakeable like they're just + unconscious. + - admin: 'Added new lua functions: SS13.is_valid, SS13.stop_tracking, SS13.new_untracked, + SS13.type and SS13.qdel' + - bugfix: Mirror reflections no longer display progress bars or runechat. + - qol: Drill module automatically disables if it's about to drill into gibtonite + - bugfix: Fixed an oversight with processable items that lead to the same chat message + being sent multiple times. + - rscadd: Add admin blackhole shuttle event with a normal version and suicidal version. + - bugfix: Fix several shuttle event runtimes + Vekter: + - bugfix: FRAG-12 shells no longer require sulfuric acid, instead needing 10 fluorosulfuric + acid. This should prevent them from leaving byproducts if crafted in a specific + way. + softcerv: + - bugfix: fixes soulcatchers not properly returning minds back to bodies. +2023-08-12: + CliffracerX: + - image: redid skyrat's bespoke duffelbags to match the rework upstream + - image: made robotics backpacks look more ruggedized + - image: minor polish to HOP storage palette, added white sec satchels as an option + - refactor: interlink isn't INCLUDED anymore! rejoice in quicker builds and dead + bugs! + - bugfix: elevators show the correct labels now! + EOBGames, MrMelbert: + - rscadd: Mars celebrates the 250th anniversary of the Martian Concession this year, + and this has brought Martian cuisine to new heights of popularity. Find a new + selection of Martian foods and drinks available in your crafting menu today! + GoldenAlpharex: + - bugfix: Certain organs that should have been unremovable for a long time, are + now properly unremovable. You know exactly why. + LT3: + - bugfix: Airlock lighting works again + - bugfix: Large airlocks are now a subtype and function on both tiles + Melbert: + - bugfix: Fix antimagic effect not expiring + SkyratBot: + - balance: Lepton Violet (wabbajack) shuttle must be unlocked by having some form + of polymorph happen in-game first (Pride Mirror or the cursed springs are the + most accessible sources) + - balance: Scrapheap shuttle can only be bought if the Cargo budget is below 600 + credits, and the shuttle has just less than half of its usual refueling time + left. However, it gives the cargo budget an influx of 3000 credits! + - qol: Uncle Pete's Rollerdome has had its price increased, and the disco machine + is no longer unbreakable. + - bugfix: fixes kinesis not actually immobilizing or blocking hands of grabbed mobs + - rscadd: Adds Summon Simians, a spell that summons four monkeys or lesser gorillas, + with the amount increasing per upgrade. The monkeys have various fun gear depending + on how lucky you get and how leveled the spell is. If the spell is maximum level, + it only summons normal gorillas. + - balance: Wizard Mutate spell works on non-human races. It also gives you Gigantism + now (funny). If the Race can't support tinted bodyparts, your whole sprite is + temporarily turned green. + - balance: Made Laser eyes projectiles a subtype of actual lasers, which has various + properties such as on-hit effects and upping the damage to 30. + - rscadd: 'Added further support for nonhuman robed casting: Monkeys, cyborgs, and + drones can all now cast robed spells as long as they''re wearing a wizardly + hat as well.' + - balance: Made monkeys able to wield two-handed things again. + - spellcheck: improvised fire extinguishers aren't full of typoes now + Wallem: + - rscadd: T + iain0: + - bugfix: A small clerical error fixed which will cause the Ukrainian station naming + prefix to be properly applied to the Independence Day of Ukraine holiday on + 24th August, rather than overwriting the Indigenous People's Day station prefixes. + vinylspiders: + - bugfix: Fixed fired foam darts, gumballs and (harmless) lollipops being embeddable. + - bugfix: 'Projectiles that should embed while being reusable will now do so correctly, + actually embedding the reusable casing instead of a shrapnel. balance: Arrows + are generally more likely to embed now, except for blazing ones, that kind of + just blaze.' + - qol: the quiver storage now uses numerical stacking (like botany and ore bags, + or the RPED, for example). +2023-08-13: + Melbert: + - bugfix: Fixes Shadow Walk + MortoSasye (Mystral Mom): + - rscadd: 'Two new sets of cosmetic sprites are now available: Arfel Harpy Wings + and Australian Shepherd tail. Enjoy, new harpies and canids players.' + SkyratBot: + - balance: Change mousetraps to kill mice instead of damaging them (except regal + rats) + - qol: North Star's Cytology and Xenobiology are now significantly more usable. + - rscadd: North Star's Genetics has been tweaked. + - bugfix: The North Star's AI SAT has a working vent and it's service hall has a + working lightswitch + - rscadd: you can upgrade laser pointers with a bluespace crystal to let them shine + through walls at double the power cost, if the laser in the pointer is of tier + 3 or higher. + - qol: laser pointer charge can be seen by examining it + - bugfix: fixed laser pointers luring dead cats when shone upon + - code_imp: laser pointer code cleaned up a tad + - bugfix: Giant Spiders only have an antag datum if created by the round event. + - balance: Flesh spider eggs hatch into adult spiders instead of baby spiders. + - balance: The eggs spawned by the start of the spider infestation event hatch into + adult Midwife spiders instead of baby ones. + - rscadd: Lets you grind things into a hauntium reagent which works similarly to + the solid form but is versatile and has some unique effects. + - bugfix: X'ing out of the podpeople no soul prompt will no longer harvest the seeds. + - qol: Gigabeacons no longer need to be constructed like standard machines, instead + being printed as items that can be deployed quickly inhand without tools. + - qol: Gigabeacons are no longer their own research node, instead being a part of + telecomms tech (due to the fact they're RADIO navigation beacons) + - image: Navigation gigabeacons now have their own unique sprites, inspired by maritime + EPIRB devices. If you find a yellow box with an antenna on it, you probably + found a nav beacon! + - code_imp: The deployable component now gives you an option to disable the examine + blurb it adds to its parent + - bugfix: rabbits are now small-sized rather than human-sized, as well as capable + of being picked up + - bugfix: baseballs are now small sized rather than large + - bugfix: fixed missing departments and names in request consoles + - qol: Gateway access no longer requires a Silver ID. + - rscadd: Added Pulse of Entropy, a new ritual for rust heretic unlocked after leeching + walk. This ritual can be completed with 20 iron sheets, 2 garbage items to rust + in a 4 tiles radius round the rune. Useful for establishing bases and fighting + area. + - bugfix: fixed detect_room not running correctly when break_if_found is not passed + - bugfix: Growing spiders will now retaliate against you like they were always meant + to. + - bugfix: After a collective brain fart lasting for 6 months, monkeys and xenomorphs + now know how to remove embedded objects from their own bodies. + - qol: The mining order console is now a bit more compact, and the search bar works + regardless of which tab you are currently on. + - qol: The flowers in Meta's chapel are no longer stacked atop eachother + - bugfix: Plumbing Constructors can now deconstruct every machine they can make, + including the plumbing IV. + - bugfix: Plumbing IV drips no longer drop metal when deconstructed + - bugfix: The Nuke Op/Lone Op sniper briefcase now properly contains a sniper rifle. + - bugfix: Mime spell books don't eat itself when used in the dark or cancelled out + of. + - qol: Emergency shuttle now gracefully display occupancy limits and prerequisites + in the communication console. + - refactor: Morphs are now basic mobs with a nice new ability to help you change + forms rather than the old shift-click method, much more intuitive. + - admin: With the morph rework comes a new ability you can add to mobs, "Assume + Form". Feel free to add that to any simple or basic mob for le funnies as Runtime + turns into a pen or something. + - bugfix: The metastation law office's shutters now function again. + - bugfix: Fixed wheelchairs being silent. + - bugfix: Labor Camp Sustenance vendor is no longer free; instead, it takes your + labor points that you'd otherwise use for paying off your point goal. + vinylspiders: + - bugfix: fixes Common being always granted regardless of language prefs deliberately + excluding it +2023-08-14: + CoiledLamb, Jacquerel: + - rscadd: Adds mining weather radio + Nerev4r: + - rscadd: NanoTrasen grooming regulations no longer specify maximum fingernail length, + leading to more clawed employees appearing on nearby facilities. + Senefi: + - bugfix: NorthStar's Supermatter Waste Chamber guide no longer contains inaccurate + information + - qol: 'NorthStar''s Supermatter Waste Chamber air alarm no longer shows the hallway + vent and scrubber on the configuration panel. /:cl:' + SkyratBot: + - bugfix: You can no longer stand up without legs. + - bugfix: Projectile damage multipliers on guns are now reflected in their combat + information. + - admin: Admins can now make a gun's fired projectiles better or worse at wounding + by changing the gun's projectile_wound_bonus. Surely this will not have any + repercussions. + - qol: xenos rest verb now is a hud button instead + - qol: The icebox bridge had its items moved to better positions. No items were + added or removed, and none left their original room (except the captain's electric + razor, which went to the bathroom). + - bugfix: Inquisitor Commander now has just 1 box. + - bugfix: If you shapeshift into a mob which can eat things such as player corpses, + those things will fall out when you stop shapeshifting + - bugfix: Doctors no longer spawn in the bedroom in the northstar + - bugfix: a few issues with Martian food + - bugfix: Player-controlled basic mobs with ranged attacks can now only fire about + as fast as AI-controlled ones. + - bugfix: The modular receiver is now only printable from a hacked autolathe. + - bugfix: The chef can no longer close the shutters in Meta's HoP office. +2023-08-15: + GoldenAlpharex: + - bugfix: The formatting on PDA messages displayed to observers is now back to what + it used to be, rather than being all bold. + - bugfix: PDA messages are now displayed to observers from dead players, and not + just dedicated observers. + - admin: The banning panel is now set to have all bans be global by default. + Melbert: + - qol: Minor mapping work to Metastation. Wallmounts, decal changes, etc - especially + around Medbay. + - qol: Remapped Meta's Morgue slightly. + ShizCalev: + - bugfix: Medbots made with tactical medical kits now have the correct skin + SkyratBot: + - bugfix: fixed the Tram Pod Bay having no lights + - bugfix: fixes a bug that can cause emotes to stop working if a client is being + created or deleted + - bugfix: fixes immerse overlays not being added the first time a mob enters a water + turf + - rscadd: Added big slappy + - image: Added big slappy parts and big slappy sprites + - rscadd: Lockers, crates, and machines no longer block click attempts in adjacency + checks. Basically, you can reach tables cornered between lockers/machines. + - refactor: ice whelps have been refactored to basic mobs + - rscadd: ice whelps have a new dangerous ability which theyll use once their enraged + meter is full + - image: modified glass pane wall mount icon + vinylspiders: + - bugfix: characters with digi legs will no longer have a broken icon when wearing + a coroner's labcoat +2023-08-16: + Onule: + - image: modified light fixtures' sprites and overlays to be more pronounced + SkyratBot: + - refactor: Refactored Mech UI + - refactor: Refactored mech radio into a utility module, adding extra slot to all + mechs + - refactor: Refactored mech air tank into a utility module with an air pump, adding + extra slot to all mechs + - refactor: Refactored mech cabin air - there is now a button to seal or unseal + cabin to make it airtight or exchanging gases with the environment + - refactor: Removed mech maintenance UI Access is set in mech UI, and parts are + ejected with a crowbar + - rscadd: Mech now has wires and can be hacked + - qol: Roboticists now can see MOD suit and mech wires + - rscadd: Mechs now require servo motor stock part and it affects movement power + usage instead of scanning module + - rscadd: Scanning module absence doesnt block mech movement and hides some UI data + instead. Big Bess starts without one. + - qol: Hitting mech with ID card now toggles ID lock on/off if the card has required + access + - bugfix: Fixed concealed weapon bay not being concealed on mech examine + - bugfix: Fixed mech radio not changing frequency + - bugfix: Fixed mech launcher type weapons ignoring specified cooldown + - bugfix: Fixed mech launcher type weapons not using specified power amount + - bugfix: Fixed mech temperature regulator ignoring gas heat capacity + - bugfix: Fixed mech stopping processing other things while not heating internal + air + - bugfix: Fixed mech being able to leave transit tube in transit + - bugfix: Fixed mech internal damage flags working incorrectly + - bugfix: Fixed Gygax leg overloading being useless + - bugfix: Fixed mechs ignoring their stock parts on creation. Syndicate mechs now + stronger against lasers and consume less energy on move. Upgrading from tier + 1 to tier 2 doesn't make mech consume MORE energy than before the upgrade. + - balance: Rebalanced mech energy drain with part upgrades. Base energy drain reduced + by 50%, 33%, 25% with upgrades and applies to movement (Servo rating), phasing, + punching, light (Capacitor rating). + - balance: Hydraulic clamp now can force open airlocks + - balance: Made mech RCS pack consume reasonable amount of gas + - code_imp: Fixed some other minor bugs and made some minor changes in the mech + code + - bugfix: items no longer stay in your hands after their respective arm is dismembered + - bugfix: mob holders no longer bug out and harddel when put into evidence bags. + - bugfix: removes bodybag welding tooltip + - bugfix: you can no longer tactially stealth-hide donuts in your right hand + - image: The Mosin-Nagant has been given new sprites and a reflavor, looking for + the old rifle? Look for the Sakhno Precision Rifle. + - balance: The tiniest balance thing, but since Silverscales use the Sakhno-Zhihao + rifle, which has a scope on it, their main weapon now has a scope. + - sound: The cargo rifle now has a new, considerably more rifle sized firing sound. + Gotten from tgmc from https://github.com/tgstation/TerraGov-Marine-Corps/pull/12280. + - rscadd: Adds a unique medibot to the Syndicate Infiltrator. It doesn't like nukes + - when one is armed, disarmed, or detonating, it says an unique line. Players + can optionally enable personalities on it if they want to. Probably best to + just let it stay on the shuttle though. (It's also in the Interdyne Pharmaceuticals + ship, renamed) + - bugfix: Fixed an issue that made mapload medibots unable to load custom skins. + - bugfix: fixed missing seating at the All American Diner +2023-08-17: + Erol509: + - bugfix: Fixes .416 stabilis tranquilizer bullets, they no longer kill you, but + put you into sleep like they suposed to work. + LT3: + - admin: New config flag to split threat budget + SkyratBot: + - balance: Hunter and viper spider toxins no longer deal liver damage. + - balance: Tangle spider's acid injection per bite reduced from 5 to 2.5. + - bugfix: Colored ammo bands, such as those on .357 and .38 speedloaders, no longer + permanently disappear upon icon update. + - rscadd: Added the Bowtie! Bartenders start with one on, but they can also be found + in the Bardrobe, Autodrobe, and Clothesmate. No need to tie it either, it's + just a clip-on. + - rscadd: Added a Greyscale "Formal Jacket" of the style that most suits use, for + crew who want to make their own using the buttondown shirt. + - rscdel: Removed the generic Cook/Bartender uniforms and changed them to use the + Service buttondown w/ slacks. + - image: updated the majority of Lawyer suit sprites, along with the Cook's Apron-Jacket + and Hat, and updated/greyscaled Botany's Overalls! Also the Overalls are available + in the clothesmate, and the Cook Jorts' shirt is less crusty. + - balance: Ascending as an Ash Heretic now reduces the cooldown of Nightwatchers + Rebirth to ten seconds, additionally Ash ascension has Bomb immunity added to + the resistances it offers (no stun immunity though) + - qol: the chemistry heater can now be unwrenched. + - rscadd: 'Add policy for sentient mobs that were revived by lazarus injector (depends + on config) + + add; Sentient mobs that were revived by malfunctioning lazarus injector now + get enslaved to whoever revived them.' + - bugfix: Servant golems get their master's real name (Won't be serving "Unknown" + if their master is wearing a mask) + - bugfix: Skeletons now heal burn damage with milk once again. + - balance: metal bat damage changed from 12 -> 20 + - bugfix: Gravitational Anomalies will now correctly clean up after themselves, + instead of leaving an area of the station permanently heavy or with no gravity + at all. + - bugfix: items implanted on arms no longer become permanently stuck in-hand when + their limb is dismembered + - bugfix: quickly sheathing and unsheathing the vorpal scythe can no longer bug + out and prevent its effects from being applied + - bugfix: Head Revolutionaries no longer count towards a revolution's defeat if + they have become simplemobs, basic mobs, or xenomorphs. + - bugfix: fixed a disconnected APC in Delta's tech storage. + - bugfix: Beam rifles will no longer inappropriately retain any bonuses they may + gain from wizardry. + - bugfix: Inappropriate stack traces over bonuses being applied to components that + gain bonuses innately (like Mythril stacks) should cease. + - bugfix: Makes the ectoplasm anomaly not randomly move so deadchat can actually + control it + - bugfix: fixed border-only firedoors being able to be walked through while closed + - rscadd: You can now set your voice to just blips. + - bugfix: multiple balloon alerts when the plumbing RCD is low on ammo + - code_imp: organized all plumbing designs into static lists for memory savings + - refactor: removed unused vars for further memory savings + - bugfix: fixes a harddel in particle holders + - rscadd: Added 28 new food recipes! + - bugfix: Goliaths will try to attack mechs with their tentacles. + - spellcheck: fixed the rat king text saying that they're summoning rats + - bugfix: dismemberment moodlets are replaced by a lesser mood debuff when you recover + the limb in question. + - balance: dismemberment moodlets can now stack for each limb you lose, and are + cleared separately. Their descriptions have been updated to reflect this. + - bugfix: Spaceacillin will once again provide antiviral effects for the deceased +2023-08-18: + AnywayFarus: + - bugfix: Player Loadout in Select Equipment(or Ctrl+Click on ghost mob) option + has been fixed. + Hatterhat: + - bugfix: For consistency's sake, piru dough is now a chemical reaction and not + a crafting recipe. + Iajret: + - bugfix: Mapped or spawned in rusted walls (such as on Birdstation or on charlie + ghost role) can now be fully cleaned without needing to deconstruct them. + LT3: + - bugfix: Base large airlock subtype no longer spawns a normal sized airlock + - image: Added mapping icons for large airlocks + - code_imp: Repathed all public airlocks to consistent naming + Melbert: + - balance: Red toolboxes go faster + Paxilmaniac: + - balance: The CIN military surplus crate's item table and corresponding weights + have been changed, the RC Makarov, pp-95, associated ammo for both of those, + and the crucifix can no longer spawn. Bolt action rifles mimic what they do + on tg, where they come in a case with a 20/80 percent chance to spawn either + a good, normal rifle/a rifle that can jam on occasion. All items in the crate + now have an equal chance of spawning when picked from, aside from the gun cases + which spawn at a slightly higher rate than everything else does. + - image: The Quartermaster's Archangel rifle has been given a new sprite and identity + to match the other boltactions that its based on + - image: AP and rubber .310 bullet casings now have a small colored bit at the bottom + to show that they are different from the normal all red bullets + - spellcheck: .310 ammo in the autolathe now has its (Lethality Warning) attached + to the end of the name like it should + SkyratBot: + - rscadd: Settler quirk! Conqueror the great outdoors....in space. Just make sure + nobody asks you to get anything from the top shelf. + - balance: Changeling arm blade has an armour penetration of 35%. + - balance: Changeling arm blade has a wound bonus of 10, from -20. + - balance: Changeling has a bare wound bonus of 10, from 20. + - bugfix: Moved the RD's plant to its proper place in Northstar + - admin: The Add Mob Ability menu now prefixes the typepath of the ability with + the ability's name, so you can much more quickly see what the ability is. + - bugfix: formal closet will no longer spawn with two 'error' icon suits inside + of it + - qol: Xenomorph Sentinel and Ambusher Spider's sneak ability now has a transition + to a lower alpha as opposed to being immediate. + - qol: The sneak ability now uses balloon alerts as opposed to chat alerts. + - bugfix: Fixed the Xenomorph Sentinel's Sneak ability icon being an error. + - spellcheck: Fixed a lack of plurality when ejecting multiple casings from a revolver. + - bugfix: fixes all the martian drinks having 20 boozepower + - rscadd: Engineers now have an RCD round start. + - balance: RCD construction/deconstruction effects can now be attacked in order + to cancel them. You can get the anti-disruption upgrade disk to prevent this. + - balance: RCD construction/deconstruction is now slower if you already have another + effect up. This does not effect reconstruction. + - balance: Both of the above effects do not effect the CE's roundstart RCD, nor + any other RCDs such as combat RCDs. + - image: bowtie sprite has been tweaked slightly to look a little bit more bowtie-ish + - bugfix: Turning into a space dragon with the polymorphic inverter will no longer + leave you existing in two places + - balance: You can no longer use the belt to transform into monkeys or xenomorphs, + for technical reasons. + - balance: you cant speed up the big slappy with slime potion + - bugfix: Fixed some jank with the dynamic threat curve. + - bugfix: replaced injector with working passive vent in birdshot incinerator + - bugfix: conveyor lever in birdshot incinerator + - rscadd: cybernetic moth eyes and their variants + - bugfix: luminescent eyes no longer make you look like a cyclops in the dark + - admin: Adds Spider, Goliath, and Meteor Heart actions to the "Grant Mob Action" + menu. + - rscdel: Removed tiny mob sprite abilities for large mobs + - rscadd: Add a Self Seethrough ability, given to most large mobs and all mobs affected + by a fugu gland + - bugfix: Space Dragon's overlay will no longer vanish at times + - spellcheck: fixes the name of the incline bench press + timothymtorres: + - qol: Add pickaxe to basic tools techweb + vinylspiders: + - bugfix: the new recolorable bowties are no longer missing from loadouts + - bugfix: fixes generic tanks not being printable +2023-08-19: + GoldenAlpharex: + - bugfix: Fixed the duplicated animation when you sigh. + Hatterhat: + - rscdel: Splints are gone. This does mean that medkits now start properly full + and not overstuffed by one item, at least. + - qol: Gauze is now, once again, usable as a splint. If you're gauzing a limb with + both a bleed and a fracture, you prioritize the bleed first. + - spellcheck: Gauze that reaches a negative absorption value (making them useless/infective) + now tells you that it's ruined. + Paxilmaniac: + - bugfix: CIN military surplus crates now come with more than just rifle cases, + as they should be + SkyratBot: + - bugfix: No more stacked items in Meta's custodial closet + - bugfix: you can actually tell what hand a reagent dartgun is in now + - refactor: Regal Rats have been refactored into basic mobs. They should be a bit + smarter and retain their docility (until attacked, in which case you should + prepare to get rekt by summoned rats), and properly flee when they can instead + of just sit there as you beat them to death. The framework for them interacting + with stuff (i.e. opening doors while slobbering on food) is a bit more unified + too, now. They also have cooler names too! + - bugfix: the goliath and watcher mating season has ended and population has returned + to normal levels + - admin: Four players can ride the speedwagon + - bugfix: Fixed dynamic. + - bugfix: Base iron floor tiles now will be able to stack with other base iron floor + tiles after being reskined to the base subtype. + - qol: Delta's Detective Office looks better now. + - bugfix: '[Waystation] Windoor for secret documents now can be accessed with away + station secoff''s id.' + - bugfix: '[Waystation] Deleted a window on the same place as windoor so it won''t + block your path to secret documents.' +2023-08-20: + Fikou, Armhulen, Sheets (+rep for Mothblocks and Potato): + - bugfix: RD MODsuit outfit (admin only) no longer has a beret that blocks the activation + of the suit + - bugfix: The beret used by death squad officers no longer is blocked from being + put on a hat stabilizer module + - admin: Admins can now Shear matrices of objects in Modify Transform + - admin: Admins now have access to Test Matrices in the VV dropdown, an all-in-one + tool for editing transforms. + - rscadd: MODLink system, available through scryers (from RnD and Charlie Station) + and through MODsuits. Lets you call people with holographs! + LT3: + - bugfix: Rotated multi-tile airlocks display correctly and won't create an invisible + box next to itself + Melbert: + - bugfix: Reactive stealth armor decoys are half as healthy, as originally intended + SkyratBot: + - bugfix: Incompatible quirks in existing savefiles shouldn't be possible anymore. + - bugfix: ripley MK2 upgrade now properly transfers servos + - spellcheck: inserting parts into mechas now properly says "installed" instead + of "intalled" + - qol: CTF assault class' (with shotgun and rocket gloves) description now mentions + that it has low armor and increased moving speed. + - balance: Decreased CTF recharge start delay for shields from 20 seconds to 12 + seconds. + - balance: Marksmans rifle now has 1.7 scope. + - bugfix: When toggling instagib mode for CTF and pressing a cross now will just + cancel instead of proceeding. + - bugfix: When clicking on other CTF teams spawners and after you already chose + your team no more will ask you to join some other team to make them even. + - bugfix: fixed lavaland beach bartender closets looking off. + - bugfix: Makes sure settlers are SHORTEST. + - bugfix: Some RCD constructs took more material than manual construction. The RCD + cost should be consistent in comparison to manual construction now. + - bugfix: healing holoparas will no longer kill slime people + - qol: Martian fried noodles now requires 2 grown peanuts instead of salted peanut + packet. + - qol: Added some textual feedback to new watcher abilities + - balance: Watchers will not attack for a short period following their gaze attack + - bugfix: Watchers won't interrupt one ability to use the other one + - bugfix: you can no longer destroy syndicate modsuits by just being on fire + - bugfix: you can now toggle repair droids and plasma engines on mechas again + - admin: admins can now upload files to the server up to 5mb (used to be 2.5mb) + - config: file upload restriction is now config + - qol: Made the cytology lab in many maps much more convenient. +2023-08-21: + SkyratBot: + - balance: the lion hunters rifle has been pegged down the knowledge tree. to make + sure the tree is kept happy, the rust path and blade path can access rust charge + - rscadd: rust charge + - balance: the lion hunter ammo knowledge is free + tf-4: + - bugfix: Ass slapping now puts an overlay on the right person +2023-08-22: + Hatterhat: + - code_imp: HUMAN_MAXHEALTH was made into a more formal define. + - bugfix: Combat info readouts (the ones you get from examining ammo/melee weapons/etc) + should now be more accurate to the increased health people have. + Rhials: + - rscadd: Ninjas can now temporarily disable cameras with the Ninja MOD right-click + hacking ability. + - rscadd: Ninjas can emag windoors, elevator controls, and buttons with their hacking + ability. + - rscadd: Ninjas can drain the power from energy weaponry, adding the charge to + their MODsuit. + - rscadd: Ninjas can now hack simplebots, overloading and detonating them after + a brief delay. + - rscadd: Ninjas can now hack vendors, causing them to eject their inventory at + people. + - rscadd: Ninjas can now hack the recycler, which notifies the AI and emags it once + complete. + - rscadd: Ninjas can now trigger an extended tram malfunction by hacking the tram + control console. + - rscadd: Ninjas can now hack open firelocks (temporarily) with right-click. + - balance: Hacking open doors with the Ninja Hacking MODule will subtract a paltry + amount of energy from your suit. + SkyratBot: + - bugfix: '[Birdshot] Morgue now has coroner''s surgery duffel bag instead of regular + surgery duffel.' + - rscadd: You can now feed fish with the can of fish feed without having to put + the fish in a aquarium first. + - balance: Some fish may survive in different, harsher atmospheres if given the + amphibious trait, like chasm chrabs on lavaland. + - qol: aquarium now uses balloon alerts when feeding fish. + - bugfix: The wary and shiny lover no longer incorrectly remove difficulty from + the minigame if conditions aren't met. + - rscdel: Traitor objectives to place posters and graffiti the station have been + removed. + - rscadd: The items associated with the poster and graffiti objectives can now be + purchased from the Badassery section of the uplink. The posters come in a box + of 3 for 1TC, and the spraycans are 1TC each. + - rscadd: Adds a new Assault traitor objective, requiring you to the attack the + target a few times without needing to kill them. Earn TC and reputation by starting + barroom fights and bait players into escalation battles for fun and profit. + - rscadd: Expands low-risk steal objectives to include the Chef's fake moustache, + Lawyer's badge, and Mime's mask. + - rscadd: Adds brand new shift start Steal & Destroy objectives for early breaking + and entering. Smash your way into a sec checkpoint to grab a Space Law book, + engineering to grab some insulated gloves or the psych office to kidnap their + moth plush. + - bugfix: Fixes an issue where the steal clown shoes objective would never be valid. + - qol: Satchels can now be crafted using the same recipe (4 cloth) as backpacks. + - bugfix: Fixed a light inside a wall on Delta Station. + - refactor: AI's player-tracking eyes received an unwanted obligatory update, and + should now not tell you that a player is untrackable when they clearly obviously + can be. + - qol: Added two magboots to engine SMES room on icebox station + - balance: Watchers have less health + - balance: You can't be overwatched by several watchers at a time + - balance: Watchers won't overwatch you instantly upon seeing you + - balance: Goliaths won't launch tentacles at you instantly upon seeing you + - bugfix: The "Unlocked Achievements" score will now be properly saved at the end + of the round the first time it's loaded. + - bugfix: plumbing ducts connects to other plumbing machinery again + - bugfix: fixed beakers disappearing when swapped in a chem heater + - bugfix: you can detach signaller from wires without the machine deconstructing + itself + - rscadd: Sacrificed heretic targets will now receive a phobia of heresy instead + of a phobia of the supernatural. Sacrificed heretics will not get this phobia, + but will lose knowledge points instead. + - rscadd: Adds green jester shoes that jingle to the autodrobe! + - image: adds new sprites for opened fireaxe/mech crowbar cabinets. + - bugfix: Bots that can't be controlled (like beepsky) no longer has a stray 0 at + the very right side of its UI. + - bugfix: Fixed embedding for projectiles. + - bugfix: wellcheers is now based on sanity rather than mood + - image: resprites martian cans + - image: adds inhands for martian cans and wellcheers + - image: minor tweaks to other cans + - spellcheck: updates wellcheers mood text + distributivgesetz: + - rscadd: Replaced slime clone damage with a "Covered in Slime" status effect that + deals brute damage over time and can be washed off by standing under a shower. + - rscadd: Northstar and Birdshot Xenobiology have been outfitted with a new shower. + - code_imp: Replaced the magic strings in slime code with macros. Also included + some warnings to anyone daring to touch the macros. +2023-08-23: + Melbert: + - bugfix: Fixed some tooltips in the sec records UI showing "false"s where they + shouldn't. + OrionTheFox: + - image: 'removed some obsolete Skyrat icon overrides, moving these items to TG + standard: Eguns, Laz/Borg hypos, Lights, and Surgery Tables.' + - bugfix: PKAs now have no safeties, as intended + SkyratBot: + - bugfix: pda messages are no longer hidden from dead players who are not observers + - refactor: the goldgrub has been refactored please report any bugs + - rscadd: the goldgrub can now be tamed and he can have babys + - code_imp: removed unused procs in ore silo + - code_imp: merged repeated code segments when using materials from the ore silo + into a single proc + - code_imp: added auto docs & cleaned up some procs + - refactor: logging when an item is inserted or sheets are ejected from the silo + is now handled directly by the silo itself + - bugfix: Mobs whose human appearance is set dynamically will once again have their + bespoke names and descriptions, instead of Unknown, with a blank description. + - bugfix: Metastation's arrivals area no longer has an intercom overlapping with + the request console. + - balance: Lasers now have increased energy cost, reverting the cost back to the + initial value before the laser buff. + - bugfix: Taking a nap can once again heal minor wounds + - bugfix: A breath of healium will no longer knock you out for eternity + - bugfix: Healium sleep now respects sleep immunity + vinylspiders: + - bugfix: interdyne siphon vents will siphon properly again + - refactor: moves ALL of the skyrat edits out of modules/research/techweb/all_nodes.dm + and into modular overrides + xXPawnStarrXx: + - rscadd: Added new crafting options to throwing wheels + - rscadd: Added clay bricks as a material type. (Incase anyone wants to add onto + it) +2023-08-24: + Hatterhat: + - code_imp: Removed some redundant Syndicate underclothes' armor values. + - bugfix: All Syndicate undersuit items now have wound armor matching their base + tg variants. + - bugfix: Cut down on some of the copy-pasted code regarding the Enclave uniforms, + which are apparently in the donator tab. + - spellcheck: Cleaned up some typos in Syndicate uniforms' descriptions. + Melbert: + - code_imp: Cleans up limb wound examine text code a tad. + Rhials: + - rscadd: The roundend report will now read out any achievements ("cheevos" as you + may know them) earned by players over the course of the round. + SkyratBot: + - rscadd: Added compact shotgun to the hos locker + - rscadd: Added compact shotgun as a traitor objective + - balance: gives the compact shotgun 1 extra shot + - bugfix: Birdshot pharmacy airlock now requires pharmacy access + - rscadd: wizards are now introverts + - balance: The Traitor's Camera bug is now a tablet app that works like a silent + camera console with an extra ability to track people through their nearby cameras. + - rscadd: You can now fully color your hair with a hair spray! + - qol: splits hair sprays are now smoother on the transition, similar to the short + fades. + - qol: Icebox perma now has holopads. + - bugfix: Moussaka now only uses eggplants instead of eggplants and potatoes + - bugfix: Pita bread no longer burns on the griddle/oven + Vekter: + - balance: Grilles will now take 0-1 damage every time they shock something. + - balance: Powersinks are now available earlier in traitor progression. +2023-08-25: + Guillaume Prata: + - qol: QM jumpsuit/skirt expose the torso when adjusted. + Hatterhat: + - rscadd: Cargo now stocks pocket-clip-equipped personal first-aid pouches in their + goodies tab for the low, low price of 6 crew paychecks (300 cr at the time of + writing). + - code_imp: The pouch path now exists in the code, for pocket-fitting storage items + that don't require the item-scooping that proper bags have. + - bugfix: The ammo workbench no longer runtime errors when inserting material. + - bugfix: The ammo workbench storage capacity now scales like the autolathe does. + - bugfix: .277 Aestus (renamed a223, formerly a556), uh, works properly in guns, + again, or something. + - bugfix: .310 Strilka no longer has duplicate nor brass ammunition because they're + magic and also better rubbers. Go... be a heretic or clockwork cultist or something + if you want magic bullets. + - qol: Right-clicking on an ammo workbench that has a magazine loaded now ejects + it. Into your hand, presumably. + LT3: + - rscadd: Immovable rod will now battle the unstoppable tram should they cross paths + - bugfix: Birdshot's maint tram doors now work properly + - bugfix: Tramstation's exterior light fixtures no longer get destroyed as soon + as the tram moves + - code_imp: Tram landmarks are now all subtyped instead of map varedits + SkyratBot: + - balance: ninja's stealth module gives silent footsteps when active + - balance: all ninjas now have the light step and freerunning quirks + - balance: ninja's hacker module shove no longer stuns in 1 hit. first shove knocks + down and pushes away, second one stuns + - bugfix: fixes ninja shoves not causing sparks + - qol: the person in an energy net is now reasonable to hit, the dark part of the + sprite is now an underlay, so you can click the person inside the net pretty + easily and if you wanna hit the net you click the green part or the darker sides + that the human sprite doesnt cover + - bugfix: Rotated a water tank in icebox's lower service hall, connecting the plumbing + to the water source. + - qol: Adds air supply for cycling airlocks in ordnance and atmos incinerator on + all stations + - qol: Makes internal incinerator chamber a vacuum + - bugfix: Adds missing incinerator airlock control console to Tram station + - bugfix: fixes multitools possibly randomly losing their buffer + - bugfix: fixes modlinks checking battery charge without a battery and working without + charge + - qol: modlink stuff is a bit more explained + - bugfix: modlinks printed from rnd no longer start with a frequency (remember to + copy it from another one with a multitool buffer, robotics starts with 2 NT + frequency linked ones) + - rscadd: becoming a felinid makes your brain smaller (visually) + - bugfix: Some incident display adverts on Northstar and Birdshot have been unobstructed. + vinylspiders: + - bugfix: fixes ashen arrows not doing the bonus damage to goliaths, basilisks, + watchers, ice whelps, wumborian fugus, and goldgrubs + - bugfix: microfusion suppressors will now spawn correctly in MCR attachment kits + and they actually work now + - qol: Janitors and Shaft Miners start with the ExperTrak Skill Tracker preinstalled + on their PDAs. +2023-08-26: + Guillaume Prata: + - qol: Medical Kiosk now have their wand removed with a right click, got new screentips + and have a few of its chat messages turned into balloon alerts. + Nerev4r & Zydras: + - image: Adds messenger bags to character setup and drobes/lockers! + Skyrat: + - rscdel: Removed the meteors and space dust emergency shuttle events + SkyratBot: + - admin: The "HREF Dock Exploit" message should now contain a bit more usable information + (such as a jump link) so you can investigate if something is really going wacky + with shuttles. + - bugfix: You should be able to click on lattices on icebox with the RCD and construct + a floor now + - refactor: fixed a bunch of instances of callbacks being qdeleted and cleaned up + related code + - bugfix: regal rats now run away from whoever attacked them + - rscadd: new pet behavior which makes pets defend their owners if they got attacked + - bugfix: You should no longer attack RCD effects when they're done constructing. + - qol: Messenger bags can be crafted with 4 cloth. + - bugfix: fixed apocalypse rune applying invisibility to mobs. + - bugfix: Unholy water preview icon is now similar with the icon it has. + - rscdel: Removes miscellaneous sources of clone damage from the game. + - balance: removes the access restrictions from all animals found under the livestocks + tab of the cargo order console, now assistants can private order animals for + their farms without access hunting + distributivgesetz: + - rscadd: Replaces decloning clone damage with a strike system that you can replenish + with Mutadone. + - bugfix: The decloning virus is curable with rezadone again. + tf-4: + - spellcheck: Fixed examine text for gemital. +2023-08-27: + GoldenAlpharex: + - bugfix: Fixes the recycler being able to grind the server to a halt by trying + to recycle the same sheet worth of material over and over and over again. + SkyratBot: + - bugfix: Watchers won't retain an ethereal outline of their wings hovering over + their dead body. + - balance: Railings now only cost 2 rods and are much easier to construct. But they + can now be destroyed much easier and cut with wirecutters without unwrenching. + - bugfix: Borgs no longer get permastunned by emotes + - bugfix: Borg hud should not fuck up in few situations + - rscadd: Adds a syndicate AI card for nuke ops. Costs 12 TC, can be refunded. Activating + it in-hand opens up a ghost poll like normal reinforcements. Base interaction + range for syndicate AIs is one, which means they can handle electronics only + in proximity. + - rscadd: Adds a syndicate AI interaction range upgrade for nuke ops, costs 4 TC + and can be applied onto a syndicate AI (inside any container) to increase its + interaction range by two per. (Three purchases are recommended for seven tiles + of range!) + - bugfix: greyscale colors will now update on the mob when modifying them via the + VV menu + - bugfix: the coroner medkit can now hold every item it spawns with + - bugfix: multitool can be used on APC/Teslacoil/SMES/emitter if it has exposed + wires. + - bugfix: Light eaters can no longer be eaten by their higher-grade brothers, the + trash eaters. (recyclers) + - spellcheck: Fixed a spelling error with the daps emote. + - bugfix: Ops wanting to get the CQC kit will actually get given the kit, and not + just the CQC book. + - bugfix: Fixed the double-barreled shotgun not working properly + - qol: Icebox monsters no longer spawn close enough to aggro Lia at round start + - rscadd: 'Gave snow legions a separate corpse-drop pool: ash walkers excluded, + but eskimos included.' + - qol: inserting new high luminosity eyes will now properly remember the previous + eyes' color and default to that initially + - bugfix: quartermasters get their voice of god power boost correctly + - qol: The Achievements UI now shows how many people have unlocked a given achievement. + - bugfix: The "Skills" Category for achievements should no longer be hidden. + - bugfix: zipping a duffle bag closes the UI of all storage items opened inside + it + TheSS13Melon: + - qol: Adds the Emergency Tether to Engineering Modsuits + vinylspiders: + - bugfix: fixed a bug that could cause the altar's religion selection ui to bug + out if a previous chaplain left via cryo without selecting a religion themselves. +2023-08-28: + Guillaume Prata: + - bugfix: Unary vents have a pressure cap on both their pressuring and siphoning + mode now, preventing the bypass trick of putting "infinite" pressure on tiles/pipelines. + - balance: Overclocked Volume Pumps do not have a pressure cap anymore. + LT3: + - bugfix: Using an airlock painter on a GAGS airlock works properly + - bugfix: Tram will no longer fly off into space when admins try to reset the contents + Paxilmaniac: + - balance: heads of security are no longer given a gk-18 in their backpack on spawn, + instead being given a hybrid energy gun to hold them over until they reach the + already quite strong weapons in their locker. + SkyratBot: + - rscadd: New rotator disposal pipe. + - bugfix: Flipped transit tube stations are now accessible in the RPD again. + - image: New rotator disposal pipe sprite. + - bugfix: Fixed an issue with the "recolor from string" option in the greyscale + modify menu that resulted in invisible icons. + - qol: Stabilized yellow slime extracts no longer spam a message every charge pulse + (but examining characters will still show that it's active). + - bugfix: Fixed Phazon construction message typo + - qol: Crafting menu "Can Make" category shows complex recipes first. + - bugfix: Woundscans no longer runtime + - bugfix: Normal health analyzers can no longer give the first aid bonus when woundscanning + - bugfix: after a long 6 years, alien alloy once again unlocks the Alien Technology + node (the one that lets you print alien alloy) + - qol: rats no longer spawn on multiz cable hubs + - bugfix: fixes a runtime with arrow projectiles + - bugfix: You can't use the bioscrambler belt to turn yourself into a changeling. + - qol: Display case chassis now uses balloon alerts, screentips, examine hints, + etc. Basically, the construction steps are more visible to players. + - rscadd: Added associative list variables and associative list variable manipulation + for finer data manipulation and storage. + - rscadd: List Find components will now return the index of the element it has found. + - code_imp: fixed some typos + - bugfix: fixed corn cobs not making seeds and lying to you in the text box. + - bugfix: Big fuel tanks' capacity is back to 5000. + Stalkeros for code, nzzy and Zydras for the sprites, Juniper for descriptions: + - rscadd: Proto-NRI/CIN food (and not only food) replicator + - rscdel: Green IRP-B (or whatever it was idk idc) NRI MRE, replaced with a new + unique one. + distributivgesetz: + - rscadd: Add an achievement for saving a cascading engine from the final countdown. + - balance: Damaging synchronous mesh blobs now incorporates damage resistance of + other blob structures when dealing shared damage to those nearby. +2023-08-29: + Iajret: + - bugfix: changed contractor's modlink frequency to syndicate + LT3: + - balance: Pre-equipped engineering modsuit now includes emergency tether + - balance: Pre-equipped atmospherics modsuit now includes magboots + SkyratBot: + - bugfix: mobs do not get stuck when running away from danger + - bugfix: Quartermaster's Overcoat and Cargo's gorka can now hold stamps in their + suit slots, just like their winter coat counterpart + - bugfix: Made it easier to place tiles on multi z level holes + - rscadd: The Lavaland Cursed Slot Machine of Greed suddenly seems a lot more sinister... + - refactor: Instead of taking clone damage from the cursed slot machine, you now + get a status effect with a number of curses associated with it. There's some + interesting florid language associated with the status effect as a nicety until + your eventual gibbing from chasing that prize. + - bugfix: Non-surgically debraining someone no longer makes their brain unusuable + - bugfix: Items worn on a void cloak's suit storage are no longer visible on the + stripping menu. + - qol: Misclicking the turf below a heretic influence no longer leaves a fingerprint. + - bugfix: Railings no longer give more metal than they take + - bugfix: roundstart modlink scryers now come with the nt frequency + softcerv: + - bugfix: Skyrat species now use the new TG non-human pay modifier +2023-08-30: + GoldenAlpharex: + - refactor: Refactored the player ranks system to separate the legacy file-based + system from a new SQL-based system, allowing the various systems to be interacted + with far easier outside of the game. + - refactor: Player ranks are now working off of a subsystem, rather than being completely + disjointed, making it easier to interface with. If you're having issues with + your Donator status, simply reconnect and that should fix it! + - config: Added three separate configs for forcing the usage of the legacy Donator, + Mentor and Veteran systems, defaulting to on (so this should hopefully not change + anything on servers that have not done any migration yet). + Seven: + - bugfix: Syndicate ranged mobs (and probably other basic mobs) properly update + their shell's description to show they are spent. + SkyratBot: + - qol: The coroner can now store scythes in their labcoat and winter coat suit storage. + Ask not for whom the bell tolls... + - image: progress bars and cleaning particles are now centered on the tile occupied + by the target, if it is a big sprite + - qol: Various jobs have gotten additional programs uploaded at roundstart, engineers + now have the canary and atmospheric scanner programs, atmospheric technicians + now have the supermatter monitor, and Robotisists/RDs now have the silliconnect + program. + - bugfix: Ash drakes, colossi, and Bubblegum spawn on Lavaland more often; a sharp + increase from the previous bugged amount of "basically never". + zydras: + - rscadd: Added a set of new donator items + - rscdel: Removed older, unused (and broken) donator items diff --git a/icons/area/areas_station.dmi b/icons/area/areas_station.dmi index 4704e61c6bc..b07ea38a159 100644 Binary files a/icons/area/areas_station.dmi and b/icons/area/areas_station.dmi differ diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi index c7d3d8951e2..ae695c3227f 100644 Binary files a/icons/effects/beam.dmi and b/icons/effects/beam.dmi differ diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 4feb3a8eb54..f7615fc045b 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/effects/eldritch.dmi b/icons/effects/eldritch.dmi index ebcbb397af0..40d4ea80df2 100644 Binary files a/icons/effects/eldritch.dmi and b/icons/effects/eldritch.dmi differ diff --git a/icons/effects/particles/acid.dmi b/icons/effects/particles/goop.dmi similarity index 67% rename from icons/effects/particles/acid.dmi rename to icons/effects/particles/goop.dmi index 74e347e9b97..673c1a7ad5b 100644 Binary files a/icons/effects/particles/acid.dmi and b/icons/effects/particles/goop.dmi differ diff --git a/icons/hud/screen_alert.dmi b/icons/hud/screen_alert.dmi index 7cc03330969..7a1f40d6fcd 100755 Binary files a/icons/hud/screen_alert.dmi and b/icons/hud/screen_alert.dmi differ diff --git a/icons/hud/screen_alien.dmi b/icons/hud/screen_alien.dmi index 82d0ed2f9f9..21d7cde0b03 100644 Binary files a/icons/hud/screen_alien.dmi and b/icons/hud/screen_alien.dmi differ diff --git a/icons/mob/actions/actions_animal.dmi b/icons/mob/actions/actions_animal.dmi index 9caf5cdf2f7..f3f9a667f22 100644 Binary files a/icons/mob/actions/actions_animal.dmi and b/icons/mob/actions/actions_animal.dmi differ diff --git a/icons/mob/actions/actions_mecha.dmi b/icons/mob/actions/actions_mecha.dmi index c621b21775b..5ae25522434 100644 Binary files a/icons/mob/actions/actions_mecha.dmi and b/icons/mob/actions/actions_mecha.dmi differ diff --git a/icons/mob/actions/actions_mod.dmi b/icons/mob/actions/actions_mod.dmi index 84fcbc00dbb..f788de20194 100644 Binary files a/icons/mob/actions/actions_mod.dmi and b/icons/mob/actions/actions_mod.dmi differ diff --git a/icons/mob/actions/actions_spells.dmi b/icons/mob/actions/actions_spells.dmi index 9d657c6b88c..9152ef8d966 100644 Binary files a/icons/mob/actions/actions_spells.dmi and b/icons/mob/actions/actions_spells.dmi differ diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi index ec1fb3e381e..8e50d48b587 100644 Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ diff --git a/icons/mob/clothing/back/backpack.dmi b/icons/mob/clothing/back/backpack.dmi index 0ee8632c87b..bf5207d85c4 100644 Binary files a/icons/mob/clothing/back/backpack.dmi and b/icons/mob/clothing/back/backpack.dmi differ diff --git a/icons/mob/clothing/belt_mirror.dmi b/icons/mob/clothing/belt_mirror.dmi index 1fc748b7b36..875aed119c1 100644 Binary files a/icons/mob/clothing/belt_mirror.dmi and b/icons/mob/clothing/belt_mirror.dmi differ diff --git a/icons/mob/clothing/feet.dmi b/icons/mob/clothing/feet.dmi index 007aff9f3ea..3c2f4b54b17 100644 Binary files a/icons/mob/clothing/feet.dmi and b/icons/mob/clothing/feet.dmi differ diff --git a/icons/mob/clothing/head/hats.dmi b/icons/mob/clothing/head/hats.dmi index 3676c8f5485..1806b193066 100644 Binary files a/icons/mob/clothing/head/hats.dmi and b/icons/mob/clothing/head/hats.dmi differ diff --git a/icons/mob/clothing/head/utility.dmi b/icons/mob/clothing/head/utility.dmi index 85b0b17b66b..3f3a668181c 100644 Binary files a/icons/mob/clothing/head/utility.dmi and b/icons/mob/clothing/head/utility.dmi differ diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi index 00f2af446db..0750f61bd82 100644 Binary files a/icons/mob/clothing/neck.dmi and b/icons/mob/clothing/neck.dmi differ diff --git a/icons/mob/clothing/suits/jacket.dmi b/icons/mob/clothing/suits/jacket.dmi index f9b7b5d31a2..2466bcda85e 100644 Binary files a/icons/mob/clothing/suits/jacket.dmi and b/icons/mob/clothing/suits/jacket.dmi differ diff --git a/icons/mob/clothing/suits/utility.dmi b/icons/mob/clothing/suits/utility.dmi index 6300eb8e067..86038a5f6d5 100644 Binary files a/icons/mob/clothing/suits/utility.dmi and b/icons/mob/clothing/suits/utility.dmi differ diff --git a/icons/mob/clothing/under/cargo.dmi b/icons/mob/clothing/under/cargo.dmi index 01b5ad6c99d..93499d605b7 100644 Binary files a/icons/mob/clothing/under/cargo.dmi and b/icons/mob/clothing/under/cargo.dmi differ diff --git a/icons/mob/clothing/under/civilian.dmi b/icons/mob/clothing/under/civilian.dmi index 667d98b5361..7283996c3b1 100644 Binary files a/icons/mob/clothing/under/civilian.dmi and b/icons/mob/clothing/under/civilian.dmi differ diff --git a/icons/mob/clothing/under/costume.dmi b/icons/mob/clothing/under/costume.dmi index 5e11516d49a..c8fd87f5272 100644 Binary files a/icons/mob/clothing/under/costume.dmi and b/icons/mob/clothing/under/costume.dmi differ diff --git a/icons/mob/clothing/under/suits.dmi b/icons/mob/clothing/under/suits.dmi index e0981dbe580..e3800e2bd04 100644 Binary files a/icons/mob/clothing/under/suits.dmi and b/icons/mob/clothing/under/suits.dmi differ diff --git a/icons/mob/human/human_face.dmi b/icons/mob/human/human_face.dmi index 0afce5c66cb..6985cf07eee 100644 Binary files a/icons/mob/human/human_face.dmi and b/icons/mob/human/human_face.dmi differ diff --git a/icons/mob/human/species/hair_gradients.dmi b/icons/mob/human/species/hair_gradients.dmi index f494fdac0da..a5b36fab6a2 100644 Binary files a/icons/mob/human/species/hair_gradients.dmi and b/icons/mob/human/species/hair_gradients.dmi differ diff --git a/icons/mob/human/species/misc/digitigrade.dmi b/icons/mob/human/species/misc/digitigrade.dmi index ce246d0d8d7..e0d20013abe 100644 Binary files a/icons/mob/human/species/misc/digitigrade.dmi and b/icons/mob/human/species/misc/digitigrade.dmi differ diff --git a/icons/mob/inhands/64x64_lefthand.dmi b/icons/mob/inhands/64x64_lefthand.dmi index 4a43893cef4..26c177f7293 100644 Binary files a/icons/mob/inhands/64x64_lefthand.dmi and b/icons/mob/inhands/64x64_lefthand.dmi differ diff --git a/icons/mob/inhands/64x64_righthand.dmi b/icons/mob/inhands/64x64_righthand.dmi index 89975e330ce..79c30f5cb19 100644 Binary files a/icons/mob/inhands/64x64_righthand.dmi and b/icons/mob/inhands/64x64_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/backpack_lefthand.dmi b/icons/mob/inhands/equipment/backpack_lefthand.dmi index 62c0dabfb52..e1cdb33c4b7 100644 Binary files a/icons/mob/inhands/equipment/backpack_lefthand.dmi and b/icons/mob/inhands/equipment/backpack_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/backpack_righthand.dmi b/icons/mob/inhands/equipment/backpack_righthand.dmi index f0d9981edc4..31bdf51e7e0 100644 Binary files a/icons/mob/inhands/equipment/backpack_righthand.dmi and b/icons/mob/inhands/equipment/backpack_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/toolbox_lefthand.dmi b/icons/mob/inhands/equipment/toolbox_lefthand.dmi index ed084d3db2a..e3aca82d9e8 100644 Binary files a/icons/mob/inhands/equipment/toolbox_lefthand.dmi and b/icons/mob/inhands/equipment/toolbox_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/toolbox_righthand.dmi b/icons/mob/inhands/equipment/toolbox_righthand.dmi index fe00f84ed67..a7b538a1300 100644 Binary files a/icons/mob/inhands/equipment/toolbox_righthand.dmi and b/icons/mob/inhands/equipment/toolbox_righthand.dmi differ diff --git a/icons/mob/inhands/items/drinks_lefthand.dmi b/icons/mob/inhands/items/drinks_lefthand.dmi index b1aa5e67822..fb2d9c22dd4 100644 Binary files a/icons/mob/inhands/items/drinks_lefthand.dmi and b/icons/mob/inhands/items/drinks_lefthand.dmi differ diff --git a/icons/mob/inhands/items/drinks_righthand.dmi b/icons/mob/inhands/items/drinks_righthand.dmi index 3d111096044..13f9dc0a026 100644 Binary files a/icons/mob/inhands/items/drinks_righthand.dmi and b/icons/mob/inhands/items/drinks_righthand.dmi differ diff --git a/icons/mob/inhands/items/food_righthand.dmi b/icons/mob/inhands/items/food_righthand.dmi index 78e22cdaea3..f49835a3a7b 100644 Binary files a/icons/mob/inhands/items/food_righthand.dmi and b/icons/mob/inhands/items/food_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/64x_guns_left.dmi b/icons/mob/inhands/weapons/64x_guns_left.dmi index e03b66b1c67..0378a604057 100644 Binary files a/icons/mob/inhands/weapons/64x_guns_left.dmi and b/icons/mob/inhands/weapons/64x_guns_left.dmi differ diff --git a/icons/mob/inhands/weapons/64x_guns_right.dmi b/icons/mob/inhands/weapons/64x_guns_right.dmi index 3e58d86b7a5..50fa2342d2a 100644 Binary files a/icons/mob/inhands/weapons/64x_guns_right.dmi and b/icons/mob/inhands/weapons/64x_guns_right.dmi differ diff --git a/icons/mob/inhands/weapons/guns_lefthand.dmi b/icons/mob/inhands/weapons/guns_lefthand.dmi index 3223282456e..013e6e47458 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 ea64718cbca..14bf9e762c7 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/mech_construction.dmi b/icons/mob/mech_construction.dmi index c0f59412335..b7b54e3f70e 100644 Binary files a/icons/mob/mech_construction.dmi and b/icons/mob/mech_construction.dmi differ diff --git a/icons/mob/mecha_equipment.dmi b/icons/mob/mecha_equipment.dmi index 18d884df2ac..18fe707cafe 100644 Binary files a/icons/mob/mecha_equipment.dmi and b/icons/mob/mecha_equipment.dmi differ diff --git a/icons/mob/simple/arachnoid.dmi b/icons/mob/simple/arachnoid.dmi index 976005f6b5e..fca53195d4c 100644 Binary files a/icons/mob/simple/arachnoid.dmi and b/icons/mob/simple/arachnoid.dmi differ diff --git a/icons/mob/simple/carp.dmi b/icons/mob/simple/carp.dmi index 54b9cb7bee4..1be59c43ecb 100644 Binary files a/icons/mob/simple/carp.dmi and b/icons/mob/simple/carp.dmi differ diff --git a/icons/mob/simple/lavaland/lavaland_monsters.dmi b/icons/mob/simple/lavaland/lavaland_monsters.dmi index c167b45e629..1d546bd17d4 100644 Binary files a/icons/mob/simple/lavaland/lavaland_monsters.dmi and b/icons/mob/simple/lavaland/lavaland_monsters.dmi differ diff --git a/icons/mob/simple/lavaland/lavaland_monsters_wide.dmi b/icons/mob/simple/lavaland/lavaland_monsters_wide.dmi index 60d8cc16cae..2be68ef4c66 100644 Binary files a/icons/mob/simple/lavaland/lavaland_monsters_wide.dmi and b/icons/mob/simple/lavaland/lavaland_monsters_wide.dmi differ diff --git a/icons/obj/aicards.dmi b/icons/obj/aicards.dmi index 86501e4b43b..2de7da5f6c8 100644 Binary files a/icons/obj/aicards.dmi and b/icons/obj/aicards.dmi differ diff --git a/icons/obj/clothing/head/hats.dmi b/icons/obj/clothing/head/hats.dmi index f420521a0aa..e8662998fd8 100644 Binary files a/icons/obj/clothing/head/hats.dmi and b/icons/obj/clothing/head/hats.dmi differ diff --git a/icons/obj/clothing/head/utility.dmi b/icons/obj/clothing/head/utility.dmi index 2d8f274c94e..9571b2add78 100644 Binary files a/icons/obj/clothing/head/utility.dmi and b/icons/obj/clothing/head/utility.dmi differ diff --git a/icons/obj/clothing/modsuit/mod_modules.dmi b/icons/obj/clothing/modsuit/mod_modules.dmi index 01c9fb635c2..d548f615c44 100644 Binary files a/icons/obj/clothing/modsuit/mod_modules.dmi and b/icons/obj/clothing/modsuit/mod_modules.dmi differ diff --git a/icons/obj/clothing/neck.dmi b/icons/obj/clothing/neck.dmi index 1f75bd6c12b..ff7e012324a 100644 Binary files a/icons/obj/clothing/neck.dmi and b/icons/obj/clothing/neck.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index bcc4a40e147..49ec0767f78 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/clothing/suits/jacket.dmi b/icons/obj/clothing/suits/jacket.dmi index bcde51f037e..3ac958c1c38 100644 Binary files a/icons/obj/clothing/suits/jacket.dmi and b/icons/obj/clothing/suits/jacket.dmi differ diff --git a/icons/obj/clothing/suits/utility.dmi b/icons/obj/clothing/suits/utility.dmi index d7bb4e9bfa6..595746191d3 100644 Binary files a/icons/obj/clothing/suits/utility.dmi and b/icons/obj/clothing/suits/utility.dmi differ diff --git a/icons/obj/clothing/under/cargo.dmi b/icons/obj/clothing/under/cargo.dmi index 5ea90482faf..4f9fe47a3f6 100644 Binary files a/icons/obj/clothing/under/cargo.dmi and b/icons/obj/clothing/under/cargo.dmi differ diff --git a/icons/obj/clothing/under/civilian.dmi b/icons/obj/clothing/under/civilian.dmi index 04c37b2356e..8552c5b9660 100644 Binary files a/icons/obj/clothing/under/civilian.dmi and b/icons/obj/clothing/under/civilian.dmi differ diff --git a/icons/obj/clothing/under/costume.dmi b/icons/obj/clothing/under/costume.dmi index fb0945bc72e..bf60bb0a445 100644 Binary files a/icons/obj/clothing/under/costume.dmi and b/icons/obj/clothing/under/costume.dmi differ diff --git a/icons/obj/clothing/under/lawyer_galaxy.dmi b/icons/obj/clothing/under/lawyer_galaxy.dmi new file mode 100644 index 00000000000..88ffcf44132 Binary files /dev/null and b/icons/obj/clothing/under/lawyer_galaxy.dmi differ diff --git a/icons/obj/clothing/under/suits.dmi b/icons/obj/clothing/under/suits.dmi index 604e3787b24..42c79981df6 100644 Binary files a/icons/obj/clothing/under/suits.dmi and b/icons/obj/clothing/under/suits.dmi differ diff --git a/icons/obj/doors/airlocks/glass_large/glass_large.dmi b/icons/obj/doors/airlocks/glass_large/glass_large.dmi deleted file mode 100644 index 9dbcb9d0f1a..00000000000 Binary files a/icons/obj/doors/airlocks/glass_large/glass_large.dmi and /dev/null differ diff --git a/icons/obj/doors/airlocks/glass_large/overlays.dmi b/icons/obj/doors/airlocks/glass_large/overlays.dmi deleted file mode 100644 index bc9cc86c107..00000000000 Binary files a/icons/obj/doors/airlocks/glass_large/overlays.dmi and /dev/null differ diff --git a/icons/obj/doors/airlocks/multi_tile/public/glass.dmi b/icons/obj/doors/airlocks/multi_tile/public/glass.dmi new file mode 100644 index 00000000000..33420a77b11 Binary files /dev/null and b/icons/obj/doors/airlocks/multi_tile/public/glass.dmi differ diff --git a/icons/obj/doors/airlocks/multi_tile/public/overlays.dmi b/icons/obj/doors/airlocks/multi_tile/public/overlays.dmi new file mode 100644 index 00000000000..b0d10c8945d Binary files /dev/null and b/icons/obj/doors/airlocks/multi_tile/public/overlays.dmi differ diff --git a/icons/obj/doors/airlocks/station2/glass.dmi b/icons/obj/doors/airlocks/public/glass.dmi similarity index 100% rename from icons/obj/doors/airlocks/station2/glass.dmi rename to icons/obj/doors/airlocks/public/glass.dmi diff --git a/icons/obj/doors/airlocks/station2/overlays.dmi b/icons/obj/doors/airlocks/public/overlays.dmi similarity index 100% rename from icons/obj/doors/airlocks/station2/overlays.dmi rename to icons/obj/doors/airlocks/public/overlays.dmi diff --git a/icons/obj/drinks/bottles.dmi b/icons/obj/drinks/bottles.dmi index 6a3c1559800..205a67c84e2 100644 Binary files a/icons/obj/drinks/bottles.dmi and b/icons/obj/drinks/bottles.dmi differ diff --git a/icons/obj/drinks/boxes.dmi b/icons/obj/drinks/boxes.dmi index b4b2ce7d1b9..0871bf55006 100644 Binary files a/icons/obj/drinks/boxes.dmi and b/icons/obj/drinks/boxes.dmi differ diff --git a/icons/obj/drinks/drinks.dmi b/icons/obj/drinks/drinks.dmi index add38550de2..4b966cb2db2 100644 Binary files a/icons/obj/drinks/drinks.dmi and b/icons/obj/drinks/drinks.dmi differ diff --git a/icons/obj/drinks/mixed_drinks.dmi b/icons/obj/drinks/mixed_drinks.dmi index 9d11040d0ab..afda4ecfe5e 100644 Binary files a/icons/obj/drinks/mixed_drinks.dmi and b/icons/obj/drinks/mixed_drinks.dmi differ diff --git a/icons/obj/drinks/soda.dmi b/icons/obj/drinks/soda.dmi index 95b195789d1..f061e029c4d 100644 Binary files a/icons/obj/drinks/soda.dmi and b/icons/obj/drinks/soda.dmi differ diff --git a/icons/obj/food/burgerbread.dmi b/icons/obj/food/burgerbread.dmi index a49423ba87c..9faca25854e 100644 Binary files a/icons/obj/food/burgerbread.dmi and b/icons/obj/food/burgerbread.dmi differ diff --git a/icons/obj/food/canned.dmi b/icons/obj/food/canned.dmi index 5f61b7e1796..97f66f2d5b5 100644 Binary files a/icons/obj/food/canned.dmi and b/icons/obj/food/canned.dmi differ diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi index 6d7792c9254..d7e3d73f861 100644 Binary files a/icons/obj/food/containers.dmi and b/icons/obj/food/containers.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index 1b2c01e7f0d..7ab1670900a 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/food/food_ingredients.dmi b/icons/obj/food/food_ingredients.dmi index 30825da0243..e0799ed7108 100644 Binary files a/icons/obj/food/food_ingredients.dmi and b/icons/obj/food/food_ingredients.dmi differ diff --git a/icons/obj/food/frozen_treats.dmi b/icons/obj/food/frozen_treats.dmi index 133d6de83a0..b5b91520e8c 100644 Binary files a/icons/obj/food/frozen_treats.dmi and b/icons/obj/food/frozen_treats.dmi differ diff --git a/icons/obj/food/martian.dmi b/icons/obj/food/martian.dmi new file mode 100644 index 00000000000..79efcd1813d Binary files /dev/null and b/icons/obj/food/martian.dmi differ diff --git a/icons/obj/food/meat.dmi b/icons/obj/food/meat.dmi index b010ced4ead..dec295bcbf0 100644 Binary files a/icons/obj/food/meat.dmi and b/icons/obj/food/meat.dmi differ diff --git a/icons/obj/food/mexican.dmi b/icons/obj/food/mexican.dmi index 44bcc5f2e7b..ba02c15a0b5 100644 Binary files a/icons/obj/food/mexican.dmi and b/icons/obj/food/mexican.dmi differ diff --git a/icons/obj/food/piecake.dmi b/icons/obj/food/piecake.dmi index ff031abecae..9a122e00ef7 100644 Binary files a/icons/obj/food/piecake.dmi and b/icons/obj/food/piecake.dmi differ diff --git a/icons/obj/food/spaghetti.dmi b/icons/obj/food/spaghetti.dmi index 23b50af2a8d..1c97a45e7b7 100644 Binary files a/icons/obj/food/spaghetti.dmi and b/icons/obj/food/spaghetti.dmi differ diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index dcf023f753b..061099defd4 100644 Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ diff --git a/icons/obj/lighting_overlay.dmi b/icons/obj/lighting_overlay.dmi index 5760653773b..de25dbe1709 100644 Binary files a/icons/obj/lighting_overlay.dmi and b/icons/obj/lighting_overlay.dmi differ diff --git a/icons/obj/machines/navigation_beacon.dmi b/icons/obj/machines/navigation_beacon.dmi new file mode 100644 index 00000000000..f20ca068c52 Binary files /dev/null and b/icons/obj/machines/navigation_beacon.dmi differ diff --git a/icons/obj/machines/vending.dmi b/icons/obj/machines/vending.dmi index f74b5ae4a85..a5db6caa6e2 100644 Binary files a/icons/obj/machines/vending.dmi and b/icons/obj/machines/vending.dmi differ diff --git a/icons/obj/medical/organs/organs.dmi b/icons/obj/medical/organs/organs.dmi index 3de3e057df6..17e09c7395c 100644 Binary files a/icons/obj/medical/organs/organs.dmi and b/icons/obj/medical/organs/organs.dmi differ diff --git a/icons/obj/medical/surgery_table.dmi b/icons/obj/medical/surgery_table.dmi index 4a9a74259db..b02801e0844 100644 Binary files a/icons/obj/medical/surgery_table.dmi and b/icons/obj/medical/surgery_table.dmi differ diff --git a/icons/obj/miningradio.dmi b/icons/obj/miningradio.dmi new file mode 100644 index 00000000000..e3d10f3b6d6 Binary files /dev/null and b/icons/obj/miningradio.dmi differ diff --git a/icons/obj/ore.dmi b/icons/obj/ore.dmi index 41f794eeace..23fcb8c89ea 100644 Binary files a/icons/obj/ore.dmi and b/icons/obj/ore.dmi differ diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi index ebacb9fde4d..89febbe2e6b 100644 Binary files a/icons/obj/pda.dmi and b/icons/obj/pda.dmi differ diff --git a/icons/obj/pipes_n_cables/disposal.dmi b/icons/obj/pipes_n_cables/disposal.dmi index 450d8e8f8ab..8487f3dd58c 100644 Binary files a/icons/obj/pipes_n_cables/disposal.dmi and b/icons/obj/pipes_n_cables/disposal.dmi differ diff --git a/icons/obj/pipes_n_cables/transit_tube.dmi b/icons/obj/pipes_n_cables/transit_tube.dmi index 966e20d6841..30a23beed16 100644 Binary files a/icons/obj/pipes_n_cables/transit_tube.dmi and b/icons/obj/pipes_n_cables/transit_tube.dmi differ diff --git a/icons/obj/service/janitor.dmi b/icons/obj/service/janitor.dmi index 18a574c7cff..8c73a99b416 100644 Binary files a/icons/obj/service/janitor.dmi and b/icons/obj/service/janitor.dmi differ diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi index c1fcad67b2b..b524789417d 100644 Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ diff --git a/icons/obj/storage/backpack.dmi b/icons/obj/storage/backpack.dmi index b66bb441968..c61d9321611 100644 Binary files a/icons/obj/storage/backpack.dmi and b/icons/obj/storage/backpack.dmi differ diff --git a/icons/obj/storage/case.dmi b/icons/obj/storage/case.dmi index 7bb51c61c8f..0320ce881f9 100644 Binary files a/icons/obj/storage/case.dmi and b/icons/obj/storage/case.dmi differ diff --git a/icons/obj/wallmounts.dmi b/icons/obj/wallmounts.dmi index c235445515e..10e19983c0c 100644 Binary files a/icons/obj/wallmounts.dmi and b/icons/obj/wallmounts.dmi differ diff --git a/icons/obj/weapons/giant_wrench.dmi b/icons/obj/weapons/giant_wrench.dmi new file mode 100644 index 00000000000..b9aef713d6a Binary files /dev/null and b/icons/obj/weapons/giant_wrench.dmi differ diff --git a/icons/obj/weapons/guns/ammo.dmi b/icons/obj/weapons/guns/ammo.dmi index 074ebca306a..a36b593706f 100644 Binary files a/icons/obj/weapons/guns/ammo.dmi and b/icons/obj/weapons/guns/ammo.dmi differ diff --git a/icons/obj/weapons/guns/ballistic.dmi b/icons/obj/weapons/guns/ballistic.dmi index 69233ec07f3..9dd25af2a92 100644 Binary files a/icons/obj/weapons/guns/ballistic.dmi and b/icons/obj/weapons/guns/ballistic.dmi differ diff --git a/icons/obj/weapons/guns/mosinnagant.dmi b/icons/obj/weapons/guns/mosinnagant.dmi deleted file mode 100644 index 87fff58e6ca..00000000000 Binary files a/icons/obj/weapons/guns/mosinnagant.dmi and /dev/null differ diff --git a/icons/obj/weapons/guns/wide_guns.dmi b/icons/obj/weapons/guns/wide_guns.dmi index 0894128677e..1f51a0a91d8 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/obj/weapons/improvised.dmi b/icons/obj/weapons/improvised.dmi index b2ef58f7088..a98d5cad860 100644 Binary files a/icons/obj/weapons/improvised.dmi and b/icons/obj/weapons/improvised.dmi differ diff --git a/icons/ui_icons/achievements/achievements.dmi b/icons/ui_icons/achievements/achievements.dmi index 0f6b9c933e3..ad34dfd16f0 100644 Binary files a/icons/ui_icons/achievements/achievements.dmi and b/icons/ui_icons/achievements/achievements.dmi differ diff --git a/icons/ui_icons/fishing/default.png b/icons/ui_icons/fishing/default.png index f21074ac2dd..20dabae9210 100644 Binary files a/icons/ui_icons/fishing/default.png and b/icons/ui_icons/fishing/default.png differ diff --git a/icons/ui_icons/fishing/lavaland.png b/icons/ui_icons/fishing/lavaland.png index 6c97f66432e..b6e2487bdc4 100644 Binary files a/icons/ui_icons/fishing/lavaland.png and b/icons/ui_icons/fishing/lavaland.png differ diff --git a/libbyond_sleeping_procs.so b/libbyond_sleeping_procs.so new file mode 100644 index 00000000000..8596115fd96 Binary files /dev/null and b/libbyond_sleeping_procs.so differ diff --git a/lua/SS13.lua b/lua/SS13.lua index b86b8ec6dfb..a17d5b50577 100644 --- a/lua/SS13.lua +++ b/lua/SS13.lua @@ -16,7 +16,7 @@ function SS13.istype(thing, type) end function SS13.new(type, ...) - local datum = dm.global_proc("_new", type, { ... }) + local datum = SS13.new_untracked(type, table.unpack({...})) if datum then local references = SS13.state.vars.references references:add(datum) @@ -25,6 +25,29 @@ function SS13.new(type, ...) end end +function SS13.type(string_type) + return dm.global_proc("_text2path", string_type) +end + +function SS13.qdel(datum) + if SS13.is_valid(datum) then + dm.global_proc("qdel", datum) + return true + end + return false +end + +function SS13.new_untracked(type, ...) + return dm.global_proc("_new", type, { ... }) +end + +function SS13.is_valid(datum) + if datum and not datum:is_null() and not datum:get_var("gc_destroyed") then + return true + end + return false +end + function SS13.await(thing_to_call, proc_to_call, ...) if not SS13.istype(thing_to_call, "/datum") then thing_to_call = SS13.global_proc @@ -38,7 +61,7 @@ function SS13.await(thing_to_call, proc_to_call, ...) sleep() end local return_value, runtime_message = promise_vars.return_value, promise_vars.runtime_message - dm.global_proc("qdel", promise) + SS13.stop_tracking(promise) return return_value, runtime_message end @@ -47,7 +70,7 @@ function SS13.wait(time, timer) local timedevent = dm.global_proc("_addtimer", callback, time * 10, 8, timer, debug.info(1, "sl")) coroutine.yield() dm.global_proc("deltimer", timedevent, timer) - dm.global_proc("qdel", callback) + SS13.stop_tracking(callback) end function SS13.register_signal(datum, signal, func, make_easy_clear_function) @@ -77,7 +100,7 @@ function SS13.register_signal(datum, signal, func, make_easy_clear_function) SS13.signal_handlers[datum]["_cleanup"] = { func = function(datum) SS13.signal_handler_cleanup(datum) - dm.global_proc("qdel", cleanup_callback) + SS13.stop_tracking(cleanup_callback) end, callback = cleanup_callback, } @@ -108,6 +131,10 @@ function SS13.register_signal(datum, signal, func, make_easy_clear_function) return callback end +function SS13.stop_tracking(datum) + SS13.state:call_proc("let_soft_delete", datum) +end + function SS13.unregister_signal(datum, signal, callback) local function clear_handler(handler_info) if not handler_info then @@ -118,7 +145,7 @@ function SS13.unregister_signal(datum, signal, callback) end local handler_callback = handler_info.callback handler_callback:call_proc("UnregisterSignal", datum, signal) - dm.global_proc("qdel", handler_callback) + SS13.stop_tracking(handler_callback) end if not SS13.signal_handlers then @@ -180,7 +207,7 @@ function SS13.set_timeout(time, func, timer) SS13.timeouts[callback] = function() SS13.timeouts[callback] = nil dm.global_proc("deltimer", timedevent, timer) - dm.global_proc("qdel", callback) + SS13.stop_tracking(callback) func() end local path = { "SS13", "timeouts", dm.global_proc("WEAKREF", callback) } diff --git a/modular_skyrat/master_files/code/_globalvars/configuration.dm b/modular_skyrat/master_files/code/_globalvars/configuration.dm index 44053f3fecd..fdd54c7498d 100644 --- a/modular_skyrat/master_files/code/_globalvars/configuration.dm +++ b/modular_skyrat/master_files/code/_globalvars/configuration.dm @@ -63,3 +63,6 @@ GLOBAL_VAR_INIT(looc_allowed, TRUE) // Minimum alert level for pods to actually evacuate people /datum/config_entry/number/minimum_alert_for_pods + +/// Split the threat budget between roundstart and midrounds +/datum/config_entry/flag/split_threat_budget diff --git a/modular_skyrat/master_files/code/controllers/configuration/entries/skyrat_config_entries.dm b/modular_skyrat/master_files/code/controllers/configuration/entries/skyrat_config_entries.dm index 23cfbcb8d47..ddb42e7024c 100644 --- a/modular_skyrat/master_files/code/controllers/configuration/entries/skyrat_config_entries.dm +++ b/modular_skyrat/master_files/code/controllers/configuration/entries/skyrat_config_entries.dm @@ -49,3 +49,18 @@ // NEVER set this value to 0!! /datum/config_entry/number/flavor_text_character_requirement default = 150 + +/// Defines whether or not mentors can see ckeys alongside mobnames. +/datum/config_entry/flag/mentors_mobname_only + +/// Defines whether the server uses the legacy donator system with donators.txt or the SQL system. +/datum/config_entry/flag/donator_legacy_system + protection = CONFIG_ENTRY_LOCKED + +/// Defines whether the server uses the legacy mentor system with mentors.txt or the SQL system. +/datum/config_entry/flag/mentor_legacy_system + protection = CONFIG_ENTRY_LOCKED + +/// Defines whether the server uses the legacy veteran system with veteran_players.txt or the SQL system. +/datum/config_entry/flag/veteran_legacy_system + protection = CONFIG_ENTRY_LOCKED diff --git a/modular_skyrat/master_files/code/datums/mind/_mind.dm b/modular_skyrat/master_files/code/datums/mind/_mind.dm new file mode 100644 index 00000000000..892f2a491ed --- /dev/null +++ b/modular_skyrat/master_files/code/datums/mind/_mind.dm @@ -0,0 +1,11 @@ +// Free chaplain highpriest role if the chaplain's mind gets deleted for some reason +/datum/mind/Destroy() + var/list/holy_successors = list_holy_successors() + if(current && (current in holy_successors)) // if this mob was a holy successor then remove them from the pool + GLOB.holy_successors -= WEAKREF(src) + + // Handle freeing the high priest role for the next chaplain in line + if(holy_role == HOLY_ROLE_HIGHPRIEST) + reset_religion() + + return ..() diff --git a/modular_skyrat/master_files/code/datums/mood_events/drink_events.dm b/modular_skyrat/master_files/code/datums/mood_events/drink_events.dm new file mode 100644 index 00000000000..a697d94b8e4 --- /dev/null +++ b/modular_skyrat/master_files/code/datums/mood_events/drink_events.dm @@ -0,0 +1,4 @@ +/datum/mood_event/race_drink + description = span_nicegreen("That drink was made for me!\n") + mood_change = 12 + timeout = 9 MINUTES diff --git a/modular_skyrat/master_files/code/datums/traits/good.dm b/modular_skyrat/master_files/code/datums/traits/good.dm index 54488b252d6..22987f7705d 100644 --- a/modular_skyrat/master_files/code/datums/traits/good.dm +++ b/modular_skyrat/master_files/code/datums/traits/good.dm @@ -20,6 +20,54 @@ medical_record_text = "Patient demonstrates a high brain plasticity in regards to language learning." icon = FA_ICON_BOOK_ATLAS +/datum/quirk/sharpclaws + name = "Sharp Claws" + desc = "Whether it's a hunter's inherent biology, or your stubborn refusal to clip your nails ahead of your Jiu-Jitsu classes, your unarmed attacks are sharper and will make people bleed." + value = 2 + gain_text = span_notice("Your palms hurt a bit from the sharpness of your nails.") + lose_text = span_danger("You feel a distinct emptiness as your nails dull; good luck scratching that itch.") + medical_record_text = "Patient ended up scratching through the examination table's cushions; recommended they look into clipping their claws." + icon = FA_ICON_HAND + +/datum/quirk/sharpclaws/add(client/client_source) + var/mob/living/carbon/human/human_holder = quirk_holder + if(!istype(human_holder)) + return FALSE + + var/obj/item/bodypart/arm/left/left_arm = human_holder.get_bodypart(BODY_ZONE_L_ARM) + if(left_arm) + left_arm.unarmed_attack_verb = "slash" + left_arm.unarmed_attack_effect = ATTACK_EFFECT_CLAW + left_arm.unarmed_attack_sound = 'sound/weapons/slash.ogg' + left_arm.unarmed_miss_sound = 'sound/weapons/slashmiss.ogg' + left_arm.unarmed_sharpness = SHARP_EDGED + + var/obj/item/bodypart/arm/right/right_arm = human_holder.get_bodypart(BODY_ZONE_R_ARM) + if(right_arm) + right_arm.unarmed_attack_verb = "slash" + right_arm.unarmed_attack_effect = ATTACK_EFFECT_CLAW + right_arm.unarmed_attack_sound = 'sound/weapons/slash.ogg' + right_arm.unarmed_miss_sound = 'sound/weapons/slashmiss.ogg' + right_arm.unarmed_sharpness = SHARP_EDGED + +/datum/quirk/sharpclaws/remove(client/client_source) + var/mob/living/carbon/human/human_holder = quirk_holder + var/obj/item/bodypart/arm/left/left_arm = human_holder.get_bodypart(BODY_ZONE_L_ARM) + if(left_arm) + left_arm.unarmed_attack_verb = initial(left_arm.unarmed_attack_verb) + left_arm.unarmed_attack_effect = initial(left_arm.unarmed_attack_effect) + left_arm.unarmed_attack_sound = initial(left_arm.unarmed_attack_sound) + left_arm.unarmed_miss_sound = initial(left_arm.unarmed_miss_sound) + left_arm.unarmed_sharpness = initial(left_arm.unarmed_sharpness) + + var/obj/item/bodypart/arm/right/right_arm = human_holder.get_bodypart(BODY_ZONE_R_ARM) + if(right_arm) + right_arm.unarmed_attack_verb = initial(right_arm.unarmed_attack_verb) + right_arm.unarmed_attack_effect = initial(right_arm.unarmed_attack_effect) + right_arm.unarmed_attack_sound = initial(right_arm.unarmed_attack_sound) + right_arm.unarmed_miss_sound = initial(right_arm.unarmed_miss_sound) + right_arm.unarmed_sharpness = initial(right_arm.unarmed_sharpness) + // AdditionalEmotes *turf quirks /datum/quirk/water_aspect name = "Water aspect (Emotes)" diff --git a/modular_skyrat/master_files/code/game/gamemodes/dynamic.dm b/modular_skyrat/master_files/code/game/gamemodes/dynamic.dm index 0170809289c..4c27c0edde0 100644 --- a/modular_skyrat/master_files/code/game/gamemodes/dynamic.dm +++ b/modular_skyrat/master_files/code/game/gamemodes/dynamic.dm @@ -28,8 +28,11 @@ /// Desired median point for midrounds, plus or minus the midround_roll_distance. var/midround_median_frequency = 36000 -/// Divides threat budget, in this case pure midround because Skyrat doesn't have roundstart antags. +/// Divides threat budget based on the server config /datum/game_mode/dynamic/generate_budgets() + if(CONFIG_GET(flag/split_threat_budget)) + return ..() + round_start_budget = 0 initial_round_start_budget = 0 mid_round_budget = threat_level diff --git a/modular_skyrat/master_files/code/game/objects/effects/decals/remains.dm b/modular_skyrat/master_files/code/game/objects/effects/decals/remains.dm index 3dc421d40be..559bfec759f 100644 --- a/modular_skyrat/master_files/code/game/objects/effects/decals/remains.dm +++ b/modular_skyrat/master_files/code/game/objects/effects/decals/remains.dm @@ -1,2 +1,2 @@ /obj/effect/decal/remains/NeverShouldHaveComeHere(turf/here_turf) - return !islava(here_turf) && ..() + return !islava(here_turf) && !(istype(here_turf, /turf/open/water/beach/xen) || istype(here_turf, /turf/open/misc/beach/coastline_t) || istype(here_turf, /turf/open/water/xen_acid)) && ..() diff --git a/modular_skyrat/master_files/code/game/objects/items/RCD.dm b/modular_skyrat/master_files/code/game/objects/items/RCD.dm index f2fc19abd1d..87606cd147e 100644 --- a/modular_skyrat/master_files/code/game/objects/items/RCD.dm +++ b/modular_skyrat/master_files/code/game/objects/items/RCD.dm @@ -31,41 +31,45 @@ else return ..() -/// add the drain design to the plumbing RCD designs list -/obj/item/construction/plumbing/set_plumbing_designs() - . = ..() - plumbing_design_types += list( - /obj/structure/drain = 5, - ) - -///overridden to account for special case for the drain which is a structure -/obj/item/construction/plumbing/get_category(obj/recipe) - if(ispath(recipe, /obj/structure/drain)) - return "Liquids" - else - return ..() - /obj/item/construction/plumbing/mining name = "mining plumbing constructor" desc = "A type of plumbing constructor designed to harvest from geysers and collect their fluids." icon_state = "plumberer_mining" + var/static/list/mining_design_types = list( + //category 1 Synthesizers i.e devices which creates , reacts & destroys chemicals + "Synthesizers" = list( + /obj/machinery/plumbing/grinder_chemical = 30, + /obj/machinery/plumbing/liquid_pump = 35, //extracting chemicals from ground is one way of creation + /obj/machinery/plumbing/disposer = 10, + /obj/machinery/plumbing/buffer = 10, //creates chemicals as it waits for other buffers containing other chemicals and when mixed creates new chemicals + ), -/obj/item/construction/plumbing/mining/set_plumbing_designs() - plumbing_design_types = list( - /obj/machinery/duct = 1, - /obj/machinery/plumbing/input = 5, - /obj/machinery/plumbing/output = 5, - /obj/machinery/plumbing/tank = 20, - /obj/machinery/plumbing/buffer = 10, - /obj/machinery/plumbing/layer_manifold = 5, - // Above are the most common machinery which is shown on the first cycle. Keep new additions below THIS line, unless they're probably gonna be needed alot - /obj/machinery/plumbing/acclimator = 10, - /obj/machinery/plumbing/bottler = 50, - /obj/machinery/plumbing/disposer = 10, - /obj/machinery/plumbing/filter = 5, - /obj/machinery/plumbing/grinder_chemical = 30, - /obj/machinery/plumbing/liquid_pump = 35, - /obj/machinery/plumbing/splitter = 5, - /obj/machinery/plumbing/sender = 20, - /obj/structure/drain = 5, + //category 2 distributors i.e devices which inject , move around , remove chemicals from the network + "Distributors" = list( + /obj/machinery/duct = 1, + /obj/machinery/plumbing/layer_manifold = 5, + /obj/machinery/plumbing/input = 5, + /obj/machinery/plumbing/filter = 5, + /obj/machinery/plumbing/splitter = 5, + /obj/machinery/plumbing/sender = 20, + /obj/machinery/plumbing/output = 5, + ), + + //category 3 Storage i.e devices which stores & makes the processed chemicals ready for consumption + "Storage" = list( + /obj/machinery/plumbing/tank = 20, + /obj/machinery/plumbing/acclimator = 10, + /obj/machinery/plumbing/bottler = 50, + /obj/machinery/iv_drip/plumbing = 20 + ), + + //category 4 liquids + "Liquids" = list( + /obj/structure/drain = 5, + ), ) + +/obj/item/construction/plumbing/mining/Initialize(mapload) + . = ..() + plumbing_design_types = mining_design_types + diff --git a/modular_skyrat/master_files/code/game/objects/items/storage/backpack.dm b/modular_skyrat/master_files/code/game/objects/items/storage/backpack.dm index 0d5c582184d..f736ae58f2a 100644 --- a/modular_skyrat/master_files/code/game/objects/items/storage/backpack.dm +++ b/modular_skyrat/master_files/code/game/objects/items/storage/backpack.dm @@ -36,3 +36,121 @@ /obj/item/storage/backpack/satchel/flat/with_tools/PopulateContents() new /obj/item/stack/tile/iron/base(src) new /obj/item/crowbar(src) + +/* + * Messenger Bag Types + */ + +/obj/item/storage/backpack/messenger + name = "messenger bag" + desc = "A trendy looking messenger bag; sometimes known as a courier bag. Fashionable and portable." + icon_state = "messenger" + inhand_icon_state = "messenger" + icon = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi' + worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi' + lefthand_file = 'modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_lefthand.dmi' + righthand_file = 'modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_righthand.dmi' + +/obj/item/storage/backpack/messenger/eng + name = "industrial messenger bag" + desc = "A tough messenger bag made of advanced treated leather for fireproofing. It also has more pockets than usual." + icon_state = "messenger_engineering" + inhand_icon_state = "messenger_engineering" + resistance_flags = FIRE_PROOF + +/obj/item/storage/backpack/messenger/med + name = "medical messenger bag" + desc = "A sterile messenger bag well loved by medics for its portability and sleek profile." + icon_state = "messenger_medical" + inhand_icon_state = "messenger_medical" + +/obj/item/storage/backpack/messenger/vir + name = "virologist messenger bag" + desc = "A sterile messenger bag with virologist colours, useful for deploying biohazards in record times." + icon_state = "messenger_virology" + inhand_icon_state = "messenger_virology" + +/obj/item/storage/backpack/messenger/chem + name = "chemist messenger bag" + desc = "A sterile messenger bag with chemist colours, good for getting to your alleyway deals on time." + icon_state = "messenger_chemistry" + inhand_icon_state = "messenger_chemistry" + +/obj/item/storage/backpack/messenger/coroner + name = "coroner messenger bag" + desc = "A messenger bag used to sneak your way out of graveyards at a good pace." + icon_state = "messenger_coroner" + inhand_icon_state = "messenger_coroner" + +/obj/item/storage/backpack/messenger/gen + name = "geneticist messenger bag" + desc = "A sterile messenger bag with geneticist colours, making a remarkably cute accessory for hulks." + icon_state = "messenger_genetics" + inhand_icon_state = "messenger_genetics" + +/obj/item/storage/backpack/messenger/science + name = "scientist messenger bag" + desc = "Useful for holding research materials, and for speeding your way to different scan objectives." + icon_state = "messenger_science" + inhand_icon_state = "messenger_science" + +/obj/item/storage/backpack/messenger/hyd + name = "botanist messenger bag" + desc = "A messenger bag made of all natural fibers, great for getting to the sesh in time." + icon_state = "messenger_hydroponics" + inhand_icon_state = "messenger_hydroponics" + +/obj/item/storage/backpack/messenger/sec + name = "security messenger bag" + desc = "A robust messenger bag for security related needs." + icon_state = "messenger_security_black" + inhand_icon_state = "messenger_security_black" + uses_advanced_reskins = TRUE + unique_reskin = list( + "Black Variant" = list( + RESKIN_ICON_STATE = "messenger_security_black", + RESKIN_WORN_ICON_STATE = "messenger_security_black", + RESKIN_INHAND_STATE = "messenger_security_black", + ), + "White Variant" = list( + RESKIN_ICON_STATE = "messenger_security_white", + RESKIN_WORN_ICON_STATE = "messenger_security_white", + RESKIN_INHAND_STATE = "messenger_security_white", + ), + ) + +/obj/item/storage/backpack/messenger/explorer + name = "explorer messenger bag" + desc = "A robust messenger bag for stashing your loot, as well as making a remarkably cute accessory for your drakebone armor." + icon_state = "messenger_explorer" + inhand_icon_state = "messenger_explorer" + +/obj/item/storage/backpack/messenger/cap + name = "captain's messenger bag" + desc = "An exclusive messenger bag for NanoTrasen officers, made of real whaleleather." + icon_state = "messenger_captain" + inhand_icon_state = "messenger_captain" + +/obj/item/storage/backpack/messenger/head_of_personnel + name = "head of personnel's messenger bag" + desc = "A exclusive messenger bag issued to Nanotrasen's finest second, with great storage space for all that paperwork you have planned." + icon_state = "messenger_hop" + inhand_icon_state = "messenger_hop" + +/obj/item/storage/backpack/messenger/blueshield + name = "blueshield's messenger bag'" + desc = "A robust messenger bag issued to Nanotrasen's finest guard dogs, with extra TACTICAL POCKETS. Whatever that even means." + icon_state = "messenger_blueshield" + inhand_icon_state = "messenger_blueshield" + +/obj/item/storage/backpack/messenger/science/robo + name = "robotics messenger bag" + desc = "A sleek, industrial-strength messenger bag issued to robotics personnel. Smells faintly of oil; a fashionably mobile choice for fashionably sedentary mechanics." + icon_state = "messenger_robo" + inhand_icon_state = "messenger_robo" + +/obj/item/storage/backpack/messenger/clown + name = "Giggles von Honkerton Jr." + desc = "The latest in storage 'technology' from Honk Co. Hey, how does this fit so much with such a small profile anyway? The wearer will definitely never tell you." + icon_state = "messenger_clown" + inhand_icon_state = "messenger_clown" diff --git a/modular_skyrat/master_files/code/game/objects/structures/crates_lockers/secure/cargo.dm b/modular_skyrat/master_files/code/game/objects/structures/crates_lockers/secure/cargo.dm new file mode 100644 index 00000000000..359f964f68b --- /dev/null +++ b/modular_skyrat/master_files/code/game/objects/structures/crates_lockers/secure/cargo.dm @@ -0,0 +1,5 @@ +/obj/structure/closet/secure_closet/quartermaster/PopulateContents() + ..() + new /obj/item/gun/ballistic/rifle/boltaction/sporterized(src) // The QM's 'special' head item. It spawns loaded, but you have to find more ammo if you run out and get ready to manually load rounds in! + new /obj/item/cargo_teleporter(src) // Adds a cargo teleporter to QM locker, so they can entice others to research it + new /obj/item/clothing/glasses/hud/gun_permit/sunglasses(src) diff --git a/modular_skyrat/master_files/code/modules/cargo/markets/market_items/weapons.dm b/modular_skyrat/master_files/code/modules/cargo/markets/market_items/weapons.dm index 9dc58d6fa67..40ad5def7a4 100644 --- a/modular_skyrat/master_files/code/modules/cargo/markets/market_items/weapons.dm +++ b/modular_skyrat/master_files/code/modules/cargo/markets/market_items/weapons.dm @@ -1,5 +1,5 @@ /datum/market_item/weapon/mosin_pro - name = "FTU 'Archangel' Precision Rifle Stock" + name = "Xhihao 'Rengo' Precision Rifle Stock" desc = "Sure, it doesn't come with any of the actual bits that go bang, but who's gonna be laughing when you spook 'em with three more rounds?" item = /obj/item/crafting_conversion_kit/mosin_pro price_min = CARGO_CRATE_VALUE * 2 diff --git a/modular_skyrat/master_files/code/modules/client/preferences/_preference.dm b/modular_skyrat/master_files/code/modules/client/preferences/_preference.dm index a5ccd16e543..19cec000446 100644 --- a/modular_skyrat/master_files/code/modules/client/preferences/_preference.dm +++ b/modular_skyrat/master_files/code/modules/client/preferences/_preference.dm @@ -108,7 +108,7 @@ savefile_identifier = PREFERENCE_CHARACTER /// Path to the default sprite accessory - var/datum/sprite_accessory/default_accessory_type + var/datum/sprite_accessory/default_accessory_type = /datum/sprite_accessory/blank /// Path to the corresponding /datum/preference/toggle to check if part is enabled. var/datum/preference/toggle/type_to_check /// Generates icons from the provided mutant bodypart for use in icon-enabled selection boxes in the prefs window. @@ -124,6 +124,15 @@ var/part_enabled = is_part_enabled(preferences) return (passed_initial_check || overriding) && part_enabled +// icons are cached +/datum/preference/choiced/mutant_choice/icon_for(value) + if(!should_generate_icons) + // because of the way the unit tests are set up, we need this to crash here + CRASH("`icon_for()` was not implemented for [type], even though should_generate_icons = TRUE!") + + var/list/cached_icons = get_choices() + return cached_icons[value] + /// Allows for dynamic assigning of icon states. /datum/preference/choiced/mutant_choice/proc/generate_icon_state(datum/sprite_accessory/sprite_accessory, original_icon_state) return original_icon_state @@ -160,7 +169,7 @@ return list_of_accessories /datum/preference/choiced/mutant_choice/create_default_value() - return initial(default_accessory_type?.name) || "None" + return initial(default_accessory_type.name) /** * Is this part enabled by the player? @@ -204,6 +213,9 @@ if(!bodypart_is_visible) value = create_default_value() + if(value == "None") + return bodypart_is_visible + if(!target.dna.mutant_bodyparts[relevant_mutant_bodypart]) target.dna.mutant_bodyparts[relevant_mutant_bodypart] = list(MUTANT_INDEX_NAME = value, MUTANT_INDEX_COLOR_LIST = list("#FFFFFF", "#FFFFFF", "#FFFFFF"), MUTANT_INDEX_EMISSIVE_LIST = list(FALSE, FALSE, FALSE)) return bodypart_is_visible diff --git a/modular_skyrat/master_files/code/modules/client/preferences/clothing.dm b/modular_skyrat/master_files/code/modules/client/preferences/clothing.dm index 48f9df3be3c..8041e751783 100644 --- a/modular_skyrat/master_files/code/modules/client/preferences/clothing.dm +++ b/modular_skyrat/master_files/code/modules/client/preferences/clothing.dm @@ -1,6 +1,3 @@ -/datum/preference/choiced/socks/init_possible_values() - return generate_values_for_underwear(GLOB.socks_list, list("human_r_leg", "human_l_leg"), COLOR_ALMOST_BLACK, 0) - /datum/preference/choiced/socks/compile_constant_data() var/list/data = ..() @@ -16,9 +13,6 @@ var/datum/species/species = new species_type return !(TRAIT_NO_UNDERWEAR in species.inherent_traits) -/datum/preference/choiced/undershirt/init_possible_values() - return generate_values_for_underwear(GLOB.undershirt_list, list("human_chest_m", "human_r_arm", "human_l_arm", "human_r_leg", "human_l_leg", "human_r_hand", "human_l_hand"), COLOR_ALMOST_BLACK, 10) - /datum/preference/choiced/undershirt/compile_constant_data() var/list/data = ..() @@ -34,9 +28,6 @@ var/datum/species/species = new species_type return !(TRAIT_NO_UNDERWEAR in species.inherent_traits) -/datum/preference/choiced/underwear/init_possible_values() - return generate_values_for_underwear(GLOB.underwear_list, list("human_chest_m", "human_r_leg", "human_l_leg"), COLOR_ALMOST_BLACK, 5) - /datum/preference/choiced/underwear/is_accessible(datum/preferences/preferences) if (!..(preferences)) return FALSE diff --git a/modular_skyrat/master_files/code/modules/client/preferences/genitals.dm b/modular_skyrat/master_files/code/modules/client/preferences/genitals.dm index a2be968a8d1..3612f27243c 100644 --- a/modular_skyrat/master_files/code/modules/client/preferences/genitals.dm +++ b/modular_skyrat/master_files/code/modules/client/preferences/genitals.dm @@ -68,7 +68,7 @@ return (savefile_key in species.get_features()) /datum/preference/choiced/genital/create_default_value() - return initial(default_accessory_type?.name) || "None" + return initial(default_accessory_type.name) /datum/preference/choiced/genital/init_possible_values() return assoc_to_keys_features(GLOB.sprite_accessories[relevant_mutant_bodypart]) diff --git a/modular_skyrat/master_files/code/modules/client/preferences/headshot.dm b/modular_skyrat/master_files/code/modules/client/preferences/headshot.dm index d9b2de4db27..44351be0fcf 100644 --- a/modular_skyrat/master_files/code/modules/client/preferences/headshot.dm +++ b/modular_skyrat/master_files/code/modules/client/preferences/headshot.dm @@ -51,6 +51,6 @@ /datum/preference/text/headshot/is_accessible(datum/preferences/preferences) if(isnull(usr)) // Joining at roundstart return ..() - if(!is_veteran_player(usr?.client) && !GLOB.donator_list[usr?.ckey] && !is_admin(usr?.client)) + if(!SSplayer_ranks.is_veteran(usr?.client) && !GLOB.donator_list[usr?.ckey] && !is_admin(usr?.client)) return FALSE return ..() diff --git a/modular_skyrat/master_files/code/modules/client/preferences/mutant_parts.dm b/modular_skyrat/master_files/code/modules/client/preferences/mutant_parts.dm index cffc4ab6d5f..fd11a6bd3b5 100644 --- a/modular_skyrat/master_files/code/modules/client/preferences/mutant_parts.dm +++ b/modular_skyrat/master_files/code/modules/client/preferences/mutant_parts.dm @@ -81,7 +81,6 @@ /datum/preference/toggle/mutant_toggle/body_markings/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) return FALSE - /datum/preference/choiced/mutant_choice/body_markings savefile_key = "feature_body_markings" relevant_mutant_bodypart = "body_markings" @@ -95,7 +94,6 @@ /datum/preference/choiced/mutant_choice/body_markings/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) return FALSE - /datum/preference/tri_color/body_markings category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER @@ -124,7 +122,6 @@ /datum/preference/tri_bool/body_markings/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) return FALSE - /// Tails /datum/preference/toggle/mutant_toggle/tail diff --git a/modular_skyrat/master_files/code/modules/clothing/back/antigravityharness.dm b/modular_skyrat/master_files/code/modules/clothing/back/antigravityharness.dm index 67e9314ce75..ebad5b1ea19 100644 --- a/modular_skyrat/master_files/code/modules/clothing/back/antigravityharness.dm +++ b/modular_skyrat/master_files/code/modules/clothing/back/antigravityharness.dm @@ -195,8 +195,9 @@ if(cell_cover_open) return current_cell -/obj/item/gravity_harness/handle_atom_del(atom/harness_cell) - if(harness_cell == current_cell) +/obj/item/gravity_harness/Exited(atom/movable/gone, direction) + . = ..() + if(gone == current_cell) change_mode(MODE_GRAVOFF) current_cell = null 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 991e1288db6..54a180753a7 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 @@ -119,6 +119,12 @@ /obj/item/clothing/suit/hooded/wintercoat supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON +/obj/item/clothing/suit/toggle/cargo_tech + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON + +/obj/item/clothing/suit/jacket/quartermaster + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON + /** * NONE(Squash) * Clothing that does not have a digitigrade version, and thus will squash legs to fit. diff --git a/modular_skyrat/master_files/code/modules/clothing/clothing_variation_overrides/under.dm b/modular_skyrat/master_files/code/modules/clothing/clothing_variation_overrides/under.dm index c6a8d47b037..cd1c15d216f 100644 --- a/modular_skyrat/master_files/code/modules/clothing/clothing_variation_overrides/under.dm +++ b/modular_skyrat/master_files/code/modules/clothing/clothing_variation_overrides/under.dm @@ -87,14 +87,6 @@ supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON gets_cropped_on_taurs = FALSE -/obj/item/clothing/under/rank/civilian/bartender/skirt - supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON - gets_cropped_on_taurs = FALSE - -/obj/item/clothing/under/rank/civilian/chef/skirt - supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON - gets_cropped_on_taurs = FALSE - /obj/item/clothing/under/rank/civilian/head_of_personnel/suit/skirt supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON gets_cropped_on_taurs = FALSE diff --git a/modular_skyrat/master_files/code/modules/clothing/head/monkey_magnification_helmet.dm b/modular_skyrat/master_files/code/modules/clothing/head/monkey_magnification_helmet.dm index 1dd6975732f..1c4c286fa85 100644 --- a/modular_skyrat/master_files/code/modules/clothing/head/monkey_magnification_helmet.dm +++ b/modular_skyrat/master_files/code/modules/clothing/head/monkey_magnification_helmet.dm @@ -97,7 +97,9 @@ if(prob(10)) switch(rand(1, 4)) if(1) // blood rage - magnification.ai_controller.blackboard[BB_MONKEY_AGGRESSIVE] = TRUE + var/datum/ai_controller/monkey/monky_controller = magnification.ai_controller + monky_controller.set_trip_mode(mode = FALSE) + monky_controller.set_blackboard_key(BB_MONKEY_AGGRESSIVE, TRUE) if(2) // brain death magnification.apply_damage(500, BRAIN, BODY_ZONE_HEAD, FALSE, FALSE, FALSE) if(3) // primal gene (gorilla) diff --git a/modular_skyrat/master_files/code/modules/clothing/under/jobs/civilian/civilian.dm b/modular_skyrat/master_files/code/modules/clothing/under/jobs/civilian/civilian.dm index da4c0537db3..b3bb1e22fbc 100644 --- a/modular_skyrat/master_files/code/modules/clothing/under/jobs/civilian/civilian.dm +++ b/modular_skyrat/master_files/code/modules/clothing/under/jobs/civilian/civilian.dm @@ -1,9 +1,12 @@ /obj/item/clothing/under/rank/civilian worn_icon_digi = 'modular_skyrat/master_files/icons/mob/clothing/under/civilian_digi.dmi' //Anything that was in TG's civilian.dmi, should be in our civilian_digi.dmi -/obj/item/clothing/under/rank/civilian/lawyer/beige //Some FOOL upstream has this item's worn and object icons seperate. This sucks. +/obj/item/clothing/under/rank/civilian/lawyer // Lawyers' suits are in TG's suits.dmi worn_icon_digi = 'modular_skyrat/master_files/icons/mob/clothing/under/suits_digi.dmi' +/obj/item/clothing/under/rank/civilian/lawyer/bluesuit // EXCEPT THIS ONE. + greyscale_config_worn_digi = /datum/greyscale_config/buttondown_slacks/worn/digi + /obj/item/clothing/under/rank/civilian/head_of_personnel/skyrat icon = 'modular_skyrat/master_files/icons/obj/clothing/under/civilian.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/under/civilian.dmi' diff --git a/modular_skyrat/master_files/code/modules/clothing/under/syndicate.dm b/modular_skyrat/master_files/code/modules/clothing/under/syndicate.dm index ce0a417efc5..f73c29ceb30 100644 --- a/modular_skyrat/master_files/code/modules/clothing/under/syndicate.dm +++ b/modular_skyrat/master_files/code/modules/clothing/under/syndicate.dm @@ -5,13 +5,11 @@ /obj/item/clothing/under/syndicate worn_icon_digi = 'modular_skyrat/master_files/icons/mob/clothing/under/syndicate_digi.dmi' // Anything that was in the syndicate.dmi, should be in the syndicate_digi.dmi - /obj/item/clothing/under/syndicate/skyrat icon = 'modular_skyrat/master_files/icons/obj/clothing/under/syndicate.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/under/syndicate.dmi' //These are pre-set for ease and reference, as syndie under items SHOULDNT have sensors and should have similar stats; also its better to start with adjust = false has_sensor = NO_SENSORS - armor_type = /datum/armor/clothing_under/syndicate_skyrat can_adjust = FALSE //Related files: @@ -24,11 +22,6 @@ //This is an overwrite, not a fully new item, but still fits best here. -/datum/armor/clothing_under/syndicate_skyrat - melee = 10 - fire = 50 - acid = 40 - /obj/item/clothing/under/syndicate/tacticool //Overwrites the 'fake' one. Zero armor, sensors, and default blue. More Balanced to make station-available. name = "tacticool turtleneck" desc = "A snug turtleneck, in fabulous Nanotrasen-blue. Just looking at it makes you want to buy a NT-certifed coffee, go into the office, and -work-." @@ -43,6 +36,7 @@ RESKIN_NT = "tactifool_blue", RESKIN_CHARCOAL = "tactifool" ) + resistance_flags = FLAMMABLE /obj/item/clothing/under/syndicate/tacticool/reskin_obj(mob/M) ..() @@ -80,22 +74,17 @@ // (Multiple non-syndicate things use the base tactical turtleneck, they cant have it red nor reskinnable. OUR version, however, can be.) /obj/item/clothing/under/syndicate/skyrat/tactical name = "tactical turtleneck" - desc = "A snug syndicate-red turtleneck with carcoal-black cargo pants. Good luck arguing allegiance with this on." + desc = "A snug syndicate-red turtleneck with charcoal-black cargo pants. Good luck arguing allegiance with this on." icon_state = "syndicate_red" inhand_icon_state = "r_suit" can_adjust = TRUE alt_covers_chest = TRUE - armor_type = /datum/armor/clothing_under/skyrat_tactical + armor_type = /datum/armor/clothing_under/syndicate unique_reskin = list( RESKIN_SYNDIE = "syndicate_red", RESKIN_CHARCOAL = "syndicate" ) -/datum/armor/clothing_under/skyrat_tactical - melee = 10 - fire = 50 - acid = 40 - /obj/item/clothing/under/syndicate/skyrat/tactical/reskin_obj(mob/M) ..() if(current_skin && current_skin == RESKIN_CHARCOAL) @@ -104,7 +93,7 @@ /obj/item/clothing/under/syndicate/skyrat/tactical/skirt name = "tactical skirtleneck" - desc = "A snug syndicate-red skirtleneck with a carcoal-black skirt. Good luck arguing allegiance with this on." + desc = "A snug syndicate-red skirtleneck with a charcoal-black skirt. Good luck arguing allegiance with this on." icon_state = "syndicate_red_skirt" inhand_icon_state = "r_suit" female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY @@ -124,36 +113,23 @@ /* * ENCLAVE */ -/obj/item/clothing/under/syndicate/skyrat/enclaveo - name = "neo american officer uniform" - desc = "Throughout the stars, rumors of mad scientists and angry drill sergeant run rampent, of creatures in armor black as night being led by men or women wearing this uniform, they share one thing, a deep, natonalistic zeal of the dream of America." - icon_state = "enclaveo" - can_adjust = TRUE - armor_type = /datum/armor/clothing_under/none - /obj/item/clothing/under/syndicate/skyrat/enclave - name = "neo american sergeant uniform" - desc = "Throughout the stars, rumors of mad scientists and angry drill sergeant run rampent, of creatures in armor black as night being led by men or women wearing this uniform, they share one thing, a deep, natonalistic zeal of the dream of America." + name = "neo-American sergeant uniform" + desc = "Throughout the stars, rumors of mad scientists and angry drill sergeants run rampant; of creatures in armor black as night, being led by men or women wearing this uniform. They share one thing: a deep, natonalistic zeal of the dream of America." icon_state = "enclave" can_adjust = TRUE armor_type = /datum/armor/clothing_under/none -/obj/item/clothing/under/syndicate/skyrat/enclaveo/real - name = "neo american officer uniform" - desc = "Throughout the stars, rumors of mad scientists and angry drill sergeant run rampent, of creatures in armor black as night being led by men or women wearing this uniform, they share one thing, a deep, natonalistic zeal of the dream of America." +/obj/item/clothing/under/syndicate/skyrat/enclave/officer + name = "neo-American officer uniform" icon_state = "enclaveo" - armor_type = /datum/armor/clothing_under/enclaveo_real - -/datum/armor/clothing_under/enclaveo_real - melee = 10 - fire = 50 - acid = 40 /obj/item/clothing/under/syndicate/skyrat/enclave/real - name = "neo american sergeant uniform" - desc = "Throughout the stars, rumors of mad scientists and angry drill sergeant run rampent, of creatures in armor black as night being led by men or women wearing this uniform, they share one thing, a deep, natonalistic zeal of the dream of America." - icon_state = "enclave" - armor_type = /datum/armor/clothing_under/enclaveo_real + armor_type = /datum/armor/clothing_under/syndicate + +/obj/item/clothing/under/syndicate/skyrat/enclave/real/officer + name = "neo-American officer uniform" + icon_state = "enclaveo" #undef RESKIN_CHARCOAL #undef RESKIN_NT diff --git a/modular_skyrat/master_files/code/modules/experisci/experiment.dm b/modular_skyrat/master_files/code/modules/experisci/experiment.dm new file mode 100644 index 00000000000..791a92a2d74 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/experisci/experiment.dm @@ -0,0 +1,4 @@ +// Changed to silver +/datum/experiment/scanning/random/material/meat + description = "Supposedly silver has an inert anti-microbial effect; scan a few samples to test this." + possible_material_types = list(/datum/material/silver) diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/atmospheric_technician.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/atmospheric_technician.dm new file mode 100644 index 00000000000..620c7e3b41c --- /dev/null +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/atmospheric_technician.dm @@ -0,0 +1,2 @@ +/datum/outfit/job/atmos + messenger = /obj/item/storage/backpack/messenger/eng diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/botanist.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/botanist.dm new file mode 100644 index 00000000000..eba9573ce23 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/botanist.dm @@ -0,0 +1,2 @@ +/datum/outfit/job/botanist + messenger = /obj/item/storage/backpack/messenger/hyd diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/captain.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/captain.dm new file mode 100644 index 00000000000..4435270b639 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/captain.dm @@ -0,0 +1,2 @@ +/datum/outfit/job/captain + messenger = /obj/item/storage/backpack/messenger/cap diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/chemist.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/chemist.dm new file mode 100644 index 00000000000..36827d3c937 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/chemist.dm @@ -0,0 +1,2 @@ +/datum/outfit/job/chemist + messenger = /obj/item/storage/backpack/messenger/chem diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/chief_engineer.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/chief_engineer.dm new file mode 100644 index 00000000000..bb204607fb2 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/chief_engineer.dm @@ -0,0 +1,2 @@ +/datum/outfit/job/ce + messenger = /obj/item/storage/backpack/messenger/eng diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/chief_medical_officer.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/chief_medical_officer.dm new file mode 100644 index 00000000000..10ef30a5839 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/chief_medical_officer.dm @@ -0,0 +1,2 @@ +/datum/outfit/job/cmo + messenger = /obj/item/storage/backpack/messenger/med diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/clown.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/clown.dm index bbc88c0b30a..e6e6095700d 100644 --- a/modular_skyrat/master_files/code/modules/jobs/job_types/clown.dm +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/clown.dm @@ -1,3 +1,6 @@ /datum/job/clown vox_outfit = /datum/outfit/vox/clown job_flags = STATION_JOB_FLAGS | JOB_CANNOT_OPEN_SLOTS + +/datum/outfit/job/clown + messenger = /obj/item/storage/backpack/messenger/clown diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/coroner.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/coroner.dm new file mode 100644 index 00000000000..0fec4aa8824 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/coroner.dm @@ -0,0 +1,2 @@ +/datum/outfit/job/coroner + messenger = /obj/item/storage/backpack/messenger/coroner diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/geneticist.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/geneticist.dm new file mode 100644 index 00000000000..840a43b688c --- /dev/null +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/geneticist.dm @@ -0,0 +1,2 @@ +/datum/outfit/job/geneticist + messenger = /obj/item/storage/backpack/messenger/gen diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/head_of_personnel.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/head_of_personnel.dm new file mode 100644 index 00000000000..f9c8432931b --- /dev/null +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/head_of_personnel.dm @@ -0,0 +1,5 @@ +/datum/outfit/job/hop + backpack = /obj/item/storage/backpack/head_of_personnel + satchel = /obj/item/storage/backpack/satchel/head_of_personnel + duffelbag = /obj/item/storage/backpack/duffelbag/head_of_personnel + messenger = /obj/item/storage/backpack/messenger/head_of_personnel diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/head_of_security.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/head_of_security.dm new file mode 100644 index 00000000000..81587c0fe21 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/head_of_security.dm @@ -0,0 +1,2 @@ +/datum/outfit/job/hos + messenger = /obj/item/storage/backpack/messenger/sec diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/medical_doctor.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/medical_doctor.dm new file mode 100644 index 00000000000..7c39b435092 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/medical_doctor.dm @@ -0,0 +1,2 @@ +/datum/outfit/job/doctor + messenger = /obj/item/storage/backpack/messenger/med diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/paramedic.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/paramedic.dm new file mode 100644 index 00000000000..9e90b107a5c --- /dev/null +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/paramedic.dm @@ -0,0 +1,2 @@ +/datum/outfit/job/paramedic + messenger = /obj/item/storage/backpack/messenger/med diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/psychologist.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/psychologist.dm new file mode 100644 index 00000000000..f9a267999cf --- /dev/null +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/psychologist.dm @@ -0,0 +1,2 @@ +/datum/outfit/job/psychologist + messenger = /obj/item/storage/backpack/messenger/med diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/research_director.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/research_director.dm new file mode 100644 index 00000000000..ae5be9d94fe --- /dev/null +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/research_director.dm @@ -0,0 +1,2 @@ +/datum/outfit/job/rd + messenger = /obj/item/storage/backpack/messenger/science 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 new file mode 100644 index 00000000000..d90c994c6ad --- /dev/null +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/roboticist.dm @@ -0,0 +1,5 @@ +/datum/outfit/job/roboticist + backpack = /obj/item/storage/backpack/science/robo + satchel = /obj/item/storage/backpack/satchel/science/robo + duffelbag = /obj/item/storage/backpack/duffelbag/science/robo + messenger = /obj/item/storage/backpack/messenger/science/robo diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/scientist.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/scientist.dm new file mode 100644 index 00000000000..1b0e4e4549c --- /dev/null +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/scientist.dm @@ -0,0 +1,2 @@ +/datum/outfit/job/scientist + messenger = /obj/item/storage/backpack/messenger/science diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/security_officer.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/security_officer.dm new file mode 100644 index 00000000000..b23e12f8f64 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/security_officer.dm @@ -0,0 +1,2 @@ +/datum/outfit/job/security + messenger = /obj/item/storage/backpack/messenger/sec diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/shaft_miner.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/shaft_miner.dm new file mode 100644 index 00000000000..c7d0841b93d --- /dev/null +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/shaft_miner.dm @@ -0,0 +1,2 @@ +/datum/outfit/job/miner + messenger = /obj/item/storage/backpack/messenger/explorer diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/station_engineer.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/station_engineer.dm new file mode 100644 index 00000000000..2bb13106400 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/station_engineer.dm @@ -0,0 +1,2 @@ +/datum/outfit/job/engineer + messenger = /obj/item/storage/backpack/messenger/eng diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/virologist.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/virologist.dm new file mode 100644 index 00000000000..1944ad527a4 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/virologist.dm @@ -0,0 +1,2 @@ +/datum/outfit/job/virologist + messenger = /obj/item/storage/backpack/messenger/vir diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/warden.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/warden.dm new file mode 100644 index 00000000000..e280f1c6c0c --- /dev/null +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/warden.dm @@ -0,0 +1,2 @@ +/datum/outfit/job/warden + messenger = /obj/item/storage/backpack/messenger/sec diff --git a/modular_skyrat/master_files/code/modules/language/language_holder.dm b/modular_skyrat/master_files/code/modules/language/language_holder.dm index 06812d8a6fa..4a061e572fe 100644 --- a/modular_skyrat/master_files/code/modules/language/language_holder.dm +++ b/modular_skyrat/master_files/code/modules/language/language_holder.dm @@ -6,22 +6,21 @@ GLOBAL_DATUM_INIT(language_holder_adjustor, /datum/language_holder_adjustor, new /datum/language_holder_adjustor/New() RegisterSignal(SSdcs, COMSIG_GLOB_CREWMEMBER_JOINED, PROC_REF(handle_new_player)) -/datum/language_holder_adjustor/proc/handle_new_player(datum/source, mob/living/new_crewmember, rank) +/datum/language_holder_adjustor/proc/handle_new_player(datum/source, mob/living/carbon/human/new_crewmember, rank) SIGNAL_HANDLER // sanity checking because we really do not want to be causing any runtimes - if(!ishuman(new_crewmember)) + if(!istype(new_crewmember)) return if(isnull(new_crewmember.mind)) return - var/mob/living/carbon/human/new_human = new_crewmember - var/datum/language_holder/language_holder = new_human.get_language_holder() + var/datum/language_holder/language_holder = new_crewmember.get_language_holder() if(isnull(language_holder)) return - language_holder.adjust_languages_to_prefs(new_human.client?.prefs) + language_holder.adjust_languages_to_prefs(new_crewmember.client?.prefs) /datum/language_holder_adjustor/Destroy() ..() @@ -34,14 +33,25 @@ GLOBAL_DATUM_INIT(language_holder_adjustor, /datum/language_holder_adjustor, new // remove the innate languages (like common, and other species languages) and instead use the language prefs // do not remove any languages granted by spawners, which are denoted by source = LANGUAGE_SPAWNER - remove_all_languages(source = LANGUAGE_MIND) - remove_all_languages(source = LANGUAGE_ATOM) + remove_languages_by_source(list(LANGUAGE_MIND, LANGUAGE_ATOM, LANGUAGE_SPECIES)) for(var/lang_path in preferences.languages) grant_language(lang_path) get_selected_language() +/// Removes every language whose source(s) match the provided source list arg +/datum/language_holder/proc/remove_languages_by_source(list/sources) + if(!length(sources)) + return + for(var/language in understood_languages) + for(var/source in sources) + remove_language(language, ALL, source) + // in most cases spoken_languages should be empty by now, but just in case we should remove what's left + for(var/language in spoken_languages) + for(var/source in sources) + remove_language(language, ALL, source) + //************************************************ //* Specific language holders * //* Use atom language sources only. * diff --git a/modular_skyrat/master_files/code/modules/mob/living/simple_animal/hostile/grabbagmob.dm b/modular_skyrat/master_files/code/modules/mob/living/simple_animal/hostile/grabbagmob.dm index e77ac59318f..614c2dc6726 100644 --- a/modular_skyrat/master_files/code/modules/mob/living/simple_animal/hostile/grabbagmob.dm +++ b/modular_skyrat/master_files/code/modules/mob/living/simple_animal/hostile/grabbagmob.dm @@ -324,7 +324,6 @@ mob_biotypes = MOB_ROBOTIC health = 75 maxHealth = 75 - healable = 0 melee_damage_lower = 10 melee_damage_upper = 10 attack_verb_continuous = "claws" diff --git a/modular_skyrat/master_files/code/modules/mob/login.dm b/modular_skyrat/master_files/code/modules/mob/login.dm new file mode 100644 index 00000000000..fbf57ccf0b5 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/mob/login.dm @@ -0,0 +1,10 @@ +/mob/Login() + . = ..() + + if(!.) + return FALSE + + if(SSplayer_ranks.initialized) + SSplayer_ranks.update_prefs_unlock_content(client?.prefs) + + return TRUE diff --git a/modular_skyrat/master_files/code/modules/religion/religious_sects.dm b/modular_skyrat/master_files/code/modules/religion/religious_sects.dm index 6685e77f9e4..e7b718b485a 100644 --- a/modular_skyrat/master_files/code/modules/religion/religious_sects.dm +++ b/modular_skyrat/master_files/code/modules/religion/religious_sects.dm @@ -1,6 +1,88 @@ +// Allowing religion to be reselected by new chaplains if something happened to the old one (cryo or being deleted) + /datum/religion_sect/on_select() . = ..() // if the same religious sect gets selected, carry the favor over if(istype(src, GLOB.prev_sect_type)) set_favor(GLOB.prev_favor) + +/// It's time to kill GLOB +/** + * Reset religion to its default state so the new chaplain becomes high priest and can change the sect, armor, weapon type, etc + * Also handles the selection of a holy successor from existing crew if multiple chaplains are on station. + */ +/proc/reset_religion() + + // try to pick the successor from existing crew, or leave it empty if no valid candidates found + var/mob/living/carbon/human/chosen_successor = pick_holy_successor() + GLOB.current_highpriest = chosen_successor ? WEAKREF(chosen_successor) : null // if a successor is already on the station then pick the first in line + + if(isnull(GLOB.religious_sect)) // sect already been reset, maybe a chaplain cryo'd before choosing a sect + return + + // remember what the previous sect and favor values were so they can be restored if the same one gets chosen + GLOB.prev_favor = GLOB.religious_sect.favor + GLOB.prev_sect_type = GLOB.religious_sect.type + + // set the altar references to the old religious_sect to null + for(var/obj/structure/altar_of_gods/altar in GLOB.chaplain_altars) + altar.GetComponent(/datum/component/religious_tool).easy_access_sect = null + altar.sect_to_altar = null + + QDEL_NULL(GLOB.religious_sect) // queue for removal but also set it to null, in case a new chaplain joins before it can be deleted + + // set the rest of the global vars to null for the new chaplain + GLOB.religion = null + GLOB.deity = null + GLOB.bible_name = null + GLOB.bible_icon_state = null + GLOB.bible_inhand_icon_state = null + GLOB.holy_armor_type = null + GLOB.holy_weapon_type = null + +/** + * Chooses a valid holy successor from GLOB.holy_successor weakref list and sets things up for them to be the new high priest + * + * Returns the chosen holy successor, or null if no valid successor + */ +/proc/pick_holy_successor() + for(var/datum/weakref/successor as anything in GLOB.holy_successors) + var/mob/living/carbon/human/actual_successor = successor.resolve() + if(!actual_successor) + GLOB.holy_successors -= successor + continue + + if(!actual_successor.key || !actual_successor.mind) + continue + + // we have a match! set the religious globals up properly and make the candidate high priest + GLOB.holy_successors -= successor + GLOB.religion = actual_successor.client?.prefs?.read_preference(/datum/preference/name/religion) || DEFAULT_RELIGION + GLOB.bible_name = actual_successor.client?.prefs?.read_preference(/datum/preference/name/deity) || DEFAULT_DEITY + GLOB.deity = actual_successor.client?.prefs?.read_preference(/datum/preference/name/bible) || DEFAULT_BIBLE + + actual_successor.mind.holy_role = HOLY_ROLE_HIGHPRIEST + + to_chat(actual_successor, span_warning("You have been chosen as the successor to the previous high priest. Visit a holy altar to declare the station's religion!")) + + return actual_successor + + return null + +/** + * Create a list of the holy successors mobs from GLOB.holy_successors weakref list + * + * Returns the list of valid holy successors + */ +/proc/list_holy_successors() + var/list/holy_successors = list() + for(var/datum/weakref/successor as anything in GLOB.holy_successors) + var/mob/living/carbon/human/actual_successor = successor.resolve() + if(!actual_successor) + GLOB.holy_successors -= successor + continue + + holy_successors += actual_successor + + return holy_successors diff --git a/modular_skyrat/master_files/code/modules/research/techweb/all_nodes.dm b/modular_skyrat/master_files/code/modules/research/techweb/all_nodes.dm index 32ba64f84e4..357e4b6497e 100644 --- a/modular_skyrat/master_files/code/modules/research/techweb/all_nodes.dm +++ b/modular_skyrat/master_files/code/modules/research/techweb/all_nodes.dm @@ -1,4 +1,6 @@ +// NEW NODES + /datum/techweb_node/adv_vision id = "adv_vision" display_name = "Combat Cybernetic Eyes" @@ -7,5 +9,230 @@ design_ids = list( "ci-thermals", "ci-xray", + "ci-thermals-moth", + "ci-xray-moth", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000) + +// MODULAR ADDITIONS AND REMOVALS + +//Base Nodes +/datum/techweb_node/base/New() + . = ..() + design_ids += list( + "polarizer", + "vox_gas_filter", + ) + +/datum/techweb_node/cyborg/New() + . = ..() + design_ids += list( + "affection_module", + ) + +/datum/techweb_node/basic_tools/New() + . = ..() + design_ids += list( + "bowl", + "drinking_glass", + "shot_glass", + ) + +/datum/techweb_node/basic_medical/New() + . = ..() + design_ids += list( + "hospital_gown", + "synth_eyes", + "synth_tongue", + "synth_liver", + "synth_lungs", + "synth_stomach", + "synth_ears", + "synth_heart", + ) + +/////////////////////////Biotech///////////////////////// + +/datum/techweb_node/adv_biotech/New() + . = ..() + design_ids += list( + "monkey_helmet", + "brute2medicell", + "burn2medicell", + "toxin2medicell", + "oxy2medicell", + "relocatemedicell", + "tempmedicell", + "bodymedicell", + "clotmedicell", + ) + +/datum/techweb_node/biotech/New() + . = ..() + design_ids += list( + "anesthetic_machine", + "smartdartgun", + ) + +/////////////////////////EMP tech///////////////////////// + +/datum/techweb_node/emp_basic/New() + . = ..() + design_ids += list( + "gownmedicell", + "bedmedicell", + ) + +////////////////////////Computer tech//////////////////////// + +/datum/techweb_node/comptech/New() + . = ..() + design_ids += list( + "time_clock_frame", + ) + +/datum/techweb_node/integrated_hud/New() + . = ..() + design_ids += list( + "health_hud_prescription", + "security_hud_prescription", + "diagnostic_hud_prescription", + "science_hud_prescription", + "health_hud_aviator", + "security_hud_aviator", + "diagnostic_hud_aviator", + "meson_hud_aviator", + "science_hud_aviator", + "health_hud_projector", + "security_hud_projector", + "diagnostic_hud_projector", + "meson_hud_projector", + "science_hud_projector", + "permit_glasses", + "nifsoft_money_sense", + "nifsoft_hud_kit", + "nifsoft_hud_science", + "nifsoft_hud_medical", + "nifsoft_hud_security", + "nifsoft_hud_diagnostic", + "nifsoft_hud_cargo", + ) + +////////////////////////Medical//////////////////////// + +/datum/techweb_node/genetics/New() + . = ..() + design_ids += list( + "self_actualization_device", + ) + +/datum/techweb_node/cyber_organs/New() + . = ..() + design_ids += list( + "cybernetic_tongue", + ) + +// Modularly removes x-ray and thermals from here, it's in adv_vision instead +/datum/techweb_node/combat_cyber_implants/New() + . = ..() + design_ids -= list( + "ci-thermals", + "ci-xray", + "ci-thermals-moth", + "ci-xray-moth", + ) + +////////////////////////Tools//////////////////////// + +/datum/techweb_node/botany/New() + . = ..() + design_ids += list( + "salvemedicell", + ) + +/datum/techweb_node/sec_basic/New() + . = ..() + design_ids += list( + "nifsoft_remover", + ) + +/////////////////////////weaponry tech///////////////////////// + +/datum/techweb_node/weaponry/New() + . = ..() + design_ids += list( + "ammoworkbench_disk_lethal", + ) + +/datum/techweb_node/adv_weaponry/New() + . = ..() + design_ids += list( + "ammo_workbench", + ) + +/datum/techweb_node/electric_weapons/New() + . = ..() + design_ids += list( + "medigun_speed", + ) + +////////////////////////Alien technology//////////////////////// + +/datum/techweb_node/alien_bio/New() + . = ..() + design_ids += list( + "brute3medicell", + "burn3medicell", + "oxy3medicell", + "toxin3medicell", + ) + +/////////////////////////engineering tech///////////////////////// + +/datum/techweb_node/adv_engi/New() + . = ..() + design_ids += list( + "engine_goggles_prescription", + "mesons_prescription", + "multi_cell_charger", + "tray_goggles_prescription", + "plumbing_eng", + ) + +/////////////////////////robotics tech///////////////////////// + +/datum/techweb_node/robotics/New() + . = ..() + design_ids += list( + "borg_upgrade_snacks", + ) + +/datum/techweb_node/neural_programming/New() + . = ..() + design_ids += list( + "soulcatcher_device", + ) + +/datum/techweb_node/cyborg_upg_util/New() + . = ..() + design_ids += list( + "borg_upgrade_clamp", + "borg_upgrade_brush", + ) + +/datum/techweb_node/cyborg_upg_engiminer/New() + . = ..() + design_ids += list( + "advanced_materials", + "inducer_module", + ) + +/datum/techweb_node/cyborg_upg_med/New() + . = ..() + design_ids += list( + "borg_upgrade_surgicaltools", + ) + + design_ids -= list( + "borg_upgrade_pinpointer", + ) diff --git a/modular_skyrat/master_files/code/modules/shuttle/shuttle_events/meteors.dm b/modular_skyrat/master_files/code/modules/shuttle/shuttle_events/meteors.dm new file mode 100644 index 00000000000..f07a393f2dc --- /dev/null +++ b/modular_skyrat/master_files/code/modules/shuttle/shuttle_events/meteors.dm @@ -0,0 +1,5 @@ +/datum/shuttle_event/simple_spawner/meteor/dust + event_probability = 0 + +/datum/shuttle_event/simple_spawner/meteor/safe + event_probability = 0 diff --git a/modular_skyrat/master_files/code/modules/surgery/bodyparts/_bodyparts.dm b/modular_skyrat/master_files/code/modules/surgery/bodyparts/_bodyparts.dm new file mode 100644 index 00000000000..81d9c544fa8 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/surgery/bodyparts/_bodyparts.dm @@ -0,0 +1,3 @@ +/obj/item/bodypart + /// If this limb has sharp unarmed attacks, by default off. You probably want to use SHARP_EDGED, SHARP_POINTY would be nuts balance-wise. + var/unarmed_sharpness = 0 diff --git a/modular_skyrat/master_files/code/modules/vehicles/sealed.dm b/modular_skyrat/master_files/code/modules/vehicles/sealed.dm new file mode 100644 index 00000000000..637cf7ccc94 --- /dev/null +++ b/modular_skyrat/master_files/code/modules/vehicles/sealed.dm @@ -0,0 +1,8 @@ +/obj/vehicle/sealed/mob_try_enter(mob/rider) + if(!istype(rider)) + return FALSE + if(HAS_TRAIT(rider, TRAIT_OVERSIZED)) + to_chat(rider, span_warning("You are far too big for this!")) + return FALSE + + return ..() diff --git a/modular_skyrat/master_files/icons/donator/mob/clothing/head.dmi b/modular_skyrat/master_files/icons/donator/mob/clothing/head.dmi index 49fedfc5400..2eb4103af80 100644 Binary files a/modular_skyrat/master_files/icons/donator/mob/clothing/head.dmi and b/modular_skyrat/master_files/icons/donator/mob/clothing/head.dmi differ diff --git a/modular_skyrat/master_files/icons/donator/mob/clothing/mask.dmi b/modular_skyrat/master_files/icons/donator/mob/clothing/mask.dmi index 43116dbdd26..f014637456a 100644 Binary files a/modular_skyrat/master_files/icons/donator/mob/clothing/mask.dmi and b/modular_skyrat/master_files/icons/donator/mob/clothing/mask.dmi differ diff --git a/modular_skyrat/master_files/icons/donator/mob/clothing/suit.dmi b/modular_skyrat/master_files/icons/donator/mob/clothing/suit.dmi index 0f0882cf036..da2fa01153b 100644 Binary files a/modular_skyrat/master_files/icons/donator/mob/clothing/suit.dmi and b/modular_skyrat/master_files/icons/donator/mob/clothing/suit.dmi differ diff --git a/modular_skyrat/master_files/icons/donator/mob/clothing/uniform.dmi b/modular_skyrat/master_files/icons/donator/mob/clothing/uniform.dmi index 2a5dd2b37e0..b57d4ece348 100644 Binary files a/modular_skyrat/master_files/icons/donator/mob/clothing/uniform.dmi and b/modular_skyrat/master_files/icons/donator/mob/clothing/uniform.dmi differ diff --git a/modular_skyrat/master_files/icons/donator/mob/clothing/uniform_digi.dmi b/modular_skyrat/master_files/icons/donator/mob/clothing/uniform_digi.dmi index 0f45921d38e..a65bf12c587 100644 Binary files a/modular_skyrat/master_files/icons/donator/mob/clothing/uniform_digi.dmi and b/modular_skyrat/master_files/icons/donator/mob/clothing/uniform_digi.dmi differ diff --git a/modular_skyrat/master_files/icons/donator/obj/clothing/hats.dmi b/modular_skyrat/master_files/icons/donator/obj/clothing/hats.dmi index 5390a0d6024..d20260a9184 100644 Binary files a/modular_skyrat/master_files/icons/donator/obj/clothing/hats.dmi and b/modular_skyrat/master_files/icons/donator/obj/clothing/hats.dmi differ diff --git a/modular_skyrat/master_files/icons/donator/obj/clothing/masks.dmi b/modular_skyrat/master_files/icons/donator/obj/clothing/masks.dmi index 072d3aacf95..99ff9b6b09b 100644 Binary files a/modular_skyrat/master_files/icons/donator/obj/clothing/masks.dmi and b/modular_skyrat/master_files/icons/donator/obj/clothing/masks.dmi differ diff --git a/modular_skyrat/master_files/icons/donator/obj/clothing/suits.dmi b/modular_skyrat/master_files/icons/donator/obj/clothing/suits.dmi index fb97244b3d6..cfb3b90e070 100644 Binary files a/modular_skyrat/master_files/icons/donator/obj/clothing/suits.dmi and b/modular_skyrat/master_files/icons/donator/obj/clothing/suits.dmi differ diff --git a/modular_skyrat/master_files/icons/donator/obj/clothing/uniform.dmi b/modular_skyrat/master_files/icons/donator/obj/clothing/uniform.dmi index d3390b4b0de..3485f63d88d 100644 Binary files a/modular_skyrat/master_files/icons/donator/obj/clothing/uniform.dmi and b/modular_skyrat/master_files/icons/donator/obj/clothing/uniform.dmi differ diff --git a/modular_skyrat/master_files/icons/effects/overlay_effects.dmi b/modular_skyrat/master_files/icons/effects/overlay_effects.dmi index be4eebf6c63..2eb0a60bd63 100644 Binary files a/modular_skyrat/master_files/icons/effects/overlay_effects.dmi and b/modular_skyrat/master_files/icons/effects/overlay_effects.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/back.dmi b/modular_skyrat/master_files/icons/mob/clothing/back.dmi index b602990d147..4e8d6bc375f 100644 Binary files a/modular_skyrat/master_files/icons/mob/clothing/back.dmi and b/modular_skyrat/master_files/icons/mob/clothing/back.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/species/vox/suit.dmi b/modular_skyrat/master_files/icons/mob/clothing/species/vox/suit.dmi index 04ef955454a..7d748461858 100644 Binary files a/modular_skyrat/master_files/icons/mob/clothing/species/vox/suit.dmi and b/modular_skyrat/master_files/icons/mob/clothing/species/vox/suit.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/suit.dmi b/modular_skyrat/master_files/icons/mob/clothing/suit.dmi index 71016a61e4e..cf43274be05 100644 Binary files a/modular_skyrat/master_files/icons/mob/clothing/suit.dmi and b/modular_skyrat/master_files/icons/mob/clothing/suit.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/suit_digi.dmi b/modular_skyrat/master_files/icons/mob/clothing/suit_digi.dmi index e0c28318614..a873d24de49 100644 Binary files a/modular_skyrat/master_files/icons/mob/clothing/suit_digi.dmi and b/modular_skyrat/master_files/icons/mob/clothing/suit_digi.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/suits/labcoat_digi.dmi b/modular_skyrat/master_files/icons/mob/clothing/suits/labcoat_digi.dmi index 8265b26b371..1c3b3c89233 100644 Binary files a/modular_skyrat/master_files/icons/mob/clothing/suits/labcoat_digi.dmi and b/modular_skyrat/master_files/icons/mob/clothing/suits/labcoat_digi.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/under/cargo.dmi b/modular_skyrat/master_files/icons/mob/clothing/under/cargo.dmi index 64fbefeed4e..66e60c5c3c0 100644 Binary files a/modular_skyrat/master_files/icons/mob/clothing/under/cargo.dmi and b/modular_skyrat/master_files/icons/mob/clothing/under/cargo.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/under/cargo_digi.dmi b/modular_skyrat/master_files/icons/mob/clothing/under/cargo_digi.dmi index 2f5d8e83baa..eaba4d79fd3 100644 Binary files a/modular_skyrat/master_files/icons/mob/clothing/under/cargo_digi.dmi and b/modular_skyrat/master_files/icons/mob/clothing/under/cargo_digi.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/under/civilian.dmi b/modular_skyrat/master_files/icons/mob/clothing/under/civilian.dmi index f759798da57..f29940e8527 100644 Binary files a/modular_skyrat/master_files/icons/mob/clothing/under/civilian.dmi and b/modular_skyrat/master_files/icons/mob/clothing/under/civilian.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/under/civilian_digi.dmi b/modular_skyrat/master_files/icons/mob/clothing/under/civilian_digi.dmi index 7b129cf66ab..fc9fddc928d 100644 Binary files a/modular_skyrat/master_files/icons/mob/clothing/under/civilian_digi.dmi and b/modular_skyrat/master_files/icons/mob/clothing/under/civilian_digi.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/under/suits.dmi b/modular_skyrat/master_files/icons/mob/clothing/under/suits.dmi index e67fbd9e89b..aa746169deb 100644 Binary files a/modular_skyrat/master_files/icons/mob/clothing/under/suits.dmi and b/modular_skyrat/master_files/icons/mob/clothing/under/suits.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/under/suits_digi.dmi b/modular_skyrat/master_files/icons/mob/clothing/under/suits_digi.dmi index bf4fcd4f9f6..3202b5117c9 100644 Binary files a/modular_skyrat/master_files/icons/mob/clothing/under/suits_digi.dmi and b/modular_skyrat/master_files/icons/mob/clothing/under/suits_digi.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_lefthand.dmi b/modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_lefthand.dmi index bfcdb98611c..7de3911b402 100644 Binary files a/modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_lefthand.dmi and b/modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_lefthand.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_righthand.dmi b/modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_righthand.dmi index a95b22d161a..14c50cdff5b 100644 Binary files a/modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_righthand.dmi and b/modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_righthand.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/sprite_accessory/tails.dmi b/modular_skyrat/master_files/icons/mob/sprite_accessory/tails.dmi index 0becc238d51..9a3fc7ebe52 100644 Binary files a/modular_skyrat/master_files/icons/mob/sprite_accessory/tails.dmi and b/modular_skyrat/master_files/icons/mob/sprite_accessory/tails.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 82a444df22c..27681198c5b 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/backpacks.dmi b/modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi index 50f6a08fc61..5d8a2cfd375 100644 Binary files a/modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi and b/modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi differ diff --git a/modular_skyrat/modules/GAGS/greyscale_configs.dm b/modular_skyrat/modules/GAGS/greyscale_configs.dm index 23b611ff0d3..d560d196031 100644 --- a/modular_skyrat/modules/GAGS/greyscale_configs.dm +++ b/modular_skyrat/modules/GAGS/greyscale_configs.dm @@ -553,18 +553,17 @@ // OVERALLS -/datum/greyscale_config/overalls - name = "Overalls" - icon_file = 'modular_skyrat/modules/GAGS/icons/suit/suit.dmi' - json_config = 'modular_skyrat/modules/GAGS/json_configs/overalls/overalls.json' - -/datum/greyscale_config/overalls/worn - name = "Overalls (Worn)" - json_config = 'modular_skyrat/modules/GAGS/json_configs/overalls/overalls_worn.json' - /datum/greyscale_config/overalls/worn/digi name = "Overalls (Worn, Digi)" - icon_file = 'modular_skyrat/modules/GAGS/icons/suit/suit_digi.dmi' + icon_file = 'modular_skyrat/master_files/icons/mob/clothing/suit_digi.dmi' + +/datum/greyscale_config/overalls/worn/vox + name = "Overalls (Worn, Vox)" + icon_file = 'modular_skyrat/master_files/icons/mob/clothing/species/vox/suit.dmi' + +/datum/greyscale_config/overalls/worn/better_vox + name = "Overalls (Worn, Better Vox)" + icon_file = 'modular_skyrat/modules/better_vox/icons/clothing/suit.dmi' // URBAN COAT @@ -698,11 +697,11 @@ icon_file = 'modular_skyrat/modules/GAGS/icons/jumpsuit_vox.dmi' /datum/greyscale_config/jumpsuit/worn/better_vox - name = "Jumpsuit (Worn) - Better Vox" + name = "Jumpsuit (Worn, Better Vox)" icon_file = 'modular_skyrat/modules/GAGS/icons/jumpsuit_better_vox.dmi' /datum/greyscale_config/jumpsuit/prison/worn/better_vox - name = "Prison Jumpsuit (Worn) - Better Vox" + name = "Prison Jumpsuit (Worn, Better Vox)" icon_file = 'modular_skyrat/modules/GAGS/icons/jumpsuit_better_vox.dmi' /datum/greyscale_config/jumpsuit/worn/taur_snake diff --git a/modular_skyrat/modules/GAGS/json_configs/overalls/overalls.json b/modular_skyrat/modules/GAGS/json_configs/overalls/overalls.json deleted file mode 100644 index 4db3f080caa..00000000000 --- a/modular_skyrat/modules/GAGS/json_configs/overalls/overalls.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "overalls": [ - { - "type": "icon_state", - "icon_state": "overalls_obj", - "blend_mode": "overlay", - "color_ids": [ 1 ] - } - ] -} diff --git a/modular_skyrat/modules/SEVA_suit/code/seva_obj.dm b/modular_skyrat/modules/SEVA_suit/code/seva_obj.dm index 1cc76086791..dad662fee36 100644 --- a/modular_skyrat/modules/SEVA_suit/code/seva_obj.dm +++ b/modular_skyrat/modules/SEVA_suit/code/seva_obj.dm @@ -17,7 +17,7 @@ armor_type = /datum/armor/hooded_seva resistance_flags = FIRE_PROOF transparent_protection = HIDEJUMPSUIT - allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe) + allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/recharge/kinetic_accelerator, /obj/item/pickaxe) /datum/armor/hooded_seva melee = 20 diff --git a/modular_skyrat/modules/admin/code/manage_player_ranks.dm b/modular_skyrat/modules/admin/code/manage_player_ranks.dm deleted file mode 100644 index 70d86c1f2b3..00000000000 --- a/modular_skyrat/modules/admin/code/manage_player_ranks.dm +++ /dev/null @@ -1,136 +0,0 @@ -/// The defines for the appropriate config files -#define SKYRAT_DONATOR_CONFIG_FILE "[global.config.directory]/skyrat/donators.txt" -#define SKYRAT_MENTOR_CONFIG_FILE "[global.config.directory]/skyrat/mentors.txt" -#define SKYRAT_VETERAN_CONFIG_FILE "[global.config.directory]/skyrat/veteran_players.txt" - -/// The list of the available special player ranks -#define SKYRAT_PLAYER_RANKS list("Donator", "Mentor", "Veteran") - -/client/proc/manage_player_ranks() - set category = "Admin" - set name = "Manage Player Ranks" - set desc = "Manage who has the special player ranks while the server is running." - - if(!check_rights(R_PERMISSIONS)) - return - usr.client?.holder.manage_player_ranks() - -/// Proc for admins to change people's "player" ranks (donator, mentor, veteran, etc.) -/datum/admins/proc/manage_player_ranks() - if(!check_rights(R_PERMISSIONS)) - return - - var/choice = tgui_alert(usr, "Which rank would you like to manage?", "Manage Player Ranks", SKYRAT_PLAYER_RANKS) - if(!choice || !(choice in SKYRAT_PLAYER_RANKS)) - return - - manage_player_rank_in_group(choice) - -/// Proc that helps a bit with repetition, basically an extension of `manage_player_ranks()` -/datum/admins/proc/manage_player_rank_in_group(group) - if(!(group in SKYRAT_PLAYER_RANKS)) - CRASH("[key_name(usr)] attempted to add someone to an invalid \"[group]\" group.") - - var/group_title = lowertext(group) - - var/list/choices = list("Add", "Remove") - switch(tgui_alert(usr, "What would you like to do?", "Manage [group]s", choices)) - if("Add") - var/name = input(usr, "Please enter the CKEY (case-insensitive) of the person you would like to make a [group_title]:", "Add a [group_title]") as null|text - if(!name) - return - - var/player_to_be = ckey(name) - if(!player_to_be) - to_chat(usr, span_warning("\"[name]\" is not a valid CKEY.")) - return - - switch(group) - if ("Donator") - for(var/a_donator as anything in GLOB.donator_list) - if(player_to_be == a_donator) - to_chat(usr, span_warning("\"[player_to_be]\" is already a [group_title]!")) - return - // Now that we know that the ckey is valid and they're not already apart of that group, let's add them to it! - GLOB.donator_list[player_to_be] = TRUE - text2file(player_to_be, SKYRAT_DONATOR_CONFIG_FILE) - - if("Mentor") - for(var/a_mentor as anything in GLOB.mentor_datums) - if(player_to_be == a_mentor) - to_chat(usr, span_warning("\"[player_to_be]\" is already a [group_title]!")) - return - // Now that we know that the ckey is valid and they're not already apart of that group, let's add them to it! - new /datum/mentors(player_to_be) - text2file(player_to_be, SKYRAT_MENTOR_CONFIG_FILE) - - if ("Veteran") - for(var/a_veteran as anything in GLOB.veteran_players) - if(player_to_be == a_veteran) - to_chat(usr, span_warning("\"[player_to_be]\" is already a [group_title]!")) - return - // Now that we know that the ckey is valid and they're not already apart of that group, let's add them to it! - GLOB.veteran_players[player_to_be] = TRUE - text2file(player_to_be, SKYRAT_VETERAN_CONFIG_FILE) - - else - return - - message_admins("[key_name(usr)] has granted [group_title] status to [player_to_be].") - log_admin_private("[key_name(usr)] has granted [group_title] status to [player_to_be].") - - - if("Remove") - var/name = input(usr, "Please enter the CKEY (case-insensitive) of the person you would like to no longer be a [group_title]:", "Remove a [group_title]") as null|text - if(!name) - return - - var/player_that_was = ckey(name) - if(!player_that_was) - to_chat(usr, span_warning("\"[name]\" is not a valid CKEY.")) - return - - var/changes = FALSE - switch(group) - if ("Donator") - for(var/a_donator as anything in GLOB.donator_list) - if(player_that_was == a_donator) - GLOB.donator_list -= player_that_was - changes = TRUE - if(!changes) - to_chat(usr, span_warning("\"[player_that_was]\" was already not a [group_title].")) - return - save_donators() - - if("Mentor") - for(var/a_mentor as anything in GLOB.mentor_datums) - if(player_that_was == a_mentor) - var/datum/mentors/mentor_datum = GLOB.mentor_datums[a_mentor] - mentor_datum.remove_mentor() - changes = TRUE - if(!changes) - to_chat(usr, span_warning("\"[player_that_was]\" was already not a [group_title].")) - save_mentors() - - if("Veteran") - for(var/a_veteran as anything in GLOB.veteran_players) - if(player_that_was == a_veteran) - GLOB.veteran_players -= player_that_was - changes = TRUE - if(!changes) - to_chat(usr, span_warning("\"[player_that_was]\" was already not a [group_title].")) - return - save_veteran_players() - - else - return - message_admins("[key_name(usr)] has revoked [group_title] status from [player_that_was].") - log_admin_private("[key_name(usr)] has revoked [group_title] status from [player_that_was].") - - else - return - -#undef SKYRAT_DONATOR_CONFIG_FILE -#undef SKYRAT_MENTOR_CONFIG_FILE -#undef SKYRAT_VETERAN_CONFIG_FILE -#undef SKYRAT_PLAYER_RANKS diff --git a/modular_skyrat/modules/admin/code/player_ranks.dm b/modular_skyrat/modules/admin/code/player_ranks.dm new file mode 100644 index 00000000000..6e05a42f7d8 --- /dev/null +++ b/modular_skyrat/modules/admin/code/player_ranks.dm @@ -0,0 +1,121 @@ +/// The list of the available special player ranks +#define SKYRAT_PLAYER_RANKS list("Donator", "Mentor", "Veteran") + +/client/proc/manage_player_ranks() + set category = "Admin" + set name = "Manage Player Ranks" + set desc = "Manage who has the special player ranks while the server is running." + + if(!check_rights(R_PERMISSIONS)) + return + + usr.client?.holder.manage_player_ranks() + +/// Proc for admins to change people's "player" ranks (donator, mentor, veteran, etc.) +/datum/admins/proc/manage_player_ranks() + if(IsAdminAdvancedProcCall()) + return + + if(!check_rights(R_PERMISSIONS)) + return + + var/choice = tgui_alert(usr, "Which rank would you like to manage?", "Manage Player Ranks", SKYRAT_PLAYER_RANKS) + if(!choice || !(choice in SKYRAT_PLAYER_RANKS)) + return + + manage_player_rank_in_group(choice) + +/** + * Handles managing player ranks based on the name of the group that was chosen. + * + * Arguments: + * * group - The title of the player rank that was chosen to be managed. + */ +/datum/admins/proc/manage_player_rank_in_group(group) + PROTECTED_PROC(TRUE) + + if(IsAdminAdvancedProcCall()) + return + + if(!(group in SKYRAT_PLAYER_RANKS)) + CRASH("[key_name(usr)] attempted to add someone to an invalid \"[group]\" group.") + + var/group_title = lowertext(group) + + var/list/choices = list("Add", "Remove") + switch(tgui_alert(usr, "What would you like to do?", "Manage [group]s", choices)) + if("Add") + var/name = input(usr, "Please enter the CKEY (case-insensitive) of the person you would like to make a [group_title]:", "Add a [group_title]") as null|text + if(!name) + return + + var/player_to_be = ckey(name) + if(!player_to_be) + to_chat(usr, span_warning("\"[name]\" is not a valid CKEY.")) + return + + var/success = SSplayer_ranks.add_player_to_group(usr.client, player_to_be, group_title) + + if(!success) + return + + message_admins("[key_name(usr)] has granted [group_title] status to [player_to_be].") + log_admin_private("[key_name(usr)] has granted [group_title] status to [player_to_be].") + + + if("Remove") + var/name = input(usr, "Please enter the CKEY (case-insensitive) of the person you would like to no longer be a [group_title]:", "Remove a [group_title]") as null|text + if(!name) + return + + var/player_that_was = ckey(name) + if(!player_that_was) + to_chat(usr, span_warning("\"[name]\" is not a valid CKEY.")) + return + + var/success = SSplayer_ranks.remove_player_from_group(usr.client, player_that_was, group_title) + + if(!success) + return + + message_admins("[key_name(usr)] has revoked [group_title] status from [player_that_was].") + log_admin_private("[key_name(usr)] has revoked [group_title] status from [player_that_was].") + + else + return + + + +/client/proc/migrate_player_ranks() + set category = "Debug" + set name = "Migrate Player Ranks" + set desc = "Individually migrate the various player ranks from their legacy system to the SQL-based one." + + if(!check_rights(R_PERMISSIONS | R_DEBUG | R_SERVER)) + return + + usr.client?.holder.migrate_player_ranks() + + +/datum/admins/proc/migrate_player_ranks() + if(IsAdminAdvancedProcCall()) + return + + if(!check_rights(R_PERMISSIONS | R_DEBUG | R_SERVER)) + return + + if(!CONFIG_GET(flag/sql_enabled)) + return + + var/choice = tgui_alert(usr, "Which rank would you like to migrate?", "Migrate Player Ranks", SKYRAT_PLAYER_RANKS) + if(!choice || !(choice in SKYRAT_PLAYER_RANKS)) + return + + if(tgui_alert(usr, "Are you sure that you would like to migrate [choice]s to the SQL-based system?", "Migrate Player Ranks", list("Yes", "No")) != "Yes") + return + + log_admin("[key_name(usr)] is migrating the [choice] player rank from its legacy system to the SQL-based one.") + SSplayer_ranks.migrate_player_rank_to_sql(usr.client, choice) + + +#undef SKYRAT_PLAYER_RANKS diff --git a/modular_skyrat/modules/advanced_shuttles/code/shuttles.dm b/modular_skyrat/modules/advanced_shuttles/code/shuttles.dm index 37e9782624a..c6ed394a8e4 100644 --- a/modular_skyrat/modules/advanced_shuttles/code/shuttles.dm +++ b/modular_skyrat/modules/advanced_shuttles/code/shuttles.dm @@ -61,6 +61,7 @@ suffix = "skyrat" name = "Standard Emergency Shuttle" description = "Nanotrasen's standard issue emergency shuttle." + occupancy_limit = 60 /datum/map_template/shuttle/labour/skyrat name = "NMC Drudge (Labour)" diff --git a/modular_skyrat/modules/aesthetics/airlock/code/airlock.dm b/modular_skyrat/modules/aesthetics/airlock/code/airlock.dm index 49425abf1dc..91f866fda6d 100644 --- a/modular_skyrat/modules/aesthetics/airlock/code/airlock.dm +++ b/modular_skyrat/modules/aesthetics/airlock/code/airlock.dm @@ -131,11 +131,12 @@ pre_light_range = door_light_range pre_light_power = door_light_power if(has_environment_lights) - set_light(pre_light_range, pre_light_power, pre_light_color, TRUE) + set_light(l_range = pre_light_range, l_power = pre_light_power, l_color = pre_light_color, l_on = TRUE) if(multi_tile) - filler.set_light(pre_light_range, pre_light_power, pre_light_color) + filler.set_light(l_range = pre_light_range, l_power = pre_light_power, l_color = pre_light_color, l_on = TRUE) else lights_overlay = "" + set_light(l_on = FALSE) var/mutable_appearance/lights_appearance = mutable_appearance(overlays_file, lights_overlay, FLOAT_LAYER, src, ABOVE_LIGHTING_PLANE) @@ -382,11 +383,20 @@ icon = 'modular_skyrat/modules/aesthetics/airlock/icons/airlocks/highsec/highsec.dmi' overlays_file = 'modular_skyrat/modules/aesthetics/airlock/icons/airlocks/highsec/overlays.dmi' -//GLASS -/obj/machinery/door/airlock/glass_large - icon = 'modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/multi_tile.dmi' - overlays_file = 'modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/overlays.dmi' - multi_tile = TRUE +//MULTI-TILE + +/obj/machinery/door/airlock/multi_tile + icon = 'modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/glass.dmi' + overlays_file = 'modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/glass_overlays.dmi' + bound_width = 64 + +/obj/machinery/door/airlock/multi_tile/glass + icon = 'modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/glass.dmi' + overlays_file = 'modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/glass_overlays.dmi' + +/obj/machinery/door/airlock/multi_tile/metal + icon = 'modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/metal.dmi' + overlays_file = 'modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/metal_overlays.dmi' //ASSEMBLYS /obj/structure/door_assembly/door_assembly_public diff --git a/modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/multi_tile.dmi b/modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/glass.dmi similarity index 100% rename from modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/multi_tile.dmi rename to modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/glass.dmi diff --git a/modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/overlays.dmi b/modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/glass_overlays.dmi similarity index 100% rename from modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/overlays.dmi rename to modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/glass_overlays.dmi diff --git a/modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile2/multi_tile.dmi b/modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/metal.dmi similarity index 100% rename from modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile2/multi_tile.dmi rename to modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/metal.dmi diff --git a/modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile2/overlays.dmi b/modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/metal_overlays.dmi similarity index 100% rename from modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile2/overlays.dmi rename to modular_skyrat/modules/aesthetics/airlock/icons/airlocks/multi_tile/metal_overlays.dmi diff --git a/modular_skyrat/modules/aesthetics/device/device.dm b/modular_skyrat/modules/aesthetics/device/device.dm index 9dae3fdd45e..f7f4b8e5d9b 100644 --- a/modular_skyrat/modules/aesthetics/device/device.dm +++ b/modular_skyrat/modules/aesthetics/device/device.dm @@ -13,12 +13,6 @@ /obj/item/geiger_counter icon = 'modular_skyrat/modules/aesthetics/device/device.dmi' -/obj/item/desynchronizer - icon = 'modular_skyrat/modules/aesthetics/device/device.dmi' - -/obj/item/camera_bug - icon = 'modular_skyrat/modules/aesthetics/device/device.dmi' - // This needs default but is a subtype. Pain. /obj/item/t_scanner/adv_mining_scanner icon = 'icons/obj/device.dmi' diff --git a/modular_skyrat/modules/aesthetics/guns/code/guns.dm b/modular_skyrat/modules/aesthetics/guns/code/guns.dm index 3bace7c4ea8..ccc43793c33 100644 --- a/modular_skyrat/modules/aesthetics/guns/code/guns.dm +++ b/modular_skyrat/modules/aesthetics/guns/code/guns.dm @@ -10,27 +10,50 @@ * these updated, more consistent defines make it so that a single round's total materials should total 20% of a sheet, or 2 SMALL_MATERIAL_AMOUNT */ -#define AMMO_MATS_BASIC list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 2) +#define AMMO_MATS_BASIC list( \ + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 2, \ +) -#define AMMO_MATS_AP list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 1.6,\ - /datum/material/titanium = SMALL_MATERIAL_AMOUNT * 0.4) +#define AMMO_MATS_AP list( \ + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 1.6, \ + /datum/material/titanium = SMALL_MATERIAL_AMOUNT * 0.4, \ +) -#define AMMO_MATS_TEMP list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 1.6,\ - /datum/material/plasma = SMALL_MATERIAL_AMOUNT * 0.4) +#define AMMO_MATS_TEMP list( \ + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 1.6, \ + /datum/material/plasma = SMALL_MATERIAL_AMOUNT * 0.4, \ +) -#define AMMO_MATS_EMP list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 1.6,\ - /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 0.4) +#define AMMO_MATS_EMP list( \ + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 1.6, \ + /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 0.4, \ +) -#define AMMO_MATS_PHASIC list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 1.6,\ - /datum/material/bluespace = SMALL_MATERIAL_AMOUNT * 0.4) +#define AMMO_MATS_PHASIC list( \ + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 1.6, \ + /datum/material/bluespace = SMALL_MATERIAL_AMOUNT * 0.4, \ +) -#define AMMO_MATS_TRAC list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 1.6,\ - /datum/material/silver = SMALL_MATERIAL_AMOUNT * 0.2,\ - /datum/material/gold = SMALL_MATERIAL_AMOUNT * 0.2) +#define AMMO_MATS_TRAC list( \ + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 1.6, \ + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 0.2, \ + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 0.2, \ +) + +#define AMMO_MATS_HOMING list( \ + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 1, \ + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 0.2, \ + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 0.2, \ + /datum/material/plasma = SMALL_MATERIAL_AMOUNT * 0.2, \ + /datum/material/diamond = SMALL_MATERIAL_AMOUNT * 0.2, \ + /datum/material/bluespace = SMALL_MATERIAL_AMOUNT * 0.2, \ +) // for .35 Sol Ripper. one day, anon. one day -#define AMMO_MATS_RIPPER list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 1.6,\ - /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.4) +#define AMMO_MATS_RIPPER list( \ + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 1.6, \ + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 0.4, \ +) /obj/item/ammo_casing custom_materials = AMMO_MATS_BASIC @@ -40,63 +63,17 @@ /// Maybe don't enable this for shotgun ammo boxes. var/multitype = TRUE -/obj/item/ammo_box/a762 - caliber = CALIBER_A762 - -/obj/item/gun/energy/e_gun - icon = 'modular_skyrat/modules/aesthetics/guns/icons/energy.dmi' - lefthand_file = 'modular_skyrat/modules/aesthetics/guns/icons/guns_lefthand.dmi' - righthand_file = 'modular_skyrat/modules/aesthetics/guns/icons/guns_righthand.dmi' - worn_icon = 'modular_skyrat/modules/aesthetics/guns/icons/guns_back.dmi' - worn_icon_state = "energy" - ammo_x_offset = 2 - -/obj/item/gun/energy/e_gun/advtaser - worn_icon = null - worn_icon_state = "gun" - -/obj/item/gun/energy/e_gun/cfa_phalanx - worn_icon = null - worn_icon_state = "gun" - -/obj/item/gun/energy/e_gun/mini - worn_icon = null - worn_icon_state = "gun" - -/obj/item/gun/energy/e_gun/stun - worn_icon = null - worn_icon_state = "gun" - -/obj/item/gun/energy/e_gun/old - worn_icon = null - worn_icon_state = "gun" - -/obj/item/gun/energy/e_gun/hos - worn_icon = null - worn_icon_state = "gun" - -/obj/item/gun/energy/e_gun/dragnet - worn_icon = null - worn_icon_state = "gun" - -/obj/item/gun/energy/laser/musket //We need to have this because we overwrote the icon file for laser guns. - icon = 'icons/obj/weapons/guns/energy.dmi' - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' +///GUN SPRITE OVERWRITES /obj/item/gun/energy/ionrifle icon = 'modular_skyrat/modules/aesthetics/guns/icons/energy.dmi' lefthand_file = 'modular_skyrat/modules/aesthetics/guns/icons/guns_lefthand.dmi' righthand_file = 'modular_skyrat/modules/aesthetics/guns/icons/guns_righthand.dmi' -/obj/item/gun/energy/laser - icon = 'modular_skyrat/modules/aesthetics/guns/icons/energy.dmi' - lefthand_file = 'modular_skyrat/modules/aesthetics/guns/icons/guns_lefthand.dmi' - righthand_file = 'modular_skyrat/modules/aesthetics/guns/icons/guns_righthand.dmi' - -/obj/item/gun/energy/e_gun/stun - charge_sections = 5 - ammo_x_offset = 2 +/obj/item/gun/energy/ionrifle/carbine + icon = 'icons/obj/weapons/guns/energy.dmi' + lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' /obj/item/gun/ballistic/shotgun/riot name = "\improper Peacekeeper shotgun" @@ -136,6 +113,15 @@ inhand_x_dimension = 32 inhand_y_dimension = 32 +// de-overrides this particular gun, it uses the tg file +/obj/item/gun/ballistic/shotgun/automatic/combat/compact + icon = 'icons/obj/weapons/guns/ballistic.dmi' + 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 + worn_icon = null + /obj/item/gun/grenadelauncher icon = 'modular_skyrat/modules/aesthetics/guns/icons/guns.dmi' lefthand_file = 'modular_skyrat/modules/aesthetics/guns/icons/guns_lefthand.dmi' @@ -172,20 +158,6 @@ worn_icon_state = "gun" worn_icon = null -/obj/item/gun/energy/laser/thermal - icon = 'icons/obj/weapons/guns/energy.dmi' - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' - -/obj/item/gun/energy/lasercannon - icon = 'modular_skyrat/modules/aesthetics/guns/icons/energy.dmi' - fire_sound_volume = 100 - ammo_x_offset = 2 - charge_sections = 5 - inhand_icon_state = "" - lefthand_file = 'modular_skyrat/modules/aesthetics/guns/icons/guns_lefthand.dmi' - righthand_file = 'modular_skyrat/modules/aesthetics/guns/icons/guns_righthand.dmi' - /obj/item/gun/energy/e_gun/nuclear/rainbow name = "fantastic energy gun" desc = "An energy gun with an experimental miniaturized nuclear reactor that automatically charges the internal power cell. This one seems quite fancy!" @@ -231,11 +203,6 @@ /obj/item/gun/energy/e_gun/nuclear/rainbow/emag_act(mob/user, obj/item/card/emag/E) return FALSE -// We don't customize CTF -/obj/item/gun/energy/laser/instakill/ctf - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' - //BEAM SOUNDS /obj/item/ammo_casing/energy fire_sound = 'modular_skyrat/modules/aesthetics/guns/sound/laser.ogg' @@ -355,49 +322,6 @@ inhand_icon_state = "arg" can_suppress = FALSE -//SOLFED PILOT RIFLE GONE, TO BE ADDED TO ERT FACTIONS FOLDER - -/obj/item/gun/energy/kinetic_accelerator - icon = 'modular_skyrat/modules/aesthetics/guns/icons/energy.dmi' - -/obj/item/gun/ballistic/rifle/boltaction - name = "\improper Sportiv precision rifle" - desc = "A rather antique sporting rifle dating back to the 2400s chambered for .244 Acia. 'НРИ - Оборонная Коллегия' is etched on the bolt." - sawn_desc = "An extremely sawn-off Sportiv rifle, popularly known as an \"obrez\". There was probably a reason it wasn't manufactured this short to begin with." - icon = 'modular_skyrat/modules/aesthetics/guns/icons/guns.dmi' - -/obj/item/gun/ballistic/rifle/boltaction/surplus - desc = "An unnervingly antique sporting rifle dating back to the 2400s chambered for .244 Acia. 'НРИ - Оборонная Коллегия' is etched on the bolt. It looks poorly kept, \ - and feels uncomfortably moist." - sawn_desc = "An extremely sawn-off, unnervingly antique Sportiv rifle, popularly known as an \"obrez\". \ - There was probably a reason it wasn't manufactured this short to begin with, especially not after what can only be assumed was years of negligence. \ - It still feels uncomfortably moist." - -/obj/item/gun/ballistic/rifle/boltaction/sporterized - name = "\improper FTU 'Archangel' precision rifle" - desc = "A very... \"modernized\" Sportiv rifle, the frame even feels a little flimsy. This thing was probably built with a conversion kit from a shady NTnet site.\ -

\ - BRAND NEW: Cannot be sawn off." - icon_state = "bubba" - worn_icon = 'modular_skyrat/modules/aesthetics/guns/icons/guns_back.dmi' - worn_icon_state = "bubba" - accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/bubba - can_be_sawn_off = FALSE - -/obj/item/gun/ballistic/rifle/boltaction/sporterized/empty - bolt_locked = TRUE // so the bolt starts visibly open - accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/bubba/empty - -/obj/item/ammo_box/magazine/internal/boltaction/bubba - name = "sportiv extended internal magazine" - desc = "How did you get it out?" - ammo_type = /obj/item/ammo_casing/a762 - caliber = CALIBER_A762 - max_ammo = 8 - -/obj/item/ammo_box/magazine/internal/boltaction/bubba/empty - start_empty = TRUE - /obj/item/gun/ballistic/automatic/surplus name = "\improper Type-69 surplus rifle" desc = "One of countless obsolete ballistic rifles that still sees use as a cheap deterrent. Uses 10mm ammo and its bulky frame prevents one-hand firing." @@ -405,7 +329,7 @@ /obj/item/gun/ballistic/automatic/ar/modular/model75 name = "\improper NT ARG-75" - desc = "A contemporary rifle manufactured by NT chambered for .244 Acia. It's equipped with a heavy duty integrally suppressed barrel, CQB scope and a topmounted laser sight." + desc = "A contemporary rifle manufactured by NT chambered for .310 Strilka. It's equipped with a heavy duty integrally suppressed barrel, CQB scope and a topmounted laser sight." icon_state = "arg75" icon = 'modular_skyrat/modules/aesthetics/guns/icons/guns.dmi' fire_sound = 'sound/weapons/gun/pistol/shot_suppressed.ogg' @@ -418,40 +342,31 @@ /obj/item/ammo_box/magazine/multi_sprite/ostwind/arg75 name = "\improper ARG-75 magazine" - desc = "A twenty round double-stack magazine for the NT ARG-75 rifle. Chambered in .244 Acia." + desc = "A twenty round double-stack magazine for the NT ARG-75 rifle. Chambered in .310 Strilka." icon = 'modular_skyrat/modules/sec_haul/icons/guns/mags.dmi' icon_state = "pcr" - ammo_type = /obj/item/ammo_casing/a762 - caliber = CALIBER_A762 + ammo_type = /obj/item/ammo_casing/strilka310 + caliber = CALIBER_STRILKA310 max_ammo = 20 // GUBMAN3 - FULL BULLET RENAME +// i loathe the above -/obj/item/ammo_casing/a762 - name = ".244 Acia casing" - desc = "A .244 bullet casing." +// overrides for .310 Strilka-derived ammo, e.g. lionhunter ammo, because you don't want to give security the ability to print infinite wallhack ammo, right? +/obj/item/ammo_casing/strilka310/lionhunter + name = "hunter's rifle round" + can_be_printed = FALSE // trust me bro you dont wanna give security homing wallhack Better Rubbers -/obj/item/ammo_casing/a762/surplus - name = ".244 Acia surplus casing" - desc = "A .244 surplus bullet casing." +/obj/item/ammo_casing/strilka310/enchanted + name = "enchanted rifle round" + can_be_printed = FALSE // these are Really Really Better Rubbers -// these two are here just so i have a place to rename them and make it VERY clear that these Should Not Be Printing -/obj/item/ammo_casing/a762/lionhunter - name = "lionhunter's casing" - desc = "There's something unnatural about this casing." - can_be_printed = FALSE - -/obj/item/ammo_casing/a762/enchanted - name = "enchanted .244 Acia casing" - desc = "A .244 Acia casing. Under the right conditions, it shimmers." // these shouldn't be appearing because LSG makes you throw your gun without working the bolt - can_be_printed = FALSE - -/obj/item/ammo_casing/a277 +// overrides for tgcode's .223 (formerly 5.56), used in the M90-gl - renamed to .277 Aestus +/obj/item/ammo_casing/a223 name = ".277 Aestus casing" desc = "A .277 bullet casing." - caliber = CALIBER_A277 -/obj/item/ammo_casing/a277/phasic +/obj/item/ammo_casing/a223/phasic name = ".277 Aestus phasic casing" desc = "A .277 Aestus bullet casing.\

\ @@ -461,9 +376,7 @@ // shotgun ammo overrides moved to modular_skyrat\modules\shotgunrebalance\code\shotgun.dm -// i'd've put more can_be_printed overrides for the cargo shells but, like... some of them actually do have defined materials so you can't just shit them out with metal? -// kinda weird that none of these others do but, whatever?? - +// overrides for tgcode .50cal, used in their sniper/anti-materiel rifles /obj/item/ammo_casing/p50 name = ".416 Stabilis polymer casing" desc = "A .416 bullet casing." @@ -475,6 +388,7 @@ desc = "A .416 bullet casing that specialises in sending the target to sleep rather than hell.\

\ SOPORIFIC: Forces targets to sleep, deals no damage." + projectile_type = /obj/projectile/bullet/p50/soporific /obj/item/ammo_casing/p50/penetrator name = ".416 Stabilis APFSDS ++P bullet casing" @@ -482,6 +396,7 @@

\ PENETRATOR: Goes through every surface, and every mob. Goes through everything. Yes, really." +// overrides for tgcode 4.6x30mm, used in the WT-550 /obj/item/ammo_casing/c46x30mm name = "8mm Usurpator bullet casing" desc = "An 8mm bullet casing." @@ -502,6 +417,7 @@ custom_materials = AMMO_MATS_TEMP advanced_print_req = TRUE +// overrides for tgcode .45, used in the M1911 and C20-r /obj/item/ammo_casing/c45 name = ".460 Ceres bullet casing" desc = "A .460 bullet casing." @@ -522,12 +438,14 @@ custom_materials = AMMO_MATS_TEMP advanced_print_req = TRUE +// overrides for .50AE, used in the deagle /obj/item/ammo_casing/a50ae name = ".454 Trucidator bullet casing" desc = "A .454 Trucidator bullet casing. Extremely powerful.\

\ HAND CANNON: Fired out of a handgun, deals disproportionately large damage." +// overrides for .357, used in the .357 revolver /obj/item/ammo_casing/a357 //We can keep the Magnum classic. name = ".357 bullet casing" desc = "A .357 bullet casing.\ @@ -535,11 +453,25 @@ HAND CANNON: Fired out of a handgun, deals disproportionately large damage." /obj/item/ammo_casing/a357/match - name = ".357 match bullet casing" desc = "A .357 bullet casing, manufactured to exceedingly high standards.\

\ MATCH: Ricochets everywhere. Like crazy." +/obj/item/ammo_casing/a357/phasic + desc = "A .357 phasic bullet casing.\ +

\ + PHASIC: Ignores all surfaces except organic matter." + advanced_print_req = TRUE + custom_materials = AMMO_MATS_PHASIC + +/obj/item/ammo_casing/a357/heartseeker + desc = "A .357 heartseeker bullet casing.\ +

\ + HEARTSEEKER: Has homing capabilities, methodology unknown." + advanced_print_req = TRUE + custom_materials = AMMO_MATS_HOMING // meme ammo. meme print cost + +// overrides for .38 Special, used in the .38 revolvers, including the det's /obj/item/ammo_box/c38 caliber = CALIBER_38 @@ -560,20 +492,11 @@ // The ones above are the casings for the ammo, whereas the ones below are the actual projectiles that give you feedback when you're shot -/obj/projectile/bullet/a277 +/obj/projectile/bullet/a223 name = ".277 Aestus bullet" -/obj/projectile/bullet/a277/phasic - name = ".277 PHASE bullet" - -/obj/projectile/bullet/a762 - name = ".244 bullet" - -/obj/projectile/bullet/a762/surplus - name = ".244 surplus bullet" - -/obj/projectile/bullet/a762/enchanted - name = "enchanted .244 bullet" +/obj/projectile/bullet/a223/phasic + name = ".277 phasic bullet" /obj/projectile/bullet/c9mm name = "9x25mm bullet" @@ -662,12 +585,3 @@ /obj/item/ammo_box/magazine/m50 name = ".454 Trucidator handcannon magazine" desc = "An absurdly THICK magazine possibly meant for a heavy hitting pistol, if you can call it that." - -/obj/item/ammo_box/a762 - name = "stripper clip (.244 Acia)" - -/obj/item/ammo_box/a762/surplus - name = "stripper clip (.244 Acia surplus)" - -/obj/item/storage/toolbox/ammobox/a762 - name = ".244 Acia ammo box (Surplus?)" diff --git a/modular_skyrat/modules/aesthetics/guns/icons/energy.dmi b/modular_skyrat/modules/aesthetics/guns/icons/energy.dmi index b8a9bec7b74..2abbd80323f 100644 Binary files a/modular_skyrat/modules/aesthetics/guns/icons/energy.dmi and b/modular_skyrat/modules/aesthetics/guns/icons/energy.dmi differ diff --git a/modular_skyrat/modules/aesthetics/guns/icons/guns.dmi b/modular_skyrat/modules/aesthetics/guns/icons/guns.dmi index 38cd8e563fa..3933f899038 100644 Binary files a/modular_skyrat/modules/aesthetics/guns/icons/guns.dmi and b/modular_skyrat/modules/aesthetics/guns/icons/guns.dmi differ diff --git a/modular_skyrat/modules/aesthetics/lights/code/lighting.dm b/modular_skyrat/modules/aesthetics/lights/code/lighting.dm index a49e4b2c387..c668fe7cf67 100644 --- a/modular_skyrat/modules/aesthetics/lights/code/lighting.dm +++ b/modular_skyrat/modules/aesthetics/lights/code/lighting.dm @@ -6,8 +6,6 @@ light_power = 1.25 /obj/machinery/light - icon = 'modular_skyrat/modules/aesthetics/lights/icons/lighting.dmi' - overlay_icon = 'modular_skyrat/modules/aesthetics/lights/icons/lighting_overlay.dmi' brightness = 6.5 fire_brightness = 4.5 fire_colour = COLOR_FIRE_LIGHT_RED @@ -113,12 +111,6 @@ if(roundstart_flicker) start_flickering() -/obj/item/light/tube - icon = 'modular_skyrat/modules/aesthetics/lights/icons/lighting.dmi' - lefthand_file = 'modular_skyrat/modules/aesthetics/lights/icons/lights_lefthand.dmi' - righthand_file = 'modular_skyrat/modules/aesthetics/lights/icons/lights_righthand.dmi' - - /obj/machinery/light/multitool_act(mob/living/user, obj/item/multitool) if(!constant_flickering) balloon_alert(user, "ballast is already working!") diff --git a/modular_skyrat/modules/aesthetics/lights/icons/lighting.dmi b/modular_skyrat/modules/aesthetics/lights/icons/lighting.dmi deleted file mode 100644 index 016401b085f..00000000000 Binary files a/modular_skyrat/modules/aesthetics/lights/icons/lighting.dmi and /dev/null differ diff --git a/modular_skyrat/modules/aesthetics/lights/icons/lighting_overlay.dmi b/modular_skyrat/modules/aesthetics/lights/icons/lighting_overlay.dmi deleted file mode 100644 index f2e60636b85..00000000000 Binary files a/modular_skyrat/modules/aesthetics/lights/icons/lighting_overlay.dmi and /dev/null differ diff --git a/modular_skyrat/modules/aesthetics/lights/icons/lights_lefthand.dmi b/modular_skyrat/modules/aesthetics/lights/icons/lights_lefthand.dmi deleted file mode 100644 index 7f32ea30013..00000000000 Binary files a/modular_skyrat/modules/aesthetics/lights/icons/lights_lefthand.dmi and /dev/null differ diff --git a/modular_skyrat/modules/aesthetics/lights/icons/lights_righthand.dmi b/modular_skyrat/modules/aesthetics/lights/icons/lights_righthand.dmi deleted file mode 100644 index 94bd2227b34..00000000000 Binary files a/modular_skyrat/modules/aesthetics/lights/icons/lights_righthand.dmi and /dev/null differ diff --git a/modular_skyrat/modules/aesthetics/spaceship_navigation_beacon/spaceship_navigation_beacon.dm b/modular_skyrat/modules/aesthetics/spaceship_navigation_beacon/spaceship_navigation_beacon.dm deleted file mode 100644 index d6e958155d4..00000000000 --- a/modular_skyrat/modules/aesthetics/spaceship_navigation_beacon/spaceship_navigation_beacon.dm +++ /dev/null @@ -1,2 +0,0 @@ -/obj/machinery/spaceship_navigation_beacon - icon = 'modular_skyrat/modules/aesthetics/spaceship_navigation_beacon/spaceship_navigation_beacon.dmi' diff --git a/modular_skyrat/modules/aesthetics/spaceship_navigation_beacon/spaceship_navigation_beacon.dmi b/modular_skyrat/modules/aesthetics/spaceship_navigation_beacon/spaceship_navigation_beacon.dmi deleted file mode 100644 index 63c76f5b37b..00000000000 Binary files a/modular_skyrat/modules/aesthetics/spaceship_navigation_beacon/spaceship_navigation_beacon.dmi and /dev/null differ diff --git a/modular_skyrat/modules/aesthetics/surgery/surgery.dm b/modular_skyrat/modules/aesthetics/surgery/surgery.dm deleted file mode 100644 index 5c04fb86117..00000000000 --- a/modular_skyrat/modules/aesthetics/surgery/surgery.dm +++ /dev/null @@ -1,2 +0,0 @@ -/obj/structure/table/optable - icon = 'modular_skyrat/modules/aesthetics/surgery/surgery.dmi' diff --git a/modular_skyrat/modules/aesthetics/surgery/surgery.dmi b/modular_skyrat/modules/aesthetics/surgery/surgery.dmi deleted file mode 100644 index 12640f957e5..00000000000 Binary files a/modular_skyrat/modules/aesthetics/surgery/surgery.dmi and /dev/null differ diff --git a/modular_skyrat/modules/aesthetics/syringe/syringe.dm b/modular_skyrat/modules/aesthetics/syringe/syringe.dm deleted file mode 100644 index 7ccbbc3720b..00000000000 --- a/modular_skyrat/modules/aesthetics/syringe/syringe.dm +++ /dev/null @@ -1,5 +0,0 @@ -/obj/item/reagent_containers/borghypo - icon = 'modular_skyrat/modules/aesthetics/syringe/syringe.dmi' - -/obj/item/lazarus_injector - icon = 'modular_skyrat/modules/aesthetics/syringe/syringe.dmi' diff --git a/modular_skyrat/modules/aesthetics/syringe/syringe.dmi b/modular_skyrat/modules/aesthetics/syringe/syringe.dmi deleted file mode 100644 index feca236556a..00000000000 Binary files a/modular_skyrat/modules/aesthetics/syringe/syringe.dmi and /dev/null differ diff --git a/modular_skyrat/modules/aesthetics/walls/code/walls.dm b/modular_skyrat/modules/aesthetics/walls/code/walls.dm index 3866bc44f85..bef7c462262 100644 --- a/modular_skyrat/modules/aesthetics/walls/code/walls.dm +++ b/modular_skyrat/modules/aesthetics/walls/code/walls.dm @@ -15,16 +15,6 @@ icon_state = "reinforced_wall-0" base_icon_state = "reinforced_wall" -/turf/closed/wall/rust/New(loc, ...) - . = ..() - var/mutable_appearance/rust = mutable_appearance(icon, "rust") - add_overlay(rust) - -/turf/closed/wall/r_wall/rust/New(loc, ...) - . = ..() - var/mutable_appearance/rust = mutable_appearance(icon, "rust") - add_overlay(rust) - /obj/structure/falsewall/material icon = 'modular_skyrat/modules/aesthetics/walls/icons/material_wall.dmi' icon_state = "wall-0" diff --git a/modular_skyrat/modules/alt_vox/code/vox_procs.dm b/modular_skyrat/modules/alt_vox/code/vox_procs.dm index be56b0bf094..1af02168763 100644 --- a/modular_skyrat/modules/alt_vox/code/vox_procs.dm +++ b/modular_skyrat/modules/alt_vox/code/vox_procs.dm @@ -168,14 +168,14 @@ if(!only_listener) // Play voice for all mobs in the z level for(var/mob/player_mob in GLOB.player_list) - if(player_mob.client && !player_mob.client?.prefs) - stack_trace("[player_mob] ([player_mob.ckey]) has null prefs, which shouldn't be possible!") + if(!player_mob.can_hear() || !(safe_read_pref(player_mob.client, /datum/preference/toggle/sound_announcements))) continue - if(player_mob.can_hear() && (player_mob.client?.prefs.read_preference(/datum/preference/toggle/sound_announcements))) - var/turf/player_turf = get_turf(player_mob) - if(player_turf.z == z_level) - SEND_SOUND(player_mob, voice) + var/turf/player_turf = get_turf(player_mob) + if(player_turf.z != z_level) + continue + + SEND_SOUND(player_mob, voice) else SEND_SOUND(only_listener, voice) diff --git a/modular_skyrat/modules/ammo_workbench/code/ammo_workbench.dm b/modular_skyrat/modules/ammo_workbench/code/ammo_workbench.dm index 2b5ceef309d..6aef270c3de 100644 --- a/modular_skyrat/modules/ammo_workbench/code/ammo_workbench.dm +++ b/modular_skyrat/modules/ammo_workbench/code/ammo_workbench.dm @@ -72,7 +72,6 @@ 200000, \ MATCONTAINER_EXAMINE, \ allowed_items = /obj/item/stack, \ - container_signals = list(COMSIG_MATCONTAINER_ITEM_CONSUMED = TYPE_PROC_REF(/obj/machinery/autolathe, AfterMaterialInsert)) \ ) . = ..() set_wires(new /datum/wires/ammo_workbench(src)) @@ -275,9 +274,13 @@ creation_efficiency = base_efficiency update_ammotypes() -/obj/machinery/ammo_workbench/proc/ejectItem() +/obj/machinery/ammo_workbench/proc/ejectItem(mob/living/user) if(loaded_magazine) loaded_magazine.forceMove(drop_location()) + + if(user) + try_put_in_hand(loaded_magazine, user) + loaded_magazine = null busy = FALSE error_message = "" @@ -452,7 +455,7 @@ var/mat_capacity = 0 for(var/datum/stock_part/matter_bin/new_matter_bin in component_parts) - mat_capacity += new_matter_bin.tier * 75000 + mat_capacity += new_matter_bin.tier * (40 * SHEET_MATERIAL_AMOUNT) var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) materials.max_amount = mat_capacity @@ -463,17 +466,6 @@ if(loaded_magazine) . += "ammobench_loaded" -/obj/machinery/ammo_workbench/proc/AfterMaterialInsert(obj/item/item_inserted, id_inserted, amount_inserted) - if(istype(item_inserted, /obj/item/stack/ore/bluespace_crystal)) - use_power(SHEET_MATERIAL_AMOUNT / 10) - else if(item_inserted.has_material_type(/datum/material/glass)) - flick("autolathe_r", src)//plays glass insertion animation by default otherwise - else - flick("autolathe_o", src)//plays metal insertion animation - - use_power(min(1000, amount_inserted / 100)) - updateUsrDialog() - /obj/machinery/ammo_workbench/Destroy() QDEL_NULL(wires) if(timer_id) @@ -511,6 +503,23 @@ else return ..() +/obj/machinery/ammo_workbench/attack_hand_secondary(mob/user, list/modifiers) + . = ..() + + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return + + if(!can_interact(user) || !user.can_perform_action(src, ALLOW_SILICON_REACH | FORBID_TELEKINESIS_REACH)) + return + + ejectItem(user) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/machinery/ammo_workbench/attack_robot_secondary(mob/user, list/modifiers) + return attack_hand_secondary(user, modifiers) + +/obj/machinery/ammo_workbench/attack_ai_secondary(mob/user, list/modifiers) + return attack_hand_secondary(user, modifiers) /obj/machinery/ammo_workbench/proc/Insert_Item(obj/item/O, mob/living/user) if(user.combat_mode) diff --git a/modular_skyrat/modules/ashwalkers/code/effects/ash_rituals.dm b/modular_skyrat/modules/ashwalkers/code/effects/ash_rituals.dm index e7bc0bb2e15..b49156bd0a1 100644 --- a/modular_skyrat/modules/ashwalkers/code/effects/ash_rituals.dm +++ b/modular_skyrat/modules/ashwalkers/code/effects/ash_rituals.dm @@ -159,13 +159,13 @@ desc = "Summons a random, wild monster from another region in space." required_components = list( "north" = /obj/item/organ/internal/monster_core/regenerative_core, - "south" = /mob/living/simple_animal/hostile/asteroid/ice_whelp, + "south" = /mob/living/basic/mining/ice_whelp, "east" = /obj/item/stack/ore/bluespace_crystal, "west" = /obj/item/stack/ore/bluespace_crystal, ) consumed_components = list( /obj/item/organ/internal/monster_core/regenerative_core, - /mob/living/simple_animal/hostile/asteroid/ice_whelp, + /mob/living/basic/mining/ice_whelp, /obj/item/stack/ore/bluespace_crystal, ) @@ -175,7 +175,7 @@ /mob/living/basic/mining/goliath, /mob/living/simple_animal/hostile/asteroid/hivelord/legion, /mob/living/simple_animal/hostile/asteroid/brimdemon, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher, + /mob/living/basic/mining/watcher, /mob/living/basic/mining/lobstrosity/lava, ) new mob_type(success_rune.loc) @@ -199,7 +199,7 @@ . = ..() var/mob_type = pick( /mob/living/simple_animal/hostile/asteroid/ice_demon, - /mob/living/simple_animal/hostile/asteroid/ice_whelp, + /mob/living/basic/mining/ice_whelp, /mob/living/basic/mining/lobstrosity, /mob/living/simple_animal/hostile/asteroid/polarbear, /mob/living/simple_animal/hostile/asteroid/wolf, diff --git a/modular_skyrat/modules/assault_operatives/code/armaments/armament_medical.dm b/modular_skyrat/modules/assault_operatives/code/armaments/armament_medical.dm index 34b1e08bff1..76d40631a5f 100644 --- a/modular_skyrat/modules/assault_operatives/code/armaments/armament_medical.dm +++ b/modular_skyrat/modules/assault_operatives/code/armaments/armament_medical.dm @@ -45,7 +45,7 @@ cost = 3 /datum/armament_entry/assault_operatives/medical/injector/bag - item_type = /obj/item/storage/bag/medpens + item_type = /obj/item/storage/pouch/medpens cost = 5 /datum/armament_entry/assault_operatives/medical/injector/box diff --git a/modular_skyrat/modules/assault_operatives/code/armaments/armament_utility.dm b/modular_skyrat/modules/assault_operatives/code/armaments/armament_utility.dm index 89d6b3cf27f..7fe436452a2 100644 --- a/modular_skyrat/modules/assault_operatives/code/armaments/armament_utility.dm +++ b/modular_skyrat/modules/assault_operatives/code/armaments/armament_utility.dm @@ -27,7 +27,7 @@ cost = 3 /datum/armament_entry/assault_operatives/utility/pouch - item_type = /obj/item/storage/bag/ammo + item_type = /obj/item/storage/pouch/ammo cost = 1 /datum/armament_entry/assault_operatives/utility/noslip diff --git a/modular_skyrat/modules/assault_operatives/code/equipment_items/misc_items.dm b/modular_skyrat/modules/assault_operatives/code/equipment_items/misc_items.dm index ed274f535ed..f14d68fcebd 100644 --- a/modular_skyrat/modules/assault_operatives/code/equipment_items/misc_items.dm +++ b/modular_skyrat/modules/assault_operatives/code/equipment_items/misc_items.dm @@ -1,11 +1,11 @@ -/obj/item/storage/bag/medpens +/obj/item/storage/pouch/medpens name = "medpen pouch" desc = "A pouch containing several different types of lifesaving medipens." icon = 'modular_skyrat/modules/modular_items/icons/storage.dmi' icon_state = "medpen_pouch" slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_POCKETS -/obj/item/storage/bag/medpens/Initialize(mapload) +/obj/item/storage/pouch/medpens/Initialize(mapload) . = ..() atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL atom_storage.max_total_storage = 30 @@ -13,7 +13,7 @@ atom_storage.numerical_stacking = FALSE atom_storage.can_hold = typecacheof(list(/obj/item/reagent_containers/hypospray)) -/obj/item/storage/bag/medpens/PopulateContents() +/obj/item/storage/pouch/medpens/PopulateContents() new /obj/item/reagent_containers/hypospray/medipen/blood_loss(src) new /obj/item/reagent_containers/hypospray/medipen/oxandrolone(src) new /obj/item/reagent_containers/hypospray/medipen/salacid(src) diff --git a/modular_skyrat/modules/automapper/code/area_spawn_entries.dm b/modular_skyrat/modules/automapper/code/area_spawn_entries.dm index 9b4aa8c7c1f..03b5ceb6cf8 100644 --- a/modular_skyrat/modules/automapper/code/area_spawn_entries.dm +++ b/modular_skyrat/modules/automapper/code/area_spawn_entries.dm @@ -1,6 +1,6 @@ // Pets /datum/area_spawn/markus - target_areas = list(/area/station/cargo/sorting, /area/station/cargo/storage, /area/station/cargo/office, /area/station/command/heads_quarters/qm) + target_areas = list(/area/station/cargo/sorting, /area/station/cargo/storage, /area/station/cargo/office, /area/station/command/heads_quarters/qm) desired_atom = /mob/living/basic/pet/dog/markus /datum/area_spawn/bumbles diff --git a/modular_skyrat/modules/automapper/code/area_spawn_subsystem.dm b/modular_skyrat/modules/automapper/code/area_spawn_subsystem.dm index 4e0ba15a8b8..a166814e2a7 100644 --- a/modular_skyrat/modules/automapper/code/area_spawn_subsystem.dm +++ b/modular_skyrat/modules/automapper/code/area_spawn_subsystem.dm @@ -262,7 +262,7 @@ SUBSYSTEM_DEF(area_spawn) /// See code/__DEFINES/~skyrat_defines/automapper.dm var/mode = AREA_SPAWN_MODE_OPEN /// Map blacklist, this is used to determine what maps we should not spawn on. - var/list/blacklisted_stations = list("Void Raptor", "Runtime Station", "MultiZ Debug", "Lima Station") // BUBBER EDIT - Original: list("Void Raptor", "Runtime Station", "MultiZ Debug") + var/list/blacklisted_stations = list("Void Raptor", "Runtime Station", "MultiZ Debug", "Gateway Test", "Lima Station") // BUBBER EDIT - Original: list("Void Raptor", "Runtime Station", "MultiZ Debug", "Gateway Test") /// If failing to find a suitable area is OK, then this should be TRUE or CI will fail. /// Should probably be true if the target_areas are random, such as ruins. var/optional = FALSE @@ -288,7 +288,7 @@ SUBSYSTEM_DEF(area_spawn) if(!LAZYLEN(available_turfs)) if(!optional) log_mapping("[src.type] could not find any suitable turfs on map [SSmapping.config.map_name]!") - SSarea_spawn.failed_area_spawns += src + SSarea_spawn.failed_area_spawns += src.type return for(var/i in 1 to amount_to_spawn) @@ -319,7 +319,7 @@ SUBSYSTEM_DEF(area_spawn) /// The atom type that we want to spawn var/desired_atom /// Map blacklist, this is used to determine what maps we should not spawn on. - var/list/blacklisted_stations = list("Void Raptor", "Runtime Station", "MultiZ Debug", "Lima Station") // BUBBER EDIT - Original: list("Void Raptor", "Runtime Station", "MultiZ Debug") + var/list/blacklisted_stations = list("Void Raptor", "Runtime Station", "MultiZ Debug", "Gateway Test", "Lima Station") // BUBBER EDIT /** * Spawn the atoms. diff --git a/modular_skyrat/modules/awaymissions_skyrat/mothership_astrum/mob.dm b/modular_skyrat/modules/awaymissions_skyrat/mothership_astrum/mob.dm index 1a1b468e3f4..6efc58b3e75 100644 --- a/modular_skyrat/modules/awaymissions_skyrat/mothership_astrum/mob.dm +++ b/modular_skyrat/modules/awaymissions_skyrat/mothership_astrum/mob.dm @@ -85,7 +85,7 @@ /mob/living/basic/abductor/ranged/Initialize(mapload) . = ..() - AddElement(/datum/element/ranged_attacks, null, 'sound/weapons/laser.ogg', /obj/projectile/beam/laser) + AddComponent(/datum/component/ranged_attacks, projectile_sound = 'sound/weapons/laser.ogg', projectile_type = /obj/projectile/beam/laser) // Tankier variant diff --git a/modular_skyrat/modules/basic_mobs/code/bananaspider.dm b/modular_skyrat/modules/basic_mobs/code/bananaspider.dm index 05bd5295555..0900f7a1a74 100644 --- a/modular_skyrat/modules/basic_mobs/code/bananaspider.dm +++ b/modular_skyrat/modules/basic_mobs/code/bananaspider.dm @@ -49,7 +49,7 @@ . = ..() AddComponent(/datum/component/slippery, 20) -/mob/living/basic/giant_spider/badnana_spider +/mob/living/basic/spider/giant/badnana_spider name = "badnana spider" desc = "WHY WOULD GOD ALLOW THIS?!" icon = 'modular_skyrat/master_files/icons/mob/newmobs.dmi' diff --git a/modular_skyrat/modules/better_vox/code/vox_species.dm b/modular_skyrat/modules/better_vox/code/vox_species.dm index eb615743adb..8297588001c 100644 --- a/modular_skyrat/modules/better_vox/code/vox_species.dm +++ b/modular_skyrat/modules/better_vox/code/vox_species.dm @@ -21,7 +21,7 @@ default_mutant_bodyparts = list( "tail" = "Vox Primalis Tail", ) - payday_modifier = 0.75 + payday_modifier = 1.0 outfit_important_for_life = /datum/outfit/vox species_language_holder = /datum/language_holder/vox changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT diff --git a/modular_skyrat/modules/better_vox/icons/clothing/suit.dmi b/modular_skyrat/modules/better_vox/icons/clothing/suit.dmi index fb397dba36e..adfd1c200c5 100644 Binary files a/modular_skyrat/modules/better_vox/icons/clothing/suit.dmi and b/modular_skyrat/modules/better_vox/icons/clothing/suit.dmi differ diff --git a/modular_skyrat/modules/black_mesa/code/armaments/armament_medical.dm b/modular_skyrat/modules/black_mesa/code/armaments/armament_medical.dm index 08e11fd9572..7a20c0dc9b6 100644 --- a/modular_skyrat/modules/black_mesa/code/armaments/armament_medical.dm +++ b/modular_skyrat/modules/black_mesa/code/armaments/armament_medical.dm @@ -74,6 +74,6 @@ cost = 4 /datum/armament_entry/hecu/medical/injector/bag - item_type = /obj/item/storage/bag/medpens + item_type = /obj/item/storage/pouch/medpens max_purchase = 2 cost = 5 diff --git a/modular_skyrat/modules/black_mesa/code/armaments/armament_utility.dm b/modular_skyrat/modules/black_mesa/code/armaments/armament_utility.dm index 2b4d0a0151a..0a7a0910cf9 100644 --- a/modular_skyrat/modules/black_mesa/code/armaments/armament_utility.dm +++ b/modular_skyrat/modules/black_mesa/code/armaments/armament_utility.dm @@ -10,12 +10,12 @@ cost = 3 /datum/armament_entry/hecu/utility/pouch - item_type = /obj/item/storage/bag/ammo + item_type = /obj/item/storage/pouch/ammo max_purchase = 8 cost = 1 /datum/armament_entry/hecu/utility/pouch_knives - item_type = /obj/item/storage/bag/ammo/marksman + item_type = /obj/item/storage/pouch/ammo/marksman max_purchase = 4 cost = 3 diff --git a/modular_skyrat/modules/black_mesa/code/m16_variations.dm b/modular_skyrat/modules/black_mesa/code/m16_variations.dm index 7b548db9035..b8eaf9f38bb 100644 --- a/modular_skyrat/modules/black_mesa/code/m16_variations.dm +++ b/modular_skyrat/modules/black_mesa/code/m16_variations.dm @@ -33,31 +33,30 @@ desc = "A double-stack solid magazine that looks rather dated. Holds 20 rounds of .223 Stinger." icon = 'modular_skyrat/modules/gunsgalore/icons/guns/gunsgalore_items.dmi' icon_state = "m16" - ammo_type = /obj/item/ammo_casing/oldarms/a223 - caliber = CALIBER_223 + ammo_type = /obj/item/ammo_casing/oldarms/a223s + caliber = CALIBER_223S max_ammo = 20 multiple_sprites = AMMO_BOX_FULL_EMPTY -/obj/item/ammo_casing/oldarms/a223 +/obj/item/ammo_casing/oldarms/a223s name = ".223 Stinger bullet casing" - desc = "A cheaply made .233 Stinger bullet casing." - caliber = CALIBER_223 - projectile_type = /obj/projectile/bullet/oldarms/a223 + desc = "A cheaply made .223 Stinger bullet casing." + caliber = CALIBER_223S + projectile_type = /obj/projectile/bullet/oldarms/a223s -/obj/projectile/bullet/oldarms/a223 +/obj/projectile/bullet/oldarms/a223s name = ".223 bullet" damage = 26 armour_penetration = 5 wound_bonus = -20 -/obj/item/ammo_casing/oldarms/a223/rubber +/obj/item/ammo_casing/oldarms/a223s/rubber name = ".223 Stinger rubber bullet casing" desc = "A cheaply made .233 Stinger bullet casing, now in rubber." - caliber = CALIBER_223 - projectile_type = /obj/projectile/bullet/oldarms/a223/rubber + projectile_type = /obj/projectile/bullet/oldarms/a223s/rubber -/obj/projectile/bullet/oldarms/a223/rubber - name = ".223 Rubber" +/obj/projectile/bullet/oldarms/a223s/rubber + name = ".223 Rubber bullet" damage = 5 stamina = 25 ricochets_max = 3 diff --git a/modular_skyrat/modules/black_mesa/code/mobs/human_mobs.dm b/modular_skyrat/modules/black_mesa/code/mobs/human_mobs.dm index f597e8201c5..b83e961a701 100644 --- a/modular_skyrat/modules/black_mesa/code/mobs/human_mobs.dm +++ b/modular_skyrat/modules/black_mesa/code/mobs/human_mobs.dm @@ -219,7 +219,7 @@ minimum_distance = 5 icon_state = "blackops_ranged" icon_living = "blackops_ranged" - casingtype = /obj/item/ammo_casing/a277/weak + casingtype = /obj/item/ammo_casing/a223/weak projectilesound = 'modular_skyrat/modules/gunsgalore/sound/guns/fire/m16_fire.ogg' attack_sound = 'sound/weapons/punch1.ogg' loot = list(/obj/effect/gibspawner/human, /obj/item/ammo_box/magazine/m16) diff --git a/modular_skyrat/modules/black_mesa/code/projectiles.dm b/modular_skyrat/modules/black_mesa/code/projectiles.dm index 8457ceb205b..2a0c77fa02e 100644 --- a/modular_skyrat/modules/black_mesa/code/projectiles.dm +++ b/modular_skyrat/modules/black_mesa/code/projectiles.dm @@ -1,10 +1,10 @@ -/obj/projectile/bullet/a277/weak +/obj/projectile/bullet/a223/weak name = "surplus .277 bullet" damage = 25 armour_penetration = 10 wound_bonus = -40 -/obj/item/ammo_casing/a277/weak +/obj/item/ammo_casing/a223/weak name = ".277 surplus bullet casing" desc = "A .277 surplus bullet casing." - projectile_type = /obj/projectile/bullet/a277/weak + projectile_type = /obj/projectile/bullet/a223/weak diff --git a/modular_skyrat/modules/blueshield/code/blueshield.dm b/modular_skyrat/modules/blueshield/code/blueshield.dm index 0e837566829..a6fd912e2df 100644 --- a/modular_skyrat/modules/blueshield/code/blueshield.dm +++ b/modular_skyrat/modules/blueshield/code/blueshield.dm @@ -60,6 +60,7 @@ backpack = /obj/item/storage/backpack/blueshield satchel = /obj/item/storage/backpack/satchel/blueshield duffelbag = /obj/item/storage/backpack/duffelbag/blueshield + messenger = /obj/item/storage/backpack/messenger/blueshield head = /obj/item/clothing/head/beret/blueshield box = /obj/item/storage/box/survival/security belt = /obj/item/modular_computer/pda/security diff --git a/modular_skyrat/modules/blueshield/code/clothing.dm b/modular_skyrat/modules/blueshield/code/clothing.dm index a6781f2f020..d25af6a26dd 100644 --- a/modular_skyrat/modules/blueshield/code/clothing.dm +++ b/modular_skyrat/modules/blueshield/code/clothing.dm @@ -99,24 +99,30 @@ desc = "A robust backpack issued to Nanotrasen's finest." icon = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi' + lefthand_file = 'modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_lefthand.dmi' + righthand_file = 'modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_righthand.dmi' icon_state = "backpack_blueshield" - inhand_icon_state = "securitypack" + inhand_icon_state = "backpack_blueshield" /obj/item/storage/backpack/satchel/blueshield name = "blueshield satchel" desc = "A robust satchel issued to Nanotrasen's finest." icon = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi' + lefthand_file = 'modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_lefthand.dmi' + righthand_file = 'modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_righthand.dmi' icon_state = "satchel_blueshield" - inhand_icon_state = "satchel-sec" + inhand_icon_state = "satchel_blueshield" /obj/item/storage/backpack/duffelbag/blueshield name = "blueshield duffelbag" desc = "A robust duffelbag issued to Nanotrasen's finest." icon = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi' + lefthand_file = 'modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_lefthand.dmi' + righthand_file = 'modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_righthand.dmi' icon_state = "duffel_blueshield" - inhand_icon_state = "duffel-sec" + inhand_icon_state = "duffel_blueshield" //blueshield armor /obj/item/clothing/suit/armor/vest/blueshield diff --git a/modular_skyrat/modules/bulletrebalance/code/sniper.dm b/modular_skyrat/modules/bulletrebalance/code/sniper.dm index 0cc6ab7a244..632f80251fd 100644 --- a/modular_skyrat/modules/bulletrebalance/code/sniper.dm +++ b/modular_skyrat/modules/bulletrebalance/code/sniper.dm @@ -6,3 +6,17 @@ dismemberment = 30 armour_penetration = 61 //Bulletproof armor alone will not stop this wound_bonus = 90 //Theoretically guaranteed wound + +/obj/projectile/bullet/p50/soporific + name = ".416 Stabilis tranquilizer casing" + damage_type = STAMINA + dismemberment = 0 + catastropic_dismemberment = FALSE + object_damage = 0 + +/obj/projectile/bullet/p50/soporific/on_hit(atom/target, blocked = FALSE) + . = ..() + if((blocked != 100) && isliving(target)) + var/mob/living/living_guy = target + living_guy.Sleeping(40 SECONDS) //Yes, its really 40 seconds of sleep, I hope you had your morning coffee. + diff --git a/modular_skyrat/modules/cargo/code/goodies.dm b/modular_skyrat/modules/cargo/code/goodies.dm index 1969776e100..5bff4884d55 100644 --- a/modular_skyrat/modules/cargo/code/goodies.dm +++ b/modular_skyrat/modules/cargo/code/goodies.dm @@ -184,3 +184,20 @@ /obj/item/disk/nifsoft_uploader/summoner, ) +/datum/supply_pack/goody/firstaid_pouch + name = "Mini-Medkit First Aid Pouch" + desc = "Contains a single surplus first-aid pouch, complete with pocket clip. Repackaged with station-standard medical supplies, \ + but nothing's stopping you from repacking it yourself, though." + cost = PAYCHECK_CREW * 6 + contains = list( + /obj/item/storage/pouch/medical/firstaid/loaded, + ) + +/datum/supply_pack/goody/stabilizer_pouch + name = "Stabilizer First Aid Pouch" + desc = "Contains a single surplus first-aid pouch, complete with pocket clip. Repackaged with a wound stabilizing-focused loadout, \ + but nothing's stopping you from repacking it yourself, though." + cost = PAYCHECK_CREW * 6 + contains = list( + /obj/item/storage/pouch/medical/firstaid/stabilizer, + ) diff --git a/modular_skyrat/modules/cargo/code/packs.dm b/modular_skyrat/modules/cargo/code/packs.dm index 2d2e073996d..f292e5ce2c4 100644 --- a/modular_skyrat/modules/cargo/code/packs.dm +++ b/modular_skyrat/modules/cargo/code/packs.dm @@ -189,9 +189,9 @@ desc = "Contains three material pouches." access_view = ACCESS_ENGINE_EQUIP contains = list( - /obj/item/storage/bag/material, - /obj/item/storage/bag/material, - /obj/item/storage/bag/material, + /obj/item/storage/pouch/material, + /obj/item/storage/pouch/material, + /obj/item/storage/pouch/material, ) cost = CARGO_CRATE_VALUE * 15 crate_name = "material pouches crate" @@ -712,27 +712,23 @@ name = "CIN Military Surplus Crate" desc = "A collection of surplus equipment sourced from the Coalition of Independent Nations' military stockpiles. Likely to contain old and outdated equipment, as is the nature of surplus." contraband = TRUE - cost = CARGO_CRATE_VALUE * 15 + cost = CARGO_CRATE_VALUE * 9 contains = list( - /obj/item/crucifix = 3, - /obj/item/storage/box/nri_rations = 3, - /obj/item/storage/toolbox/ammobox/a762 = 1, + /obj/item/storage/box/colonial_rations = 1, + /obj/item/storage/toolbox/ammobox/strilka310 = 1, + /obj/item/storage/toolbox/ammobox/strilka310/surplus = 1, /obj/item/storage/toolbox/maint_kit = 1, - /obj/item/gun/ballistic/rifle/boltaction = 1, - /obj/item/ammo_box/a762 = 3, - /obj/item/gun/ballistic/automatic/plastikov = 1, - /obj/item/ammo_box/magazine/plastikov9mm = 3, - /obj/item/gun/ballistic/automatic/pistol/makarov = 1, - /obj/item/ammo_box/magazine/multi_sprite/makarov = 3, - /obj/item/clothing/suit/armor/vest/cin_surplus_vest = 3, - /obj/item/clothing/head/helmet/cin_surplus_helmet/random_color = 3, - /obj/item/storage/backpack/industrial/cin_surplus/random_color = 3, - /obj/item/storage/belt/military/cin_surplus/random_color = 3, - /obj/item/clothing/gloves/tackler/combat = 3, - /obj/item/clothing/under/syndicate/rus_army/cin_surplus/random_color = 3, - /obj/item/clothing/shoes/jackboots = 3, - /obj/item/clothing/mask/gas/hecu2 = 3, - /obj/item/clothing/mask/balaclavaadjust = 3, + /obj/item/storage/toolbox/guncase/soviet/sakhno = 2, + /obj/item/ammo_box/strilka310 = 1, + /obj/item/clothing/suit/armor/vest/cin_surplus_vest = 1, + /obj/item/clothing/head/helmet/cin_surplus_helmet/random_color = 1, + /obj/item/storage/backpack/industrial/cin_surplus/random_color = 1, + /obj/item/storage/belt/military/cin_surplus/random_color = 1, + /obj/item/clothing/gloves/tackler/combat = 1, + /obj/item/clothing/under/syndicate/rus_army/cin_surplus/random_color = 1, + /obj/item/clothing/shoes/jackboots = 1, + /obj/item/clothing/mask/gas/hecu2 = 1, + /obj/item/clothing/mask/balaclavaadjust = 1, ) /datum/supply_pack/imports/cin_surplus/fill(obj/structure/closet/crate/we_are_filling_this_crate) diff --git a/modular_skyrat/modules/cell_component/code/cell_component.dm b/modular_skyrat/modules/cell_component/code/cell_component.dm index 830f7dc6143..52357cd1ba8 100644 --- a/modular_skyrat/modules/cell_component/code/cell_component.dm +++ b/modular_skyrat/modules/cell_component/code/cell_component.dm @@ -88,7 +88,7 @@ component_cell_out_of_charge/component_cell_removed proc using loc where necessa /datum/component/cell/Destroy(force, silent) if(on_cell_removed) - QDEL_NULL(on_cell_removed) + on_cell_removed = null if(inserted_cell) if(!inside_robot) //We really don't want to be deleting the robot's cell. QDEL_NULL(inserted_cell) diff --git a/modular_skyrat/modules/clock_cult/code/components/structure_info_element.dm b/modular_skyrat/modules/clock_cult/code/components/structure_info_element.dm index 6e50c89d422..fa37830184f 100644 --- a/modular_skyrat/modules/clock_cult/code/components/structure_info_element.dm +++ b/modular_skyrat/modules/clock_cult/code/components/structure_info_element.dm @@ -15,6 +15,7 @@ /datum/element/clockwork_structure_info/Detach(datum/target) . = ..() UnregisterSignal(target, COMSIG_ATOM_AFTER_ATTACKEDBY) + UnregisterSignal(target, COMSIG_ATOM_EXAMINE) /** * diff --git a/modular_skyrat/modules/clock_cult/code/items/clothing.dm b/modular_skyrat/modules/clock_cult/code/items/clothing.dm index 470e42db7fe..c2e9fca5478 100644 --- a/modular_skyrat/modules/clock_cult/code/items/clothing.dm +++ b/modular_skyrat/modules/clock_cult/code/items/clothing.dm @@ -329,7 +329,7 @@ ADD_TRAIT(wearer, TRAIT_MADNESS_IMMUNE, CLOTHING_TRAIT) ADD_TRAIT(wearer, TRAIT_KNOW_ENGI_WIRES, CLOTHING_TRAIT) - ADD_TRAIT(wearer, TRAIT_KNOW_CYBORG_WIRES, CLOTHING_TRAIT) + ADD_TRAIT(wearer, TRAIT_KNOW_ROBO_WIRES, CLOTHING_TRAIT) color_cutoffs = list(50, 10, 30) wearer.update_sight() @@ -347,7 +347,7 @@ REMOVE_TRAIT(wearer, TRAIT_MADNESS_IMMUNE, CLOTHING_TRAIT) REMOVE_TRAIT(wearer, TRAIT_KNOW_ENGI_WIRES, CLOTHING_TRAIT) - REMOVE_TRAIT(wearer, TRAIT_KNOW_CYBORG_WIRES, CLOTHING_TRAIT) + REMOVE_TRAIT(wearer, TRAIT_KNOW_ROBO_WIRES, CLOTHING_TRAIT) color_cutoffs = null wearer.update_sight() diff --git a/modular_skyrat/modules/clock_cult/code/items/weaponry.dm b/modular_skyrat/modules/clock_cult/code/items/weaponry.dm index 18a66e6f4be..9704cd0d4ef 100644 --- a/modular_skyrat/modules/clock_cult/code/items/weaponry.dm +++ b/modular_skyrat/modules/clock_cult/code/items/weaponry.dm @@ -259,16 +259,16 @@ /obj/item/ammo_box/magazine/internal/boltaction/lionhunter/clockwork name = "brass rifle internal magazine" - ammo_type = /obj/item/ammo_casing/a762/lionhunter/clock + ammo_type = /obj/item/ammo_casing/strilka310/lionhunter/clock -/obj/item/ammo_casing/a762/lionhunter/clock +/obj/item/ammo_casing/strilka310/lionhunter/clock name = "brass rifle round" - projectile_type = /obj/projectile/bullet/a762/lionhunter/clock + projectile_type = /obj/projectile/bullet/strilka310/lionhunter/clock min_distance = 3 -/obj/item/ammo_casing/a762/lionhunter/clock/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, atom/fired_from) +/obj/item/ammo_casing/strilka310/lionhunter/clock/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, atom/fired_from) var/obj/item/gun/ballistic/fired_gun = fired_from if(istype(get_turf(user), /turf/open/floor/bronze) && istype(fired_gun, /obj/item/gun/ballistic/rifle/lionhunter/clockwork)) @@ -277,29 +277,29 @@ return ..() -/obj/projectile/bullet/a762/lionhunter/clock - name = "brass 7.62 bullet" +/obj/projectile/bullet/strilka310/lionhunter/clock + name = "brass .310 bullet" // These stats are only applied if the weapon is fired fully aimed // If fired without aiming or at someone too close, it will do much less damage = 45 stamina = 45 -/obj/item/ammo_box/a762/lionhunter/clock - name = "stripper clip (7.62mm brass)" +/obj/item/ammo_box/strilka310/lionhunter/clock + name = "stripper clip (.310 brass)" desc = "A stripper clip that's just as brass as the rounds it holds." icon = 'modular_skyrat/modules/clock_cult/icons/weapons/ammo.dmi' icon_state = "762_brass" - ammo_type = /obj/item/ammo_casing/a762/lionhunter/clock + ammo_type = /obj/item/ammo_casing/strilka310/lionhunter/clock max_ammo = 3 multiple_sprites = AMMO_BOX_PER_BULLET -/obj/item/storage/bag/ammo/clock +/obj/item/storage/pouch/ammo/clock -/obj/item/storage/bag/ammo/clock/PopulateContents() +/obj/item/storage/pouch/ammo/clock/PopulateContents() var/static/items_inside = list( - /obj/item/ammo_box/a762/lionhunter/clock = 3 + /obj/item/ammo_box/strilka310/lionhunter/clock = 3 ) generate_items_inside(items_inside, src) diff --git a/modular_skyrat/modules/clock_cult/code/outfit.dm b/modular_skyrat/modules/clock_cult/code/outfit.dm index 0f2fb1af9f6..4b922c6ad41 100644 --- a/modular_skyrat/modules/clock_cult/code/outfit.dm +++ b/modular_skyrat/modules/clock_cult/code/outfit.dm @@ -38,8 +38,8 @@ glasses = /obj/item/clothing/glasses/clockwork/wraith_spectacles suit = /obj/item/clothing/suit/clockwork - l_pocket = /obj/item/storage/bag/ammo/clock - r_pocket = /obj/item/storage/bag/ammo/clock + l_pocket = /obj/item/storage/pouch/ammo/clock + r_pocket = /obj/item/storage/pouch/ammo/clock l_hand = /obj/item/gun/ballistic/rifle/lionhunter/clockwork /datum/outfit/clock/support diff --git a/modular_skyrat/modules/clock_cult/code/research/clockwork_research.dm b/modular_skyrat/modules/clock_cult/code/research/clockwork_research.dm index 9a62576f654..c3297c7c167 100644 --- a/modular_skyrat/modules/clock_cult/code/research/clockwork_research.dm +++ b/modular_skyrat/modules/clock_cult/code/research/clockwork_research.dm @@ -53,20 +53,26 @@ /// Pick an an area for this research to take place in -/datum/clockwork_research/proc/set_new_area() +/datum/clockwork_research/proc/set_new_area(failed_validation = FALSE) var/list/possible_areas = GLOB.the_station_areas.Copy() for(var/area/possible_area as anything in possible_areas) if(initial(possible_area.outdoors) || !is_type_in_typecache(possible_area, area_whitelist) || is_type_in_typecache(possible_area, area_blacklist)) possible_areas -= possible_area - selected_area = pick(possible_areas) - validate_area() + if(length(possible_areas)) + selected_area = pick(possible_areas) + + validate_area(failed_validation) -/// Makes sure the selected area is correct, and regenerates it if not. Potentially dangerous if there are no station areas, somehow. -/datum/clockwork_research/proc/validate_area() +/// Makes sure the selected area is correct, and regenerates it if not. Only gets one reattempt before defaulting to the base station area (allowing it to happen anywhere). +/datum/clockwork_research/proc/validate_area(failed_validation) if(!selected_area || !length(get_area_turfs(selected_area))) - set_new_area() + if(failed_validation) + log_mapping("Clockwork research node [src] was unable to find a ritual area! Defaulting to base /area/station type.") + selected_area = /area/station + return TRUE + set_new_area(failed_validation = TRUE) // we will retry this once and only once return FALSE return TRUE diff --git a/modular_skyrat/modules/clock_cult/code/status_effects.dm b/modular_skyrat/modules/clock_cult/code/status_effects.dm index 2c34baa9540..e9798e26ddd 100644 --- a/modular_skyrat/modules/clock_cult/code/status_effects.dm +++ b/modular_skyrat/modules/clock_cult/code/status_effects.dm @@ -8,7 +8,7 @@ var/running_toggled = FALSE /datum/status_effect/interdiction/tick(seconds_between_ticks) - if(owner.m_intent == MOVE_INTENT_RUN) + if(owner.move_intent == MOVE_INTENT_RUN) owner.toggle_move_intent(owner) owner.adjust_confusion_up_to(1 SECONDS, 1 SECONDS) running_toggled = TRUE @@ -19,7 +19,7 @@ /datum/status_effect/interdiction/on_remove() owner.remove_movespeed_modifier(/datum/movespeed_modifier/clock_interdiction) - if(running_toggled && owner.m_intent == MOVE_INTENT_WALK) + if(running_toggled && owner.move_intent == MOVE_INTENT_WALK) owner.toggle_move_intent(owner) /atom/movable/screen/alert/status_effect/interdiction diff --git a/modular_skyrat/modules/clock_cult/code/structures/tinkerers_cache.dm b/modular_skyrat/modules/clock_cult/code/structures/tinkerers_cache.dm index ca429410191..898965615d9 100644 --- a/modular_skyrat/modules/clock_cult/code/structures/tinkerers_cache.dm +++ b/modular_skyrat/modules/clock_cult/code/structures/tinkerers_cache.dm @@ -135,7 +135,7 @@ /datum/tinker_cache_item/clockwork_rifle_ammo name = "Clockwork Rifle Ammunition" - item_path = /obj/item/ammo_box/a762/lionhunter/clock + item_path = /obj/item/ammo_box/strilka310/lionhunter/clock power_use = 200 time_delay_mult = 0.5 research_locked = TRUE diff --git a/modular_skyrat/modules/command_vendor/code/vending.dm b/modular_skyrat/modules/command_vendor/code/vending.dm index 4361d9bad1e..432956fc3df 100644 --- a/modular_skyrat/modules/command_vendor/code/vending.dm +++ b/modular_skyrat/modules/command_vendor/code/vending.dm @@ -38,6 +38,7 @@ /obj/item/storage/backpack/captain = 1, /obj/item/storage/backpack/satchel/cap = 1, /obj/item/storage/backpack/duffelbag/captain = 1, + /obj/item/storage/backpack/messenger/cap = 1, /obj/item/clothing/shoes/sneakers/brown = 1, // BLUESHIELD @@ -53,6 +54,7 @@ /obj/item/storage/backpack/blueshield = 1, /obj/item/storage/backpack/satchel/blueshield = 1, /obj/item/storage/backpack/duffelbag/blueshield = 1, + /obj/item/storage/backpack/messenger/blueshield = 1, /obj/item/clothing/shoes/laceup = 1, ) access_lists["[ACCESS_HOP]"] = list( // Best head btw @@ -73,6 +75,7 @@ /obj/item/storage/backpack/head_of_personnel = 1, /obj/item/storage/backpack/satchel/head_of_personnel = 1, /obj/item/storage/backpack/duffelbag/head_of_personnel = 1, + /obj/item/storage/backpack/messenger/head_of_personnel = 1, /obj/item/clothing/shoes/sneakers/brown = 1, ) access_lists["[ACCESS_CMO]"] = list( 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 d4b7cef20dd..00f7869c3d3 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 @@ -35,13 +35,6 @@ stock_mult = 3 interest_addition = COMPANY_INTEREST_GAIN_PITIFUL -/datum/armament_entry/company_import/deforest/first_aid/splint - item_type = /obj/item/stack/medical/splint/twelve - lower_cost = CARGO_CRATE_VALUE * PRICE_FIRST_AID_BASIC_LOWER - upper_cost = CARGO_CRATE_VALUE * PRICE_FIRST_AID_BASIC_HIGHER - stock_mult = 3 - interest_addition = COMPANY_INTEREST_GAIN_PITIFUL - /datum/armament_entry/company_import/deforest/first_aid/bruise_pack item_type = /obj/item/stack/medical/bruise_pack lower_cost = CARGO_CRATE_VALUE * PRICE_FIRST_AID_MEDIUM_LOWER diff --git a/modular_skyrat/modules/company_imports/code/armament_datums/nri_military_surplus.dm b/modular_skyrat/modules/company_imports/code/armament_datums/nri_military_surplus.dm index 2037ba7efec..9af064d68cc 100644 --- a/modular_skyrat/modules/company_imports/code/armament_datums/nri_military_surplus.dm +++ b/modular_skyrat/modules/company_imports/code/armament_datums/nri_military_surplus.dm @@ -82,11 +82,15 @@ lower_cost = CARGO_CRATE_VALUE * 0.5 upper_cost = CARGO_CRATE_VALUE -/datum/armament_entry/company_import/nri_surplus/misc/rations - item_type = /obj/item/storage/box/nri_rations - lower_cost = CARGO_CRATE_VALUE * 0.75 - upper_cost = CARGO_CRATE_VALUE * 1.5 +/datum/armament_entry/company_import/nri_surplus/misc/food_replicator + description = "Once widespread technology used by numerous fringe colonies of NRI origin and even in some SolFed territories, that ultimately went out of fashion due to \ + SolFed propaganda deeming it unprofitable and imposing severe trading fees on anyone trying to sell them. A small portion of government-backed manufacturers still produce \ + 'food replicators' for private and government use; a few of them is selling this via us." + item_type = /obj/item/circuitboard/machine/biogenerator/food_replicator + lower_cost = CARGO_CRATE_VALUE * 7.5 + upper_cost = CARGO_CRATE_VALUE * 11 interest_required = COMPANY_SOME_INTEREST + interest_addition = COMPANY_INTEREST_GAIN_BIG /datum/armament_entry/company_import/nri_surplus/misc/nri_flag item_type = /obj/item/sign/flag/nri diff --git a/modular_skyrat/modules/company_imports/code/objects/microstar/mcr_attachment_kits.dm b/modular_skyrat/modules/company_imports/code/objects/microstar/mcr_attachment_kits.dm index 66db6ce8eb6..b0ed7452055 100644 --- a/modular_skyrat/modules/company_imports/code/objects/microstar/mcr_attachment_kits.dm +++ b/modular_skyrat/modules/company_imports/code/objects/microstar/mcr_attachment_kits.dm @@ -45,7 +45,7 @@ /obj/item/storage/secure/briefcase/white/mcr_loadout/tacticool/PopulateContents() var/static/items_inside = list( - /obj/item/microfusion_gun_attachment/suppressor = 1, + /obj/item/microfusion_gun_attachment/barrel/suppressor = 1, /obj/item/microfusion_gun_attachment/rail = 1, /obj/item/microfusion_gun_attachment/grip = 1, /obj/item/microfusion_gun_attachment/camo = 1, diff --git a/modular_skyrat/modules/company_imports/code/objects/vitezstvi/ammo_boxes.dm b/modular_skyrat/modules/company_imports/code/objects/vitezstvi/ammo_boxes.dm index 4ae6836e53a..20ebab5002f 100644 --- a/modular_skyrat/modules/company_imports/code/objects/vitezstvi/ammo_boxes.dm +++ b/modular_skyrat/modules/company_imports/code/objects/vitezstvi/ammo_boxes.dm @@ -4,7 +4,7 @@ /obj/item/ammo_box/magazine w_class = WEIGHT_CLASS_SMALL -/obj/item/ammo_box/a762 +/obj/item/ammo_box/strilka310 w_class = WEIGHT_CLASS_SMALL /obj/item/ammo_box/a357 diff --git a/modular_skyrat/modules/contractor/code/items/modsuit/modsuit.dm b/modular_skyrat/modules/contractor/code/items/modsuit/modsuit.dm index 4344cad62aa..e1dd641ea3b 100644 --- a/modular_skyrat/modules/contractor/code/items/modsuit/modsuit.dm +++ b/modular_skyrat/modules/contractor/code/items/modsuit/modsuit.dm @@ -4,6 +4,7 @@ icon = 'modular_skyrat/modules/contractor/icons/modsuit.dmi' icon_state = "contractor-control" theme = /datum/mod_theme/contractor + starting_frequency = MODLINK_FREQ_SYNDICATE applied_cell = /obj/item/stock_parts/cell/hyper applied_modules = list( /obj/item/mod/module/dna_lock, diff --git a/modular_skyrat/modules/contractor/code/items/modsuit/theme.dm b/modular_skyrat/modules/contractor/code/items/modsuit/theme.dm index c585b426e2a..83781f7246f 100644 --- a/modular_skyrat/modules/contractor/code/items/modsuit/theme.dm +++ b/modular_skyrat/modules/contractor/code/items/modsuit/theme.dm @@ -11,6 +11,7 @@ All rights reserved, tampering with suit will void warranty." default_skin = "contractor" armor_type = /datum/armor/mod_theme_contractor + resistance_flags = FIRE_PROOF atom_flags = PREVENT_CONTENTS_EXPLOSION_1 max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -36,7 +37,7 @@ HELMET_LAYER = NECK_LAYER, HELMET_FLAGS = list( UNSEALED_CLOTHING = SNUG_FIT, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|HEADINTERNALS, UNSEALED_INVISIBILITY = HIDEFACIALHAIR, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, @@ -44,14 +45,17 @@ CHESTPLATE_FLAGS = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, ), GAUNTLETS_FLAGS = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + CAN_OVERSLOT = TRUE, ), BOOTS_FLAGS = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + CAN_OVERSLOT = TRUE, ), ), ) diff --git a/modular_skyrat/modules/cryosleep/code/cryopod.dm b/modular_skyrat/modules/cryosleep/code/cryopod.dm index e704a63a710..aaa77103fe7 100644 --- a/modular_skyrat/modules/cryosleep/code/cryopod.dm +++ b/modular_skyrat/modules/cryosleep/code/cryopod.dm @@ -393,81 +393,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/cryopod, 32) open_machine() name = initial(name) -/// It's time to kill GLOB -/** - * Reset religion to its default state so the new chaplain becomes high priest and can change the sect, armor, weapon type, etc - * Also handles the selection of a holy successor from existing crew if multiple chaplains are on station. - */ -/obj/machinery/cryopod/proc/reset_religion() - - // remember what the previous sect and favor values were so they can be restored if the same one gets chosen - GLOB.prev_favor = GLOB.religious_sect.favor - GLOB.prev_sect_type = GLOB.religious_sect.type - - // set the altar references to the old religious_sect to null - for(var/obj/structure/altar_of_gods/altar in GLOB.chaplain_altars) - altar.GetComponent(/datum/component/religious_tool).easy_access_sect = null - altar.sect_to_altar = null - - QDEL_NULL(GLOB.religious_sect) // queue for removal but also set it to null, in case a new chaplain joins before it can be deleted - - // set the rest of the global vars to null for the new chaplain - GLOB.religion = null - GLOB.deity = null - GLOB.bible_name = null - GLOB.bible_icon_state = null - GLOB.bible_inhand_icon_state = null - GLOB.holy_armor_type = null - GLOB.holy_weapon_type = null - - // now try to pick the successor from existing crew, or leave it empty if no valid candidates found - var/mob/living/carbon/human/chosen_successor = pick_holy_successor() - GLOB.current_highpriest = chosen_successor ? WEAKREF(chosen_successor) : null // if a successor is already on the station then pick the first in line - -/** - * Chooses a valid holy successor from GLOB.holy_successor weakref list and sets things up for them to be the new high priest - * - * Returns the chosen holy successor, or null if no valid successor - */ -/obj/machinery/cryopod/proc/pick_holy_successor() - for(var/datum/weakref/successor as anything in GLOB.holy_successors) - var/mob/living/carbon/human/actual_successor = successor.resolve() - if(!actual_successor) - GLOB.holy_successors -= successor - continue - if(!actual_successor.key || !actual_successor.mind) - continue - - // we have a match! set the religious globals up properly and make the candidate high priest - GLOB.holy_successors -= successor - GLOB.religion = actual_successor.client?.prefs?.read_preference(/datum/preference/name/religion) || DEFAULT_RELIGION - GLOB.bible_name = actual_successor.client?.prefs?.read_preference(/datum/preference/name/deity) || DEFAULT_DEITY - GLOB.deity = actual_successor.client?.prefs?.read_preference(/datum/preference/name/bible) || DEFAULT_BIBLE - - actual_successor.mind.holy_role = HOLY_ROLE_HIGHPRIEST - - to_chat(actual_successor, span_warning("You have been chosen as the successor to the previous high priest. Visit a holy altar to declare the station's religion!")) - - return actual_successor - - return null - -/** - * Create a list of the holy successors mobs from GLOB.holy_successors weakref list - * - * Returns the list of valid holy successors - */ -/obj/machinery/cryopod/proc/list_holy_successors() - var/list/holy_successors = list() - for(var/datum/weakref/successor as anything in GLOB.holy_successors) - var/mob/living/carbon/human/actual_successor = successor.resolve() - if(!actual_successor) - GLOB.holy_successors -= successor - continue - holy_successors += actual_successor - - return holy_successors - /obj/machinery/cryopod/MouseDrop_T(mob/living/target, mob/user) if(!istype(target) || !can_interact(user) || !target.Adjacent(user) || !ismob(target) || isanimal(target) || !istype(user.loc, /turf) || target.buckled) return diff --git a/modular_skyrat/modules/customization/__HELPERS/global_lists.dm b/modular_skyrat/modules/customization/__HELPERS/global_lists.dm index f7c6b4e8630..825737a6cf8 100644 --- a/modular_skyrat/modules/customization/__HELPERS/global_lists.dm +++ b/modular_skyrat/modules/customization/__HELPERS/global_lists.dm @@ -6,9 +6,6 @@ populate_total_ui_len_by_block() populate_total_uf_len_by_block() make_augment_references() - //We're loading donators here because it's the least intrusive way modularly - load_donators() - load_veteran_players() /proc/make_sprite_accessory_references() // Here we build the global list for all accessories diff --git a/modular_skyrat/modules/customization/datums/components/crafting/teshari_recipes.dm b/modular_skyrat/modules/customization/datums/components/crafting/teshari_recipes.dm index 8a0e07990de..76e9729c583 100644 --- a/modular_skyrat/modules/customization/datums/components/crafting/teshari_recipes.dm +++ b/modular_skyrat/modules/customization/datums/components/crafting/teshari_recipes.dm @@ -1,11 +1,16 @@ -/datum/crafting_recipe/food/piru_dough - name = "Piru dough" - reqs = list( +/datum/crafting_recipe/food/reaction/piru_dough + reaction = /datum/chemical_reaction/food/piru_dough + result = /obj/item/food/piru_dough + category = CAT_TESHARI + +/datum/chemical_reaction/food/piru_dough + required_reagents = list( /datum/reagent/consumable/piru_flour = 15, /datum/reagent/consumable/muli_juice = 10, ) - result = /obj/item/food/piru_dough - category = CAT_TESHARI + mix_message = "The ingredients form a dough." + reaction_flags = REACTION_INSTANT + resulting_food_path = /obj/item/food/piru_dough /datum/crafting_recipe/food/spiced_jerky name = "Spiced Jerky" diff --git a/modular_skyrat/modules/customization/game/objects/items/plushes.dm b/modular_skyrat/modules/customization/game/objects/items/plushes.dm index f0889aa1514..2271a54273d 100644 --- a/modular_skyrat/modules/customization/game/objects/items/plushes.dm +++ b/modular_skyrat/modules/customization/game/objects/items/plushes.dm @@ -617,16 +617,6 @@ squeak_override = list('modular_skyrat/modules/customization/game/objects/items/sound/tracymrowr.ogg' = 1) gender = FEMALE -// Donation reward for isthatdan -/obj/item/toy/plush/skyrat/dog - name = "bad dog plushie" - desc = "A collared, black dog plushie." - icon_state = "plush_dan" - attack_verb_continuous = list("barks at", "borks at", "woofs at") - attack_verb_simple = list("bark at", "bork at", "woof at") - squeak_override = list('modular_skyrat/modules/emotes/sound/voice/bark1.ogg' = 1, 'modular_skyrat/modules/emotes/sound/voice/bark2.ogg' = 1) - gender = MALE - //Donation reward for Frixit /obj/item/toy/plush/skyrat/plushie_synthia name = "adventurous synth plushie" diff --git a/modular_skyrat/modules/customization/modules/admin/donator_list.dm b/modular_skyrat/modules/customization/modules/admin/donator_list.dm deleted file mode 100644 index 426b702c2e0..00000000000 --- a/modular_skyrat/modules/customization/modules/admin/donator_list.dm +++ /dev/null @@ -1,21 +0,0 @@ -#define DONATORLISTFILE "[global.config.directory]/skyrat/donators.txt" - -GLOBAL_LIST(donator_list) - -/proc/load_donators() - GLOB.donator_list = list() - for(var/line in world.file2list(DONATORLISTFILE)) - if(!line) - continue - if(findtextEx(line,"#",1,2)) - continue - GLOB.donator_list[ckey(line)] = TRUE //Associative so we can check it much faster - -/proc/save_donators() - /// Yes, this is incredibly long, deal with it. It's to keep that cute little comment at the top. - var/donators = "###############################################################################################\n# List for people who support us! They get cool loadout items #\n# Case is not important for ckey. #\n###############################################################################################\n" - for(var/donator in GLOB.donator_list) - donators += donator + "\n" - rustg_file_write(donators, DONATORLISTFILE) - -#undef DONATORLISTFILE diff --git a/modular_skyrat/modules/customization/modules/client/augment/organs.dm b/modular_skyrat/modules/customization/modules/client/augment/organs.dm index 3c1e422c02b..83c1c337221 100644 --- a/modular_skyrat/modules/customization/modules/client/augment/organs.dm +++ b/modular_skyrat/modules/customization/modules/client/augment/organs.dm @@ -69,12 +69,22 @@ name = "Cybernetic eyes" path = /obj/item/organ/internal/eyes/robotic +/datum/augment_item/organ/eyes/cybernetic/moth + name = "Cybernetic moth eyes" + path = /obj/item/organ/internal/eyes/robotic/moth + /datum/augment_item/organ/eyes/highlumi name = "High-luminosity eyes" path = /obj/item/organ/internal/eyes/robotic/glow allowed_biotypes = MOB_ORGANIC|MOB_ROBOTIC cost = 1 +/datum/augment_item/organ/eyes/highlumi/moth + name = "High Luminosity Moth Eyes" + path = /obj/item/organ/internal/eyes/robotic/glow/moth + allowed_biotypes = MOB_ORGANIC|MOB_ROBOTIC + cost = 1 + //TONGUES /datum/augment_item/organ/tongue slot = AUGMENT_SLOT_TONGUE diff --git a/modular_skyrat/modules/customization/modules/clothing/storage/backpacks.dm b/modular_skyrat/modules/customization/modules/clothing/storage/backpacks.dm index b698f99f553..c94701b2254 100644 --- a/modular_skyrat/modules/customization/modules/clothing/storage/backpacks.dm +++ b/modular_skyrat/modules/customization/modules/clothing/storage/backpacks.dm @@ -12,18 +12,27 @@ desc = "A sleek, industrial-strength backpack issued to robotics personnel. Smells faintly of oil." icon = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi' + lefthand_file = 'modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_lefthand.dmi' + righthand_file = 'modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_righthand.dmi' icon_state = "backpack_robo" + inhand_icon_state = "backpack_robo" /obj/item/storage/backpack/satchel/science/robo name = "robotics satchel" desc = "A sleek, industrial-strength satchel issued to robotics personnel. Smells faintly of oil." icon = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi' + lefthand_file = 'modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_lefthand.dmi' + righthand_file = 'modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_righthand.dmi' icon_state = "satchel_robo" + inhand_icon_state = "satchel_robo" /obj/item/storage/backpack/duffelbag/science/robo name = "robotics duffelbag" desc = "A sleek, industrial-strength duffelbag issued to robotics personnel. Smells faintly of oil." icon = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi' + lefthand_file = 'modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_lefthand.dmi' + righthand_file = 'modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_righthand.dmi' icon_state = "duffel_robo" + inhand_icon_state = "duffel_robo" diff --git a/modular_skyrat/modules/customization/modules/clothing/suits/misc.dm b/modular_skyrat/modules/customization/modules/clothing/suits/misc.dm index a22533e2f2b..19a3bf83462 100644 --- a/modular_skyrat/modules/customization/modules/clothing/suits/misc.dm +++ b/modular_skyrat/modules/customization/modules/clothing/suits/misc.dm @@ -303,16 +303,12 @@ greyscale_config_worn_vox = /datum/greyscale_config/apron/worn/oldvox flags_1 = IS_PLAYER_COLORABLE_1 -/obj/item/clothing/suit/apron/overalls/greyscale - desc = "A set of overalls." - icon_state = "overalls" - greyscale_config = /datum/greyscale_config/overalls - greyscale_config_worn = /datum/greyscale_config/overalls/worn +/obj/item/clothing/suit/apron/overalls greyscale_config_worn_digi = /datum/greyscale_config/overalls/worn/digi - greyscale_colors = "#594032" - flags_1 = IS_PLAYER_COLORABLE_1 + greyscale_config_worn_better_vox = /datum/greyscale_config/overalls/worn/better_vox + greyscale_config_worn_vox = /datum/greyscale_config/overalls/worn/vox -/obj/item/clothing/suit/apron/overalls/greyscale/Initialize(mapload) +/obj/item/clothing/suit/apron/overalls/Initialize(mapload) . = ..() allowed += list( /obj/item/flashlight, @@ -331,31 +327,3 @@ /obj/item/storage/bag/construction, /obj/item/t_scanner, ) - -/obj/item/clothing/suit/apron/overalls/greyscale/examine(mob/user) - . = ..() - - . += span_notice("With Alt + Click you can switch this between making it overclothes or jumpsuit slot wearable.") - - return . - -/obj/item/clothing/suit/apron/overalls/greyscale/AltClick(mob/user) - . = ..() - if(!iscarbon(user)) - return - var/mob/living/carbon/carbon_user = user - if(carbon_user.get_item_by_slot(slot_flags) == src) - to_chat(user, span_warning("You must take [src] off before adjusting it!")) - return - if(!user.is_holding(src)) - to_chat(user, span_warning("You must be holding [src] in order to adjust it!")) - return - switch(slot_flags) - if(ITEM_SLOT_ICLOTHING) - slot_flags = ITEM_SLOT_OCLOTHING - to_chat(user, span_warning("You adjust [src] to let you wear it over jumpsuits.")) - return - if(ITEM_SLOT_OCLOTHING) - slot_flags = ITEM_SLOT_ICLOTHING - to_chat(user, span_warning("You adjust [src] to let you wear it as a jumpsuit.")) - return diff --git a/modular_skyrat/modules/customization/modules/clothing/~donator/donator_clothing.dm b/modular_skyrat/modules/customization/modules/clothing/~donator/donator_clothing.dm index 526a198d0fc..2a8f0b11ed8 100644 --- a/modular_skyrat/modules/customization/modules/clothing/~donator/donator_clothing.dm +++ b/modular_skyrat/modules/customization/modules/clothing/~donator/donator_clothing.dm @@ -264,13 +264,14 @@ flags_cover = MASKCOVERSEYES resistance_flags = FIRE_PROOF +/******CALIGRA DONATIONS******/ // Donation reward for Farsighted Nightlight /obj/item/clothing/mask/gas/nightlight - name = "FIR-36 Rebreather" + name = "\improper FIR-36 half-face rebreather" desc = "A close-fitting respirator designed by Forestfel Intersystem Industries and originally meant for Ixian Tajarans, the FIR-36 Rebreather is commonly used by Military and Civilian Personnel alike. It reeks of Militarism." icon = 'modular_skyrat/master_files/icons/donator/obj/clothing/masks.dmi' worn_icon = 'modular_skyrat/master_files/icons/donator/mob/clothing/mask.dmi' - icon_state = "far14c" + icon_state = "fir36" actions_types = list(/datum/action/item_action/adjust) clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS //same flags as actual sec hailer gas mask flags_inv = HIDEFACE | HIDESNOUT @@ -294,6 +295,52 @@ /obj/item/clothing/mask/gas/nightlight/alldono //different itempath so regular donators can have it, too +// Donation reward for Farsighted Nightlight +/obj/item/clothing/mask/gas/nightlight/fir22 + name = "\improper FIR-22 full-face rebreather" + desc = "A full-face respirator designed by Forestfel Intersystem Industries and originally meant for Ixian Tajarans, the FIR-22 Rebreather is a snout-covering variant often seen used by Tajaran Military Personnel. It reeks of militarism." + icon_state = "fir22" + +// Donation reward for Raxraus +/obj/item/clothing/head/caligram_cap_tan + name = "\improper Caligram tan softcap" + desc = "A Caligram's Fleet-branded hat in a '/surprisingly/' tasteful shade of brown." + icon = 'modular_skyrat/master_files/icons/donator/obj/clothing/hats.dmi' + worn_icon = 'modular_skyrat/master_files/icons/donator/mob/clothing/head.dmi' + icon_state = "caligram_cap_tan" + +// Donation reward for Raxraus +/obj/item/clothing/under/jumpsuit/caligram_fatigues_tan + name = "\improper Caligram tan fatigues" + desc = "A set of tan and brown work fatigues bearing a Caligram's Fleet insigna on an armband. Lacks the typical Tajaran extravagance." + icon = 'modular_skyrat/master_files/icons/donator/obj/clothing/uniform.dmi' + worn_icon = 'modular_skyrat/master_files/icons/donator/mob/clothing/uniform.dmi' + worn_icon_digi = 'modular_skyrat/master_files/icons/donator/mob/clothing/uniform_digi.dmi' + icon_state = "caligram_fatigues_tan" + worn_icon_state = "caligram_fatigues_tan" + +// Donation reward for Raxraus +/obj/item/clothing/suit/jacket/caligram_parka_tan + name = "\improper Caligram tan parka" + desc = "A tan parka with a fancy black belt and '/Caligram's Fleet/' stitched onto its armband." + icon = 'modular_skyrat/master_files/icons/donator/obj/clothing/suits.dmi' + worn_icon = 'modular_skyrat/master_files/icons/donator/mob/clothing/suit.dmi' + icon_state = "caligram_parka_tan" + body_parts_covered = CHEST|GROIN|ARMS + cold_protection = CHEST|GROIN|LEGS|ARMS|HANDS + +// Donation reward for Raxraus +/obj/item/clothing/suit/armor/vest/caligram_parka_vest_tan + name = "\improper Caligram armored tan parka" + desc = "A tan parka with a fancy black belt, a lightly armored vest and '/Caligram's Fleet/' stitched onto its armband." + icon = 'modular_skyrat/master_files/icons/donator/obj/clothing/suits.dmi' + worn_icon = 'modular_skyrat/master_files/icons/donator/mob/clothing/suit.dmi' + icon_state = "caligram_parka_vest_tan" + inhand_icon_state = "armor" + body_parts_covered = CHEST|GROIN|ARMS + cold_protection = CHEST|GROIN|LEGS|ARMS|HANDS + + // Donation reward for ChillyLobster /obj/item/clothing/suit/jacket/brasspriest name = "brasspriest coat" @@ -790,16 +837,6 @@ worn_icon = 'modular_skyrat/master_files/icons/donator/mob/clothing/uniform.dmi' icon_state = "plasmaman_jax" -// Donation reward for Raxraus -/obj/item/clothing/under/rax_turtleneck - icon = 'icons/obj/clothing/under/security.dmi' - worn_icon = 'icons/mob/clothing/under/security.dmi' - name = "black turtleneck" - desc = "A stylish black turtleneck." - icon_state = "hosalt" - inhand_icon_state = "bl_suit" - alt_covers_chest = TRUE - // Donation reward for Raxraus /obj/item/clothing/shoes/combat/rax name = "tactical boots" @@ -825,24 +862,6 @@ icon_state = "hos_black" supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION -// Donation reward for Raxraus -/obj/item/clothing/under/rax_turtleneck_gray - name = "gray turtleneck" - desc = "A stylish gray turtleneck." - icon = 'modular_skyrat/master_files/icons/obj/clothing/under/command.dmi' - worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/under/command.dmi' - worn_icon_digi = 'modular_skyrat/master_files/icons/mob/clothing/under/command_digi.dmi' - icon_state = "bs_turtleneck" - can_adjust = FALSE - -// Donation reward for Raxraus -/obj/item/clothing/suit/jacket/rax - name = "navy aerostatic jacket" - desc = "An expensive jacket with a golden badge on the chest and \"NT\" emblazoned on the back. It weighs surprisingly little, despite how heavy it looks." - icon = 'modular_skyrat/master_files/icons/obj/clothing/suits/armor.dmi' - worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/suits/armor.dmi' - icon_state = "blueshield" - // Donation reward for DeltaTri /obj/item/clothing/suit/jacket/delta name = "grey winter hoodie" diff --git a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/tails.dm b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/tails.dm index 38b3107d643..0a23f98f254 100644 --- a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/tails.dm +++ b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/tails.dm @@ -420,3 +420,7 @@ name = "Slim reptile" icon_state = "reptileslim" color_src = USE_ONE_COLOR + +/datum/sprite_accessory/tails/mammal/wagging/australian_shepherd + name = "Australian Shepherd" + icon_state = "australianshepherd" diff --git a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/wings.dm b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/wings.dm index b7b9fa357a2..cb3e6c03579 100644 --- a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/wings.dm +++ b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/wings.dm @@ -395,3 +395,8 @@ /datum/sprite_accessory/wings/moth/moffra name = "Moth (Moffra)" icon_state = "moffra" + +/datum/sprite_accessory/wings/mammal/top/arfel_harpy + name = "Arfel Harpy" + icon_state = "arfelharpy_top" + color_src = USE_ONE_COLOR diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/akula.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/akula.dm index 170936590c2..c226914c1e7 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/akula.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/akula.dm @@ -35,7 +35,7 @@ "legs" = "Normal Legs" ) outfit_important_for_life = /datum/outfit/akula - payday_modifier = 0.75 + payday_modifier = 1.0 changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT bodypart_overrides = list( BODY_ZONE_HEAD = /obj/item/bodypart/head/mutant/akula, diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/aquatic.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/aquatic.dm index 080766a166e..910c49229b7 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/aquatic.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/aquatic.dm @@ -20,7 +20,7 @@ "legs" = "Normal Legs", "wings" = "None" ) - payday_modifier = 0.75 + payday_modifier = 1.0 changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT examine_limb_id = SPECIES_AKULA bodypart_overrides = list( diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/dwarf.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/dwarf.dm index 83911c33400..1d15db5f5ae 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/dwarf.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/dwarf.dm @@ -13,7 +13,7 @@ mutanttongue = /obj/item/organ/internal/tongue/dwarven skinned_type = /obj/item/stack/sheet/animalhide/human changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT - payday_modifier = 0.75 + payday_modifier = 1.0 body_size_restricted = TRUE /datum/species/dwarf/get_species_description() diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/ghoul.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/ghoul.dm index e0e93a7a3da..0efe513cf26 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/ghoul.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/ghoul.dm @@ -20,7 +20,7 @@ TRAIT_MUTANT_COLORS, TRAIT_FIXED_MUTANT_COLORS, ) - payday_modifier = 0.75 //-- "Equality" + payday_modifier = 1.0 //-- "Equality" stunmod = 1.25 //multiplier for stun durations bodytemp_normal = T20C changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/humanoid.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/humanoid.dm index b3477673b71..76d1feab513 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/humanoid.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/humanoid.dm @@ -20,7 +20,7 @@ "horns" = "None" ) changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT - payday_modifier = 0.75 + payday_modifier = 1.0 examine_limb_id = SPECIES_HUMAN /datum/species/humanoid/get_species_description() diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/insect.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/insect.dm index db3e4c699c3..ef6afc7788d 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/insect.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/insect.dm @@ -22,7 +22,7 @@ "moth_antennae" = "None" ) mutanttongue = /obj/item/organ/internal/tongue/insect - payday_modifier = 0.75 + payday_modifier = 1.0 changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT examine_limb_id = SPECIES_INSECT bodypart_overrides = list( diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/lizard.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/lizard.dm index 3975e10775c..213e9bfbc91 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/lizard.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/lizard.dm @@ -12,7 +12,7 @@ "taur" = "None", "wings" = "None", ) - payday_modifier = 0.75 + payday_modifier = 1.0 /datum/species/lizard/randomize_features(mob/living/carbon/human/human_mob) var/main_color = "#[random_color()]" diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/mammal.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/mammal.dm index 6d9761bdc0b..6e7d9ae4f2c 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/mammal.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/mammal.dm @@ -23,7 +23,7 @@ "head_acc" = "None", "neck_acc" = "None" ) - payday_modifier = 0.75 + payday_modifier = 1.0 changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT bodypart_overrides = list( BODY_ZONE_HEAD = /obj/item/bodypart/head/mutant, diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/placeholder_helper.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/placeholder_helper.dm index 257f957a1d6..d68d4520ceb 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/placeholder_helper.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/placeholder_helper.dm @@ -1,4 +1,4 @@ /datum/species var/placeholder_description = "Placeholder Description! Will you be the only to write a description? (Contact a maintainer today!)" var/placeholder_lore = "Placeholder Lore! Will you be the one to add lore here? (Contact a maintainer today!)" - payday_modifier = 0.75 + payday_modifier = 1.0 diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/podweak.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/podweak.dm index 3a528f1b88c..90a4e4298a7 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/podweak.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/podweak.dm @@ -11,7 +11,7 @@ "pod_hair" = ACC_RANDOM, "legs" = "Normal Legs" ) - payday_modifier = 0.75 + payday_modifier = 1.0 /datum/species/pod/podweak name = "Podperson" diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/skrell.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/skrell.dm index 4c24b4e9d07..aa9d14b5e5a 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/skrell.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/skrell.dm @@ -16,7 +16,7 @@ species_language_holder = /datum/language_holder/skrell mutant_bodyparts = list() mutanttongue = /obj/item/organ/internal/tongue/skrell - payday_modifier = 0.75 + payday_modifier = 1.0 default_mutant_bodyparts = list("skrell_hair" = ACC_RANDOM) changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT eyes_icon = 'modular_skyrat/modules/organs/icons/skrell_eyes.dmi' diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/tajaran.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/tajaran.dm index 57eb335622c..abc27ee7f69 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/tajaran.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/tajaran.dm @@ -18,7 +18,7 @@ "ears" = ACC_RANDOM, "legs" = "Normal Legs" ) - payday_modifier = 0.75 + payday_modifier = 1.0 species_language_holder = /datum/language_holder/tajaran changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT examine_limb_id = SPECIES_MAMMAL diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/unathi.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/unathi.dm index d3e016d6974..13d460bc109 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/unathi.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/unathi.dm @@ -20,7 +20,7 @@ "body_markings" = ACC_RANDOM, "legs" = "Normal Legs" ) - payday_modifier = 0.75 + payday_modifier = 1.0 changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT examine_limb_id = SPECIES_LIZARD ass_image = 'icons/ass/asslizard.png' diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vox.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vox.dm index efe92cfb3ac..f5bb77bb668 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vox.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vox.dm @@ -23,7 +23,7 @@ "snout" = "Vox Snout", "spines" = ACC_RANDOM ) - payday_modifier = 0.75 + payday_modifier = 1.0 outfit_important_for_life = /datum/outfit/vox species_language_holder = /datum/language_holder/vox changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vulpkanin.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vulpkanin.dm index 8e82513d992..e1d819db3e0 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vulpkanin.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vulpkanin.dm @@ -18,7 +18,7 @@ "legs" = "Normal Legs" ) species_language_holder = /datum/language_holder/vulpkanin - payday_modifier = 0.75 + payday_modifier = 1.0 changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT examine_limb_id = SPECIES_MAMMAL bodypart_overrides = list( diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/xeno.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/xeno.dm index 1d2739fe34e..acbf904da43 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/xeno.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/xeno.dm @@ -21,7 +21,7 @@ "taur" = "None" ) external_organs = list() - payday_modifier = 0.75 + payday_modifier = 1.0 changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT bodypart_overrides = list( BODY_ZONE_HEAD = /obj/item/bodypart/head/mutant/xenohybrid, diff --git a/modular_skyrat/modules/customization/modules/surgery/organs/genitals.dm b/modular_skyrat/modules/customization/modules/surgery/organs/genitals.dm index f3b0711c11e..e5cc17fc258 100644 --- a/modular_skyrat/modules/customization/modules/surgery/organs/genitals.dm +++ b/modular_skyrat/modules/customization/modules/surgery/organs/genitals.dm @@ -1,6 +1,6 @@ /obj/item/organ/external/genital color = "#fcccb3" - organ_flags = ORGAN_NO_DISMEMBERMENT + organ_flags = ORGAN_ORGANIC | ORGAN_UNREMOVABLE ///Size value of the genital, needs to be translated to proper lengths/diameters/cups var/genital_size = 1 ///Sprite name of the genital, it's what shows up on character creation diff --git a/modular_skyrat/modules/decay_subsystem/code/decaySS.dm b/modular_skyrat/modules/decay_subsystem/code/decaySS.dm index c4a8959641a..a91f8619499 100644 --- a/modular_skyrat/modules/decay_subsystem/code/decaySS.dm +++ b/modular_skyrat/modules/decay_subsystem/code/decaySS.dm @@ -23,7 +23,7 @@ SUBSYSTEM_DEF(decay) init_order = INIT_ORDER_DECAY /// This is used to determine what maps we should not spawn on. - var/list/station_filter = list("Birdshot Station", "Runtime Station", "MultiZ Debug") + var/list/station_filter = list("Birdshot Station", "Runtime Station", "MultiZ Debug", "Gateway Test") var/list/possible_turfs = list() var/list/possible_areas = list() var/severity_modifier = 1 diff --git a/modular_skyrat/modules/decay_subsystem/code/nests.dm b/modular_skyrat/modules/decay_subsystem/code/nests.dm index 402f17101ba..3a8dad43888 100644 --- a/modular_skyrat/modules/decay_subsystem/code/nests.dm +++ b/modular_skyrat/modules/decay_subsystem/code/nests.dm @@ -140,7 +140,7 @@ desc = "A mush of sticky cobwebs and nasty looking eggs..." icon_state = "nest_spider" light_color = LIGHT_COLOR_BLOOD_MAGIC - monster_types = list(/mob/living/basic/giant_spider/hunter, /mob/living/basic/giant_spider) + monster_types = list(/mob/living/basic/spider/giant/hunter, /mob/living/basic/spider/giant/) loot = list(/obj/item/spider_egg = 4) /obj/item/spider_egg @@ -155,7 +155,7 @@ if(do_after(user, 3 SECONDS, src)) to_chat(user, span_userdanger("You crack [src] open, something monsterous crawls out!")) playsound(src, 'sound/effects/blobattack.ogg', 100) - new /mob/living/basic/giant_spider (user.loc) + new /mob/living/basic/spider/giant/ (user.loc) qdel(src) /obj/structure/mob_spawner/bush diff --git a/modular_skyrat/modules/emotes/code/additionalemotes/overlay_emote.dm b/modular_skyrat/modules/emotes/code/additionalemotes/overlay_emote.dm index 2c480b67002..e456712124a 100644 --- a/modular_skyrat/modules/emotes/code/additionalemotes/overlay_emote.dm +++ b/modular_skyrat/modules/emotes/code/additionalemotes/overlay_emote.dm @@ -75,34 +75,3 @@ overlay.pixel_y = 10 user.flick_overlay_static(overlay, 50) playsound(get_turf(user), 'modular_skyrat/modules/emotes/sound/emotes/annoyed.ogg', 25, TRUE) - - -/datum/emote/living/glasses - key = "glasses" - key_third_person = "glasses" - message = "pushes up their glasses." - -/datum/emote/living/glasses/run_emote(mob/living/carbon/human/user, params, type_override, intentional) - . = ..() - var/obj/O = user.get_item_by_slot(ITEM_SLOT_EYES) - if((istype(O, /obj/item/clothing/glasses)) && get_toggle(user)) - var/mutable_appearance/overlay = mutable_appearance(overlay_emote, "glasses", ABOVE_MOB_LAYER) - if(isteshari(user)) - overlay.pixel_y = -5 - user.flick_overlay_static(overlay, 10) - else - return FALSE - -// These emotes hook into existing ones -/datum/emote/living/sigh - key = "sigh" - key_third_person = "sighs" - -/datum/emote/living/sigh/run_emote(mob/living/carbon/human/user, params, type_override, intentional) - . = ..() - if(iscarbon(user) && get_toggle(user)) - var/mutable_appearance/overlay = mutable_appearance(overlay_emote, "sigh", ABOVE_MOB_LAYER) - if(isteshari(user)) - overlay.pixel_y = -4 - - user.flick_overlay_static(overlay, 50) diff --git a/modular_skyrat/modules/emotes/code/emotes.dm b/modular_skyrat/modules/emotes/code/emotes.dm index 1bdf86a68a0..85680557334 100644 --- a/modular_skyrat/modules/emotes/code/emotes.dm +++ b/modular_skyrat/modules/emotes/code/emotes.dm @@ -456,7 +456,7 @@ var/image/gloveimg = image('icons/effects/effects.dmi', slapped, "slapglove", slapped.layer + 0.1) gloveimg.pixel_y = -5 gloveimg.pixel_x = 0 - flick_overlay_view(gloveimg, 1 SECONDS) + slapped.flick_overlay_view(gloveimg, 1 SECONDS) // And animate the attack! animate(gloveimg, alpha = 175, transform = matrix() * 0.75, pixel_x = 0, pixel_y = -5, pixel_z = 0, time = 0.3 SECONDS) diff --git a/modular_skyrat/modules/encounters/code/nri_raiders.dm b/modular_skyrat/modules/encounters/code/nri_raiders.dm index 73c94f1505e..1cea08893b8 100644 --- a/modular_skyrat/modules/encounters/code/nri_raiders.dm +++ b/modular_skyrat/modules/encounters/code/nri_raiders.dm @@ -94,7 +94,7 @@ GLOBAL_VAR(first_officer) back = /obj/item/storage/backpack/satchel/leather backpack_contents = list(/obj/item/storage/box/nri_survival_pack/raider = 1, /obj/item/ammo_box/magazine/m9mm_aps = 3, /obj/item/gun/ballistic/automatic/pistol/ladon/nri = 1, /obj/item/crucifix = 1, /obj/item/clothing/mask/gas/hecu2 = 1, /obj/item/modular_computer/pda/security = 1) l_pocket = /obj/item/folder/blue/nri_cop - r_pocket = /obj/item/storage/bag/ammo + r_pocket = /obj/item/storage/pouch/ammo id = /obj/item/card/id/advanced id_trim = /datum/id_trim/nri_raider/officer @@ -121,7 +121,7 @@ GLOBAL_VAR(first_officer) back = /obj/item/storage/backpack/satchel/leather backpack_contents = list(/obj/item/storage/box/nri_survival_pack/raider = 1, /obj/item/crucifix = 1, /obj/item/ammo_box/magazine/m9mm = 3, /obj/item/clothing/mask/gas/hecu2 = 1, /obj/item/modular_computer/pda/security = 1) l_pocket = /obj/item/gun/ballistic/automatic/pistol - r_pocket = /obj/item/storage/bag/ammo + r_pocket = /obj/item/storage/pouch/ammo id = /obj/item/card/id/advanced id_trim = /datum/id_trim/nri_raider diff --git a/modular_skyrat/modules/exp_corps/code/expeditionary_trooper.dm b/modular_skyrat/modules/exp_corps/code/expeditionary_trooper.dm index 3d4cbdeb415..54fc933848a 100644 --- a/modular_skyrat/modules/exp_corps/code/expeditionary_trooper.dm +++ b/modular_skyrat/modules/exp_corps/code/expeditionary_trooper.dm @@ -23,7 +23,7 @@ new /obj/item/storage/medkit/regular(src) new /obj/item/storage/box/expeditionary_survival(src) new /obj/item/radio(src) - new /obj/item/storage/bag/ammo/marksman(src) + new /obj/item/storage/pouch/ammo/marksman(src) new /obj/item/clothing/gloves/color/black/expeditionary_corps(src) new /obj/item/clothing/head/helmet/expeditionary_corps(src) new /obj/item/clothing/suit/armor/vest/expeditionary_corps(src) diff --git a/modular_skyrat/modules/exp_corps/code/gear.dm b/modular_skyrat/modules/exp_corps/code/gear.dm index 81a311ff9b4..05c5a989ac8 100644 --- a/modular_skyrat/modules/exp_corps/code/gear.dm +++ b/modular_skyrat/modules/exp_corps/code/gear.dm @@ -9,7 +9,6 @@ if(empty) return new /obj/item/stack/medical/gauze(src) - new /obj/item/stack/medical/splint(src) new /obj/item/defibrillator/compact/loaded(src) new /obj/item/reagent_containers/hypospray/combat(src) new /obj/item/stack/medical/mesh/advanced(src) @@ -95,10 +94,10 @@ force = 12 throwforce = 30 -/obj/item/storage/bag/ammo/marksman +/obj/item/storage/pouch/ammo/marksman name = "marksman's knife pouch" -/obj/item/storage/bag/ammo/marksman/Initialize(mapload) +/obj/item/storage/pouch/ammo/marksman/Initialize(mapload) . = ..() create_storage(storage_type = /datum/storage/marksman) @@ -112,7 +111,7 @@ . = ..() can_hold = typecacheof(list(/obj/item/knife/combat)) -/obj/item/storage/bag/ammo/marksman/PopulateContents() //can kill most basic enemies with 5 knives, though marksmen shouldn't be soloing enemies anyways +/obj/item/storage/pouch/ammo/marksman/PopulateContents() //can kill most basic enemies with 5 knives, though marksmen shouldn't be soloing enemies anyways new /obj/item/knife/combat/marksman(src) new /obj/item/knife/combat/marksman(src) new /obj/item/knife/combat/marksman(src) diff --git a/modular_skyrat/modules/faction/code/mapping/mapping_helpers.dm b/modular_skyrat/modules/faction/code/mapping/mapping_helpers.dm index ac23ad8d84c..035e1597f4e 100644 --- a/modular_skyrat/modules/faction/code/mapping/mapping_helpers.dm +++ b/modular_skyrat/modules/faction/code/mapping/mapping_helpers.dm @@ -41,13 +41,20 @@ shuttlekeys = list("tradership") /obj/structure/closet/crate/tradership_cargo + /// Determines which items will be spawned, overriding itemspawn_seed var/used_preset + /// Determines which items will be spawned + var/itemspawn_seed + +/obj/structure/closet/crate/tradership_cargo/Initialize(mapload) + itemspawn_seed = used_preset || rand(1,5) + return ..() //Generic inventory /obj/structure/closet/crate/tradership_cargo/PopulateContents() - . = ..() - var/random = used_preset || rand(1,5) - switch(random) + ..() + + switch(itemspawn_seed) if(1) for(var/i in 1 to 10) new /obj/item/food/canned/beans(src) @@ -87,11 +94,18 @@ new /obj/item/storage/toolbox/electrical(src) new /obj/item/storage/toolbox/mechanical(src) new /obj/item/storage/toolbox/mechanical(src) - new /obj/item/clothing/gloves/color/yellow(src) - new /obj/item/clothing/gloves/color/yellow(src) name = "engineering crate" icon_state = "engi_crate" +// traitor objective items +/obj/structure/closet/crate/tradership_cargo/populate_contents_immediate() + . = ..() + + switch(itemspawn_seed) + if(5) + new /obj/item/clothing/gloves/color/yellow(src) + new /obj/item/clothing/gloves/color/yellow(src) + /obj/structure/closet/crate/freezer/tradership_cargo_freezer var/used_preset @@ -146,7 +160,7 @@ if(1) //Random traitor items new /obj/item/storage/box/syndie_kit/chameleon(src) new /obj/item/storage/backpack/duffelbag/syndie/c4(src) - new /obj/item/camera_bug(src) + new /obj/item/computer_disk/syndicate/camera_app(src) new /obj/item/gun/chem(src) new /obj/item/card/emag(src) new /obj/item/card/emag/doorjack(src) diff --git a/modular_skyrat/modules/food_replicator/code/clothing.dm b/modular_skyrat/modules/food_replicator/code/clothing.dm new file mode 100644 index 00000000000..8d1b6238ed6 --- /dev/null +++ b/modular_skyrat/modules/food_replicator/code/clothing.dm @@ -0,0 +1,63 @@ +/obj/item/clothing/under/colonial + name = "colonial outfit" + desc = "Fancy white satin shirt and a pair of cotton-blend pants with a black synthleather belt." + icon = 'modular_skyrat/modules/food_replicator/icons/clothing.dmi' + worn_icon = 'modular_skyrat/modules/food_replicator/icons/clothing_worn.dmi' + worn_icon_digi = 'modular_skyrat/modules/food_replicator/icons/clothing_digi.dmi' + icon_state = "under_colonial" + +/obj/item/clothing/under/colonial/mob_can_equip(mob/living/equipper, slot, disable_warning, bypass_equip_delay_self, ignore_equipped, indirect_action) + if(is_species(equipper, /datum/species/teshari)) + to_chat(equipper, span_warning("[src] is far too big for you!")) + return FALSE + + return ..() + +/obj/item/clothing/shoes/jackboots/colonial + name = "colonial half-boots" + desc = "Good old laceless boots, with a sturdy plastic toe to, theoretically, keep your toes uncrushed." + icon = 'modular_skyrat/modules/food_replicator/icons/clothing.dmi' + worn_icon = 'modular_skyrat/modules/food_replicator/icons/clothing_worn.dmi' + worn_icon_digi = 'modular_skyrat/modules/food_replicator/icons/clothing_digi.dmi' + icon_state = "boots_colonial" + +/obj/item/clothing/shoes/jackboots/colonial/mob_can_equip(mob/living/equipper, slot, disable_warning, bypass_equip_delay_self, ignore_equipped, indirect_action) + if(is_species(equipper, /datum/species/teshari)) + to_chat(equipper, span_warning("[src] is far too big for you!")) + return FALSE + + return ..() + +/obj/item/clothing/neck/cloak/colonial + name = "colonial cloak" + desc = "A cloak made from heavy tarpaulin. Nigh wind- and waterproof thanks to its design." + slot_flags = ITEM_SLOT_OCLOTHING|ITEM_SLOT_NECK + w_class = WEIGHT_CLASS_NORMAL + icon = 'modular_skyrat/modules/food_replicator/icons/clothing.dmi' + worn_icon = 'modular_skyrat/modules/food_replicator/icons/clothing_worn.dmi' + worn_icon_digi = 'modular_skyrat/modules/food_replicator/icons/clothing_digi.dmi' + icon_state = "cloak_colonial" + +/obj/item/clothing/neck/cloak/colonial/mob_can_equip(mob/living/equipper, slot, disable_warning, bypass_equip_delay_self, ignore_equipped, indirect_action) + if(is_species(equipper, /datum/species/teshari)) + to_chat(equipper, span_warning("[src] is far too big for you!")) + return FALSE + + return ..() + +/obj/item/clothing/head/hats/colonial + name = "colonial cap" + desc = "A puffy cap made out of tarpaulin covered by some textile. It is sturdy and comfortable, and seems to retain its form very well." + icon = 'modular_skyrat/modules/food_replicator/icons/clothing.dmi' + worn_icon = 'modular_skyrat/modules/food_replicator/icons/clothing_worn.dmi' + worn_icon_digi = 'modular_skyrat/modules/food_replicator/icons/clothing_digi.dmi' + icon_state = "cap_colonial" + inhand_icon_state = null + supports_variations_flags = CLOTHING_SNOUTED_VARIATION_NO_NEW_ICON + +/obj/item/clothing/head/hats/colonial/mob_can_equip(mob/living/equipper, slot, disable_warning, bypass_equip_delay_self, ignore_equipped, indirect_action) + if(is_species(equipper, /datum/species/teshari)) + to_chat(equipper, span_warning("[src] is far too big for you!")) + return FALSE + + return ..() diff --git a/modular_skyrat/modules/food_replicator/code/medical.dm b/modular_skyrat/modules/food_replicator/code/medical.dm new file mode 100644 index 00000000000..1b55cae5991 --- /dev/null +++ b/modular_skyrat/modules/food_replicator/code/medical.dm @@ -0,0 +1,66 @@ +/obj/item/stack/medical/suture/bloody + name = "hemostatic suture" + desc = "Bloodclotting agent-infused sterile sutures used to seal up cuts and lacerations and reverse critical bleedings." + icon = 'modular_skyrat/modules/food_replicator/icons/medicine.dmi' + icon_state = "hemo_suture" + heal_brute = 7 + stop_bleeding = 1 + grind_results = list(/datum/reagent/medicine/coagulant = 2) + merge_type = /obj/item/stack/medical/suture/bloody + +/obj/item/stack/medical/suture/bloody/post_heal_effects(amount_healed, mob/living/carbon/healed_mob, mob/user) + . = ..() + if(healed_mob.blood_volume <= BLOOD_VOLUME_SAFE) + healed_mob.reagents.add_reagent(/datum/reagent/medicine/salglu_solution, 2) + healed_mob.adjustOxyLoss(-amount_healed) + +/obj/item/stack/medical/mesh/bloody + name = "hemostatic mesh" + desc = "A hemostatic mesh used to dress burns and stimulate hemopoiesis. Due to its blood-related purpose, it is worse at sanitizing infections." + icon = 'modular_skyrat/modules/food_replicator/icons/medicine.dmi' + icon_state = "hemo_mesh" + heal_burn = 7 + sanitization = 0.5 + flesh_regeneration = 1.75 + stop_bleeding = 0.25 + grind_results = list(/datum/reagent/medicine/coagulant = 2) + merge_type = /obj/item/stack/medical/mesh/bloody + +/obj/item/stack/medical/mesh/bloody/update_icon_state() + if(is_open) + return ..() + + icon_state = "hemo_mesh_closed" + +/obj/item/stack/medical/mesh/bloody/post_heal_effects(amount_healed, mob/living/carbon/healed_mob, mob/user) + . = ..() + if(healed_mob.blood_volume <= BLOOD_VOLUME_SAFE) + healed_mob.reagents.add_reagent(/datum/reagent/medicine/salglu_solution, 2) + healed_mob.adjustOxyLoss(-amount_healed) + +/obj/item/reagent_containers/hypospray/medipen/glucose + name = "pressurised glucose medipen" + desc = "A medipen for keeping yourself going during prolonged EVA shifts, injects a dose of glucose into your bloodstream. Recommended for use in low-pressure environments." + icon = 'modular_skyrat/modules/food_replicator/icons/medicine.dmi' + icon_state = "glupen" + inhand_icon_state = "stimpen" + base_icon_state = "glupen" + volume = 15 + amount_per_transfer_from_this = 15 + list_reagents = list(/datum/reagent/consumable/nutriment/glucose = 15) + +/obj/item/reagent_containers/hypospray/medipen/glucose/inject(mob/living/affected_mob, mob/user) + if(lavaland_equipment_pressure_check(get_turf(user))) + amount_per_transfer_from_this = initial(amount_per_transfer_from_this) + return ..() + + if(DOING_INTERACTION(user, DOAFTER_SOURCE_SURVIVALPEN)) + to_chat(user,span_notice("You are too busy to use \the [src]!")) + return + + to_chat(user,span_notice("You start manually releasing the low-pressure gauge...")) + if(!do_after(user, 10 SECONDS, affected_mob, interaction_key = DOAFTER_SOURCE_SURVIVALPEN)) + return + + amount_per_transfer_from_this = initial(amount_per_transfer_from_this) * 0.5 + return ..() diff --git a/modular_skyrat/modules/food_replicator/code/rationpacks.dm b/modular_skyrat/modules/food_replicator/code/rationpacks.dm new file mode 100644 index 00000000000..c22d588d49a --- /dev/null +++ b/modular_skyrat/modules/food_replicator/code/rationpacks.dm @@ -0,0 +1,188 @@ +/obj/item/food/colonial_course + name = "undefined colonial course" + desc = "Something you shouldn't see. But it's edible." + icon = 'modular_skyrat/modules/food_replicator/icons/rationpack.dmi' + icon_state = "borgir" + base_icon_state = "borgir" + food_reagents = list(/datum/reagent/consumable/nutriment = 20) + tastes = list("crayon powder" = 1) + foodtypes = VEGETABLES | GRAIN + w_class = WEIGHT_CLASS_SMALL + preserved_food = TRUE + +/obj/item/food/colonial_course/attack_self(mob/user, modifiers) + if(preserved_food) + preserved_food = FALSE + icon_state = "[base_icon_state]_unwrapped" + to_chat(user, span_notice("You unpackage \the [src].")) + playsound(user.loc, 'sound/items/foodcanopen.ogg', 50) + +/obj/item/food/colonial_course/attack(mob/living/target, mob/user, def_zone) + if(preserved_food) + to_chat(user, span_warning("[src] is still packaged!")) + return FALSE + + return ..() + +/obj/item/food/colonial_course/pljeskavica + name = "pljeskavica" + desc = "Freshly-printed steaming hot burger consisting of a biogenerator-produced handcraft-imitating buns, with a minced meat patty inbetween, among various vegetables and sauces.\ +
Looks good enough for something as replicated as this. Its packaging is covered in copious amounts of information on its nutritional facts, contents and the expiry date. Sadly, it's all written in Pan-Slavic." + trash_type = /obj/item/trash/pljeskavica + food_reagents = list( + /datum/reagent/consumable/nutriment = 3, + /datum/reagent/consumable/nutriment/protein = 9, + /datum/reagent/consumable/nutriment/vitamin = 4, + ) + tastes = list("bun" = 2, "spiced meat" = 10, "death of veganism" = 3) + foodtypes = VEGETABLES | GRAIN | MEAT + +/obj/item/food/colonial_course/nachos + name = "plain nachos tray" + desc = "A vacuum-sealed package with what seems to be a generous serving of triangular corn chips, with three sections reserved for a salsa, cheese and guacamole sauces.\ +
Probably the best-looking food you can find in these rations, perhaps due to its simplicity." + food_reagents = list( + /datum/reagent/consumable/nutriment = 5, + /datum/reagent/consumable/nutriment/vitamin = 2, + ) + trash_type = /obj/item/trash/nachos + icon_state = "nacho" + base_icon_state = "nacho" + tastes = list("corn chips" = 5, "'artificial' organic sauces" = 5) + foodtypes = GRAIN | FRIED | DAIRY + +/obj/item/food/colonial_course/blins + name = "condensed milk crepes" + desc = "A vacuum-sealed four-pack of stuffed crepes with a minimal amount of markings. There is nothing else to it, to be frank.\ +
Surprisingly tasty for its looks, as long as you're not lactose intolerant, on diet, or vegan. The back of the packaging is covered in a mass of information detailing the product." + food_reagents = list( + /datum/reagent/consumable/nutriment = 2, + /datum/reagent/consumable/caramel = 3, + /datum/reagent/consumable/milk = 4, + ) + trash_type = /obj/item/trash/blins + icon_state = "blin" + base_icon_state = "blin" + tastes = list("insane amount of sweetness" = 10, "crepes" = 3) + foodtypes = SUGAR | GRAIN | DAIRY | BREAKFAST + +/obj/item/reagent_containers/cup/glass/coffee/colonial + name = "colonial thermocup" + desc = "Technically, used to drink hot beverages. But since it's the only cup design that was available, you gotta make do. It has an instruction written on its side. \ +
This particular one comes prefilled with a single serving of coffee powder." + special_desc = "A small instruction on the side reads: \"For use in food replicators; mix water and powdered solutions in one-to-one proportions. \ +
For cocoa, mix milk and powdered solution in one-to-one proportion.\"
" + icon = 'modular_skyrat/modules/food_replicator/icons/rationpack.dmi' + list_reagents = list(/datum/reagent/consumable/powdered_coffee = 25) + +/obj/item/reagent_containers/cup/glass/coffee/colonial/empty + desc = "Technically, used to drink hot beverages. But since it's the only cup design that was available, you gotta make do. It has an instruction written on its side." + list_reagents = null + +/obj/item/trash/pljeskavica + name = "pljeskavica wrapping paper" + desc = "Covered in sauce smearings and smaller pieces of the dish on the inside, crumpled into a ball. It's probably best to dispose of it." + icon = 'modular_skyrat/modules/food_replicator/icons/rationpack.dmi' + icon_state = "borgir_trash" + +/obj/item/trash/nachos + name = "empty nachos tray" + desc = "Covered in sauce smearings and smaller pieces of the dish on the inside, a plastic food tray with not much use anymore. It's probably best to dispose of it or recycle it." + icon = 'modular_skyrat/modules/food_replicator/icons/rationpack.dmi' + custom_materials = list(/datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT) + icon_state = "nacho_trash" + +/obj/item/trash/blins + name = "empty crepes wrapper" + desc = "Empty torn wrapper that used to hold something ridiculously sweet. It's probably best to recycle it." + icon = 'modular_skyrat/modules/food_replicator/icons/rationpack.dmi' + custom_materials = list(/datum/material/plastic = HALF_SHEET_MATERIAL_AMOUNT * 0.5) + icon_state = "blin_trash" + +/obj/item/storage/box/gum/colonial + name = "mixed bubblegum packet" + desc = "The packaging is entirely written in Pan-Slavic, with a small blurb of Sol Common. You would need to take a better look to read it, though, as it is written quite small." + special_desc = "Examining the small text reveals the following: \"Foreign colonization ration, model J: mixed origin, adult. Bubblegum package, medicinal, recreational.
\ + Do not overconsume. Certain strips contain nicotine.\"
" + icon = 'modular_skyrat/modules/food_replicator/icons/rationpack.dmi' + icon_state = "bubblegum" + +/obj/item/storage/box/gum/colonial/PopulateContents() + new /obj/item/food/bubblegum(src) + new /obj/item/food/bubblegum(src) + new /obj/item/food/bubblegum/nicotine(src) + new /obj/item/food/bubblegum/nicotine(src) + +/obj/item/storage/box/utensils + name = "utensils package" + desc = "A small package containing various utensils required for human consumption of various foods. \ + In a normal situation contains a plastic fork, a plastic spoon, and two serviettes." + icon = 'modular_skyrat/modules/food_replicator/icons/rationpack.dmi' + icon_state = "utensil_box" + w_class = WEIGHT_CLASS_TINY + illustration = null + foldable_result = null + +/obj/item/storage/box/utensils/Initialize(mapload) + . = ..() + atom_storage.set_holdable(list( + /obj/item/kitchen/spoon/plastic, + /obj/item/kitchen/fork/plastic, + /obj/item/serviette, + )) + atom_storage.max_slots = 4 + +/obj/item/storage/box/utensils/PopulateContents() + new /obj/item/kitchen/spoon/plastic(src) + new /obj/item/kitchen/fork/plastic(src) + new /obj/item/serviette/colonial(src) + new /obj/item/serviette/colonial(src) + +/obj/item/serviette/colonial + name = "colonial napkin" + desc = "To clean all the mess. Comes with a custom combined design of red and blue." + icon_state = "napkin_unused" + icon = 'modular_skyrat/modules/food_replicator/icons/rationpack.dmi' + used_serviette = /obj/item/serviette_used/colonial + +/obj/item/serviette_used/colonial + name = "dirty colonial napkin" + desc = "No longer useful, super dirty, or soaked, or otherwise unrecognisable." + icon_state = "napkin_used" + icon = 'modular_skyrat/modules/food_replicator/icons/rationpack.dmi' + +/obj/item/storage/box/colonial_rations + name = "foreign colonization ration" + desc = "A freshly printed civilian MRE, or more specifically a lunchtime food package, for use in the early colonization times by the first settlers of what is now known as the NRI.
\ + The lack of any imprinted dates, as well as its origin, the food replicator, should probably give you a good enough hint at its short, if reasonable, expiry time." + icon = 'modular_skyrat/modules/food_replicator/icons/rationpack.dmi' + icon_state = "mre_package" + foldable_result = null + illustration = null + +/obj/item/storage/box/colonial_rations/Initialize(mapload) + . = ..() + atom_storage.max_slots = 6 + atom_storage.locked = TRUE + +/obj/item/storage/box/colonial_rations/attack_self(mob/user, modifiers) + if(user) + if(atom_storage.locked == TRUE) + atom_storage.locked = FALSE + icon_state = "mre_package_open" + balloon_alert(user, "unsealed!") + return ..() + else + atom_storage.locked = TRUE + atom_storage.close_all() + icon_state = "mre_package" + balloon_alert(user, "resealed!") + return + +/obj/item/storage/box/colonial_rations/PopulateContents() + new /obj/item/food/colonial_course/pljeskavica(src) + new /obj/item/food/colonial_course/nachos(src) + new /obj/item/food/colonial_course/blins(src) + new /obj/item/reagent_containers/cup/glass/coffee/colonial(src) + new /obj/item/storage/box/gum/colonial(src) + new /obj/item/storage/box/utensils(src) diff --git a/modular_skyrat/modules/food_replicator/code/reagents.dm b/modular_skyrat/modules/food_replicator/code/reagents.dm new file mode 100644 index 00000000000..ef25e49efd3 --- /dev/null +++ b/modular_skyrat/modules/food_replicator/code/reagents.dm @@ -0,0 +1,116 @@ +/datum/reagent/consumable/powdered_tea + name = "Powdered Tea" + description = "Tea in its powdered form. Tastes horribly." + color = "#3a3a03" + nutriment_factor = 0 + taste_description = "bitter powder" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + default_container = /obj/item/reagent_containers/cup/glass/mug/tea + +/datum/chemical_reaction/food/unpowdered_tea + required_reagents = list( + /datum/reagent/water = 1, + /datum/reagent/consumable/powdered_tea = 1, + ) + results = list(/datum/reagent/consumable/tea = 2) + mix_message = "The mixture instantly heats up." + reaction_flags = REACTION_INSTANT + +/datum/reagent/consumable/powdered_coffee + name = "Powdered Coffee" + description = "Americano in its powdered form. Quite an ordinary thing to be honest." + color = "#101000" + nutriment_factor = 0 + taste_description = "very bitter powder" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + default_container = /obj/item/reagent_containers/cup/glass/coffee + +/datum/chemical_reaction/food/unpowdered_coffee + required_reagents = list( + /datum/reagent/water = 1, + /datum/reagent/consumable/powdered_coffee = 1, + ) + results = list(/datum/reagent/consumable/coffee = 2) + mix_message = "The mixture instantly heats up." + reaction_flags = REACTION_INSTANT + +/datum/reagent/consumable/powdered_coco + name = "Powdered Coco" + description = "Made with love (citation needed), and reclaimed biomass." + nutriment_factor = 0 + color = "#403010" + taste_description = "dry chocolate" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + default_container = /obj/item/reagent_containers/cup/glass/mug/coco + +/datum/chemical_reaction/food/unpowdered_coco + required_reagents = list( + /datum/reagent/consumable/milk = 1, + /datum/reagent/consumable/powdered_coco = 1, + ) + results = list(/datum/reagent/consumable/hot_coco = 2) + mix_message = "The mixture instantly heats up." + reaction_flags = REACTION_INSTANT + +/datum/reagent/consumable/powdered_lemonade + name = "Powdered Lemonade" + description = "Sweet, tangy base of a lemonade. Would be good if you'd mix it with water." + nutriment_factor = 0 + color = "#FFE978" + taste_description = "intensely sour and sweet lemon powder" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + default_container = /obj/item/reagent_containers/cup/soda_cans/lemon_lime + +/datum/chemical_reaction/food/unpowdered_lemonade + required_reagents = list( + /datum/reagent/water = 1, + /datum/reagent/consumable/powdered_lemonade = 1, + ) + results = list(/datum/reagent/consumable/lemonade = 2) + mix_message = "The mixture instantly cools down." + reaction_flags = REACTION_INSTANT + +/datum/reagent/consumable/powdered_milk + name = "Powdered Milk" + description = "An opaque white powder produced by the biomass restructurizers of certain machines." + nutriment_factor = 0 + color = "#DFDFDF" + taste_description = "sweet dry milk" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + default_container = /obj/item/reagent_containers/condiment/milk + +/datum/chemical_reaction/food/unpowdered_milk + required_reagents = list( + /datum/reagent/water = 1, + /datum/reagent/consumable/powdered_milk = 1, + ) + results = list(/datum/reagent/consumable/milk = 2) + mix_message = "The mixture cools down." + reaction_flags = REACTION_INSTANT + +/obj/item/reagent_containers/pill/convermol + name = "convermol pill" + desc = "Used to treat oxygen deprivation. Intoxicates the body." + icon_state = "pill16" + list_reagents = list(/datum/reagent/medicine/c2/convermol = 15) + rename_with_volume = TRUE + +/datum/reagent/consumable/nutriment/glucose + name = "Synthetic Glucose" + description = "A sticky yellow liquid, simple carbohydrate, allotrope of organic glucose. Gives your body a short-term energy boost." + nutriment_factor = 1 + color = "#f3d00d" + taste_description = "strong sweetness" + chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + var/delayed_satiety_drain = 30 + +/datum/reagent/consumable/nutriment/glucose/on_mob_life(mob/living/carbon/affected_mob, seconds_per_tick, times_fired) + if(affected_mob.satiety < MAX_SATIETY) + affected_mob.adjust_nutrition(15) + delayed_satiety_drain += 15 + + return ..() + +/datum/reagent/consumable/nutriment/glucose/on_mob_delete(mob/living/carbon/detoxed_mob) + detoxed_mob.adjust_nutrition(-delayed_satiety_drain) + return ..() diff --git a/modular_skyrat/modules/food_replicator/code/replicator.dm b/modular_skyrat/modules/food_replicator/code/replicator.dm new file mode 100644 index 00000000000..9fcef963545 --- /dev/null +++ b/modular_skyrat/modules/food_replicator/code/replicator.dm @@ -0,0 +1,23 @@ +#define RND_CATEGORY_NRI_FOOD "Provision" +#define RND_CATEGORY_NRI_MEDICAL "Medicine" +#define RND_CATEGORY_NRI_CLOTHING "Apparel" + +/obj/machinery/biogenerator/food_replicator + name = "\improper Type 34 'Colonial Supply Core'" + desc = "The Type 34 'Colonial Supply Core,' colloquially known as the 'Gencrate/CSC' is an ancient, boxy design first put in use by the pioneer colonists of what's now known \ + as the NRI. The Gencrate is at its core a matter resequencer, a highly specialized subtype of biogenerator which performs a sort of transmutation using organic \ + compounds; normally from large-scale crops or waste product. With sufficient supply, the machine is capable of making a wide variety of provisions, \ + from clothes to food to first-aid medical supplies." + icon = 'modular_skyrat/modules/food_replicator/icons/biogenerator.dmi' + circuit = /obj/item/circuitboard/machine/biogenerator/food_replicator + efficiency = 0.75 + productivity = 0.75 + show_categories = list( + RND_CATEGORY_NRI_FOOD, + RND_CATEGORY_NRI_MEDICAL, + RND_CATEGORY_NRI_CLOTHING, + ) + +/obj/item/circuitboard/machine/biogenerator/food_replicator + name = "Colonial Supply Core" + build_path = /obj/machinery/biogenerator/food_replicator diff --git a/modular_skyrat/modules/food_replicator/code/replicator_designs/replicator_clothing.dm b/modular_skyrat/modules/food_replicator/code/replicator_designs/replicator_clothing.dm new file mode 100644 index 00000000000..b7973d2fb3a --- /dev/null +++ b/modular_skyrat/modules/food_replicator/code/replicator_designs/replicator_clothing.dm @@ -0,0 +1,54 @@ +/datum/design/colonial_under + name = "Colonial Uniform" + id = "slavic_under" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 200) + build_path = /obj/item/clothing/under/colonial + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_CLOTHING, + ) + +/datum/design/colonial_boots + name = "Colonial Half-Boots" + id = "slavic_boots" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 150) + build_path = /obj/item/clothing/shoes/jackboots/colonial + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_CLOTHING, + ) + +/datum/design/colonial_cloak + name = "Colonial Cloak" + id = "slavic_cloak" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 250) + build_path = /obj/item/clothing/neck/cloak/colonial + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_CLOTHING, + ) + +/datum/design/cool_hat + name = "Colonial Cap" + id = "slavic_cap" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 150) + build_path = /obj/item/clothing/head/hats/colonial + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_CLOTHING, + ) + +/datum/design/cool_gloves + name = "Black Gloves" + id = "slavic_gloves" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/clothing/gloves/color/black + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_CLOTHING, + ) diff --git a/modular_skyrat/modules/food_replicator/code/replicator_designs/replicator_food.dm b/modular_skyrat/modules/food_replicator/code/replicator_designs/replicator_food.dm new file mode 100644 index 00000000000..389ca245089 --- /dev/null +++ b/modular_skyrat/modules/food_replicator/code/replicator_designs/replicator_food.dm @@ -0,0 +1,165 @@ +/datum/design/ration + name = "Foreign Colonization Ration" + id = "slavic_mre" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 550) + build_path = /obj/item/storage/box/colonial_rations + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_FOOD, + ) + +/datum/design/pljeskavica + name = "Foreign Colonization Ration, Main Course" + id = "slavic_burger" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 200) + build_path = /obj/item/food/colonial_course/pljeskavica + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_FOOD, + ) + +/datum/design/nachos + name = "Foreign Colonization Ration, Side Dish" + id = "mexican_chips" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 150) + build_path = /obj/item/food/colonial_course/nachos + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_FOOD, + ) + +/datum/design/blins + name = "Foreign Colonization Ration, Dessert" + id = "slavic_crepes" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/food/colonial_course/blins + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_FOOD, + ) + +///Despite being in the medical.dm file, it's still used to fill your hunger up, as such, technically, is food. +/datum/design/glucose + name = "EVA Glucose Injector" + id = "slavic_glupen" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 150) + build_path = /obj/item/reagent_containers/hypospray/medipen/glucose + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_FOOD, + ) + +/datum/design/spork + name = "Foreign Colonization Ration, Utensils" + id = "slavic_utens" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 75) + build_path = /obj/item/storage/box/utensils + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_FOOD, + ) + +/datum/design/bubblegum + name = "Foreign Colonization Ration, Bubblegum Pack" + id = "slavic_gum" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/storage/box/gum/colonial + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_FOOD, + ) + +/datum/design/cup + name = "Empty Paper Cup" + id = "slavic_cup" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 10) + build_path = /obj/item/reagent_containers/cup/glass/coffee/colonial/empty + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_FOOD, + ) + +/datum/design/tea + name = "Powdered Black Tea" + id = "slavic_tea" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 4) + make_reagent = /datum/reagent/consumable/powdered_tea + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_FOOD, + ) + +/datum/design/coffee + name = "Powdered Coffee" + id = "slavic_coffee" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 4) + make_reagent = /datum/reagent/consumable/powdered_coffee + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_FOOD, + ) + +/datum/design/cocoa + name = "Powdered Hot Chocolate" + id = "slavic_coco" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 4) + make_reagent = /datum/reagent/consumable/powdered_coco + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_FOOD, + ) + +/datum/design/lemonade + name = "Powdered Lemonade" + id = "slavic_lemon" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 4) + make_reagent = /datum/reagent/consumable/powdered_lemonade + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_FOOD, + ) + +/datum/design/replicator_sugar + name = "Sugar" + id = "slavic_sugar" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 5) + make_reagent = /datum/reagent/consumable/sugar + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_FOOD, + ) + +/datum/design/powdered_milk + name = "Powdered Milk" + id = "slavic_milk" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 4) + make_reagent = /datum/reagent/consumable/powdered_milk + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_FOOD, + ) + +/datum/design/water + name = "Water" + id = "slavic_water" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 1) + make_reagent = /datum/reagent/water + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_FOOD, + ) diff --git a/modular_skyrat/modules/food_replicator/code/replicator_designs/replicator_medical.dm b/modular_skyrat/modules/food_replicator/code/replicator_designs/replicator_medical.dm new file mode 100644 index 00000000000..31b14284387 --- /dev/null +++ b/modular_skyrat/modules/food_replicator/code/replicator_designs/replicator_medical.dm @@ -0,0 +1,113 @@ +/datum/design/pocket_medkit + name = "Empty Pocket First Aid Kit" + id = "slavic_cfap" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 250) + build_path = /obj/item/storage/bag/pocket_medkit + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_MEDICAL, + ) + +/datum/design/medipouch + name = "Empty Medipen Pouch" + id = "slavic_medipouch" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 250) + build_path = /obj/item/storage/bag/medipen + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_MEDICAL, + ) + +/datum/design/sutures + name = "Hemostatic Sutures" + id = "slavic_suture" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 150) + build_path = /obj/item/stack/medical/suture/bloody + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_MEDICAL, + ) + +/datum/design/mesh + name = "Hemostatic Mesh" + id = "slavic_mesh" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 150) + build_path = /obj/item/stack/medical/mesh/bloody + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_MEDICAL, + ) + +/datum/design/bruise_patch + name = "Bruise Patch" + id = "slavic_bruise" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 250) + build_path = /obj/item/reagent_containers/pill/patch/libital + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_MEDICAL, + ) + +/datum/design/burn_patch + name = "Burn Patch" + id = "slavic_burn" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 250) + build_path = /obj/item/reagent_containers/pill/patch/aiuri + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_MEDICAL, + ) + +/datum/design/gauze + name = "Medical Gauze" + id = "slavic_gauze" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/stack/medical/gauze + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_MEDICAL, + ) + +/datum/design/epi_pill + name = "Epinephrine Pill" + id = "slavic_epi" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 75) + build_path = /obj/item/reagent_containers/pill/epinephrine + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_MEDICAL, + ) + +/datum/design/conv_pill + name = "Convermol Pill" + id = "slavic_conv" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 75) + build_path = /obj/item/reagent_containers/pill/convermol + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_MEDICAL, + ) + +/datum/design/multiver_pill + name = "Multiver Pill" + id = "slavic_multiver" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 75) + build_path = /obj/item/reagent_containers/pill/multiver + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_NRI_MEDICAL, + ) + +#undef RND_CATEGORY_NRI_FOOD +#undef RND_CATEGORY_NRI_MEDICAL +#undef RND_CATEGORY_NRI_CLOTHING diff --git a/modular_skyrat/modules/food_replicator/code/storage.dm b/modular_skyrat/modules/food_replicator/code/storage.dm new file mode 100644 index 00000000000..09ae7bece12 --- /dev/null +++ b/modular_skyrat/modules/food_replicator/code/storage.dm @@ -0,0 +1,40 @@ +/obj/item/storage/bag/medipen + name = "colonial medipen pouch" + desc = "A pouch for your (medi-)pens that goes in your pocket." + icon = 'modular_skyrat/modules/food_replicator/icons/pouch.dmi' + icon_state = "medipen_pouch" + slot_flags = ITEM_SLOT_POCKETS + w_class = WEIGHT_CLASS_BULKY + resistance_flags = FLAMMABLE + +/obj/item/storage/bag/medipen/update_icon_state() + icon_state = "[initial(icon_state)]_[contents.len]" + return ..() + +/obj/item/storage/bag/medipen/Initialize(mapload) + . = ..() + update_appearance() + +/obj/item/storage/bag/medipen/Initialize(mapload) + . = ..() + atom_storage.max_specific_storage = WEIGHT_CLASS_TINY + atom_storage.max_total_storage = 4 + atom_storage.max_slots = 4 + atom_storage.numerical_stacking = FALSE + atom_storage.can_hold = typecacheof(list(/obj/item/reagent_containers/hypospray/medipen, /obj/item/pen, /obj/item/flashlight/pen)) + +/obj/item/storage/bag/pocket_medkit + name = "colonial first aid kit" + desc = "A medical pouch that goes in your pocket. Can be used to store things unrelated to medicine, except for guns, ammo and raw materials." + icon = 'modular_skyrat/modules/food_replicator/icons/pouch.dmi' + icon_state = "cfak" + slot_flags = ITEM_SLOT_POCKETS + w_class = WEIGHT_CLASS_BULKY + resistance_flags = FLAMMABLE + +/obj/item/storage/bag/pocket_medkit/Initialize(mapload) + . = ..() + atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL + atom_storage.max_total_storage = 4 + atom_storage.max_slots = 4 + atom_storage.cant_hold = typecacheof(list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/stack/sheet)) diff --git a/modular_skyrat/modules/food_replicator/icons/biogenerator.dmi b/modular_skyrat/modules/food_replicator/icons/biogenerator.dmi new file mode 100644 index 00000000000..98ead8bd6bc Binary files /dev/null and b/modular_skyrat/modules/food_replicator/icons/biogenerator.dmi differ diff --git a/modular_skyrat/modules/food_replicator/icons/clothing.dmi b/modular_skyrat/modules/food_replicator/icons/clothing.dmi new file mode 100644 index 00000000000..87b63178b5d Binary files /dev/null and b/modular_skyrat/modules/food_replicator/icons/clothing.dmi differ diff --git a/modular_skyrat/modules/food_replicator/icons/clothing_digi.dmi b/modular_skyrat/modules/food_replicator/icons/clothing_digi.dmi new file mode 100644 index 00000000000..baec8fc7b5d Binary files /dev/null and b/modular_skyrat/modules/food_replicator/icons/clothing_digi.dmi differ diff --git a/modular_skyrat/modules/food_replicator/icons/clothing_worn.dmi b/modular_skyrat/modules/food_replicator/icons/clothing_worn.dmi new file mode 100644 index 00000000000..35b4f4b497c Binary files /dev/null and b/modular_skyrat/modules/food_replicator/icons/clothing_worn.dmi differ diff --git a/modular_skyrat/modules/food_replicator/icons/medicine.dmi b/modular_skyrat/modules/food_replicator/icons/medicine.dmi new file mode 100644 index 00000000000..38cbffbcf13 Binary files /dev/null and b/modular_skyrat/modules/food_replicator/icons/medicine.dmi differ diff --git a/modular_skyrat/modules/food_replicator/icons/pouch.dmi b/modular_skyrat/modules/food_replicator/icons/pouch.dmi new file mode 100644 index 00000000000..9756206d0df Binary files /dev/null and b/modular_skyrat/modules/food_replicator/icons/pouch.dmi differ diff --git a/modular_skyrat/modules/food_replicator/icons/rationpack.dmi b/modular_skyrat/modules/food_replicator/icons/rationpack.dmi new file mode 100644 index 00000000000..c0422ef3ca0 Binary files /dev/null and b/modular_skyrat/modules/food_replicator/icons/rationpack.dmi differ diff --git a/modular_skyrat/modules/goofsec/code/department_guards.dm b/modular_skyrat/modules/goofsec/code/department_guards.dm index 07f7dbc9159..7a5828b5fa2 100644 --- a/modular_skyrat/modules/goofsec/code/department_guards.dm +++ b/modular_skyrat/modules/goofsec/code/department_guards.dm @@ -206,6 +206,7 @@ backpack = /obj/item/storage/backpack/science satchel = /obj/item/storage/backpack/satchel/science duffelbag = /obj/item/storage/backpack/duffelbag/science + messenger = /obj/item/storage/backpack/messenger/science id_trim = /datum/id_trim/job/science_guard @@ -309,6 +310,7 @@ backpack = /obj/item/storage/backpack/medic satchel = /obj/item/storage/backpack/satchel/med duffelbag = /obj/item/storage/backpack/duffelbag/med + messenger = /obj/item/storage/backpack/messenger/med box = /obj/item/storage/box/survival/medical id_trim = /datum/id_trim/job/orderly @@ -406,6 +408,7 @@ backpack = /obj/item/storage/backpack/industrial satchel = /obj/item/storage/backpack/satchel/eng duffelbag = /obj/item/storage/backpack/duffelbag/engineering + messenger = /obj/item/storage/backpack/messenger/eng box = /obj/item/storage/box/survival/engineer id_trim = /datum/id_trim/job/engineering_guard @@ -510,6 +513,7 @@ backpack = /obj/item/storage/backpack satchel = /obj/item/storage/backpack/satchel duffelbag = /obj/item/storage/backpack/duffelbag + messenger = /obj/item/storage/backpack/messenger id_trim = /datum/id_trim/job/customs_agent @@ -607,6 +611,7 @@ backpack = /obj/item/storage/backpack satchel = /obj/item/storage/backpack/satchel duffelbag = /obj/item/storage/backpack/duffelbag + messenger = /obj/item/storage/backpack/messenger id_trim = /datum/id_trim/job/bouncer diff --git a/modular_skyrat/modules/goofsec/code/sec_clothing_overrides.dm b/modular_skyrat/modules/goofsec/code/sec_clothing_overrides.dm index 86eef5406a0..ea06dc1163c 100644 --- a/modular_skyrat/modules/goofsec/code/sec_clothing_overrides.dm +++ b/modular_skyrat/modules/goofsec/code/sec_clothing_overrides.dm @@ -47,37 +47,63 @@ /obj/item/storage/backpack/security icon = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi' + lefthand_file = 'modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_lefthand.dmi' + righthand_file = 'modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_righthand.dmi' icon_state = "backpack_security_black" + inhand_icon_state = "backpack_security_black" uses_advanced_reskins = TRUE unique_reskin = list( "Black Variant" = list( RESKIN_ICON_STATE = "backpack_security_black", - RESKIN_WORN_ICON_STATE = "backpack_security_black" + RESKIN_WORN_ICON_STATE = "backpack_security_black", + RESKIN_INHAND_STATE = "backpack_security_black" ), "White Variant" = list( RESKIN_ICON_STATE = "backpack_security_white", - RESKIN_WORN_ICON_STATE = "backpack_security_white" + RESKIN_WORN_ICON_STATE = "backpack_security_white", + RESKIN_INHAND_STATE = "backpack_security_white" ), ) /obj/item/storage/backpack/satchel/sec icon = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi' - icon_state = "satchel_security" + lefthand_file = 'modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_lefthand.dmi' + righthand_file = 'modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_righthand.dmi' + icon_state = "satchel_security_black" + inhand_icon_state = "satchel_security_black" + uses_advanced_reskins = TRUE + unique_reskin = list( + "Black Variant" = list( + RESKIN_ICON_STATE = "satchel_security_black", + RESKIN_WORN_ICON_STATE = "satchel_security_black", + RESKIN_INHAND_STATE = "satchel_security_black" + ), + "White Variant" = list( + RESKIN_ICON_STATE = "satchel_security_white", + RESKIN_WORN_ICON_STATE = "satchel_security_white", + RESKIN_INHAND_STATE = "satchel_security_white" + ), + ) /obj/item/storage/backpack/duffelbag/sec icon = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi' worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi' + lefthand_file = 'modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_lefthand.dmi' + righthand_file = 'modular_skyrat/master_files/icons/mob/inhands/clothing/backpack_righthand.dmi' icon_state = "duffel_security_black" + inhand_icon_state = "duffel_security_black" uses_advanced_reskins = TRUE unique_reskin = list( "Black Variant" = list( RESKIN_ICON_STATE = "duffel_security_black", - RESKIN_WORN_ICON_STATE = "duffel_security_black" + RESKIN_WORN_ICON_STATE = "duffel_security_black", + RESKIN_INHAND_STATE = "duffel_security_black" ), "White Variant" = list( RESKIN_ICON_STATE = "duffel_security_white", - RESKIN_WORN_ICON_STATE = "duffel_security_white" + RESKIN_WORN_ICON_STATE = "duffel_security_white", + RESKIN_INHAND_STATE = "duffel_security_white" ), ) @@ -728,7 +754,7 @@ /obj/item/gun/ballistic/revolver, /obj/item/ammo_box/c38, // Revolver speedloaders. /obj/item/ammo_box/a357, - /obj/item/ammo_box/a762, + /obj/item/ammo_box/strilka310, /obj/item/gun/energy/e_gun/mini, /obj/item/gun/energy/disabler, /obj/item/gun/ballistic/revolver, @@ -751,7 +777,7 @@ /obj/item/gun/ballistic/revolver, /obj/item/ammo_box/c38, // Revolver speedloaders. /obj/item/ammo_box/a357, - /obj/item/ammo_box/a762, + /obj/item/ammo_box/strilka310, /obj/item/gun/energy/e_gun/mini, /obj/item/gun/energy/disabler, /obj/item/gun/ballistic/revolver, diff --git a/modular_skyrat/modules/gun_safety/code/safety_additions.dm b/modular_skyrat/modules/gun_safety/code/safety_additions.dm index 013fc022ec2..67b6fe8561e 100644 --- a/modular_skyrat/modules/gun_safety/code/safety_additions.dm +++ b/modular_skyrat/modules/gun_safety/code/safety_additions.dm @@ -39,7 +39,7 @@ /obj/item/gun/energy/plasmacutter/give_gun_safeties() return -/obj/item/gun/energy/kinetic_accelerator/give_gun_safeties() +/obj/item/gun/energy/recharge/kinetic_accelerator/give_gun_safeties() return // Syringe Guns diff --git a/modular_skyrat/modules/gunpoint/code/gunpoint_datum.dm b/modular_skyrat/modules/gunpoint/code/gunpoint_datum.dm index 0223d9e83c8..2791dd9a66f 100644 --- a/modular_skyrat/modules/gunpoint/code/gunpoint_datum.dm +++ b/modular_skyrat/modules/gunpoint/code/gunpoint_datum.dm @@ -26,7 +26,7 @@ source.face_atom(target) source.visible_message(span_danger("[source.name] aims at [target.name] with the [aimed_gun.name]!")) - was_running = (source.m_intent == MOVE_INTENT_RUN) + was_running = (source.move_intent == MOVE_INTENT_RUN) if(was_running) source.toggle_move_intent() ADD_TRAIT(source, TRAIT_NORUNNING, "gunpoint") diff --git a/modular_skyrat/modules/gunsgalore/code/guns/m16.dm b/modular_skyrat/modules/gunsgalore/code/guns/m16.dm index 1cdd023c80b..9251c7aee70 100644 --- a/modular_skyrat/modules/gunsgalore/code/guns/m16.dm +++ b/modular_skyrat/modules/gunsgalore/code/guns/m16.dm @@ -28,8 +28,8 @@ desc = "A double-stack translucent polymer magazine for use with the XM-2537 rifles. Holds 30 rounds of .277 Aestus." icon = 'modular_skyrat/modules/gunsgalore/icons/guns/gunsgalore_items.dmi' icon_state = "m16e" - ammo_type = /obj/item/ammo_casing/a277 - caliber = CALIBER_A277 + ammo_type = /obj/item/ammo_casing/a223 + caliber = CALIBER_A223 max_ammo = 30 multiple_sprites = AMMO_BOX_FULL_EMPTY @@ -38,8 +38,6 @@ desc = "A double-stack solid magazine that looks rather dated. Holds 20 rounds of .277 Aestus." icon = 'modular_skyrat/modules/gunsgalore/icons/guns/gunsgalore_items.dmi' icon_state = "m16" - ammo_type = /obj/item/ammo_casing/a277 - caliber = CALIBER_A277 max_ammo = 20 multiple_sprites = AMMO_BOX_FULL_EMPTY @@ -73,7 +71,5 @@ desc = "A double-stack solid polymer drum made for use with the Amans Patriae rifle. Holds 50 rounds of .277 ammo." icon = 'modular_skyrat/modules/gunsgalore/icons/guns/gunsgalore_items.dmi' icon_state = "m16" - ammo_type = /obj/item/ammo_casing/a277 - caliber = CALIBER_A277 max_ammo = 50 multiple_sprites = AMMO_BOX_FULL_EMPTY diff --git a/modular_skyrat/modules/horrorform/code/true_changeling.dm b/modular_skyrat/modules/horrorform/code/true_changeling.dm index 6bcc461aa33..bc51c730b7d 100644 --- a/modular_skyrat/modules/horrorform/code/true_changeling.dm +++ b/modular_skyrat/modules/horrorform/code/true_changeling.dm @@ -22,7 +22,6 @@ minbodytemp = 0 maxHealth = 750 //Very durable health = 500 - healable = FALSE lighting_cutoff_red = 0 lighting_cutoff_green = 35 lighting_cutoff_blue = 20 diff --git a/modular_skyrat/modules/implants/icons/internal_HA.dmi b/modular_skyrat/modules/implants/icons/internal_HA.dmi index efa4509a16b..1efa03a1c59 100644 Binary files a/modular_skyrat/modules/implants/icons/internal_HA.dmi and b/modular_skyrat/modules/implants/icons/internal_HA.dmi differ diff --git a/modular_skyrat/modules/large_doors/code/large_doors.dm b/modular_skyrat/modules/large_doors/code/large_doors.dm deleted file mode 100644 index 799968fcb8e..00000000000 --- a/modular_skyrat/modules/large_doors/code/large_doors.dm +++ /dev/null @@ -1,189 +0,0 @@ -/** - * Returns the size of the sprite in tiles. - * Takes the icon size and divides it by the world icon size (default 32). - * This gives the size of the sprite in tiles. - * - * @return size of the sprite in tiles - */ -/proc/get_size_in_tiles(obj/target) - var/icon/size_check = icon(target.icon, target.icon_state) - var/size = size_check.Width() / world.icon_size - - return size - -/obj/machinery/door/airlock - /// Whether or not the door is a multi-tile airlock. - var/multi_tile - /// A filler object used to fill the space of multi-tile airlocks. - var/obj/airlock_filler_object/filler - -/obj/machinery/door/airlock/Initialize(mapload) - . = ..() - multi_tile = get_size_in_tiles(src) > 1 - if(multi_tile) - set_bounds() - update_overlays() - -/obj/machinery/door/airlock/Move() - if(multi_tile) - set_bounds() - return ..() - -/obj/machinery/door/airlock/Destroy() - if(filler) - qdel(filler) - filler = null - return ..() - -/** - * Sets the bounds of the airlock. For use with multi-tile airlocks. - * If the airlock is multi-tile, it will set the bounds to be the size of the airlock. - * If the airlock doesn't already have a filler object, it will create one. - * If the airlock already has a filler object, it will move it to the correct location. - */ -/obj/machinery/door/airlock/proc/set_bounds() - if(!multi_tile) - return - var/size = get_size_in_tiles(src) - bound_width = (get_adjusted_dir(dir) == NORTH) ? world.icon_size : size * world.icon_size - bound_height = (get_adjusted_dir(dir) == NORTH) ? size * world.icon_size : world.icon_size - if(!filler) - filler = new(get_step(src, get_adjusted_dir(dir))) - filler.parent_airlock = src - else - filler.loc = get_step(src, get_adjusted_dir(dir)) - - filler.density = density - filler.set_opacity(opacity) - - -/** - * Checks which way the airlock is facing and adjusts the direction accordingly. - * For use with multi-tile airlocks. - * - * @param dir direction to adjust - * @return adjusted direction - */ -/obj/machinery/door/proc/get_adjusted_dir(dir) - if(dir in list(NORTH, SOUTH)) - return EAST - else - return NORTH - -/** - * Returns a list of turfs that the door occupies. - * If the door is multi-tile, it will return a list of turfs that the door occupies. - * If the door is not multi-tile, it will return only the current turf. - * - * @return list of turfs the door occupies - */ -/obj/machinery/door/airlock/proc/get_turfs() - var/turf/current_turf = get_turf(src) - if(!multi_tile) - return current_turf - var/list/occupied_turfs = list() - for(var/i in 1 to get_size_in_tiles(src)) - occupied_turfs += current_turf - current_turf = get_step(current_turf, get_adjusted_dir(dir)) - return occupied_turfs - - -/obj/machinery/door/airlock/multi_tile - multi_tile = TRUE - has_environment_lights = FALSE - -/obj/machinery/door/airlock/multi_tile/glass - name = "large glass airlock" - icon = 'modular_skyrat/modules/large_doors/icons/glass/multi_tile.dmi' - overlays_file = 'modular_skyrat/modules/large_doors/icons/glass/overlays.dmi' - opacity = FALSE - airlock_material = "glass" - glass = TRUE - assemblytype = /obj/structure/door_assembly/multi_tile/glass - -/obj/machinery/door/airlock/multi_tile/metal - name = "large airlock" - icon = 'modular_skyrat/modules/large_doors/icons/metal/multi_tile.dmi' - overlays_file = 'modular_skyrat/modules/large_doors/icons/metal/overlays.dmi' - assemblytype = /obj/structure/door_assembly/multi_tile/metal - -/obj/airlock_filler_object - name = "" - density = TRUE - opacity = TRUE - anchored = TRUE - can_atmos_pass = ATMOS_PASS_DENSITY - var/parent_airlock - -/obj/airlock_filler_object/CanAllowThrough(atom/movable/mover, turf/target) - . = ..() - if(.) - return - // Snowflake handling for PASSGLASS. - if(istype(mover) && (mover.pass_flags & PASSGLASS)) - return !opacity - -/obj/airlock_filler_object/can_be_pulled(user, grab_state, force) - return FALSE - -/obj/airlock_filler_object/singularity_act() - return - -/obj/airlock_filler_object/singularity_pull(S, current_size) - return - -/obj/airlock_filler_object/Destroy(force) - if(parent_airlock) - parent_airlock = null - return ..() - -//ASSEMBLYS! -/obj/structure/door_assembly/multi_tile - dir = EAST - /// Whether or not the assembly is for a multi-tile airlock. - var/multi_tile - -/obj/structure/door_assembly/multi_tile/Initialize(mapload) - . = ..() - multi_tile = get_size_in_tiles(src) > 1 - if(multi_tile) - set_bounds() - update_overlays() - - -/obj/structure/door_assembly/multi_tile/Move() - . = ..() - set_bounds() - - -/** - * Updates the bounds of the airlock assembly - * Sets the bounds of the airlock assembly according to the direction. - * This ensures that the bounds are always correct, even if the airlock is rotated. - */ -/obj/structure/door_assembly/multi_tile/proc/set_bounds() - var/size = get_size_in_tiles(src) - - if(dir in list(NORTH, SOUTH)) - bound_width = size * world.icon_size - bound_height = world.icon_size - else - bound_width = world.icon_size - bound_height = size * world.icon_size - - -/obj/structure/door_assembly/multi_tile/metal - name = "large airlock assembly" - base_name = "large airlock" - icon = 'modular_skyrat/modules/large_doors/icons/metal/multi_tile.dmi' - overlays_file = 'modular_skyrat/modules/large_doors/icons/metal/overlays.dmi' - airlock_type = /obj/machinery/door/airlock/multi_tile/metal - glass_type = /obj/machinery/door/airlock/multi_tile/glass - -/obj/structure/door_assembly/multi_tile/glass - name = "large glass airlock assembly" - base_name = "large glass airlock" - icon = 'modular_skyrat/modules/large_doors/icons/glass/multi_tile.dmi' - overlays_file = 'modular_skyrat/modules/large_doors/icons/glass/overlays.dmi' - airlock_type = /obj/machinery/door/airlock/multi_tile/glass - diff --git a/modular_skyrat/modules/large_doors/icons/glass/multi_tile.dmi b/modular_skyrat/modules/large_doors/icons/glass/multi_tile.dmi deleted file mode 100644 index a400cb6c61d..00000000000 Binary files a/modular_skyrat/modules/large_doors/icons/glass/multi_tile.dmi and /dev/null differ diff --git a/modular_skyrat/modules/large_doors/icons/glass/overlays.dmi b/modular_skyrat/modules/large_doors/icons/glass/overlays.dmi deleted file mode 100644 index 2f08ff85ea3..00000000000 Binary files a/modular_skyrat/modules/large_doors/icons/glass/overlays.dmi and /dev/null differ diff --git a/modular_skyrat/modules/large_doors/icons/metal/multi_tile.dmi b/modular_skyrat/modules/large_doors/icons/metal/multi_tile.dmi deleted file mode 100644 index b0b5ca2b20e..00000000000 Binary files a/modular_skyrat/modules/large_doors/icons/metal/multi_tile.dmi and /dev/null differ diff --git a/modular_skyrat/modules/large_doors/icons/metal/overlays.dmi b/modular_skyrat/modules/large_doors/icons/metal/overlays.dmi deleted file mode 100644 index a47008823b4..00000000000 Binary files a/modular_skyrat/modules/large_doors/icons/metal/overlays.dmi and /dev/null differ diff --git a/modular_skyrat/modules/large_doors/readme.md b/modular_skyrat/modules/large_doors/readme.md deleted file mode 100644 index 1717340292a..00000000000 --- a/modular_skyrat/modules/large_doors/readme.md +++ /dev/null @@ -1,26 +0,0 @@ -## Title: Large Airlocks - -MODULE ID: LARGE_DOORS - -### Description: - -Adds double doors with atmos functionality. - -### TG Proc Changes: - -- /obj/machinery/door/airlock/open() -- /obj/machinery/door/airlock/close() - -### Defines: - - -### Master file additions - - -### Included files that are not contained in this module: - -- N/A - -### Credits: -Gandalf2k15 - Original code -Eris / Tau Ceti - Sprites diff --git a/modular_skyrat/modules/liquids/code/liquid_systems/liquid_plumbers.dm b/modular_skyrat/modules/liquids/code/liquid_systems/liquid_plumbers.dm index 6d0f553e788..dd764e2c564 100644 --- a/modular_skyrat/modules/liquids/code/liquid_systems/liquid_plumbers.dm +++ b/modular_skyrat/modules/liquids/code/liquid_systems/liquid_plumbers.dm @@ -28,9 +28,6 @@ /// Floor tile is placed down var/tile_placed = FALSE - ///category for plumbing RCD - category = "Liquids" - /obj/machinery/plumbing/floor_pump/Initialize(mapload, bolt, layer) . = ..() RegisterSignal(src, COMSIG_OBJ_HIDE, PROC_REF(on_hide)) @@ -301,22 +298,41 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/plumbing/floor_pump/output/on/supply, name = "engineering plumbing constructor" desc = "A type of plumbing constructor designed to rapidly deploy the machines needed for logistics regarding fluids." icon_state = "plumberer_engi" + var/static/list/engineering_design_types = list( + //category 1 Synthesizers i.e devices which creates , reacts & destroys chemicals + "Synthesizers" = list( + /obj/machinery/plumbing/disposer = 10, + ), -/obj/item/construction/plumbing/engineering/set_plumbing_designs() - plumbing_design_types = list( - /obj/machinery/duct = 1, - /obj/machinery/plumbing/input = 5, - /obj/machinery/plumbing/output = 5, - /obj/machinery/plumbing/tank = 20, - /obj/machinery/plumbing/acclimator = 10, - /obj/machinery/plumbing/filter = 5, - /obj/machinery/plumbing/splitter = 5, - /obj/machinery/plumbing/disposer = 10, - /obj/machinery/plumbing/floor_pump/input = 20, - /obj/machinery/plumbing/floor_pump/output = 20, - /obj/structure/drain = 5, + //category 2 distributors i.e devices which inject , move around , remove chemicals from the network + "Distributors" = list( + /obj/machinery/duct = 1, + /obj/machinery/plumbing/layer_manifold = 5, + /obj/machinery/plumbing/input = 5, + /obj/machinery/plumbing/filter = 5, + /obj/machinery/plumbing/splitter = 5, + /obj/machinery/plumbing/sender = 20, + /obj/machinery/plumbing/output = 5, + ), + + //category 3 Storage i.e devices which stores & makes the processed chemicals ready for consumption + "Storage" = list( + /obj/machinery/plumbing/tank = 20, + /obj/machinery/plumbing/acclimator = 10, + ), + + //category 4 liquids + "Liquids" = list( + /obj/structure/drain = 5, + /obj/machinery/plumbing/floor_pump/input = 20, + /obj/machinery/plumbing/floor_pump/output = 20, + ), ) +/obj/item/construction/plumbing/engineering/Initialize(mapload) + . = ..() + plumbing_design_types = engineering_design_types + // Helpers for maps /obj/machinery/duct/supply duct_color = COLOR_CYAN diff --git a/modular_skyrat/modules/loadouts/loadout_items/donator/personal/donator_personal.dm b/modular_skyrat/modules/loadouts/loadout_items/donator/personal/donator_personal.dm index 705beaa83fc..d369dcbcceb 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/donator/personal/donator_personal.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/donator/personal/donator_personal.dm @@ -54,16 +54,6 @@ item_path = /obj/item/clothing/gloves/ring/hypno/bippys //ckeywhitelist = list("bippys") -/datum/loadout_item/suit/kimjacket - name = "Aerostatic Bomber Jacket" - item_path = /obj/item/clothing/suit/kimjacket - //ckeywhitelist = list("raxraus") - -/datum/loadout_item/under/jumpsuit/rax_turtleneck - name = "Black Turtleneck" - item_path = /obj/item/clothing/under/rax_turtleneck - //ckeywhitelist = list("raxraus") - /datum/loadout_item/shoes/rax_armadyne_boots name = "Tactical Boots" item_path = /obj/item/clothing/shoes/combat/rax @@ -81,16 +71,6 @@ // ckeywhitelist = list("raxraus") restricted_roles = list(JOB_BLUESHIELD, JOB_HEAD_OF_SECURITY, JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_DETECTIVE, JOB_SECURITY_MEDIC, JOB_CORRECTIONS_OFFICER) //BUBBER EDIT -/datum/loadout_item/suit/rax_aerostatic_jacket - name = "Navy Aerostatic Jacket" - item_path = /obj/item/clothing/suit/jacket/rax - //ckeywhitelist = list("raxraus") - -/datum/loadout_item/under/jumpsuit/rax_gray_turtleneck - name = "Gray Turtleneck" - item_path = /obj/item/clothing/under/rax_turtleneck_gray - //ckeywhitelist = list("raxraus") - /datum/loadout_item/head/goldengoggles name = "Steampunk Goggles" item_path = /obj/item/clothing/glasses/welding/steampunk_goggles @@ -155,7 +135,33 @@ /datum/loadout_item/mask/nightlight_mask name = "FIR-36 Rebreather" item_path = /obj/item/clothing/mask/gas/nightlight -// ckeywhitelist = list("farsightednightlight", "raxraus", "1ceres", "marcoalbaredaa", "itzshift_yt", "drifter7371", "AvianAviator", "Katty Kat", "Investigator77", "Dalao Azure", "Socialistion", "ChillyLobster", "Sylvara", "AmZee") +// ckeywhitelist = list("farsightednightlight", "raxraus", "1ceres", "marcoalbaredaa", "itzshift_yt", "drifter7371", "AvianAviator", "Katty Kat", "Investigator77", "Dalao Azure", "Socialistion", "ChillyLobster", "Sylvara", "AmZee", "Tf4", "rb303", "Kay_Nite", "whataboutism", "taac", "Halkyon", "Lupo_di_rosa", "Merek2", "lowpowermia", "RyeanBread", "Jesterz7", "Saund_Minah", "Ruediger4") + +/datum/loadout_item/mask/fir22 + name = "FIR-22 Full-Face Rebreather" + item_path = /obj/item/clothing/mask/gas/nightlight/fir22 +// ckeywhitelist = list("farsightednightlight", "raxraus", "1ceres", "marcoalbaredaa", "itzshift_yt", "drifter7371", "AvianAviator", "Katty Kat", "Investigator77", "Dalao Azure", "Socialistion", "ChillyLobster", "Sylvara", "AmZee", "Tf4", "rb303", "Kay_Nite", "whataboutism", "taac", "Halkyon", "Lupo_di_rosa", "Merek2", "lowpowermia", "RyeanBread", "Jesterz7", "Saund_Minah", "Ruediger4") + +/datum/loadout_item/head/caligram_cap_tan + name = "Caligram Tan Softcap" + item_path = /obj/item/clothing/head/caligram_cap_tan +// ckeywhitelist = list("farsightednightlight", "raxraus", "1ceres", "marcoalbaredaa", "itzshift_yt", "drifter7371", "AvianAviator", "Katty Kat", "Investigator77", "Dalao Azure", "Socialistion", "ChillyLobster", "Sylvara", "AmZee", "Tf4", "rb303", "Kay_Nite", "whataboutism", "taac", "Halkyon", "Lupo_di_rosa", "Merek2", "lowpowermia", "RyeanBread", "Jesterz7", "Saund_Minah", "Ruediger4") + +/datum/loadout_item/under/jumpsuit/caligram_fatigues_tan + name = "Caligram Tan Fatigues" + item_path = /obj/item/clothing/under/jumpsuit/caligram_fatigues_tan +// ckeywhitelist = list("farsightednightlight", "raxraus", "1ceres", "marcoalbaredaa", "itzshift_yt", "drifter7371", "AvianAviator", "Katty Kat", "Investigator77", "Dalao Azure", "Socialistion", "ChillyLobster", "Sylvara", "AmZee", "Tf4", "rb303", "Kay_Nite", "whataboutism", "taac", "Halkyon", "Lupo_di_rosa", "Merek2", "lowpowermia", "RyeanBread", "Jesterz7", "Saund_Minah", "Ruediger4") + +/datum/loadout_item/suit/caligram_parka_tan + name = "Caligram Tan Parka" + item_path = /obj/item/clothing/suit/jacket/caligram_parka_tan +// ckeywhitelist = list("farsightednightlight", "raxraus", "1ceres", "marcoalbaredaa", "itzshift_yt", "drifter7371", "AvianAviator", "Katty Kat", "Investigator77", "Dalao Azure", "Socialistion", "ChillyLobster", "Sylvara", "AmZee", "Tf4", "rb303", "Kay_Nite", "whataboutism", "taac", "Halkyon", "Lupo_di_rosa", "Merek2", "lowpowermia", "RyeanBread", "Jesterz7", "Saund_Minah", "Ruediger4") + +/datum/loadout_item/suit/caligram_parka_vest_tan + name = "Caligram Armored Tan Parka" + item_path = /obj/item/clothing/suit/armor/vest/caligram_parka_vest_tan +// ckeywhitelist = list("farsightednightlight", "raxraus", "1ceres", "marcoalbaredaa", "itzshift_yt", "drifter7371", "AvianAviator", "Katty Kat", "Investigator77", "Dalao Azure", "Socialistion", "ChillyLobster", "Sylvara", "AmZee", "Tf4", "rb303", "Kay_Nite", "whataboutism", "taac", "Halkyon", "Lupo_di_rosa", "Merek2", "lowpowermia", "RyeanBread", "Jesterz7", "Saund_Minah", "Ruediger4") + restricted_roles = list(JOB_BLUESHIELD, JOB_HEAD_OF_SECURITY, JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_DETECTIVE, JOB_CORRECTIONS_OFFICER) /datum/loadout_item/suit/brasspriest name = "Brasspriest Coat" diff --git a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_neck.dm b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_neck.dm index 9af8adabbbe..971d15be993 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_neck.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_neck.dm @@ -94,6 +94,10 @@ GLOBAL_LIST_INIT(loadout_necks, generate_loadout_items(/datum/loadout_item/neck) * NECKTIES */ +/datum/loadout_item/neck/bowtie_black + name = "Black Bowtie" + item_path = /obj/item/clothing/neck/bowtie + /datum/loadout_item/neck/necktie_black name = "Black Necktie" item_path = /obj/item/clothing/neck/tie/black 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 d52e88f58ba..2dbf870ad1d 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_suit.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_suit.dm @@ -60,24 +60,28 @@ GLOBAL_LIST_INIT(loadout_exosuits, generate_loadout_items(/datum/loadout_item/su * SUITS / SUIT JACKETS */ +/datum/loadout_item/suit/recolorable + name = "Recolorable Formal Suit Jacket" + item_path = /obj/item/clothing/suit/toggle/lawyer/greyscale + /datum/loadout_item/suit/black_suit_jacket - name = "Black Suit Jacket" + name = "Black Formal Suit Jacket" item_path = /obj/item/clothing/suit/toggle/lawyer/black /datum/loadout_item/suit/blue_suit_jacket - name = "Blue Suit Jacket" + name = "Blue Formal Suit Jacket" item_path = /obj/item/clothing/suit/toggle/lawyer /datum/loadout_item/suit/purple_suit_jacket - name = "Purple Suit Jacket" + name = "Purple Formal Suit Jacket" item_path = /obj/item/clothing/suit/toggle/lawyer/purple /datum/loadout_item/suit/white_suit_jacket - name = "White Suit Jacket" + name = "White Formal Suit Jacket" item_path = /obj/item/clothing/suit/toggle/lawyer/white /datum/loadout_item/suit/suitblackbetter - name = "Light Black Suit Jacket" + name = "Light Black Formal Suit Jacket" item_path = /obj/item/clothing/suit/toggle/lawyer/black/better /datum/loadout_item/suit/suitwhite @@ -279,20 +283,12 @@ GLOBAL_LIST_INIT(loadout_exosuits, generate_loadout_items(/datum/loadout_item/su * MISC */ -/datum/loadout_item/suit/purple_apron - name = "Purple Apron" - item_path = /obj/item/clothing/suit/apron/purple_bartender - /datum/loadout_item/suit/recolorable_apron name = "Recolorable Apron" item_path = /obj/item/clothing/suit/apron/chef/colorable_apron /datum/loadout_item/suit/recolorable_overalls name = "Recolorable Overalls" - item_path = /obj/item/clothing/suit/apron/overalls/greyscale - -/datum/loadout_item/suit/denim_overalls - name = "Denim Overalls" item_path = /obj/item/clothing/suit/apron/overalls /datum/loadout_item/suit/redhood @@ -617,6 +613,16 @@ GLOBAL_LIST_INIT(loadout_exosuits, generate_loadout_items(/datum/loadout_item/su item_path = /obj/item/clothing/suit/gorka/supply restricted_roles = list(JOB_QUARTERMASTER, JOB_CARGO_TECHNICIAN, JOB_SHAFT_MINER, JOB_CUSTOMS_AGENT) +/datum/loadout_item/suit/cargo_gorka_jacket + name = "Cargo Gorka Jacket" + item_path = /obj/item/clothing/suit/toggle/cargo_tech + restricted_roles = list(JOB_QUARTERMASTER, JOB_CARGO_TECHNICIAN, JOB_SHAFT_MINER, JOB_CUSTOMS_AGENT) + +/datum/loadout_item/suit/qm_jacket + name = "Quartermaster's Overcoat" + item_path = /obj/item/clothing/suit/jacket/quartermaster + restricted_roles = list(JOB_QUARTERMASTER) + // LABCOATS /datum/loadout_item/suit/labcoat_highvis name = "High-Vis Labcoat" diff --git a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_toys.dm b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_toys.dm index 3612176a7be..03dc535ea33 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_toys.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_toys.dm @@ -253,10 +253,6 @@ GLOBAL_LIST_INIT(loadout_toys, generate_loadout_items(/datum/loadout_item/toys)) name = "Creature Plushie" item_path = /obj/item/toy/plush/skyrat/tracy -/datum/loadout_item/toys/dog_plushie - name = "Black Dog Plushie" - item_path = /obj/item/toy/plush/skyrat/dog - /datum/loadout_item/toys/adventurous_synth name = "Adventurous Synth Plushie" item_path = /obj/item/toy/plush/skyrat/plushie_synthia diff --git a/modular_skyrat/modules/loadouts/loadout_items/under/donator.dm b/modular_skyrat/modules/loadouts/loadout_items/under/donator.dm index 2b5c313aab4..da5fb6bbd22 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/under/donator.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/under/donator.dm @@ -7,7 +7,7 @@ /datum/loadout_item/under/jumpsuit/donator/enclaveofficer name = "Enclave - Officer" - item_path = /obj/item/clothing/under/syndicate/skyrat/enclaveo + item_path = /obj/item/clothing/under/syndicate/skyrat/enclave/officer /datum/loadout_item/under/jumpsuit/donator/blondie name = "Blonde Cowboy Uniform" 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 e875ca24b69..0ae7470aa69 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 @@ -573,6 +573,11 @@ GLOBAL_LIST_INIT(loadout_miscunders, generate_loadout_items(/datum/loadout_item/ item_path = /obj/item/clothing/under/rank/cargo/tech/skyrat/casualman restricted_roles = list(JOB_CARGO_TECHNICIAN) +/datum/loadout_item/under/miscellaneous/cargo_shorts + name = "Cargo Tech Shorts" + item_path = /obj/item/clothing/under/rank/cargo/tech/alt + restricted_roles = list(JOB_CARGO_TECHNICIAN) + /datum/loadout_item/under/miscellaneous/cargo_black name = "Black Cargo Uniform" item_path = /obj/item/clothing/under/rank/cargo/tech/skyrat/evil @@ -658,11 +663,11 @@ GLOBAL_LIST_INIT(loadout_miscunders, generate_loadout_items(/datum/loadout_item/ item_path = /obj/item/clothing/under/rank/civilian/lawyer/black/skirt /datum/loadout_item/under/formal/blue_suit - name = "Blue Suit" + name = "Blue Buttondown Suit" item_path = /obj/item/clothing/under/rank/civilian/lawyer/bluesuit /datum/loadout_item/under/formal/blue_suitskirt - name = "Blue Suitskirt" + name = "Blue Buttondown Suitskirt" item_path = /obj/item/clothing/under/rank/civilian/lawyer/bluesuit/skirt /datum/loadout_item/under/formal/blue_lawyer_suit diff --git a/modular_skyrat/modules/loadouts/loadout_ui/loadout_outfit_helpers.dm b/modular_skyrat/modules/loadouts/loadout_ui/loadout_outfit_helpers.dm index fc75d9688f1..9c5b53ebada 100644 --- a/modular_skyrat/modules/loadouts/loadout_ui/loadout_outfit_helpers.dm +++ b/modular_skyrat/modules/loadouts/loadout_ui/loadout_outfit_helpers.dm @@ -4,6 +4,10 @@ /datum/outfit/player_loadout name = "Player Loadout" +/datum/outfit/player_loadout/equip(mob/living/carbon/human/user, visualsOnly) + . = ..() + user.equip_outfit_and_loadout(new /datum/outfit(), user.client.prefs) + /* * Actually equip our mob with our job outfit and our loadout items. * Loadout items override the pre-existing item in the corresponding slot of the job outfit. diff --git a/modular_skyrat/modules/manufacturer_examine/code/gun_company_additions.dm b/modular_skyrat/modules/manufacturer_examine/code/gun_company_additions.dm index 70bf3bb205b..fb52206891e 100644 --- a/modular_skyrat/modules/manufacturer_examine/code/gun_company_additions.dm +++ b/modular_skyrat/modules/manufacturer_examine/code/gun_company_additions.dm @@ -7,12 +7,24 @@ /obj/item/gun/ballistic/automatic/pistol/aps/give_manufacturer_examine() AddElement(/datum/element/manufacturer_examine, COMPANY_SCARBOROUGH) +/obj/item/gun/ballistic/rifle/boltaction/give_manufacturer_examine() + AddElement(/datum/element/manufacturer_examine, COMPANY_SAKHNO) + +/obj/item/gun/ballistic/rifle/boltaction/prime/give_manufacturer_examine() + AddElement(/datum/element/manufacturer_examine, COMPANY_XHIHAO) + +/obj/item/gun/ballistic/rifle/boltaction/pipegun/give_manufacturer_examine() + return + +/obj/item/gun/ballistic/rifle/boltaction/harpoon/give_manufacturer_examine() + return + +/obj/item/gun/ballistic/rifle/boltaction/lionhunter/give_manufacturer_examine() + return + /obj/item/gun/ballistic/revolver/give_manufacturer_examine() AddElement(/datum/element/manufacturer_examine, COMPANY_SCARBOROUGH) -/obj/item/gun/ballistic/rifle/boltaction/give_manufacturer_examine() - AddElement(/datum/element/manufacturer_examine, COMPANY_IZHEVSK) - /obj/item/gun/ballistic/shotgun/riot/give_manufacturer_examine() AddElement(/datum/element/manufacturer_examine, COMPANY_NANOTRASEN) @@ -37,15 +49,6 @@ /obj/item/gun/ballistic/shotgun/toy/give_manufacturer_examine() AddElement(/datum/element/manufacturer_examine, COMPANY_DONK) -/obj/item/gun/ballistic/rifle/boltaction/sporterized/give_manufacturer_examine() - return - -/obj/item/gun/ballistic/rifle/boltaction/prime/give_manufacturer_examine() - return - -/obj/item/gun/ballistic/rifle/boltaction/pipegun/give_manufacturer_examine() - return - /obj/item/gun/ballistic/automatic/c20r/toy/give_manufacturer_examine() AddElement(/datum/element/manufacturer_examine, COMPANY_DONK) diff --git a/modular_skyrat/modules/mapping/code/holocall.dm b/modular_skyrat/modules/mapping/code/holocall.dm index 3dcfc16f542..9c2da80641f 100644 --- a/modular_skyrat/modules/mapping/code/holocall.dm +++ b/modular_skyrat/modules/mapping/code/holocall.dm @@ -1,6 +1,6 @@ //Custom Holoimages// /datum/preset_holoimage/spider - nonhuman_mobtype = /mob/living/basic/giant_spider + nonhuman_mobtype = /mob/living/basic/spider/giant/ //Custom Holodisks// /obj/item/disk/holodisk/woospider //No special markings on this disk, should be a fun maint loot surprise. diff --git a/modular_skyrat/modules/mapping/code/interlink_helper.dm b/modular_skyrat/modules/mapping/code/interlink_helper.dm new file mode 100644 index 00000000000..4d173e0f32f --- /dev/null +++ b/modular_skyrat/modules/mapping/code/interlink_helper.dm @@ -0,0 +1,16 @@ +/// A file to help with making it possible to load the Interlink *modularly* instead of leaving it stuck in Z-2 where station should be and spawning all manner of bad behaviour. +#define INIT_ANNOUNCE(X) to_chat(world, span_boldannounce("[X]")); log_world(X) + +/datum/controller/subsystem/mapping/loadWorld() + . = ..() + var/list/FailedZsRat = list() + LoadGroup(FailedZsRat, "The Interlink", "map_files/generic", "CentCom_skyrat_z2.dmm", default_traits = ZTRAITS_CENTCOM) + if(LAZYLEN(FailedZsRat)) //but seriously, unless the server's filesystem is messed up this will never happen + var/msg = "RED ALERT! The following map files failed to load: [FailedZsRat[1]]" + if(FailedZsRat.len > 1) + for(var/I in 2 to FailedZsRat.len) + msg += ", [FailedZsRat[I]]" + msg += ". Yell at your server host!" + INIT_ANNOUNCE(msg) + +#undef INIT_ANNOUNCE diff --git a/modular_skyrat/modules/mapping/code/lockers/cargodiselost/cargodiselockers.dm b/modular_skyrat/modules/mapping/code/lockers/cargodiselost/cargodiselockers.dm index 838fca7db3a..00c5d6e8b62 100644 --- a/modular_skyrat/modules/mapping/code/lockers/cargodiselost/cargodiselockers.dm +++ b/modular_skyrat/modules/mapping/code/lockers/cargodiselost/cargodiselockers.dm @@ -17,16 +17,16 @@ new /obj/item/ammo_box/magazine/akm(src) new /obj/item/ammo_box/magazine/multi_sprite/makarov(src) new /obj/item/ammo_box/magazine/multi_sprite/makarov(src) - new /obj/item/ammo_box/a762(src) - new /obj/item/ammo_box/a762(src) - new /obj/item/ammo_box/a762(src) - new /obj/item/ammo_box/a762(src) + new /obj/item/ammo_box/strilka310(src) + new /obj/item/ammo_box/strilka310(src) + new /obj/item/ammo_box/strilka310(src) + new /obj/item/ammo_box/strilka310(src) /obj/structure/closet/secure_closet/personal/cabinet/freighterboss/PopulateContents() . = ..() new /obj/item/gun/ballistic/automatic/cfa_rifle(src) - new /obj/item/storage/bag/ammo(src) + new /obj/item/storage/pouch/ammo(src) new /obj/item/clothing/suit/armor/bulletproof(src) new /obj/item/storage/belt/utility/syndicate(src) new /obj/item/gps/mining(src) diff --git a/modular_skyrat/modules/mapping/code/lockers/interdyne_fob/cargo.dm b/modular_skyrat/modules/mapping/code/lockers/interdyne_fob/cargo.dm index 16b20d080f4..8c039cc0de1 100644 --- a/modular_skyrat/modules/mapping/code/lockers/interdyne_fob/cargo.dm +++ b/modular_skyrat/modules/mapping/code/lockers/interdyne_fob/cargo.dm @@ -10,11 +10,16 @@ /obj/structure/closet/secure_closet/interdynefob/mining_locker/PopulateContents() ..() - new /obj/item/gun/energy/recharge/kinetic_accelerator(src) new /obj/item/storage/bag/ore(src) new /obj/item/mining_scanner(src) new /obj/item/storage/belt/mining/alt(src) new /obj/item/clothing/under/syndicate/skyrat/overalls(src) new /obj/item/storage/backpack/satchel/explorer(src) new /obj/item/storage/backpack/explorer(src) + new /obj/item/storage/backpack/messenger/explorer(src) new /obj/item/clothing/accessory/armband/cargo/syndicate(src) + +/obj/structure/closet/secure_closet/interdynefob/mining_locker/populate_contents_immediate() + . = ..() + + new /obj/item/gun/energy/recharge/kinetic_accelerator(src) diff --git a/modular_skyrat/modules/mapping/code/shuttles.dm b/modular_skyrat/modules/mapping/code/shuttles.dm index 999266ed676..9f5293d9a1d 100644 --- a/modular_skyrat/modules/mapping/code/shuttles.dm +++ b/modular_skyrat/modules/mapping/code/shuttles.dm @@ -9,6 +9,7 @@ description = "The perfect shuttle for rectangle enthuasiasts, this long and slender shuttle has been known for it's incredible(Citation Needed) safety rating." admin_notes = "Has airlocks on both sides of the shuttle and will probably ram deltastation's maint wing below medical. Oh well?" credit_cost = CARGO_CRATE_VALUE * 4 + occupancy_limit = 45 /*----- Black Market Shuttle Datum + related code -----*/ /datum/map_template/shuttle/ruin/blackmarket_chevvy @@ -119,7 +120,7 @@ back = /obj/item/storage/backpack implants = list(/obj/item/implant/weapons_auth) belt = /obj/item/storage/belt/military - r_pocket = /obj/item/storage/bag/ammo + r_pocket = /obj/item/storage/pouch/ammo l_pocket = /obj/item/gun/energy/disabler/bolt_disabler id = /obj/item/card/id/advanced/chameleon id_trim = /datum/id_trim/chameleon/operative @@ -149,7 +150,7 @@ back = /obj/item/storage/backpack implants = list(/obj/item/implant/weapons_auth) belt = /obj/item/storage/belt/military - r_pocket = /obj/item/storage/bag/ammo + r_pocket = /obj/item/storage/pouch/ammo l_pocket = /obj/item/gun/energy/disabler/bolt_disabler id = /obj/item/card/id/advanced/chameleon id_trim = /datum/id_trim/chameleon/operative diff --git a/modular_skyrat/modules/medical/code/bodypart.dm b/modular_skyrat/modules/medical/code/bodypart.dm index 6b77decd5df..60a695f59ef 100644 --- a/modular_skyrat/modules/medical/code/bodypart.dm +++ b/modular_skyrat/modules/medical/code/bodypart.dm @@ -4,7 +4,7 @@ current_gauze = new new_gauze.gauze_type(src) new_gauze.use(1) -/obj/item/bodypart/proc/apply_splint(obj/item/stack/medical/splint/new_splint) +/obj/item/bodypart/proc/apply_splint(obj/item/stack/medical/gauze/new_splint) if(!istype(new_splint) || current_splint) return current_splint = new new_splint.splint_type(src) diff --git a/modular_skyrat/modules/medical/code/bodypart_aid.dm b/modular_skyrat/modules/medical/code/bodypart_aid.dm index 43dfbbc323f..e5b3b13ceaa 100644 --- a/modular_skyrat/modules/medical/code/bodypart_aid.dm +++ b/modular_skyrat/modules/medical/code/bodypart_aid.dm @@ -96,7 +96,7 @@ name = "splint" overlay_prefix = "splint" desc_prefix = "fastened" - stack_to_drop = /obj/item/stack/medical/splint + stack_to_drop = /obj/item/stack/medical/gauze /// How effective are we in keeping the bodypart rigid var/splint_factor = 0.3 /// Whether the splint prevents the limb from being disabled, with a ruptured tendon or a shattered bone @@ -133,15 +133,9 @@ name = "improvised splint" splint_factor = 0.6 helps_disabled= FALSE - stack_to_drop = /obj/item/stack/medical/splint/improvised + stack_to_drop = /obj/item/stack/medical/gauze/improvised overlay_prefix = "splint_improv" -/datum/bodypart_aid/splint/tribal - name = "tribal splint" - splint_factor = 0.5 - stack_to_drop = /obj/item/stack/medical/splint/tribal - overlay_prefix = "splint_tribal" - /datum/bodypart_aid/gauze name = "gauze" stack_to_drop = /obj/item/stack/medical/gauze @@ -163,6 +157,8 @@ /datum/bodypart_aid/gauze/get_description() var/desc switch(absorption_capacity) + if(-INFINITY to 0) + desc = "unusable" if(0 to 1.25) desc = "nearly ruined" if(1.25 to 2.75) diff --git a/modular_skyrat/modules/medical/code/carbon_examine.dm b/modular_skyrat/modules/medical/code/carbon_examine.dm index 6bd81874bc3..aab30138184 100644 --- a/modular_skyrat/modules/medical/code/carbon_examine.dm +++ b/modular_skyrat/modules/medical/code/carbon_examine.dm @@ -53,7 +53,7 @@ msg += "\t[t_His] [LB.name] is [current_gauze.desc_prefix] with [current_gauze.get_description()]." if(LB.current_splint) var/datum/bodypart_aid/current_splint = LB.current_splint - msg += "\t[t_His] [LB.name] is [current_splint.desc_prefix] with [current_splint.get_description()]." + msg += "\t[t_His] [LB.name] is [current_splint.desc_prefix] with a [current_splint.get_description()]." if(!any_bodypart_damage) msg += "\t[t_He] [t_Has] no significantly damaged bodyparts." diff --git a/modular_skyrat/modules/medical/code/crafting_recipes.dm b/modular_skyrat/modules/medical/code/crafting_recipes.dm deleted file mode 100644 index 201c69492f1..00000000000 --- a/modular_skyrat/modules/medical/code/crafting_recipes.dm +++ /dev/null @@ -1,14 +0,0 @@ -/datum/crafting_recipe/tribalsplint - name = "Tribal Splint" - result = /obj/item/stack/medical/splint/tribal - time = 30 - reqs = list(/obj/item/stack/sheet/bone = 2, - /obj/item/stack/sheet/sinew = 1) - category = CAT_MISC - -/datum/crafting_recipe/improvsplint - name = "Improvised Splint" - result = /obj/item/stack/medical/splint/improvised - time = 30 - reqs = list(/obj/item/stack/sheet/mineral/wood = 2, /obj/item/stack/sheet/cloth = 2) - category = CAT_MISC diff --git a/modular_skyrat/modules/medical/code/medical_stacks.dm b/modular_skyrat/modules/medical/code/medical_stacks.dm new file mode 100644 index 00000000000..35b2ff1b1f9 --- /dev/null +++ b/modular_skyrat/modules/medical/code/medical_stacks.dm @@ -0,0 +1,65 @@ +/obj/item/stack/medical/gauze + var/gauze_type = /datum/bodypart_aid/gauze + var/splint_type = /datum/bodypart_aid/splint + +/obj/item/stack/medical/gauze/improvised + gauze_type = /datum/bodypart_aid/gauze/improvised + splint_type = /datum/bodypart_aid/splint/improvised + +// gauze is only relevant for wounds, which are handled in the wounds themselves +/obj/item/stack/medical/gauze/try_heal(mob/living/patient, mob/user, silent) + + var/treatment_delay = (user == patient ? self_delay : other_delay) + + var/obj/item/bodypart/limb = patient.get_bodypart(check_zone(user.zone_selected)) + if(!limb) + patient.balloon_alert(user, "missing limb!") + return + if(!LAZYLEN(limb.wounds)) + patient.balloon_alert(user, "no wounds!") // good problem to have imo + return + + var/gauzeable_wound = FALSE + var/splintable_wound = FALSE + var/datum/wound/woundies + for(var/i in limb.wounds) + woundies = i + if(woundies.wound_flags & (ACCEPTS_GAUZE | ACCEPTS_SPLINT)) + if(woundies.wound_flags & ACCEPTS_GAUZE) + gauzeable_wound = TRUE + continue + if(woundies.wound_flags & ACCEPTS_SPLINT) + splintable_wound = TRUE + continue + if(!gauzeable_wound && !splintable_wound) + patient.balloon_alert(user, "can't heal those!") + return + + if(limb.current_gauze && gauzeable_wound) + gauzeable_wound = FALSE + if(limb.current_splint && splintable_wound) + splintable_wound = FALSE + if(!gauzeable_wound && !splintable_wound) + balloon_alert(user, "already bandaged!") + return + + if(HAS_TRAIT(woundies, TRAIT_WOUND_SCANNED)) + treatment_delay *= 0.5 + if(user == patient) + user.visible_message(span_warning("[user] begins expertly [gauzeable_wound ? "wrapping the wounds on their [limb.plaintext_zone]" : "splinting their [limb.plaintext_zone]"] with [src]..."), span_notice("You keep in mind the indications from the holo-image about your injury, and expertly begin [gauzeable_wound ? "wrapping your wounds" : "splinting your [limb.plaintext_zone]"] with [src].")) + else + user.visible_message(span_warning("[user] begins expertly [gauzeable_wound ? "wrapping the wounds on [patient]'s [limb.plaintext_zone]" : "splinting [patient]'s [limb.plaintext_zone]"] with [src]..."), span_warning("You begin quickly [gauzeable_wound ? "wrapping the wounds on [patient]'s [limb.plaintext_zone]" : "splinting [patient]'s [limb.plaintext_zone]"] with [src], keeping the holo-image indications in mind...")) + else + user.visible_message(span_warning("[user] begins [gauzeable_wound ? "wrapping the wounds on [patient]'s [limb.plaintext_zone]" : "splinting [patient]'s [limb.plaintext_zone]"] with [src]..."), span_warning("You begin [gauzeable_wound ? "wrapping the wounds on" : "splinting"] [user == patient ? "your" : "[patient]'s"] [limb.plaintext_zone] with [src]...")) + + if(!do_after(user, treatment_delay, target = patient)) + return + + user.visible_message("[user] [gauzeable_wound ? "wraps the wounds on" : "splints"] [user == patient ? "[user.p_their()]" : "[patient]'s"] [limb.plaintext_zone] with [src].", "You [gauzeable_wound ? "wrap the wounds on" : "splint"] [user == patient ? "your" : "[patient]'s"] [limb.plaintext_zone].") + if(gauzeable_wound) + limb.apply_gauze(src) + return + if(splintable_wound) + limb.apply_splint(src) + return + diff --git a/modular_skyrat/modules/medical/code/splint.dm b/modular_skyrat/modules/medical/code/splint.dm deleted file mode 100644 index b2ace8180fe..00000000000 --- a/modular_skyrat/modules/medical/code/splint.dm +++ /dev/null @@ -1,66 +0,0 @@ -/obj/item/stack/medical/splint - name = "medical splint" - desc = "Medical splints, designed to fastened a limb with ease, perfect for stabilizing broken bones and torn muscles. " - gender = PLURAL - singular_name = "medical splint" - icon_state = "splint" - icon = 'modular_skyrat/modules/medical/icons/stack_medical.dmi' - self_delay = 5 SECONDS - other_delay = 2 SECONDS - max_amount = 12 - amount = 6 - grind_results = list(/datum/reagent/carbon = 2) - custom_price = PAYCHECK_LOWER * 2 - merge_type = /obj/item/stack/medical/splint - var/splint_type = /datum/bodypart_aid/splint - -/obj/item/stack/medical/splint/try_heal(mob/living/M, mob/user, silent) - var/obj/item/bodypart/limb = M.get_bodypart(check_zone(user.zone_selected)) - if(!limb) - to_chat(user, span_notice("There's nothing there to bandage!")) - return - if(!LAZYLEN(limb.wounds)) - to_chat(user, span_notice("There's no wounds that require bandaging on [user==M ? "your" : "[M]'s"] [limb.name]!")) // good problem to have imo - return - - var/splintable_wound = FALSE - for(var/i in limb.wounds) - var/datum/wound/woundies = i - if(woundies.wound_flags & ACCEPTS_SPLINT) - splintable_wound = TRUE - break - if(!splintable_wound) - to_chat(user, span_notice("There's no wounds that require splinting on [user==M ? "your" : "[M]'s"] [limb.name]!")) // good problem to have imo - return - - if(limb.current_splint) - to_chat(user, span_warning("[user==M ? "Your" : "[M]'s"] [limb.name] is already fastened in a splint!")) - return - - user.visible_message(span_warning("[user] begins fastening [M]'s [limb.name] with [src]..."), span_warning("You begin to fasten [user == M ? "your" : "[M]'s"] [limb.name] with [src]...")) - if(!do_after(user, (user == M ? self_delay : other_delay), target=M)) - return - - user.visible_message(span_green("[user] applies [src] to [M]'s [limb.name]."), span_green("You splint [user == M ? "your" : "[M]'s"] [limb.name].")) - limb.apply_splint(src) - -/obj/item/stack/medical/splint/twelve - amount = 12 - -/obj/item/stack/medical/splint/tribal - name = "tribal splint" - desc = "Bone fastened with sinew, used to keep injured limbs rigid, surprisingly effective." - singular_name = "tribal splint" - icon_state = "splint_tribal" - amount = 1 - splint_type = /datum/bodypart_aid/splint/tribal - merge_type = /obj/item/stack/medical/splint/tribal - -/obj/item/stack/medical/splint/improvised - name = "improvised splint" - desc = "Crudely made out splints with wood and some cotton sling, you doubt this will be any good." - singular_name = "improvised splint" - icon_state = "splint_improv" - amount = 1 - splint_type = /datum/bodypart_aid/splint/improvised - merge_type = /obj/item/stack/medical/splint/improvised diff --git a/modular_skyrat/modules/medical/code/wounds/bones.dm b/modular_skyrat/modules/medical/code/wounds/bones.dm index d31a3fe932f..089e289e3d8 100644 --- a/modular_skyrat/modules/medical/code/wounds/bones.dm +++ b/modular_skyrat/modules/medical/code/wounds/bones.dm @@ -450,3 +450,6 @@ else if(limb.body_zone == BODY_ZONE_CHEST && victim.blood_volume) . += "Ribcage Trauma Detected: Further trauma to chest is likely to worsen internal bleeding until bone is repaired." . += "" + +/datum/wound/blunt/get_limb_examine_description() + return span_warning("The bones in this limb appear badly cracked.") diff --git a/modular_skyrat/modules/medical/code/wounds/burns.dm b/modular_skyrat/modules/medical/code/wounds/burns.dm index 00944a8ec7d..45eb0f2b7dc 100644 --- a/modular_skyrat/modules/medical/code/wounds/burns.dm +++ b/modular_skyrat/modules/medical/code/wounds/burns.dm @@ -43,7 +43,7 @@ if(victim.reagents) if(victim.reagents.has_reagent(/datum/reagent/medicine/spaceacillin)) sanitization += 0.9 - if(victim.reagents.has_reagent(/datum/reagent/space_cleaner/sterilizine/)) + if(victim.reagents.has_reagent(/datum/reagent/space_cleaner/sterilizine)) sanitization += 0.9 if(victim.reagents.has_reagent(/datum/reagent/medicine/mine_salve)) sanitization += 0.3 @@ -175,12 +175,15 @@ if(WOUND_INFECTION_SEPTIC to INFINITY) . += "Infection Level: LOSS IMMINENT\n" if(infestation > sanitization) - . += "\tSurgical debridement, antiobiotics/sterilizers, or regenerative mesh will rid infection. Paramedic UV penlights are also effective.\n" + . += "\tSurgical debridement, antibiotics/sterilizers, or regenerative mesh will rid infection. Paramedic UV penlights are also effective.\n" if(flesh_damage > 0) . += "Flesh damage detected: Application of ointment, regenerative mesh, Synthflesh, or ingestion of \"Miner's Salve\" will repair damaged flesh. Good nutrition, rest, and keeping the wound clean can also slowly repair flesh.\n" . += "" +/datum/wound/burn/get_limb_examine_description() + return span_warning("The flesh on this limb appears badly cooked.") + /* new burn common procs */ @@ -296,3 +299,13 @@ desc = "Patient is suffering extreme burns from a strange brand marking, creating serious risk of infection and greatly reduced limb integrity." examine_desc = "appears to have holy symbols painfully branded into their flesh, leaving severe burns." occur_text = "chars rapidly into a strange pattern of holy symbols, burned into the flesh." + +/// special severe wound caused by the cursed slot machine. +/datum/wound/burn/severe/cursed_brand + name = "Ancient Brand" + desc = "Patient is suffering extreme burns with oddly ornate brand markings, creating serious risk of infection and greatly reduced limb integrity." + examine_desc = "appears to have ornate symbols painfully branded into their flesh, leaving severe burns" + occur_text = "chars rapidly into a pattern that can only be described as an agglomeration of several financial symbols, burned into the flesh" + +/datum/wound/burn/severe/cursed_brand/get_limb_examine_description() + return span_warning("The flesh on this limb has several ornate symbols burned into it, with pitting throughout.") diff --git a/modular_skyrat/modules/medical/code/wounds/pierce.dm b/modular_skyrat/modules/medical/code/wounds/pierce.dm index 47e1e012187..c41855402d0 100644 --- a/modular_skyrat/modules/medical/code/wounds/pierce.dm +++ b/modular_skyrat/modules/medical/code/wounds/pierce.dm @@ -193,3 +193,6 @@ status_effect_type = /datum/status_effect/wound/pierce/critical scar_keyword = "piercecritical" wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE | MANGLES_FLESH) + +/datum/wound/pierce/get_limb_examine_description() + return span_warning("The flesh on this limb appears badly perforated.") diff --git a/modular_skyrat/modules/medical/code/wounds/slash.dm b/modular_skyrat/modules/medical/code/wounds/slash.dm index f3e56e13458..345381ac503 100644 --- a/modular_skyrat/modules/medical/code/wounds/slash.dm +++ b/modular_skyrat/modules/medical/code/wounds/slash.dm @@ -319,3 +319,6 @@ /datum/wound/slash/critical/cleave/update_descriptions() if(no_bleeding) occur_text = "is ruptured" + +/datum/wound/slash/get_limb_examine_description() + return span_warning("The flesh on this limb appears badly lacerated.") diff --git a/modular_skyrat/modules/medical/icons/stack_medical.dmi b/modular_skyrat/modules/medical/icons/stack_medical.dmi deleted file mode 100644 index 673a746fab9..00000000000 Binary files a/modular_skyrat/modules/medical/icons/stack_medical.dmi and /dev/null differ diff --git a/modular_skyrat/modules/mentor/code/client_procs.dm b/modular_skyrat/modules/mentor/code/client_procs.dm index 5d68874444f..af6ecae38e4 100644 --- a/modular_skyrat/modules/mentor/code/client_procs.dm +++ b/modular_skyrat/modules/mentor/code/client_procs.dm @@ -5,6 +5,7 @@ /client/Destroy() if(GLOB.mentors[src]) GLOB.mentors -= src + return ..() /client/proc/mentor_client_procs(href_list) @@ -29,17 +30,20 @@ mentor_unfollow() return TRUE -/client/proc/mentor_datum_set(admin) +/client/proc/mentor_datum_set() mentor_datum = GLOB.mentor_datums[ckey] - if(!mentor_datum && check_rights_for(src, R_ADMIN,0)) // admin with no mentor datum?let's fix that + if(!mentor_datum && is_admin(src)) // admin with no mentor datum? let's fix that new /datum/mentors(ckey) + if(mentor_datum) mentor_datum.owner = src GLOB.mentors[src] = TRUE add_mentor_verbs() - if(check_rights_for(src, R_ADMIN,0) && prefs.read_preference(/datum/preference/toggle/admin/auto_dementor)) + + if(check_rights_for(src, R_ADMIN) && prefs.read_preference(/datum/preference/toggle/admin/auto_dementor)) cmd_mentor_dementor() + /client/proc/is_mentor() // admins are mentors too. - if(mentor_datum || check_rights_for(src, R_ADMIN,0)) + if(mentor_datum || check_rights_for(src, R_ADMIN)) return TRUE diff --git a/modular_skyrat/modules/mentor/code/config.dm b/modular_skyrat/modules/mentor/code/config.dm deleted file mode 100644 index a1d1053796a..00000000000 --- a/modular_skyrat/modules/mentor/code/config.dm +++ /dev/null @@ -1,8 +0,0 @@ -/datum/configuration - var/mentors_mobname_only = FALSE // Only display mob name to mentors in mentorhelps - var/mentor_legacy_system = FALSE // Whether to use the legacy mentor system (flat file) instead of SQL - -/datum/config_entry/flag/mentors_mobname_only - -/datum/config_entry/flag/mentor_legacy_system //Defines whether the server uses the legacy mentor system with mentors.txt or the SQL system - protection = CONFIG_ENTRY_LOCKED diff --git a/modular_skyrat/modules/mentor/code/mentor.dm b/modular_skyrat/modules/mentor/code/mentor.dm index ede24dccaae..f6bd03f3823 100644 --- a/modular_skyrat/modules/mentor/code/mentor.dm +++ b/modular_skyrat/modules/mentor/code/mentor.dm @@ -1,13 +1,9 @@ -#define SKYRAT_MENTOR_CONFIG_FILE "[global.config.directory]/skyrat/mentors.txt" - GLOBAL_LIST_EMPTY(mentor_datums) GLOBAL_PROTECT(mentor_datums) GLOBAL_VAR_INIT(mentor_href_token, GenerateToken()) GLOBAL_PROTECT(mentor_href_token) -//#define SKYRAT_MENTOR_CONFIG_FILE "[global.config.directory]/skyrat/mentors.txt" - /datum/mentors var/name = "someone's mentor datum" var/client/owner // the actual mentor, client type @@ -70,64 +66,7 @@ GLOBAL_PROTECT(mentor_href_token) /proc/MentorHrefToken(forceGlobal = FALSE) return "mentor_token=[RawMentorHrefToken(forceGlobal)]" -/proc/load_mentors() - usr = null - GLOB.mentor_datums.Cut() - for(var/it as anything in GLOB.mentors) - var/client/C = it - C.remove_mentor_verbs() - C.mentor_datum = null - GLOB.mentors.Cut() - //if(CONFIG_GET(flag/mentor_legacy_system))//legacy - var/list/lines = world.file2list(SKYRAT_MENTOR_CONFIG_FILE) - for(var/line in lines) - if(!length(line)) - continue - if(findtextEx(line, "#", 1, 2)) - continue - new /datum/mentors(line) - /*else//Database - if(!SSdbcore.Connect()) - log_world("Failed to connect to database in load_mentors(). Reverting to legacy system.") - WRITE_FILE(GLOB.world_game_log, "Failed to connect to database in load_mentors(). Reverting to legacy system.") - CONFIG_SET(flag/mentor_legacy_system, TRUE) - load_mentors() - return - var/datum/DBQuery/query_load_mentors = SSdbcore.NewQuery("SELECT ckey FROM [format_table_name("mentor")]") - if(!query_load_mentors.Execute()) - return - while(query_load_mentors.NextRow()) - var/ckey = ckey(query_load_mentors.item[1]) - new /datum/mentors(ckey)*/ -/// Proc to save the current mentor list into the config, overwriting it. -/proc/save_mentors() - usr = null - var/mentor_list = "" - - // This whole mess is just to create a cache of all the mentors that were in the config already - // so that we don't add every admin to the list, which would be a pain to maintain afterwards. - var/list/existing_mentor_config = world.file2list(SKYRAT_MENTOR_CONFIG_FILE) - var/list/existing_mentors = list() - for(var/line in existing_mentor_config) - if(!length(line)) - continue - if(findtextEx(line, "#", 1, 2)) - continue - var/existing_mentor = ckey(line) - if(!existing_mentor) - continue - existing_mentors[existing_mentor] = TRUE - - for(var/mentor as anything in GLOB.mentor_datums) - // We're doing this check to not add admins to the file, as explained above. - if(existing_mentors[mentor] == TRUE) - mentor_list += mentor + "\n" - rustg_file_write(mentor_list, SKYRAT_MENTOR_CONFIG_FILE) - - -// new client var: mentor_datum. Acts the same way holder does towards admin: it holds the mentor datum. if set, the guy's a mentor. /client + /// Acts the same way holder does towards admin: it holds the mentor datum. if set, the guy's a mentor. var/datum/mentors/mentor_datum - -#undef SKYRAT_MENTOR_CONFIG_FILE diff --git a/modular_skyrat/modules/mentor/code/mentor_verbs.dm b/modular_skyrat/modules/mentor/code/mentor_verbs.dm index 5989c3b12e6..1852dee4c8c 100644 --- a/modular_skyrat/modules/mentor/code/mentor_verbs.dm +++ b/modular_skyrat/modules/mentor/code/mentor_verbs.dm @@ -6,7 +6,7 @@ GLOBAL_PROTECT(mentor_verbs) /client/proc/add_mentor_verbs() if(mentor_datum) - add_verb(src,GLOB.mentor_verbs) + add_verb(src, GLOB.mentor_verbs) /client/proc/remove_mentor_verbs() - remove_verb(src,GLOB.mentor_verbs) + remove_verb(src, GLOB.mentor_verbs) diff --git a/modular_skyrat/modules/microfusion/code/gun_types.dm b/modular_skyrat/modules/microfusion/code/gun_types.dm index 8177e30ca6b..24a1eeed053 100644 --- a/modular_skyrat/modules/microfusion/code/gun_types.dm +++ b/modular_skyrat/modules/microfusion/code/gun_types.dm @@ -37,7 +37,7 @@ cell_type = /obj/item/stock_parts/cell/microfusion/advanced phase_emitter_type = /obj/item/microfusion_phase_emitter/advanced attachments = list( - /obj/item/microfusion_gun_attachment/suppressor, + /obj/item/microfusion_gun_attachment/barrel/suppressor, /obj/item/microfusion_gun_attachment/grip, /obj/item/microfusion_gun_attachment/rail, /obj/item/microfusion_gun_attachment/syndi_camo, diff --git a/modular_skyrat/modules/microfusion/code/microfusion_energy_master.dm b/modular_skyrat/modules/microfusion/code/microfusion_energy_master.dm index 909fafffbac..e242cebbc1c 100644 --- a/modular_skyrat/modules/microfusion/code/microfusion_energy_master.dm +++ b/modular_skyrat/modules/microfusion/code/microfusion_energy_master.dm @@ -132,14 +132,14 @@ STOP_PROCESSING(SSobj, src) return ..() -/obj/item/gun/microfusion/handle_atom_del(atom/to_handle) - if(to_handle == cell) +/obj/item/gun/microfusion/Exited(atom/movable/gone, direction) + . = ..() + if(gone == cell) cell = null update_appearance() - if(to_handle == phase_emitter) + else if(gone == phase_emitter) phase_emitter = null update_appearance() - return ..() /obj/item/gun/microfusion/can_shoot() return !QDELETED(cell) ? (cell.charge >= microfusion_lens.e_cost) : FALSE @@ -613,7 +613,7 @@ if(sound_cell_remove) playsound(src, sound_cell_remove, sound_cell_remove_volume, sound_cell_remove_vary) old_cell.update_appearance() - cell.parent_gun = null + old_cell.parent_gun = null cell = null update_appearance() diff --git a/modular_skyrat/modules/microfusion/code/microfusion_gun_attachments.dm b/modular_skyrat/modules/microfusion/code/microfusion_gun_attachments.dm index a1ffd15ec91..97a806effdb 100644 --- a/modular_skyrat/modules/microfusion/code/microfusion_gun_attachments.dm +++ b/modular_skyrat/modules/microfusion/code/microfusion_gun_attachments.dm @@ -267,11 +267,11 @@ Makes operators operate operatingly. slot = GUN_SLOT_BARREL attachment_overlay_icon_state = "attachment_suppressor" -/obj/item/microfusion_gun_attachment/suppressor/run_attachment(obj/item/gun/microfusion/microfusion_gun) +/obj/item/microfusion_gun_attachment/barrel/suppressor/run_attachment(obj/item/gun/microfusion/microfusion_gun) . = ..() microfusion_gun.suppressed = TRUE -/obj/item/microfusion_gun_attachment/suppressor/remove_attachment(obj/item/gun/microfusion/microfusion_gun) +/obj/item/microfusion_gun_attachment/barrel/suppressor/remove_attachment(obj/item/gun/microfusion/microfusion_gun) . = ..() microfusion_gun.suppressed = null diff --git a/modular_skyrat/modules/modular_ert/code/trauma_team/trauma_team_outfit.dm b/modular_skyrat/modules/modular_ert/code/trauma_team/trauma_team_outfit.dm index f52f28470c4..604d28eb5c1 100644 --- a/modular_skyrat/modules/modular_ert/code/trauma_team/trauma_team_outfit.dm +++ b/modular_skyrat/modules/modular_ert/code/trauma_team/trauma_team_outfit.dm @@ -83,7 +83,6 @@ /obj/item/storage/medkit/tactical/ntrauma/PopulateContents() new /obj/item/stack/medical/gauze(src) - new /obj/item/stack/medical/splint(src) new /obj/item/defibrillator/compact/combat/loaded/nanotrasen(src) new /obj/item/reagent_containers/pill/patch/libital(src) new /obj/item/reagent_containers/pill/patch/libital(src) diff --git a/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_component.dm b/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_component.dm index fc26b143b91..6fb548eb4ff 100644 --- a/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_component.dm +++ b/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_component.dm @@ -230,7 +230,10 @@ GLOBAL_LIST_EMPTY(soulcatchers) current_souls -= soul_to_remove soul_to_remove.current_room = null + + soul_to_remove.return_to_body() qdel(soul_to_remove) + return TRUE /// Transfers a soul from a soulcatcher room to another soulcatcher room. Returns `FALSE` if the target room or target soul cannot be found. diff --git a/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_mob.dm b/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_mob.dm index 7f2acf6ddde..fefaf69c25e 100644 --- a/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_mob.dm +++ b/modular_skyrat/modules/modular_implants/code/soulcatcher/soulcatcher_mob.dm @@ -97,10 +97,12 @@ if(tgui_alert(src, "Are you really sure about this?", "Soulcatcher", list("Yes", "No")) != "Yes") return FALSE + return_to_body() qdel(src) /mob/living/soulcatcher_soul/ghost() . = ..() + return_to_body() qdel(src) /mob/living/soulcatcher_soul/say(message, bubble_type, list/spans, sanitize, datum/language/language, ignore_spam, forced, filterproof, message_range, datum/saymode/saymode) @@ -155,6 +157,21 @@ set hidden = TRUE return FALSE +/// Assuming we have a previous body a present mind on our soul, we are going to transfer the mind back to the old body. +/mob/living/soulcatcher_soul/proc/return_to_body() + if(!previous_body || !mind) + return FALSE + + var/mob/target_body = previous_body.resolve() + if(!target_body) + return FALSE + + mind.transfer_to(target_body) + SEND_SIGNAL(target_body, COMSIG_SOULCATCHER_CHECK_SOUL, FALSE) + + if(target_body.stat != DEAD) + target_body.grab_ghost(TRUE) + /mob/living/soulcatcher_soul/Destroy() log_message("[key_name(src)] has exited a soulcatcher.", LOG_GAME) if(current_room) @@ -164,17 +181,6 @@ current_room = null - if(previous_body && mind) - var/mob/target_body = previous_body.resolve() - if(!target_body) - return FALSE - - mind.transfer_to(target_body) - SEND_SIGNAL(target_body, COMSIG_SOULCATCHER_CHECK_SOUL, FALSE) - - if(target_body.stat != DEAD) - target_body.grab_ghost(TRUE) - return ..() /datum/emote/living diff --git a/modular_skyrat/modules/modular_items/code/bags.dm b/modular_skyrat/modules/modular_items/code/bags.dm index 9b40cbeaa44..3e5e779268f 100644 --- a/modular_skyrat/modules/modular_items/code/bags.dm +++ b/modular_skyrat/modules/modular_items/code/bags.dm @@ -1,14 +1,26 @@ -/obj/item/storage/bag/ammo +/// Base pouch type. Fits in pockets, as its main gimmick. +/obj/item/storage/pouch + name = "storage pouch" + desc = "It's a nondescript pouch made with dark fabric. It has a clip, for fitting in pockets." + icon = 'modular_skyrat/modules/modular_items/icons/storage.dmi' + icon_state = "survival" + resistance_flags = FLAMMABLE + slot_flags = ITEM_SLOT_POCKETS + +/obj/item/storage/pouch/Initialize(mapload) + . = ..() + atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL + atom_storage.max_slots = 5 + +/obj/item/storage/pouch/ammo name = "ammo pouch" desc = "A pouch for your ammo that goes in your pocket." icon = 'modular_skyrat/modules/modular_items/icons/storage.dmi' icon_state = "ammopouch" - slot_flags = ITEM_SLOT_POCKETS w_class = WEIGHT_CLASS_BULKY - resistance_flags = FLAMMABLE custom_price = PAYCHECK_CREW * 4 -/obj/item/storage/bag/ammo/Initialize(mapload) +/obj/item/storage/pouch/ammo/Initialize(mapload) . = ..() atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL atom_storage.max_total_storage = 30 @@ -16,17 +28,15 @@ atom_storage.numerical_stacking = FALSE atom_storage.can_hold = typecacheof(list(/obj/item/ammo_box/magazine, /obj/item/ammo_casing, /obj/item/ammo_box/revolver, /obj/item/stock_parts/cell/microfusion)) -/obj/item/storage/bag/material +/obj/item/storage/pouch/material name = "material pouch" desc = "A pouch for sheets and RCD ammunition that manages to hang where you would normally put things in your pocket." icon = 'modular_skyrat/modules/modular_items/icons/storage.dmi' icon_state = "materialpouch" - slot_flags = ITEM_SLOT_POCKETS w_class = WEIGHT_CLASS_BULKY - resistance_flags = FLAMMABLE custom_price = PAYCHECK_CREW * 4 -/obj/item/storage/bag/material/Initialize(mapload) +/obj/item/storage/pouch/material/Initialize(mapload) . = ..() atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL atom_storage.max_total_storage = INFINITY @@ -34,7 +44,87 @@ atom_storage.numerical_stacking = TRUE atom_storage.can_hold = typecacheof(list(/obj/item/rcd_ammo, /obj/item/stack/sheet)) -/obj/item/storage/bag/trash - slot_flags = ITEM_SLOT_BELT //QoL by Gandalf - worn_icon_state = "trashbag" - worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/belt.dmi' +/// It's a pocket medkit. Use sparingly? +/obj/item/storage/pouch/medical + name = "medkit pouch" + desc = "A standard medkit pouch compartmentalized for the bare essentials of field medical care, made with fireproof kevlar \ + (but hopefully you never have to test that). Cannot, itself, contain a medkit. Comes with a pocket clip." + resistance_flags = FIRE_PROOF + icon_state = "medkit" + /// The list of things that medical pouches can hold. Stolen from what medkits can hold, but modified for things you would probably want at pocket-access. + var/static/list/med_pouch_holdables = list( + /obj/item/healthanalyzer, + /obj/item/dnainjector, + /obj/item/reagent_containers/dropper, + /obj/item/reagent_containers/cup/beaker, + /obj/item/reagent_containers/cup/bottle, + /obj/item/reagent_containers/cup/tube, + /obj/item/reagent_containers/pill, + /obj/item/reagent_containers/syringe, + /obj/item/reagent_containers/medigel, + /obj/item/reagent_containers/spray, + /obj/item/reagent_containers/hypospray, + /obj/item/storage/pill_bottle, + /obj/item/stack/medical, + /obj/item/flashlight/pen, + /obj/item/bonesetter, + /obj/item/cautery, + /obj/item/hemostat, + /obj/item/reagent_containers/blood, + /obj/item/stack/sticky_tape, + ) + +/obj/item/storage/pouch/medical/Initialize(mapload) + . = ..() + atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL + atom_storage.max_slots = 7 + atom_storage.max_total_storage = 14 + atom_storage.set_holdable(med_pouch_holdables) + +/obj/item/storage/pouch/medical/loaded/Initialize(mapload) + . = ..() + var/static/items_inside = list( + /obj/item/stack/medical/gauze/twelve = 1, + /obj/item/stack/medical/suture = 2, + /obj/item/stack/medical/mesh = 2, + /obj/item/reagent_containers/hypospray/medipen = 1, + /obj/item/healthanalyzer/simple = 1, + ) + generate_items_inside(items_inside, src) + desc += " Repackaged with station-standard medical supplies." + +/// It's... not as egregious as a full pocket medkit. +/obj/item/storage/pouch/medical/firstaid + name = "first aid pouch" + desc = "A standard nondescript first-aid pouch, compartmentalized for the bare essentials of field medical care. Made with fireproof kevlar \ + (but hopefully you never have to test that). Slightly smaller than a full-on medkit, \ + but has better weight distribution, making it more comfortable to wear. Comes with a pocket-clip." + icon_state = "firstaid" + +/obj/item/storage/pouch/medical/firstaid/Initialize(mapload) + . = ..() + atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL + atom_storage.max_slots = 4 + atom_storage.max_total_storage = 8 + +/obj/item/storage/pouch/medical/firstaid/loaded/Initialize(mapload) + . = ..() + desc += " Repackaged with station-standard medical supplies." + var/static/items_inside = list( + /obj/item/stack/medical/suture = 1, + /obj/item/stack/medical/mesh = 1, + /obj/item/stack/medical/gauze/twelve = 1, + /obj/item/reagent_containers/hypospray/medipen/ekit = 1, + ) + generate_items_inside(items_inside, src) + +/obj/item/storage/pouch/medical/firstaid/stabilizer/Initialize(mapload) + . = ..() + desc += " Repackaged with a wound stabilization-focused loadout." + var/static/items_inside = list( + /obj/item/cautery = 1, + /obj/item/bonesetter = 1, + /obj/item/stack/medical/gauze/twelve = 1, + /obj/item/reagent_containers/hypospray/medipen/ekit = 1, + ) + generate_items_inside(items_inside, src) diff --git a/modular_skyrat/modules/modular_items/icons/storage.dmi b/modular_skyrat/modules/modular_items/icons/storage.dmi index cb46e7fb896..8da1deba6dc 100644 Binary files a/modular_skyrat/modules/modular_items/icons/storage.dmi and b/modular_skyrat/modules/modular_items/icons/storage.dmi differ diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/serviette.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/serviette.dm index fc51887bf76..2a00fd85f26 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/serviette.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/serviette.dm @@ -5,9 +5,10 @@ icon = 'modular_skyrat/modules/modular_items/lewd_items/icons/obj/lewd_items/lewd_items.dmi' /// How much time it takes to clean something using it var/cleanspeed = 5 SECONDS + /// Which item spawns after it's used + var/used_serviette = /obj/item/serviette_used w_class = WEIGHT_CLASS_TINY item_flags = NOBLUDGEON - gender = PLURAL /obj/item/serviette_used name = "dirty serviette" @@ -35,9 +36,9 @@ user.mind?.adjust_experience(/datum/skill/cleaning, max(round(cleanies.beauty/CLEAN_SKILL_BEAUTY_ADJUSTMENT), 0)) //again, intentional that this does NOT round but mops do. qdel(target) qdel(src) - var/obj/item/serviette_used/used_serviette = new /obj/item/serviette_used + var/obj/item/serviette_used/used_cloth = new used_serviette remove_item_from_storage(user) - user.put_in_hands(used_serviette) + user.put_in_hands(used_cloth) else if(istype(target, /obj/structure/window)) user.visible_message(span_notice("[user] begins to clean \the [target.name] with [src]..."), span_notice("You begin to clean \the [target.name] with [src]...")) @@ -47,9 +48,9 @@ target.set_opacity(initial(target.opacity)) user.mind?.adjust_experience(/datum/skill/cleaning, CLEAN_SKILL_GENERIC_WASH_XP) qdel(src) - var/obj/item/serviette_used/used_serviette = new /obj/item/serviette_used + var/obj/item/serviette_used/used_cloth = new used_serviette remove_item_from_storage(user) - user.put_in_hands(used_serviette) + user.put_in_hands(used_cloth) else user.visible_message(span_notice("[user] begins to clean \the [target.name] with [src]..."), span_notice("You begin to clean \the [target.name] with [src]...")) @@ -62,9 +63,9 @@ target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) user.mind?.adjust_experience(/datum/skill/cleaning, CLEAN_SKILL_GENERIC_WASH_XP) qdel(src) - var/obj/item/serviette_used/used_serviette = new /obj/item/serviette_used + var/obj/item/serviette_used/used_cloth = new used_serviette remove_item_from_storage(user) - user.put_in_hands(used_serviette) + user.put_in_hands(used_cloth) /* * SERVIETTE PACK diff --git a/modular_skyrat/modules/modular_vending/code/engivend.dm b/modular_skyrat/modules/modular_vending/code/engivend.dm index 441c9f40319..082726e2108 100644 --- a/modular_skyrat/modules/modular_vending/code/engivend.dm +++ b/modular_skyrat/modules/modular_vending/code/engivend.dm @@ -2,6 +2,6 @@ skyrat_products = list( /obj/item/clothing/glasses/meson/engine = 5, /obj/item/construction/rcd/loaded = 3, - /obj/item/storage/bag/material = 2, + /obj/item/storage/pouch/material = 2, /obj/item/storage/bag/construction = 2, ) diff --git a/modular_skyrat/modules/modular_vending/code/security.dm b/modular_skyrat/modules/modular_vending/code/security.dm index f30feb64645..a5ebbca2fb2 100644 --- a/modular_skyrat/modules/modular_vending/code/security.dm +++ b/modular_skyrat/modules/modular_vending/code/security.dm @@ -1,5 +1,5 @@ /obj/machinery/vending/security skyrat_products = list( - /obj/item/storage/bag/ammo = 2, + /obj/item/storage/pouch/ammo = 2, /obj/item/storage/barricade = 4, ) diff --git a/modular_skyrat/modules/modular_vending/code/wardrobes.dm b/modular_skyrat/modules/modular_vending/code/wardrobes.dm index 55cf087327d..8cf3fb0f6da 100644 --- a/modular_skyrat/modules/modular_vending/code/wardrobes.dm +++ b/modular_skyrat/modules/modular_vending/code/wardrobes.dm @@ -8,7 +8,8 @@ /obj/item/clothing/under/rank/medical/scrubs/skyrat/red = 4, /obj/item/clothing/under/rank/medical/scrubs/skyrat/white = 4, /obj/item/clothing/under/rank/medical/doctor/skyrat/utility = 4, - /obj/item/clothing/suit/toggle/labcoat/medical = 4 + /obj/item/clothing/suit/toggle/labcoat/medical = 4, + /obj/item/storage/backpack/messenger/med = 4, ) /obj/machinery/vending/wardrobe/engi_wardrobe @@ -23,13 +24,15 @@ /obj/item/clothing/head/utility/hardhat/welding/orange = 2, /obj/item/clothing/head/utility/hardhat/dblue = 2, /obj/item/clothing/head/utility/hardhat/welding/dblue = 2, - /obj/item/clothing/head/utility/hardhat/red = 2 + /obj/item/clothing/head/utility/hardhat/red = 2, + /obj/item/storage/backpack/messenger/eng = 3, ) /obj/machinery/vending/wardrobe/atmos_wardrobe skyrat_products = list( /obj/item/clothing/glasses/meson/engine = 2, /obj/item/clothing/head/beret/atmos = 4, + /obj/item/storage/backpack/messenger/eng = 3, ) /obj/machinery/vending/wardrobe/cargo_wardrobe @@ -43,6 +46,7 @@ /obj/item/clothing/suit/gorka/supply = 3, /obj/item/clothing/suit/toggle/jacket/supply = 3, /obj/item/clothing/glasses/hud/gun_permit = 5, //from company imports module + /obj/item/storage/backpack/messenger = 3, ) skyrat_contraband = list( @@ -61,6 +65,7 @@ /obj/item/storage/backpack/science/robo = 2, /obj/item/storage/backpack/satchel/science/robo = 2, /obj/item/storage/backpack/duffelbag/science/robo = 2, + /obj/item/storage/backpack/messenger/science/robo = 2, ) /obj/machinery/vending/wardrobe/science_wardrobe @@ -68,6 +73,7 @@ /obj/item/clothing/under/rank/rnd/scientist/skyrat/hlscience = 3, /obj/item/clothing/under/rank/rnd/scientist/skyrat/utility = 3, /obj/item/clothing/suit/toggle/jacket/sci = 3, + /obj/item/storage/backpack/messenger/science = 3, ) /obj/machinery/vending/wardrobe/hydro_wardrobe @@ -75,6 +81,7 @@ /obj/item/clothing/under/suit/skyrat/scarface = 2, /obj/item/clothing/under/misc/skyrat/gear_harness/adam = 2, /obj/item/clothing/under/misc/skyrat/gear_harness/eve = 2, + /obj/item/storage/backpack/messenger/hyd = 3, ) /obj/machinery/vending/wardrobe/bar_wardrobe @@ -110,11 +117,13 @@ /obj/item/clothing/under/rank/medical/chemist/skyrat/formal = 2, /obj/item/clothing/under/rank/medical/chemist/skyrat/formal/skirt = 2, /obj/item/clothing/head/beret/medical/chemist = 2, + /obj/item/storage/backpack/messenger/chem = 2, ) /obj/machinery/vending/wardrobe/viro_wardrobe skyrat_products = list( /obj/item/clothing/head/beret/medical/virologist = 2, + /obj/item/storage/backpack/messenger/vir = 2, ) /obj/machinery/vending/wardrobe/det_wardrobe @@ -130,6 +139,7 @@ /obj/item/clothing/suit/toggle/labcoat/skyrat/highvis = 2, /obj/item/clothing/under/rank/security/detective/cowboy = 2, /obj/item/clothing/suit/jacket/det_suit/cowboyvest = 2, + /obj/item/storage/backpack/messenger/sec = 2, ) /obj/machinery/vending/wardrobe/law_wardrobe diff --git a/modular_skyrat/modules/modular_weapons/code/autolathe_designs.dm b/modular_skyrat/modules/modular_weapons/code/autolathe_designs.dm index af62273fc1d..f51d6883d64 100644 --- a/modular_skyrat/modules/modular_weapons/code/autolathe_designs.dm +++ b/modular_skyrat/modules/modular_weapons/code/autolathe_designs.dm @@ -2,20 +2,12 @@ * AMMO */ -/datum/design/a762 - name = "7.62 Bullet" - id = "a762" +/datum/design/strilka310_rubber + name = ".310 Rubber Bullet (Less Lethal)" + id = "astrilka310_rubber" build_type = AUTOLATHE materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT) - build_path = /obj/item/ammo_casing/a762 - category = list(RND_CATEGORY_HACKED, RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO) - -/datum/design/a762_rubber - name = "7.62 Rubber Bullet" - id = "a762_rubber" - build_type = AUTOLATHE - materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT) - build_path = /obj/item/ammo_casing/a762/rubber + build_path = /obj/item/ammo_casing/strilka310/rubber category = list(RND_CATEGORY_HACKED, RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO) // 4.6x30mm - SMG round, used in the WT550 and in numerous modular guns as a weaker alternative to 9mm. diff --git a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/xhihao_light_arms/ammo.dm b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/xhihao_light_arms/ammo.dm new file mode 100644 index 00000000000..7c43be2c19a --- /dev/null +++ b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/xhihao_light_arms/ammo.dm @@ -0,0 +1,45 @@ +/* +* .310 Strilka +*/ + +/obj/item/ammo_casing/strilka310/rubber + name = ".310 Strilka rubber bullet casing" + desc = "A .310 rubber bullet casing. Casing is a bit of a fib, there isn't one.\ +

\ + RUBBER: Less than lethal ammo. Deals both stamina damage and regular damage." + + icon = 'modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/xhihao_light_arms/ammo.dmi' + icon_state = "310-casing-rubber" + + projectile_type = /obj/projectile/bullet/strilka310/rubber + harmful = FALSE + +/obj/projectile/bullet/strilka310/rubber + name = ".310 rubber bullet" + damage = 15 + stamina = 55 + ricochets_max = 5 + ricochet_incidence_leeway = 0 + ricochet_chance = 130 + ricochet_decay_damage = 0.7 + shrapnel_type = null + sharpness = NONE + embedding = null + +/obj/item/ammo_casing/strilka310/ap + name = ".310 Strilka armor-piercing bullet casing" + desc = "A .310 armor-piercing bullet casing. Note, does not actually contain a casing.\ +

\ + ARMOR-PIERCING: Improved armor-piercing capabilities, in return for less outright damage." + + icon = 'modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/xhihao_light_arms/ammo.dmi' + icon_state = "310-casing-ap" + + projectile_type = /obj/projectile/bullet/strilka310/ap + custom_materials = AMMO_MATS_AP + advanced_print_req = TRUE + +/obj/projectile/bullet/strilka310/ap + name = ".310 armor-piercing bullet" + damage = 50 + armour_penetration = 60 diff --git a/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/xhihao_light_arms/guns.dm b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/xhihao_light_arms/guns.dm new file mode 100644 index 00000000000..4207eb85eef --- /dev/null +++ b/modular_skyrat/modules/modular_weapons/code/company_and_or_faction_based/xhihao_light_arms/guns.dm @@ -0,0 +1,48 @@ +/* +* QM Sporter Rifle +*/ + +/obj/item/gun/ballistic/rifle/boltaction/sporterized + name = "\improper Xhihao 'Rengo' precision rifle" + desc = "A Xhihao 'Rengo' conversion rifle. Came as parts sold in a single kit by Xhihao Light Arms, \ + which can be swapped out with many of the outdated or simply old parts on a typical Sakhno rifle. \ + While not necessarily increasing performance in any way, the magazine is slightly longer. The weapon \ + is also overall a bit shorter, making it easier to handle for some people. Cannot be sawn off, cutting \ + really any part of this weapon off would make it non-functional." + icon = 'modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/xhihao_light_arms/guns40x.dmi' + icon_state = "rengo" + worn_icon_state = "enchanted_rifle" // Not actually magical looking, just looks closest to this one + inhand_icon_state = "enchanted_rifle" + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/bubba + can_be_sawn_off = FALSE + +/obj/item/gun/ballistic/rifle/boltaction/sporterized/Initialize(mapload) + . = ..() + + AddComponent(/datum/component/scope, range_modifier = 1.5) + +/obj/item/gun/ballistic/rifle/boltaction/sporterized/give_manufacturer_examine() + AddElement(/datum/element/manufacturer_examine, COMPANY_XHIHAO) + +/obj/item/gun/ballistic/rifle/boltaction/sporterized/empty + bolt_locked = TRUE // so the bolt starts visibly open + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/bubba/empty + +/obj/item/ammo_box/magazine/internal/boltaction/bubba + name = "Sakhno extended internal magazine" + desc = "How did you get it out?" + ammo_type = /obj/item/ammo_casing/strilka310 + caliber = CALIBER_STRILKA310 + max_ammo = 8 + +/obj/item/ammo_box/magazine/internal/boltaction/bubba/empty + start_empty = TRUE + +/* +* Box that contains Sakhno rifles, but less soviet union since we don't have one of those +*/ + +/obj/item/storage/toolbox/guncase/soviet/sakhno + desc = "A weapon's case. This one is green and looks pretty old, but is otherwise in decent condition." + icon = 'modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/cases.dmi' + material_flags = NONE // ????? Why do these have materials enabled?? diff --git a/modular_skyrat/modules/aesthetics/guns/code/conversion_kits.dm b/modular_skyrat/modules/modular_weapons/code/conversion_kits.dm similarity index 74% rename from modular_skyrat/modules/aesthetics/guns/code/conversion_kits.dm rename to modular_skyrat/modules/modular_weapons/code/conversion_kits.dm index 069fb58e5fb..a15d0766ece 100644 --- a/modular_skyrat/modules/aesthetics/guns/code/conversion_kits.dm +++ b/modular_skyrat/modules/modular_weapons/code/conversion_kits.dm @@ -11,15 +11,15 @@ pickup_sound = 'sound/items/handling/component_pickup.ogg' /obj/item/crafting_conversion_kit/mosin_pro - name = "\improper FTU 'Archangel' precision rifle stock (desert tan)" - desc = "It's a plastic rifle stock, an extended .244 Acia magazine, and some off-brand sight. Unfortunately, it lacks the actual bits that make it go bang. \ - It's probably a safe assumption that fixing that is an exercise left to the buyer." - icon = 'modular_skyrat/modules/aesthetics/guns/icons/guns.dmi' - icon_state = "bubba_wit_no_bubba" + name = "\improper Xhihao 'Rengo' rifle conversion kit" + desc = "All the parts you need to make a 'Rengo' rifle, outside of the parts that make the gun actually a gun. \ + It looks like this stuff could fit on an old Sakhno rifle, if only you had one of those around." + icon = 'modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/cases.dmi' + icon_state = "xhihao_conversion_kit" /datum/crafting_recipe/mosin_pro - name = "Sportiv to FTU 'Archangel' Conversion" - desc = "It's actually really easy to change the stock on your Sportiv. Anyone can do it. It takes roughly thirty seconds and a screwdriver." + name = "Sakhno to Xhihao 'Rengo' Conversion" + desc = "It's actually really easy to change the stock on your Sakhno. Anyone can do it. It takes roughly thirty seconds and a screwdriver." result = /obj/item/gun/ballistic/rifle/boltaction/sporterized/empty reqs = list( /obj/item/gun/ballistic/rifle/boltaction = 1, diff --git a/modular_skyrat/modules/modular_weapons/code/modular_projectiles.dm b/modular_skyrat/modules/modular_weapons/code/modular_projectiles.dm index d74a177f979..16a9ba35f7f 100644 --- a/modular_skyrat/modules/modular_weapons/code/modular_projectiles.dm +++ b/modular_skyrat/modules/modular_weapons/code/modular_projectiles.dm @@ -9,7 +9,7 @@ // whatever goblin decided to spread out bullets over like 3 files and god knows however many overrides i wish you a very stubbed toe /* -* .460 Ceres +* .460 Ceres (renamed tgcode .45) */ /obj/item/ammo_casing/c45/rubber @@ -45,7 +45,7 @@ weak_against_armour = TRUE /* -* 8mm Usurpator +* 8mm Usurpator (renamed tg c46x30mm, used in the WT550) */ /obj/projectile/bullet/c46x30mm_rubber @@ -70,19 +70,18 @@ harmful = FALSE /* -* .277 Aestus +* .277 Aestus (renamed tgcode .223, used in the M-90gl) */ -/obj/item/ammo_casing/a277/rubber +/obj/item/ammo_casing/a223/rubber name = ".277 rubber bullet casing" desc = "A .277 rubber bullet casing.\

\ RUBBER: Less than lethal ammo. Deals both stamina damage and regular damage." - caliber = CALIBER_A277 - projectile_type = /obj/projectile/bullet/a277/rubber + projectile_type = /obj/projectile/bullet/a223/rubber harmful = FALSE -/obj/projectile/bullet/a277/rubber +/obj/projectile/bullet/a223/rubber name = ".277 rubber bullet" damage = 10 armour_penetration = 10 @@ -96,60 +95,19 @@ embedding = null wound_bonus = -50 -/obj/item/ammo_casing/a277/ap +/obj/item/ammo_casing/a223/ap name = ".277 Aestus armor-piercing bullet casing" desc = "A .277 armor-piercing bullet casing.\

\ ARMOR PIERCING: Increased armor piercing capabilities. What did you expect?" - caliber = CALIBER_A277 - projectile_type = /obj/projectile/bullet/a277/ap + projectile_type = /obj/projectile/bullet/a223/ap advanced_print_req = TRUE custom_materials = AMMO_MATS_AP -/obj/projectile/bullet/a277/ap +/obj/projectile/bullet/a223/ap name = ".277 armor-piercing bullet" armour_penetration = 60 -/* -* .244 Acia -*/ - -/obj/item/ammo_casing/a762/rubber - name = ".244 Acia rubber bullet casing" - desc = "A .244 rubber bullet casing.\ -

\ - RUBBER: Less than lethal ammo. Deals both stamina damage and regular damage." - icon_state = "762-casing" - caliber = CALIBER_A762 - projectile_type = /obj/projectile/bullet/a762/rubber - harmful = FALSE - -/obj/projectile/bullet/a762/rubber - name = ".244 rubber bullet" - damage = 15 - stamina = 55 - ricochets_max = 5 - ricochet_incidence_leeway = 0 - ricochet_chance = 130 - ricochet_decay_damage = 0.7 - shrapnel_type = null - sharpness = NONE - embedding = null - -/obj/item/ammo_casing/a762/ap - name = ".244 Acia armor-piercing bullet casing" - desc = "A .244 armor-piercing bullet casing.\ -

\ - ARMOR-PIERCING: Improved armor-piercing capabilities, in return for less outright damage." - projectile_type = /obj/projectile/bullet/a762/ap - custom_materials = AMMO_MATS_AP - advanced_print_req = TRUE - -/obj/projectile/bullet/a762/ap - name = ".244 armor-piercing bullet" - damage = 50 - armour_penetration = 60 - /* * .34 ACP */ diff --git a/modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/cases.dmi b/modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/cases.dmi new file mode 100644 index 00000000000..238153cd32b Binary files /dev/null and b/modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/cases.dmi differ diff --git a/modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/xhihao_light_arms/ammo.dmi b/modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/xhihao_light_arms/ammo.dmi new file mode 100644 index 00000000000..f671b307528 Binary files /dev/null and b/modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/xhihao_light_arms/ammo.dmi differ diff --git a/modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/xhihao_light_arms/guns40x.dmi b/modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/xhihao_light_arms/guns40x.dmi new file mode 100644 index 00000000000..1e6e33762aa Binary files /dev/null and b/modular_skyrat/modules/modular_weapons/icons/obj/company_and_or_faction_based/xhihao_light_arms/guns40x.dmi differ diff --git a/modular_skyrat/modules/mold/code/mold.dm b/modular_skyrat/modules/mold/code/mold.dm index edcccf6e874..dbd1ff139f6 100644 --- a/modular_skyrat/modules/mold/code/mold.dm +++ b/modular_skyrat/modules/mold/code/mold.dm @@ -270,7 +270,7 @@ mold_color = "#cb37f5" structure_light_color = LIGHT_COLOR_LAVENDER examine_text = "It feels damp and smells of rat poison." - mob_types = list(/mob/living/basic/giant_spider) + mob_types = list(/mob/living/basic/spider/giant/) preferred_atmos_conditions = "miasma=50;TEMP=296" resistance_flags = UNACIDABLE | ACID_PROOF diff --git a/modular_skyrat/modules/moretraitoritems/code/syndicate_loadout.dm b/modular_skyrat/modules/moretraitoritems/code/syndicate_loadout.dm index d756ff42810..8a49d1b6cf5 100644 --- a/modular_skyrat/modules/moretraitoritems/code/syndicate_loadout.dm +++ b/modular_skyrat/modules/moretraitoritems/code/syndicate_loadout.dm @@ -41,7 +41,7 @@ new /obj/item/clothing/mask/chameleon(src) new /obj/item/card/id/advanced/chameleon(src) new /obj/item/clothing/shoes/chameleon/noslip(src) - new /obj/item/camera_bug(src) + new /obj/item/computer_disk/syndicate/camera_app(src) new /obj/item/multitool/ai_detect(src) new /obj/item/encryptionkey/syndicate(src) new /obj/item/reagent_containers/syringe/mulligan(src) @@ -72,7 +72,7 @@ new /obj/item/ai_module/toy_ai(src) new /obj/item/multitool/ai_detect(src) new /obj/item/storage/toolbox/syndicate(src) - new /obj/item/camera_bug(src) + new /obj/item/computer_disk/syndicate/camera_app(src) new /obj/item/clothing/glasses/thermal/syndi(src) new /obj/item/card/id/advanced/chameleon(src) diff --git a/modular_skyrat/modules/nanotrasen_rep/code/nanotrasen_consultant.dm b/modular_skyrat/modules/nanotrasen_rep/code/nanotrasen_consultant.dm index cf43df0bc2c..12d2406d0b7 100644 --- a/modular_skyrat/modules/nanotrasen_rep/code/nanotrasen_consultant.dm +++ b/modular_skyrat/modules/nanotrasen_rep/code/nanotrasen_consultant.dm @@ -62,6 +62,7 @@ backpack = /obj/item/storage/backpack satchel = /obj/item/storage/backpack/satchel duffelbag = /obj/item/storage/backpack/duffelbag + messenger = /obj/item/storage/backpack/messenger implants = list(/obj/item/implant/mindshield) accessory = /obj/item/clothing/accessory/medal/gold/nanotrasen_consultant diff --git a/modular_skyrat/modules/novaya_ert/code/rationpacks.dm b/modular_skyrat/modules/novaya_ert/code/rationpacks.dm deleted file mode 100644 index 170411fa008..00000000000 --- a/modular_skyrat/modules/novaya_ert/code/rationpacks.dm +++ /dev/null @@ -1,55 +0,0 @@ -/obj/item/food/nri_course - name = "undefined NRI course" - desc = "Something you shouldn't see. But it's edible." - icon = 'modular_skyrat/modules/novaya_ert/icons/rationpack.dmi' - icon_state = "main_course" - food_reagents = list(/datum/reagent/consumable/nutriment = 20) - tastes = list("crayon powder" = 1) - foodtypes = VEGETABLES | GRAIN - w_class = WEIGHT_CLASS_SMALL - -/obj/item/food/nri_course/entree - name = "combat ration entree" - desc = "A vacuum-sealed weather-resistant spaceproof package written in Pan-Slavic, labelled 'завтрак'. It supposedly contains protein-enriched wholewheat biscuits, liver pate and blueberry jam." - food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 4) - tastes = list("wholewheat biscuits" = 5, "liver pate" = 5, "blueberry jam" = 5) - foodtypes = FRUIT | GRAIN | MEAT | BREAKFAST - -/obj/item/food/nri_course/main - name = "combat ration main course" - desc = "A vacuum-sealed weather-resistant spaceproof package written in Pan-Slavic, labelled 'обед'. It supposedly contains snap-to-heat buckwheat porridge and tushonka and snap-to-heat borscht." - food_reagents = list(/datum/reagent/consumable/nutriment = 17, /datum/reagent/consumable/nutriment/vitamin = 8) - icon_state = "side_dish" - tastes = list("hot buckwheat porridge with canned beef" = 5, "hot imperial borscht" = 5) - foodtypes = VEGETABLES | GRAIN | MEAT - -/obj/item/food/nri_course/side - name = "combat ration side-dish" - desc = "A vacuum-sealed weather-resistant spaceproof package written in Pan-Slavic, labelled 'закуска'. It supposedly contains a large carnitine-enriched pryanik, breadsticks and apple sauce." - food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 2) - icon_state = "dessert" - tastes = list("pryaniki" = 10, "breadsticks" = 5, "apple sauce" = 3) - foodtypes = SUGAR | GRAIN | FRUIT - -/obj/item/storage/box/nri_rations - name = "NRI combat rations" - desc = "A packaged military MRE for soldiers in extended deployments and people who can deal with the shits after finishing one. Everything on the back and front is written in Pan-Slavic, but you can make out 'Једите пре: Сентябрь 2603'." - icon = 'modular_skyrat/modules/novaya_ert/icons/rationpack.dmi' - icon_state = "mre_package" - illustration = null - -/obj/item/storage/box/nri_rations/Initialize(mapload) - . = ..() - atom_storage.max_slots = 7 - -/obj/item/storage/box/nri_rations/PopulateContents() - new /obj/item/food/nri_course/entree(src) - new /obj/item/food/nri_course/main(src) - new /obj/item/food/nri_course/side(src) - new /obj/item/storage/box/gum(src) - new /obj/item/reagent_containers/cup/glass/waterbottle(src) - new /obj/item/storage/fancy/cigarettes/cigpack_robust(src) - new /obj/item/storage/box/matches(src) - -/obj/item/storage/box/nri_rations/attack_self(mob/user, modifiers) - icon_state = "mre_package_open" diff --git a/modular_skyrat/modules/novaya_ert/code/survival_pack.dm b/modular_skyrat/modules/novaya_ert/code/survival_pack.dm index 7dc3b639166..48bd7c2e5ff 100644 --- a/modular_skyrat/modules/novaya_ert/code/survival_pack.dm +++ b/modular_skyrat/modules/novaya_ert/code/survival_pack.dm @@ -10,7 +10,7 @@ new /obj/item/tank/internals/emergency_oxygen/double(src) new /obj/item/stack/spacecash/c1000(src) new /obj/item/storage/pill_bottle/iron(src) - new /obj/item/storage/box/nri_rations(src) + new /obj/item/storage/box/colonial_rations(src) new /obj/item/storage/box/nri_pens(src) new /obj/item/storage/box/nri_flares(src) new /obj/item/crowbar/red(src) diff --git a/modular_skyrat/modules/novaya_ert/code/toolbox.dm b/modular_skyrat/modules/novaya_ert/code/toolbox.dm index 23d9ed427c0..19dde9e7ef2 100644 --- a/modular_skyrat/modules/novaya_ert/code/toolbox.dm +++ b/modular_skyrat/modules/novaya_ert/code/toolbox.dm @@ -18,8 +18,8 @@ new ammo_type(src) /obj/item/storage/toolbox/ammobox/full/mosin - name = "ammo box (Sportiv)" - ammo_type = /obj/item/ammo_box/a762 + name = "ammo box (Sakhno)" + ammo_type = /obj/item/ammo_box/strilka310 amount = 7 /obj/item/storage/toolbox/ammobox/full/krinkov diff --git a/modular_skyrat/modules/novaya_ert/icons/rationpack.dmi b/modular_skyrat/modules/novaya_ert/icons/rationpack.dmi deleted file mode 100644 index 81b22e76748..00000000000 Binary files a/modular_skyrat/modules/novaya_ert/icons/rationpack.dmi and /dev/null differ diff --git a/modular_skyrat/modules/opposing_force/code/equipment/utility.dm b/modular_skyrat/modules/opposing_force/code/equipment/utility.dm index ddb83d4ddbe..17c7c6ed8ce 100644 --- a/modular_skyrat/modules/opposing_force/code/equipment/utility.dm +++ b/modular_skyrat/modules/opposing_force/code/equipment/utility.dm @@ -78,9 +78,9 @@ description = "A briefcase containing a launchpad, a device able to teleport items and people to and from targets up to eight tiles away from the briefcase. \ Also includes a remote control, disguised as an ordinary folder. Touch the briefcase with the remote to link it." -/datum/opposing_force_equipment/gear/camera_bug - name = "Camera Bug" - item_type = /obj/item/camera_bug +/datum/opposing_force_equipment/gear/camera_app + name = "SyndEye Program" + item_type = /obj/item/computer_disk/syndicate/camera_app /datum/opposing_force_equipment/gear/microlaser name = "Radioactive Microlaser" diff --git a/modular_skyrat/modules/oversized/code/door.dm b/modular_skyrat/modules/oversized/code/door.dm index b595e596f2a..e270554369b 100644 --- a/modular_skyrat/modules/oversized/code/door.dm +++ b/modular_skyrat/modules/oversized/code/door.dm @@ -11,7 +11,7 @@ SIGNAL_HANDLER if(HAS_TRAIT(crossed_atom, TRAIT_OVERSIZED) && ishuman(crossed_atom)) var/mob/living/carbon/human/crossing_human = crossed_atom - if(crossing_human.m_intent != MOVE_INTENT_WALK && crossing_human.body_position == STANDING_UP) + if(crossing_human.move_intent != MOVE_INTENT_WALK && crossing_human.body_position == STANDING_UP) //We gonna bamf you, you tall fucker var/affecting = crossing_human.get_bodypart(BODY_ZONE_HEAD) crossing_human.apply_damage(15, BRUTE, affecting) diff --git a/modular_skyrat/modules/player_ranks/code/player_rank_controller/_player_rank_controller.dm b/modular_skyrat/modules/player_ranks/code/player_rank_controller/_player_rank_controller.dm new file mode 100644 index 00000000000..bfab13aa108 --- /dev/null +++ b/modular_skyrat/modules/player_ranks/code/player_rank_controller/_player_rank_controller.dm @@ -0,0 +1,227 @@ +/// The index of the ckey in the items of a given row in a query for player ranks. +#define INDEX_CKEY 1 + +/** + * This datum is intended to be used as a method of abstraction for the different + * ways that each player rank handles adding and removing players from their global + * lists, as well as handling the legacy adding, removing, loading and saving of + * said lists. + */ +/datum/player_rank_controller + /// The name of the player rank in the database. + /// This **NEEDS** to be set by subtypes, otherwise you WILL run into severe + /// issues. + var/rank_title = null + /// The path to the legacy file holding all of the players that have this rank. + /// Should be set in `New()`, since it has a non-constant compile-time value. + var/legacy_file_path = null + /// The header for the legacy file, if any. + /// Leave as `""` if you don't have one. + var/legacy_file_header = "" + + +/datum/player_rank_controller/vv_edit_var(var_name, var_value) + // No touching the controller's vars, treat these as protected config. + return FALSE + + +/** + * Handles adding this rank to a player by their ckey. This is only intended to + * be used for handling the in-game portion of adding this rank, and not to + * save this change anywhere. That should be handled by the caller. + * + * DO NOT FORGET TO ADD A `IsAdminAdvancedProcCall()` CHECK SO THAT ADMINS + * CAN'T JUST USE THAT TO SKIP PERMISSION CHECKS!!! + */ +/datum/player_rank_controller/proc/add_player(ckey) + SHOULD_CALL_PARENT(FALSE) + + CRASH("[src] did not implement add_player()! Fix this ASAP!") + + +/** + * Handles adding this rank to a player using the legacy system, updating the + * legacy config file in the process. + * + * Don't override this, everything should be handled from `add_player()`, + * this is mostly just a helper for convenience. + * + * Arguments: + * * ckey - The ckey of the player you want to now possess this player rank. + */ +/datum/player_rank_controller/proc/add_player_legacy(ckey) + SHOULD_NOT_OVERRIDE(TRUE) + + if(IsAdminAdvancedProcCall()) + return + + add_player(ckey) + text2file(ckey, legacy_file_path) + + +/** + * Handles removing this rank from a player by their ckey. This is only + * intended to be used for handling the in-game portion of removing this rank, + * and not to save this change anywhere. That should be handled by the caller. + * + * DO NOT FORGET TO ADD A `IsAdminAdvancedProcCall()` CHECK SO THAT ADMINS + * CAN'T JUST USE THAT TO SKIP PERMISSION CHECKS!!! + */ +/datum/player_rank_controller/proc/remove_player(ckey) + SHOULD_CALL_PARENT(FALSE) + + CRASH("[src] did not implement remove_player()! Fix this ASAP!") + + +/** + * Handles removing this rank from a player using the legacy system, updating + * the legacy config file in the process. + * + * Don't override this, everything should be handled from `remove_player()` + * and `save_legacy()`, this is mostly just a helper for convenience. + * + * Arguments: + * * ckey - The ckey of the player you want to no longer possess this player + * rank. + */ +/datum/player_rank_controller/proc/remove_player_legacy(ckey) + SHOULD_NOT_OVERRIDE(TRUE) + + if(IsAdminAdvancedProcCall()) + return + + remove_player(ckey) + // We have to save like this, because we're taking something out at an + // arbitrary point in the list. + save_legacy() + + +/** + * Handles loading the players that have this rank from an already-executed + * database query. + * + * Mostly just a helper to simplify the logic of the subsystem. + */ +/datum/player_rank_controller/proc/load_from_query(datum/db_query/query) + if(IsAdminAdvancedProcCall()) + return + + clear_existing_rank_data() + + while(query.NextRow()) + var/ckey = ckey(query.item[INDEX_CKEY]) + add_player(ckey) + + +/** + * Handles loading the players that have this rank from its legacy config file. + * + * Don't override this, use `clear_existing_rank_data()` to clear up anything + * that needs to be cleared/initialized before loading the rank, and + * `add_player()` for actually giving the rank to the ckey in-game. + */ +/datum/player_rank_controller/proc/load_legacy() + SHOULD_NOT_OVERRIDE(TRUE) + + if(IsAdminAdvancedProcCall()) + return + + clear_existing_rank_data() + + for(var/line in world.file2list(legacy_file_path)) + if(!line) + continue + + if(findtextEx(line, "#", 1, 2)) + continue + + add_player(line) + + return TRUE + + +/** + * Handles saving the players that have this rank using its legacy config file. + * + * Don't override this, use `get_ckeys_for_legacy_save()` if you need to filter + * the list of ckeys that will get saved. + */ +/datum/player_rank_controller/proc/save_legacy() + SHOULD_NOT_OVERRIDE(TRUE) + + if(IsAdminAdvancedProcCall()) + return + + var/save_file_contents = legacy_file_header + + for(var/player in get_ckeys_for_legacy_save()) + save_file_contents += player + "\n" + + rustg_file_write(save_file_contents, legacy_file_path) + + +/** + * Handles returning a list of all the legacy ckeys that should be migrated + * from the legacy system to the database one. + * + * Returns a list of ckeys as strings. + */ +/datum/player_rank_controller/proc/get_ckeys_to_migrate() + SHOULD_NOT_OVERRIDE(TRUE) + RETURN_TYPE(/list) + + var/list/ckeys_to_migrate = list() + + for(var/line in world.file2list(legacy_file_path)) + if(!line) + continue + + if(findtextEx(line, "#", 1, 2)) + continue + + var/to_migrate = ckey(line) + + if(!to_migrate) + continue + + ckeys_to_migrate += to_migrate + + return ckeys_to_migrate + + +/** + * Simple proc for subtypes to override for their own handling of obtaining + * a list of ckeys to save during a legacy save. + * + * DO NOT FORGET TO ADD A `IsAdminAdvancedProcCall()` CHECK SO THAT ADMINS + * CAN'T JUST ELEVATE PERMISSIONS TO ADD THEMSELVES TO A LEGACY SAVE!!! + */ +/datum/player_rank_controller/proc/get_ckeys_for_legacy_save() + SHOULD_CALL_PARENT(FALSE) + RETURN_TYPE(/list) + + CRASH("[src] did not implement get_ckeys_for_legacy_save()! Fix this ASAP!") + + +/datum/player_rank_controller/proc/should_use_legacy_system() + SHOULD_CALL_PARENT(FALSE) + . = TRUE + + stack_trace("[src] did not implement should_use_legacy_system(), defaulting to TRUE! Fix this ASAP!") + + +/** + * Simple proc for subtypes to override for their own handling of clearing any + * lists that need to be cleared before loading the player rank data. + * + * DO NOT FORGET TO ADD A `IsAdminAdvancedProcCall()` CHECK SO THAT ADMINS + * CAN'T JUST ELEVATE PERMISSIONS TO CLEAR RANK DATA AND SCREW YOU OVER!!! + */ +/datum/player_rank_controller/proc/clear_existing_rank_data() + SHOULD_CALL_PARENT(FALSE) + PROTECTED_PROC(TRUE) + + CRASH("[src] did not implement clear_existing_rank_data()! Fix this ASAP!") + + +#undef INDEX_CKEY diff --git a/modular_skyrat/modules/player_ranks/code/player_rank_controller/donator_controller.dm b/modular_skyrat/modules/player_ranks/code/player_rank_controller/donator_controller.dm new file mode 100644 index 00000000000..4ed68934ef9 --- /dev/null +++ b/modular_skyrat/modules/player_ranks/code/player_rank_controller/donator_controller.dm @@ -0,0 +1,49 @@ +/// The list of all donators. +GLOBAL_LIST_EMPTY(donator_list) +GLOBAL_PROTECT(donator_list) + +/datum/player_rank_controller/donator + rank_title = "donator" + // Yes, this is incredibly long, deal with it. It's to keep that cute little comment at the top. + legacy_file_header = "###############################################################################################\n# List for people who support us! They get cool loadout items #\n# Case is not important for ckey. #\n###############################################################################################\n" + + +/datum/player_rank_controller/donator/New() + . = ..() + legacy_file_path = "[global.config.directory]/skyrat/donators.txt" + + + +/datum/player_rank_controller/donator/add_player(ckey) + if(IsAdminAdvancedProcCall()) + return + + ckey = ckey(ckey) + + // Associative list for extra SPEED! + GLOB.donator_list[ckey] = TRUE + + +/datum/player_rank_controller/donator/remove_player(ckey) + if(IsAdminAdvancedProcCall()) + return + + GLOB.donator_list -= ckey + + +/datum/player_rank_controller/donator/get_ckeys_for_legacy_save() + if(IsAdminAdvancedProcCall()) + return + + return GLOB.donator_list + + +/datum/player_rank_controller/donator/should_use_legacy_system() + return CONFIG_GET(flag/donator_legacy_system) + + +/datum/player_rank_controller/donator/clear_existing_rank_data() + if(IsAdminAdvancedProcCall()) + return + + GLOB.donator_list = list() diff --git a/modular_skyrat/modules/player_ranks/code/player_rank_controller/mentor_controller.dm b/modular_skyrat/modules/player_ranks/code/player_rank_controller/mentor_controller.dm new file mode 100644 index 00000000000..304ee98d1e5 --- /dev/null +++ b/modular_skyrat/modules/player_ranks/code/player_rank_controller/mentor_controller.dm @@ -0,0 +1,76 @@ +// The mentor system is a bit more complex than the other player ranks, so it's +// got its own handling and global lists declarations in the `mentor` module. + +/datum/player_rank_controller/mentor + rank_title = "mentor" + + +/datum/player_rank_controller/mentor/New() + . = ..() + legacy_file_path = "[global.config.directory]/skyrat/mentors.txt" + + +/datum/player_rank_controller/mentor/add_player(ckey) + if(IsAdminAdvancedProcCall()) + return + + ckey = ckey(ckey) + + new /datum/mentors(ckey) + + +/datum/player_rank_controller/mentor/remove_player(ckey) + if(IsAdminAdvancedProcCall()) + return + + var/datum/mentors/mentor_datum = GLOB.mentor_datums[ckey] + mentor_datum?.remove_mentor() + + +/datum/player_rank_controller/mentor/get_ckeys_for_legacy_save() + if(IsAdminAdvancedProcCall()) + return + + // This whole mess is just to only save the mentors that were in the config + // already so that we don't add every admin to the config file, which would + // be a pain to maintain afterwards. + // We don't save mentors that are new to the `GLOB.mentor_datums` list, + // because they should have already been saved from `add_player_legacy()`. + var/list/mentors_to_save = list() + var/list/existing_mentor_config = world.file2list(legacy_file_path) + for(var/line in existing_mentor_config) + if(!length(line)) + continue + + if(findtextEx(line, "#", 1, 2)) + continue + + var/existing_mentor = ckey(line) + if(!existing_mentor) + continue + + // Only save them if they're still in the mentor datums list in-game. + if(!GLOB.mentor_datums[existing_mentor]) + continue + + // Associative list for extra SPEED! + mentors_to_save[existing_mentor] = TRUE + + return mentors_to_save + + +/datum/player_rank_controller/mentor/should_use_legacy_system() + return CONFIG_GET(flag/mentor_legacy_system) + + +/datum/player_rank_controller/mentor/clear_existing_rank_data() + if(IsAdminAdvancedProcCall()) + return + + GLOB.mentor_datums.Cut() + + for(var/client/ex_mentor as anything in GLOB.mentors) + ex_mentor.remove_mentor_verbs() + ex_mentor.mentor_datum = null + + GLOB.mentors.Cut() diff --git a/modular_skyrat/modules/player_ranks/code/player_rank_controller/veteran_controller.dm b/modular_skyrat/modules/player_ranks/code/player_rank_controller/veteran_controller.dm new file mode 100644 index 00000000000..cc759c92832 --- /dev/null +++ b/modular_skyrat/modules/player_ranks/code/player_rank_controller/veteran_controller.dm @@ -0,0 +1,47 @@ +/// The list of all veteran players. +GLOBAL_LIST_EMPTY(veteran_list) +GLOBAL_PROTECT(veteran_list) + + +/datum/player_rank_controller/veteran + rank_title = "veteran" + + +/datum/player_rank_controller/veteran/New() + . = ..() + legacy_file_path = "[global.config.directory]/skyrat/veteran_players.txt" + + +/datum/player_rank_controller/veteran/add_player(ckey) + if(IsAdminAdvancedProcCall()) + return + + ckey = ckey(ckey) + + // Associative list for extra SPEED! + GLOB.veteran_list[ckey] = TRUE + + +/datum/player_rank_controller/veteran/remove_player(ckey) + if(IsAdminAdvancedProcCall()) + return + + GLOB.veteran_list -= ckey + + +/datum/player_rank_controller/veteran/get_ckeys_for_legacy_save() + if(IsAdminAdvancedProcCall()) + return + + return GLOB.veteran_list + + +/datum/player_rank_controller/veteran/should_use_legacy_system() + return CONFIG_GET(flag/veteran_legacy_system) + + +/datum/player_rank_controller/veteran/clear_existing_rank_data() + if(IsAdminAdvancedProcCall()) + return + + GLOB.veteran_list = list() diff --git a/modular_skyrat/modules/player_ranks/code/subsystem/player_ranks.dm b/modular_skyrat/modules/player_ranks/code/subsystem/player_ranks.dm new file mode 100644 index 00000000000..8e20fcda771 --- /dev/null +++ b/modular_skyrat/modules/player_ranks/code/subsystem/player_ranks.dm @@ -0,0 +1,454 @@ +/// The name of the table on the database containing the player ranks. +/// See `skyrat_schema.sql` for the schema of the table. +#define PLAYER_RANK_TABLE_NAME "player_rank" +/// The index of the ckey in the items of a given row in a query for player ranks. +#define INDEX_CKEY 1 +/// The name entered in the database for the admin_ckey for legacy migrations. +#define LEGACY_MIGRATION_ADMIN_CKEY "LEGACY" + + +SUBSYSTEM_DEF(player_ranks) + name = "Player Ranks" + flags = SS_NO_FIRE + init_order = INIT_ORDER_PLAYER_RANKS + // The following controllers handle most of the legacy system's functions, + // and provide a layer of abstraction for this subsystem to have cleaner + // logic. + /// The donator player rank controller. + var/datum/player_rank_controller/donator/donator_controller + /// The mentor player rank controller. + var/datum/player_rank_controller/mentor/mentor_controller + /// The veteran player rank controller. + var/datum/player_rank_controller/veteran/veteran_controller + + +/datum/controller/subsystem/player_ranks/Initialize() + if(IsAdminAdvancedProcCall()) + return + + load_donators() + load_mentors() + load_veterans() + + return SS_INIT_SUCCESS + + +/datum/controller/subsystem/player_ranks/Destroy() + . = ..() + + QDEL_NULL(donator_controller) + QDEL_NULL(mentor_controller) + QDEL_NULL(veteran_controller) + + +/** + * Returns whether or not the user is qualified as a donator. + * + * Arguments: + * * user - The client to verify the donator status of. + */ +/datum/controller/subsystem/player_ranks/proc/is_donator(client/user) + if(!istype(user)) + CRASH("Invalid user type provided to is_donator(), expected 'client' and obtained '[user ? user.type : "null"]'.") + + if(GLOB.donator_list[user.ckey]) + return TRUE + + if(is_admin(user)) + return TRUE + + return FALSE + + +/** + * Returns whether or not the user is qualified as a mentor. + * Wrapper for the `is_mentor()` proc on the client, with a null check. + * + * Arguments: + * * user - The client to verify the mentor status of. + */ +/datum/controller/subsystem/player_ranks/proc/is_mentor(client/user) + if(!istype(user)) + CRASH("Invalid user type provided to is_mentor(), expected 'client' and obtained '[user ? user.type : "null"]'.") + + return user.is_mentor() + + +/** + * Returns whether or not the user is qualified as a veteran. + * + * Arguments: + * * user - The client to verify the veteran status of. + */ +/datum/controller/subsystem/player_ranks/proc/is_veteran(client/user) + if(!istype(user)) + CRASH("Invalid user type provided to is_veteran(), expected 'client' and obtained '[user ? user.type : "null"]'.") + + if(GLOB.veteran_list[user.ckey]) + return TRUE + + if(is_admin(user)) + return TRUE + + return FALSE + + +/// Handles loading donators either via SQL or using the legacy system, +/// based on configs. +/datum/controller/subsystem/player_ranks/proc/load_donators() + PROTECTED_PROC(TRUE) + + if(IsAdminAdvancedProcCall()) + return + + donator_controller = new + + if(CONFIG_GET(flag/donator_legacy_system)) + donator_controller.load_legacy() + update_all_prefs_unlock_contents() + return + + if(!SSdbcore.Connect()) + var/message = "Failed to connect to database in load_donators(). Reverting to legacy system." + log_config(message) + log_game(message) + message_admins(message) + CONFIG_SET(flag/donator_legacy_system, TRUE) + donator_controller.load_legacy() + return + + load_player_rank_sql(donator_controller) + update_all_prefs_unlock_contents() + + +/** + * Handles updating all of the preferences datums to have the appropriate + * `unlock_content` and `max_save_slots` once donators are loaded. + */ +/datum/controller/subsystem/player_ranks/proc/update_all_prefs_unlock_contents() + for(var/ckey as anything in GLOB.preferences_datums) + update_prefs_unlock_content(GLOB.preferences_datums[ckey]) + + +/** + * Updates the `unlock_contents` and the `max_save_slots` + * + * Arguments: + * * prefs - The preferences datum to check the unlock_content eligibility. + */ +/datum/controller/subsystem/player_ranks/proc/update_prefs_unlock_content(datum/preferences/prefs) + if(!prefs) + return + + prefs.unlock_content = !!prefs.parent.IsByondMember() || is_donator(prefs.parent) + if(prefs.unlock_content) + prefs.max_save_slots = 50 + + +/// Handles loading mentors either via SQL or using the legacy system, +/// based on configs. +/datum/controller/subsystem/player_ranks/proc/load_mentors() + PROTECTED_PROC(TRUE) + + if(IsAdminAdvancedProcCall()) + return + + mentor_controller = new + + if(CONFIG_GET(flag/mentor_legacy_system)) + mentor_controller.load_legacy() + return + + if(!SSdbcore.Connect()) + var/message = "Failed to connect to database in load_mentors(). Reverting to legacy system." + log_config(message) + log_game(message) + message_admins(message) + CONFIG_SET(flag/mentor_legacy_system, TRUE) + mentor_controller.load_legacy() + return + + load_player_rank_sql(mentor_controller) + + +/// Handles loading veteran players either via SQL or using the legacy system, +/// based on configs. +/datum/controller/subsystem/player_ranks/proc/load_veterans() + PROTECTED_PROC(TRUE) + + if(IsAdminAdvancedProcCall()) + return + + veteran_controller = new + + if(CONFIG_GET(flag/veteran_legacy_system)) + veteran_controller.load_legacy() + return + + if(!SSdbcore.Connect()) + var/message = "Failed to connect to database in load_veterans(). Reverting to legacy system." + log_config(message) + log_game(message) + message_admins(message) + CONFIG_SET(flag/veteran_legacy_system, TRUE) + veteran_controller.load_legacy() + return + + load_player_rank_sql(veteran_controller) + + +/** + * Handles populating the player rank from the database. + * + * Arguments: + * * rank_controller - The player rank controller of the rank to load. + */ +/datum/controller/subsystem/player_ranks/proc/load_player_rank_sql(datum/player_rank_controller/rank_controller) + PROTECTED_PROC(TRUE) + + if(IsAdminAdvancedProcCall()) + return + + var/datum/db_query/query_load_player_rank = SSdbcore.NewQuery( + "SELECT ckey FROM [format_table_name(PLAYER_RANK_TABLE_NAME)] WHERE deleted = 0 AND rank = :rank", + list("rank" = rank_controller.rank_title), + ) + + if(!query_load_player_rank.warn_execute()) + return + + rank_controller.load_from_query(query_load_player_rank) + + +/// Allows fetching the appropriate player_rank_controller based on its +/// `rank_title`, for convenience. +/datum/controller/subsystem/player_ranks/proc/get_controller_for_group(rank_title) + PROTECTED_PROC(TRUE) + + if(IsAdminAdvancedProcCall()) + return null + + rank_title = lowertext(rank_title) + + // Can't make switch() statements with non-constant values. + if(rank_title == donator_controller.rank_title) + return donator_controller + + if(rank_title == mentor_controller.rank_title) + return mentor_controller + + if(rank_title == veteran_controller.rank_title) + return veteran_controller + + CRASH("Invalid player_rank_controller \"[rank_title || "*null*"]\" used in get_controller_for_group()!") + + +/** + * Handles adding the ckey to the proper player rank group, either on the database + * or in the legacy system. + * + * Arguments: + * * admin - The admin making the rank change. + * * ckey - The ckey of the player you want to now possess that player rank. + * * rank_title - The title of the group you want to add the ckey to. + */ +/datum/controller/subsystem/player_ranks/proc/add_player_to_group(client/admin, ckey, rank_title) + if(IsAdminAdvancedProcCall()) + return FALSE + + if(!ckey || !admin || !rank_title) + return FALSE + + if(!check_rights_for(admin, R_PERMISSIONS)) + to_chat(admin, span_warning("You do not possess the permissions to do this.")) + return FALSE + + rank_title = lowertext(rank_title) + + var/datum/player_rank_controller/controller = get_controller_for_group(rank_title) + + if(!controller) + stack_trace("Invalid player rank \"[rank_title]\" supplied in add_player_to_group()!") + return FALSE + + ckey = ckey(ckey) + + var/already_in_config = controller.get_ckeys_for_legacy_save() + + if(already_in_config[ckey]) + to_chat(admin, span_warning("\"[ckey]\" is already a [rank_title]!")) + return FALSE + + if(controller.should_use_legacy_system()) + controller.add_player_legacy(ckey) + return TRUE + + return add_player_rank_sql(controller, ckey, admin.ckey) + + +/** + * Handles adding the ckey to the appropriate player rank table on the database, + * as well as in-game. + * + * Arguments: + * * controller - The controller of the player rank you want to add the ckey to. + * * ckey - The ckey of the player you want to now possess that player rank. + * * admin_ckey - The ckey of the admin that made the rank change. + */ +/datum/controller/subsystem/player_ranks/proc/add_player_rank_sql(datum/player_rank_controller/controller, ckey, admin_ckey) + PROTECTED_PROC(TRUE) + + if(IsAdminAdvancedProcCall()) + return FALSE + + var/datum/db_query/query_add_player_rank = SSdbcore.NewQuery( + "INSERT INTO [format_table_name(PLAYER_RANK_TABLE_NAME)] (ckey, rank, admin_ckey) VALUES(:ckey, :rank, :admin_ckey) \ + ON DUPLICATE KEY UPDATE deleted = 0, admin_ckey = :admin_ckey", + list("ckey" = ckey, "rank" = controller.rank_title, "admin_ckey" = admin_ckey), + ) + + if(!query_add_player_rank.warn_execute()) + return FALSE + + controller.add_player(ckey) + return TRUE + + +/** + * Handles removing the ckey from the proper player rank group, either on the database + * or in the legacy system. + * + * Arguments: + * * admin - The admin making the rank change. + * * ckey - The ckey of the player you want to no longer possess that player rank. + * * rank_title - The title of the group you want to remove the ckey from. + */ +/datum/controller/subsystem/player_ranks/proc/remove_player_from_group(client/admin, ckey, rank_title) + if(IsAdminAdvancedProcCall()) + return FALSE + + if(!ckey || !admin || !rank_title) + return FALSE + + if(!check_rights_for(admin, R_PERMISSIONS)) + to_chat(admin, span_warning("You do not possess the permissions to do this.")) + return FALSE + + rank_title = lowertext(rank_title) + + var/datum/player_rank_controller/controller = get_controller_for_group(rank_title) + + if(!controller) + stack_trace("Invalid player rank \"[rank_title]\" supplied in add_player_to_group()!") + return FALSE + + ckey = ckey(ckey) + + var/already_in_config = controller.get_ckeys_for_legacy_save() + + if(!already_in_config[ckey]) + to_chat(admin, span_warning("\"[ckey]\" is already not a [rank_title]!")) + return FALSE + + if(controller.should_use_legacy_system()) + controller.remove_player_legacy(ckey) + return TRUE + + return remove_player_rank_sql(controller, ckey, admin.ckey) + + +/** + * Handles removing the ckey from the appropriate player rank table on the database, + * as well as in-game. + * + * Arguments: + * * controller - The controller of the player rank you want to remove the ckey from. + * * ckey - The ckey of the player you want to no longer possess that player rank. + * * admin_ckey - The ckey of the admin that made the rank change. + */ +/datum/controller/subsystem/player_ranks/proc/remove_player_rank_sql(datum/player_rank_controller/controller, ckey, admin_ckey) + PROTECTED_PROC(TRUE) + + if(IsAdminAdvancedProcCall()) + return FALSE + + var/datum/db_query/query_remove_player_rank = SSdbcore.NewQuery( + "UPDATE [format_table_name(PLAYER_RANK_TABLE_NAME)] SET deleted = 1, admin_ckey = :admin_ckey WHERE ckey = :ckey AND rank = :rank", + list("ckey" = ckey, "rank" = controller.rank_title, "admin_ckey" = admin_ckey), + ) + + if(!query_remove_player_rank.warn_execute()) + return FALSE + + controller.remove_player(ckey) + return TRUE + + +/** + * Handles migrating a player rank system from the legacy system to the + * SQL-based version, from its `rank_title` + * + * Arguments: + * * admin - The admin trying to do the migration. + * * rank_title - String of the name of the player rank to migrate + * (case-sensitive). + */ +/datum/controller/subsystem/player_ranks/proc/migrate_player_rank_to_sql(client/admin, rank_title) + if(IsAdminAdvancedProcCall()) + return + + if(!check_rights_for(admin, R_PERMISSIONS | R_DEBUG | R_SERVER)) + to_chat(admin, span_warning("You do not possess the permissions to do this.")) + return + + var/datum/player_rank_controller/controller = get_controller_for_group(rank_title) + + if(!controller) + return + + migrate_player_rank_to_sql_from_controller(controller) + + +/** + * Handles migrating the ckeys of the players that were stored in a legacy + * player rank system into the SQL-based one instead. It will ensure to only + * add ckeys that were not already present in the database. + * + * Arguments: + * * controller - The player rank controller you want to migrate from the + * legacy system to the SQL one. + */ +/datum/controller/subsystem/player_ranks/proc/migrate_player_rank_to_sql_from_controller(datum/player_rank_controller/controller) + PROTECTED_PROC(TRUE) + + if(IsAdminAdvancedProcCall()) + return + + var/list/ckeys_to_migrate = controller.get_ckeys_to_migrate() + + // We explicitly don't check if they were deleted or not, because we + // EXPLICITLY want to avoid any kind of duplicates. + var/datum/db_query/query_get_existing_entries = SSdbcore.NewQuery( + "SELECT ckey FROM [format_table_name(PLAYER_RANK_TABLE_NAME)] WHERE rank = :rank", + list("rank" = controller.rank_title), + ) + + if(!query_get_existing_entries.warn_execute()) + return + + while(query_get_existing_entries.NextRow()) + var/ckey = ckey(query_get_existing_entries.item[INDEX_CKEY]) + ckeys_to_migrate -= ckey + + var/list/rows_to_insert = list() + + for(var/ckey in ckeys_to_migrate) + rows_to_insert += list(list("ckey" = ckey, "rank" = controller.rank_title, "admin_ckey" = LEGACY_MIGRATION_ADMIN_CKEY)) + + log_config("Migrating [length(rows_to_insert)] entries from \the [controller.rank_title] legacy system to the SQL-based system.") + SSdbcore.MassInsert(format_table_name(PLAYER_RANK_TABLE_NAME), rows_to_insert, warn = TRUE) + + +#undef PLAYER_RANK_TABLE_NAME +#undef INDEX_CKEY +#undef LEGACY_MIGRATION_ADMIN_CKEY diff --git a/modular_skyrat/modules/primitive_production/code/ceramics.dm b/modular_skyrat/modules/primitive_production/code/ceramics.dm index d6bcb032916..49d71494393 100644 --- a/modular_skyrat/modules/primitive_production/code/ceramics.dm +++ b/modular_skyrat/modules/primitive_production/code/ceramics.dm @@ -59,9 +59,12 @@ /datum/export/ceramics cost = CARGO_CRATE_VALUE * 2 unit_name = "ceramic product" - export_types = list(/obj/item/plate/ceramic, - /obj/item/reagent_containers/cup/bowl/ceramic, - /obj/item/reagent_containers/cup/beaker/large/ceramic) + export_types = list( + /obj/item/plate/ceramic, + /obj/item/plate/oven_tray/material/ceramic, + /obj/item/reagent_containers/cup/bowl/ceramic, + /obj/item/reagent_containers/cup/beaker/large/ceramic, + ) /datum/export/ceramics/sell_object(obj/O, datum/export_report/report, dry_run, apply_elastic = FALSE) //I really dont want them to feel gimped . = ..() @@ -71,6 +74,7 @@ unit_name = "unfinished ceramic product" export_types = list(/obj/item/ceramic/plate, /obj/item/ceramic/bowl, + /obj/item/ceramic/tray, /obj/item/ceramic/cup) /datum/export/ceramics_unfinished/sell_object(obj/O, datum/export_report/report, dry_run, apply_elastic = FALSE) //I really dont want them to feel gimped @@ -87,6 +91,17 @@ icon = 'modular_skyrat/modules/primitive_production/icons/prim_fun.dmi' icon_state = "clay_plate" +/obj/item/ceramic/tray + name = "ceramic tray" + desc = "A piece of clay that is flat, in the shape of a tray." + icon_state = "clay_tray" + forge_item = /obj/item/plate/oven_tray/material/ceramic + +/obj/item/plate/oven_tray/material/ceramic + name = "ceramic oven tray" + icon = 'modular_skyrat/modules/primitive_production/icons/prim_fun.dmi' + icon_state = "clay_tray" + /obj/item/ceramic/bowl name = "ceramic bowl" desc = "A piece of clay with a raised lip, in the shape of a bowl." @@ -112,6 +127,13 @@ icon_state = "clay_cup" custom_materials = null +/obj/item/ceramic/brick + name = "ceramic brick" + desc = "A dense block of clay, ready to be fired into a brick!" + icon = 'modular_skyrat/modules/primitive_production/icons/prim_fun.dmi' + icon_state = "clay_brick" + forge_item = /obj/item/stack/sheet/mineral/clay + /obj/structure/throwing_wheel name = "throwing wheel" desc = "A machine that allows you to throw clay." @@ -171,7 +193,7 @@ if(in_use) return use(user) - in_use = FALSE + in_use = FALSE /** * Prompts user for how they wish to use the throwing wheel @@ -192,7 +214,7 @@ return switch(user_input) if("Create") - var/creation_choice = tgui_alert(user, "What you like to create?", "Creation Choice", list("Cup", "Plate", "Bowl")) + var/creation_choice = tgui_input_list(user, "What you like to create?", "Creation Choice", list("Cup", "Plate", "Bowl", "Tray", "Brick")) if(!creation_choice) return switch(creation_choice) @@ -202,6 +224,10 @@ use_clay(/obj/item/ceramic/plate, user) if("Bowl") use_clay(/obj/item/ceramic/bowl, user) + if("Tray") + use_clay(/obj/item/ceramic/tray, user) + if("Brick") + use_clay(/obj/item/ceramic/brick, user) if("Remove") if(!do_after(user, spinning_speed, target = src)) return diff --git a/modular_skyrat/modules/primitive_production/icons/prim_fun.dmi b/modular_skyrat/modules/primitive_production/icons/prim_fun.dmi index 258f6ca2897..0f6e0725611 100644 Binary files a/modular_skyrat/modules/primitive_production/icons/prim_fun.dmi and b/modular_skyrat/modules/primitive_production/icons/prim_fun.dmi differ diff --git a/modular_skyrat/modules/sec_haul/code/corrections_officer/corrections_officer.dm b/modular_skyrat/modules/sec_haul/code/corrections_officer/corrections_officer.dm index ccbe7a29119..48ff0b3905e 100644 --- a/modular_skyrat/modules/sec_haul/code/corrections_officer/corrections_officer.dm +++ b/modular_skyrat/modules/sec_haul/code/corrections_officer/corrections_officer.dm @@ -51,6 +51,7 @@ backpack = /obj/item/storage/backpack/security satchel = /obj/item/storage/backpack/satchel/sec duffelbag = /obj/item/storage/backpack/duffelbag/sec + messenger = /obj/item/storage/backpack/messenger/sec head = /obj/item/clothing/head/corrections_officer box = /obj/item/storage/box/survival/security belt = /obj/item/modular_computer/pda/security diff --git a/modular_skyrat/modules/sec_haul/code/guns/gunsets.dm b/modular_skyrat/modules/sec_haul/code/guns/gunsets.dm index f67d2ac2271..f89300df920 100644 --- a/modular_skyrat/modules/sec_haul/code/guns/gunsets.dm +++ b/modular_skyrat/modules/sec_haul/code/guns/gunsets.dm @@ -21,7 +21,7 @@ /obj/item/storage/box/gunset/PopulateContents() . = ..() - new /obj/item/storage/bag/ammo(src) + new /obj/item/storage/pouch/ammo(src) /obj/item/storage/box/gunset/update_icon() . = ..() diff --git a/modular_skyrat/modules/sec_haul/code/misc/vending.dm b/modular_skyrat/modules/sec_haul/code/misc/vending.dm index 6ec68e4a407..9239ab4c5e8 100644 --- a/modular_skyrat/modules/sec_haul/code/misc/vending.dm +++ b/modular_skyrat/modules/sec_haul/code/misc/vending.dm @@ -44,6 +44,7 @@ /obj/item/storage/backpack/security = 5, /obj/item/storage/backpack/satchel/sec = 5, /obj/item/storage/backpack/duffelbag/sec = 5, + /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/tactical = 4, diff --git a/modular_skyrat/modules/skyrat-uplinks/code/categories/device_tools.dm b/modular_skyrat/modules/skyrat-uplinks/code/categories/device_tools.dm index 6b0ef91884c..c33882e6c72 100644 --- a/modular_skyrat/modules/skyrat-uplinks/code/categories/device_tools.dm +++ b/modular_skyrat/modules/skyrat-uplinks/code/categories/device_tools.dm @@ -26,7 +26,7 @@ /datum/uplink_item/device_tools/ammo_pouch name = "Ammo Pouch" desc = "A small yet large enough pouch that can fit in your pocket, and has room for three magazines." - item = /obj/item/storage/bag/ammo + item = /obj/item/storage/pouch/ammo cost = 1 illegal_tech = FALSE diff --git a/modular_skyrat/modules/synths/code/species/synthetic.dm b/modular_skyrat/modules/synths/code/species/synthetic.dm index f8a521fd2e4..08091118909 100644 --- a/modular_skyrat/modules/synths/code/species/synthetic.dm +++ b/modular_skyrat/modules/synths/code/species/synthetic.dm @@ -34,7 +34,7 @@ ) changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT reagent_flags = PROCESS_SYNTHETIC - payday_modifier = 0.75 // Matches the rest of the pay penalties the non-human crew have + payday_modifier = 1.0 // Matches the rest of the pay penalties the non-human crew have species_language_holder = /datum/language_holder/machine mutant_organs = list(/obj/item/organ/internal/cyberimp/arm/power_cord) mutantbrain = /obj/item/organ/internal/brain/synth diff --git a/modular_skyrat/modules/teshari/code/_teshari.dm b/modular_skyrat/modules/teshari/code/_teshari.dm index b278be3c2c8..84dc35e59c2 100644 --- a/modular_skyrat/modules/teshari/code/_teshari.dm +++ b/modular_skyrat/modules/teshari/code/_teshari.dm @@ -21,7 +21,7 @@ ) digitigrade_customization = DIGITIGRADE_NEVER changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT - payday_modifier = 0.75 + payday_modifier = 1.0 mutanttongue = /obj/item/organ/internal/tongue/teshari custom_worn_icons = list( LOADOUT_ITEM_HEAD = TESHARI_HEAD_ICON, diff --git a/modular_skyrat/modules/tribal_extended/code/ammo/reusable/arrow.dm b/modular_skyrat/modules/tribal_extended/code/ammo/reusable/arrow.dm index a4debd87dde..dbd807d16e5 100644 --- a/modular_skyrat/modules/tribal_extended/code/ammo/reusable/arrow.dm +++ b/modular_skyrat/modules/tribal_extended/code/ammo/reusable/arrow.dm @@ -1,19 +1,26 @@ /obj/projectile/bullet/arrow var/faction_bonus_force = 0 //Bonus force dealt against certain factions - var/list/nemesis_path //Any mob with a faction that exists in this list will take bonus damage/effects + var/list/nemesis_paths //Any mob with a faction that exists in this list will take bonus damage/effects /obj/projectile/bullet/arrow/prehit_pierce(mob/living/target, mob/living/carbon/human/user) - if(istype(target, nemesis_path)) + if(isnull(target)) + return ..() + if(target.type in nemesis_paths) damage += faction_bonus_force - .=..() + + return ..() /obj/projectile/bullet/arrow/ash name = "ashen arrow" desc = "An arrow made of hardened ash." faction_bonus_force = 60 damage = 15//lower me to 20 or 15 - nemesis_path = /mob/living/simple_animal/hostile/asteroid - projectile_type = /obj/item/ammo_casing/arrow/ash + nemesis_paths = list( + /mob/living/simple_animal/hostile/asteroid, + /mob/living/basic/mining, + /mob/living/basic/wumborian_fugu, + ) + shrapnel_type = /obj/item/ammo_casing/arrow/ash /obj/projectile/bullet/arrow/bone name = "bone arrow" @@ -22,9 +29,22 @@ damage = 35 armour_penetration = 20 wound_bonus = -30 - nemesis_path = /mob/living/simple_animal/hostile/asteroid - projectile_type = /obj/item/ammo_casing/arrow/bone - embedding = list(embed_chance=33, fall_chance=3, jostle_chance=4, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.4, pain_mult=5, jostle_pain_mult=6, rip_time=5) + nemesis_paths = list( + /mob/living/simple_animal/hostile/asteroid, + /mob/living/basic/mining, + /mob/living/basic/wumborian_fugu, + ) + shrapnel_type = /obj/item/ammo_casing/arrow/bone + embedding = list( + embed_chance = 33, + fall_chance = 3, + jostle_chance = 4, + ignore_throwspeed_threshold = TRUE, + pain_stam_pct = 0.4, + pain_mult = 5, + jostle_pain_mult = 6, + rip_time = 0.5 SECONDS + ) /obj/projectile/bullet/arrow/bronze name = "bronze arrow" @@ -32,5 +52,7 @@ faction_bonus_force = 90 damage = 30 armour_penetration = 30 - nemesis_path = /mob/living/simple_animal/hostile/megafauna - projectile_type = /obj/item/ammo_casing/arrow/bronze + nemesis_paths = list( + /mob/living/simple_animal/hostile/megafauna, + ) + shrapnel_type = /obj/item/ammo_casing/arrow/bronze diff --git a/modular_skyrat/modules/veteran_players/code/veteran_players.dm b/modular_skyrat/modules/veteran_players/code/veteran_players.dm deleted file mode 100644 index ab1c98b1fa9..00000000000 --- a/modular_skyrat/modules/veteran_players/code/veteran_players.dm +++ /dev/null @@ -1,33 +0,0 @@ -#define VETERANPLAYERS "[global.config.directory]/skyrat/veteran_players.txt" - -GLOBAL_LIST(veteran_players) - -/proc/load_veteran_players() - GLOB.veteran_players = list() - for(var/line in world.file2list(VETERANPLAYERS)) - if(!line) - continue - if(findtextEx(line,"#",1,2)) - continue - GLOB.veteran_players[ckey(line)] = TRUE //Associative so we can check it much faster - -/proc/save_veteran_players() - var/veteran_list = "" - for(var/veteran in GLOB.veteran_players) - veteran_list += veteran + "\n" - rustg_file_write(veteran_list, VETERANPLAYERS) - -/proc/is_veteran_player(client/user) - if(isnull(user)) - return FALSE - return TRUE //Bubberstation Edit, unlocks all Veteran features for everyone - /* - if(GLOB.veteran_players[user.ckey]) - return TRUE - if(check_rights_for(user, R_ADMIN)) - return TRUE - if(GLOB.deadmins[user.ckey]) - return TRUE - return FALSE -*/ -#undef VETERANPLAYERS diff --git a/modular_skyrat/modules/xenos_skyrat_redo/code/base_skyrat_xeno.dm b/modular_skyrat/modules/xenos_skyrat_redo/code/base_skyrat_xeno.dm index 1d36afcdf3b..e098f01769b 100644 --- a/modular_skyrat/modules/xenos_skyrat_redo/code/base_skyrat_xeno.dm +++ b/modular_skyrat/modules/xenos_skyrat_redo/code/base_skyrat_xeno.dm @@ -5,8 +5,6 @@ icon = 'modular_skyrat/modules/xenos_skyrat_redo/icons/big_xenos.dmi' rotate_on_lying = FALSE base_pixel_x = -16 //All of the xeno sprites are 64x64, and we want them to be level with the tile they are on, much like oversized quirk users - /// Holds the ability for making an alien's sprite smaller to only themselves - var/datum/action/small_sprite/skyrat_xeno/small_sprite /// Holds the ability for quick resting without using the ic panel, and without editing xeno huds var/datum/action/cooldown/alien/skyrat/sleepytime/rest_button mob_size = MOB_SIZE_LARGE @@ -35,8 +33,7 @@ /mob/living/carbon/alien/adult/skyrat/Initialize(mapload) . = ..() - small_sprite = new /datum/action/small_sprite/skyrat_xeno() - small_sprite.Grant(src) + AddComponent(/datum/component/seethrough_mob) rest_button = new /datum/action/cooldown/alien/skyrat/sleepytime() rest_button.Grant(src) @@ -51,7 +48,6 @@ real_name = "alien [caste]" /mob/living/carbon/alien/adult/skyrat/Destroy() - QDEL_NULL(small_sprite) QDEL_NULL(rest_button) if(evolve_ability) QDEL_NULL(evolve_ability) @@ -87,10 +83,6 @@ if(!istype(owner_alien) || owner_alien.unable_to_use_abilities) return FALSE -/datum/action/small_sprite/skyrat_xeno - small_icon = 'icons/obj/toys/plushes.dmi' - small_icon_state = "rouny" - /datum/action/cooldown/alien/skyrat/sleepytime //I don't think this has a mechanical advantage but they have cool resting sprites so... name = "Rest" desc = "Sometimes even murder aliens need to have a little lie down." diff --git a/rust_g.dll b/rust_g.dll index 059c79e3402..cfb52ffc65a 100644 Binary files a/rust_g.dll and b/rust_g.dll differ diff --git a/sound/attributions.txt b/sound/attributions.txt index 55b34c5618f..baeb5f30851 100644 --- a/sound/attributions.txt +++ b/sound/attributions.txt @@ -87,3 +87,7 @@ https://freesound.org/people/squareal/sounds/237375/ ding_short.ogg is from Natty23 (CC 4) https://freesound.org/people/Natty23/sounds/411747/ + + +jingle.ogg is from Zapsplat (https://www.zapsplat.com/license-type/standard-license/) +https://www.zapsplat.com/sound-effect-category/sleigh-bells/ diff --git a/sound/effects/jingle.ogg b/sound/effects/jingle.ogg new file mode 100644 index 00000000000..da903910dfc Binary files /dev/null and b/sound/effects/jingle.ogg differ diff --git a/sound/weapons/gun/rifle/shot_heavy.ogg b/sound/weapons/gun/rifle/shot_heavy.ogg new file mode 100644 index 00000000000..f91b21ec4d8 Binary files /dev/null and b/sound/weapons/gun/rifle/shot_heavy.ogg differ diff --git a/strings/phobia.json b/strings/phobia.json index feb52d7b871..3f45b9f2364 100644 --- a/strings/phobia.json +++ b/strings/phobia.json @@ -263,6 +263,43 @@ "wt550" ], + "heresy": [ + "armsy", + "ash", + "blade", + "cloak", + "codex", + "cosmic", + "eldritch", + "fire shark", + "flesh", + "focus", + "ghoul", + "grasp", + "hand", + "heart", + "heresy", + "heretic", + "lionhunter", + "maid in the mirror", + "mansus", + "offer", + "pierced reality", + "raw prophet", + "reality crack", + "reality pierce", + "ritual", + "robe", + "rune", + "rust", + "sacrifice", + "space", + "stalker", + "star", + "void", + "worm" + ], + "insects": [ "bee", "buzz", @@ -424,7 +461,7 @@ "wiz", "wizard", "zombie" - ] + ] diff --git a/tgstation.dme b/tgstation.dme index ccbc0c133f8..ea7f4b92ac4 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -277,6 +277,7 @@ #include "code\__DEFINES\dcs\signals\signals_backpack.dm" #include "code\__DEFINES\dcs\signals\signals_beam.dm" #include "code\__DEFINES\dcs\signals\signals_bot.dm" +#include "code\__DEFINES\dcs\signals\signals_camera.dm" #include "code\__DEFINES\dcs\signals\signals_changeling.dm" #include "code\__DEFINES\dcs\signals\signals_circuit.dm" #include "code\__DEFINES\dcs\signals\signals_client.dm" @@ -356,6 +357,7 @@ #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_spawner.dm" #include "code\__DEFINES\research\anomalies.dm" #include "code\__DEFINES\research\research_categories.dm" +#include "code\__DEFINES\research\slimes.dm" #include "code\__DEFINES\~skyrat_defines\_organ_defines.dm" #include "code\__DEFINES\~skyrat_defines\access.dm" #include "code\__DEFINES\~skyrat_defines\actionspeed_modification.dm" @@ -455,6 +457,8 @@ #include "code\__HELPERS\atoms.dm" #include "code\__HELPERS\auxtools.dm" #include "code\__HELPERS\bitflag_lists.dm" +#include "code\__HELPERS\byond_status.dm" +#include "code\__HELPERS\cameras.dm" #include "code\__HELPERS\chat.dm" #include "code\__HELPERS\chat_filter.dm" #include "code\__HELPERS\clients.dm" @@ -577,6 +581,7 @@ #include "code\_globalvars\lists\client.dm" #include "code\_globalvars\lists\color.dm" #include "code\_globalvars\lists\flavor_misc.dm" +#include "code\_globalvars\lists\icons.dm" #include "code\_globalvars\lists\keybindings.dm" #include "code\_globalvars\lists\maintenance_loot.dm" #include "code\_globalvars\lists\mapping.dm" @@ -808,7 +813,6 @@ #include "code\datums\request_message.dm" #include "code\datums\ruins.dm" #include "code\datums\saymode.dm" -#include "code\datums\shuttles.dm" #include "code\datums\signals.dm" #include "code\datums\spawners_menu.dm" #include "code\datums\sprite_accessories.dm" @@ -850,6 +854,7 @@ #include "code\datums\actions\items\unzip.dm" #include "code\datums\actions\items\vortex_recall.dm" #include "code\datums\actions\mobs\adjust_vision.dm" +#include "code\datums\actions\mobs\assume_form.dm" #include "code\datums\actions\mobs\blood_warp.dm" #include "code\datums\actions\mobs\charge.dm" #include "code\datums\actions\mobs\charge_apc.dm" @@ -863,7 +868,6 @@ #include "code\datums\actions\mobs\open_mob_commands.dm" #include "code\datums\actions\mobs\projectileattack.dm" #include "code\datums\actions\mobs\sign_language.dm" -#include "code\datums\actions\mobs\small_sprite.dm" #include "code\datums\actions\mobs\sneak.dm" #include "code\datums\actions\mobs\transform_weapon.dm" #include "code\datums\actions\mobs\sequences\dash_attack.dm" @@ -899,7 +903,9 @@ #include "code\datums\ai\basic_mobs\basic_subtrees\find_paper_and_write.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\find_parent.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\flee_target.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\maintain_distance.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\opportunistic_ventcrawler.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\ranged_skirmish.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\simple_attack_target.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\simple_find_nearest_target_to_flee.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\simple_find_target.dm" @@ -989,8 +995,11 @@ #include "code\datums\components\action_item_overlay.dm" #include "code\datums\components\admin_popup.dm" #include "code\datums\components\aggro_emote.dm" +#include "code\datums\components\ai_has_target_timer.dm" +#include "code\datums\components\ai_listen_to_weather.dm" #include "code\datums\components\ai_retaliate_advanced.dm" #include "code\datums\components\anti_magic.dm" +#include "code\datums\components\appearance_on_aggro.dm" #include "code\datums\components\aquarium_content.dm" #include "code\datums\components\area_based_godmode.dm" #include "code\datums\components\area_sound_manager.dm" @@ -1001,6 +1010,7 @@ #include "code\datums\components\aura_healing.dm" #include "code\datums\components\bakeable.dm" #include "code\datums\components\basic_mob_attack_telegraph.dm" +#include "code\datums\components\basic_ranged_ready_overlay.dm" #include "code\datums\components\beetlejuice.dm" #include "code\datums\components\blood_walk.dm" #include "code\datums\components\bloodysoles.dm" @@ -1084,6 +1094,7 @@ #include "code\datums\components\leash.dm" #include "code\datums\components\light_eater.dm" #include "code\datums\components\lock_on_cursor.dm" +#include "code\datums\components\magnet.dm" #include "code\datums\components\manual_blinking.dm" #include "code\datums\components\manual_breathing.dm" #include "code\datums\components\mind_linker.dm" @@ -1110,6 +1121,7 @@ #include "code\datums\components\radiation_countdown.dm" #include "code\datums\components\radioactive_emitter.dm" #include "code\datums\components\radioactive_exposure.dm" +#include "code\datums\components\ranged_attacks.dm" #include "code\datums\components\reagent_refiller.dm" #include "code\datums\components\redirect_attack_hand_from_turf.dm" #include "code\datums\components\reflection.dm" @@ -1123,6 +1135,7 @@ #include "code\datums\components\seclight_attachable.dm" #include "code\datums\components\sect_nullrod_bonus.dm" #include "code\datums\components\seethrough.dm" +#include "code\datums\components\seethrough_mob.dm" #include "code\datums\components\shell.dm" #include "code\datums\components\shielded.dm" #include "code\datums\components\shovel_hands.dm" @@ -1165,6 +1178,7 @@ #include "code\datums\components\tattoo.dm" #include "code\datums\components\technointrovert.dm" #include "code\datums\components\technoshy.dm" +#include "code\datums\components\telegraph_ability.dm" #include "code\datums\components\temporary_body.dm" #include "code\datums\components\tether.dm" #include "code\datums\components\thermite.dm" @@ -1183,6 +1197,7 @@ #include "code\datums\components\usb_port.dm" #include "code\datums\components\vacuum.dm" #include "code\datums\components\wearertargeting.dm" +#include "code\datums\components\weatherannouncer.dm" #include "code\datums\components\wet_floor.dm" #include "code\datums\components\container_item\container_item.dm" #include "code\datums\components\container_item\tank_holder.dm" @@ -1301,7 +1316,6 @@ #include "code\datums\elements\ai_target_damagesource.dm" #include "code\datums\elements\amputating_limbs.dm" #include "code\datums\elements\animal_variety.dm" -#include "code\datums\elements\appearance_on_aggro.dm" #include "code\datums\elements\art.dm" #include "code\datums\elements\atmos_requirements.dm" #include "code\datums\elements\atmos_sensitive.dm" @@ -1394,7 +1408,6 @@ #include "code\datums\elements\radiation_protected_clothing.dm" #include "code\datums\elements\radioactive.dm" #include "code\datums\elements\ranged_armour.dm" -#include "code\datums\elements\ranged_attacks.dm" #include "code\datums\elements\relay_attackers.dm" #include "code\datums\elements\ridable.dm" #include "code\datums\elements\rust.dm" @@ -1579,6 +1592,23 @@ #include "code\datums\screentips\atom_context.dm" #include "code\datums\screentips\item_context.dm" #include "code\datums\screentips\screentips.dm" +#include "code\datums\shuttles\_shuttle.dm" +#include "code\datums\shuttles\arrival.dm" +#include "code\datums\shuttles\assault_pod.dm" +#include "code\datums\shuttles\aux_base.dm" +#include "code\datums\shuttles\cargo.dm" +#include "code\datums\shuttles\emergency.dm" +#include "code\datums\shuttles\ert.dm" +#include "code\datums\shuttles\escape_pod.dm" +#include "code\datums\shuttles\ferry.dm" +#include "code\datums\shuttles\hunter.dm" +#include "code\datums\shuttles\infiltrator.dm" +#include "code\datums\shuttles\mining.dm" +#include "code\datums\shuttles\pirate.dm" +#include "code\datums\shuttles\ruin.dm" +#include "code\datums\shuttles\snowdin.dm" +#include "code\datums\shuttles\starfury.dm" +#include "code\datums\shuttles\whiteship.dm" #include "code\datums\skills\_skill.dm" #include "code\datums\skills\cleaning.dm" #include "code\datums\skills\fishing.dm" @@ -1605,7 +1635,9 @@ #include "code\datums\status_effects\debuffs\blindness.dm" #include "code\datums\status_effects\debuffs\choke.dm" #include "code\datums\status_effects\debuffs\confusion.dm" +#include "code\datums\status_effects\debuffs\cursed.dm" #include "code\datums\status_effects\debuffs\debuffs.dm" +#include "code\datums\status_effects\debuffs\decloning.dm" #include "code\datums\status_effects\debuffs\dizziness.dm" #include "code\datums\status_effects\debuffs\drowsiness.dm" #include "code\datums\status_effects\debuffs\drugginess.dm" @@ -1618,6 +1650,7 @@ #include "code\datums\status_effects\debuffs\screen_blur.dm" #include "code\datums\status_effects\debuffs\screwy_hud.dm" #include "code\datums\status_effects\debuffs\silenced.dm" +#include "code\datums\status_effects\debuffs\slimed.dm" #include "code\datums\status_effects\debuffs\spacer.dm" #include "code\datums\status_effects\debuffs\speech_debuffs.dm" #include "code\datums\status_effects\debuffs\strandling.dm" @@ -1656,6 +1689,7 @@ #include "code\datums\wires\emitter.dm" #include "code\datums\wires\explosive.dm" #include "code\datums\wires\fax.dm" +#include "code\datums\wires\mecha.dm" #include "code\datums\wires\microwave.dm" #include "code\datums\wires\mod.dm" #include "code\datums\wires\mulebot.dm" @@ -1678,6 +1712,7 @@ #include "code\game\alternate_appearance.dm" #include "code\game\atom_defense.dm" #include "code\game\atoms.dm" +#include "code\game\atoms_initializing_EXPENSIVE.dm" #include "code\game\atoms_movable.dm" #include "code\game\communications.dm" #include "code\game\data_huds.dm" @@ -1688,7 +1723,6 @@ #include "code\game\world.dm" #include "code\game\area\ai_monitored.dm" #include "code\game\area\areas.dm" -#include "code\game\area\space_station_13_areas.dm" #include "code\game\area\areas\ai_monitored.dm" #include "code\game\area\areas\away_content.dm" #include "code\game\area\areas\centcom.dm" @@ -1696,12 +1730,24 @@ #include "code\game\area\areas\mining.dm" #include "code\game\area\areas\misc.dm" #include "code\game\area\areas\shuttles.dm" -#include "code\game\area\areas\station.dm" #include "code\game\area\areas\ruins\_ruins.dm" #include "code\game\area\areas\ruins\icemoon.dm" #include "code\game\area\areas\ruins\lavaland.dm" #include "code\game\area\areas\ruins\space.dm" #include "code\game\area\areas\ruins\templates.dm" +#include "code\game\area\areas\station\cargo.dm" +#include "code\game\area\areas\station\command.dm" +#include "code\game\area\areas\station\common.dm" +#include "code\game\area\areas\station\engineering.dm" +#include "code\game\area\areas\station\hallway.dm" +#include "code\game\area\areas\station\maintenance.dm" +#include "code\game\area\areas\station\medical.dm" +#include "code\game\area\areas\station\misc.dm" +#include "code\game\area\areas\station\science.dm" +#include "code\game\area\areas\station\security.dm" +#include "code\game\area\areas\station\service.dm" +#include "code\game\area\areas\station\solars.dm" +#include "code\game\area\areas\station\telecomm.dm" #include "code\game\gamemodes\events.dm" #include "code\game\gamemodes\game_mode.dm" #include "code\game\gamemodes\objective.dm" @@ -1757,6 +1803,7 @@ #include "code\game\machinery\mechlaunchpad.dm" #include "code\game\machinery\medical_kiosk.dm" #include "code\game\machinery\medipen_refiller.dm" +#include "code\game\machinery\mining_weather_monitor.dm" #include "code\game\machinery\modular_shield.dm" #include "code\game\machinery\navbeacon.dm" #include "code\game\machinery\nebula_shielding.dm" @@ -1789,7 +1836,7 @@ #include "code\game\machinery\camera\camera_assembly.dm" #include "code\game\machinery\camera\motion.dm" #include "code\game\machinery\camera\presets.dm" -#include "code\game\machinery\camera\tracking.dm" +#include "code\game\machinery\camera\trackable.dm" #include "code\game\machinery\computer\_computer.dm" #include "code\game\machinery\computer\accounting.dm" #include "code\game\machinery\computer\aifixer.dm" @@ -1858,7 +1905,6 @@ #include "code\game\machinery\dna_infuser\organ_sets\roach_organs.dm" #include "code\game\machinery\doors\airlock.dm" #include "code\game\machinery\doors\airlock_electronics.dm" -#include "code\game\machinery\doors\airlock_types.dm" #include "code\game\machinery\doors\brigdoors.dm" #include "code\game\machinery\doors\door.dm" #include "code\game\machinery\doors\firedoor.dm" @@ -1916,6 +1962,7 @@ #include "code\game\objects\effects\particle_holder.dm" #include "code\game\objects\effects\phased_mob.dm" #include "code\game\objects\effects\portals.dm" +#include "code\game\objects\effects\poster_demotivational.dm" #include "code\game\objects\effects\poster_motivational.dm" #include "code\game\objects\effects\powerup.dm" #include "code\game\objects\effects\spiderwebs.dm" @@ -1960,6 +2007,7 @@ #include "code\game\objects\effects\particles\fire.dm" #include "code\game\objects\effects\particles\misc.dm" #include "code\game\objects\effects\particles\note_particles.dm" +#include "code\game\objects\effects\particles\slime.dm" #include "code\game\objects\effects\particles\smoke.dm" #include "code\game\objects\effects\particles\water.dm" #include "code\game\objects\effects\posters\contraband.dm" @@ -1981,11 +2029,12 @@ #include "code\game\objects\effects\spawners\random\entertainment.dm" #include "code\game\objects\effects\spawners\random\exotic.dm" #include "code\game\objects\effects\spawners\random\food_or_drink.dm" +#include "code\game\objects\effects\spawners\random\lavaland_mobs.dm" #include "code\game\objects\effects\spawners\random\maintenance.dm" #include "code\game\objects\effects\spawners\random\medical.dm" #include "code\game\objects\effects\spawners\random\mod.dm" -#include "code\game\objects\effects\spawners\random\mosin_nagant_spawner.dm" #include "code\game\objects\effects\spawners\random\random.dm" +#include "code\game\objects\effects\spawners\random\russian_rifle_spawner.dm" #include "code\game\objects\effects\spawners\random\structure.dm" #include "code\game\objects\effects\spawners\random\techstorage.dm" #include "code\game\objects\effects\spawners\random\trash.dm" @@ -2080,6 +2129,7 @@ #include "code\game\objects\items\skub.dm" #include "code\game\objects\items\spear.dm" #include "code\game\objects\items\sticker.dm" +#include "code\game\objects\items\syndie_spraycan.dm" #include "code\game\objects\items\tail_pin.dm" #include "code\game\objects\items\taster.dm" #include "code\game\objects\items\teleportation.dm" @@ -2108,7 +2158,6 @@ #include "code\game\objects\items\devices\anomaly_neutralizer.dm" #include "code\game\objects\items\devices\anomaly_releaser.dm" #include "code\game\objects\items\devices\beacon.dm" -#include "code\game\objects\items\devices\camera_bug.dm" #include "code\game\objects\items\devices\chameleonproj.dm" #include "code\game\objects\items\devices\destabilizing_crystal.dm" #include "code\game\objects\items\devices\desynchronizer.dm" @@ -2159,6 +2208,7 @@ #include "code\game\objects\items\food\egg.dm" #include "code\game\objects\items\food\frozen.dm" #include "code\game\objects\items\food\lizard.dm" +#include "code\game\objects\items\food\martian.dm" #include "code\game\objects\items\food\meatdish.dm" #include "code\game\objects\items\food\meatslab.dm" #include "code\game\objects\items\food\mexican.dm" @@ -2502,6 +2552,7 @@ #include "code\game\turfs\open\floor\reinforced_floor.dm" #include "code\game\turfs\open\floor\plating\misc_plating.dm" #include "code\game\turfs\open\space\space.dm" +#include "code\game\turfs\open\space\space_EXPENSIVE.dm" #include "code\game\turfs\open\space\transit.dm" #include "code\modules\actionspeed\_actionspeed_modifier.dm" #include "code\modules\actionspeed\modifiers\addiction.dm" @@ -2644,6 +2695,7 @@ #include "code\modules\admin\view_variables\mark_datum.dm" #include "code\modules\admin\view_variables\mass_edit_variables.dm" #include "code\modules\admin\view_variables\modify_variables.dm" +#include "code\modules\admin\view_variables\nobody_wants_to_learn_matrix_math.dm" #include "code\modules\admin\view_variables\particle_editor.dm" #include "code\modules\admin\view_variables\reference_tracking.dm" #include "code\modules\admin\view_variables\tag_datum.dm" @@ -2834,6 +2886,7 @@ #include "code\modules\antagonists\heretic\magic\mirror_walk.dm" #include "code\modules\antagonists\heretic\magic\nightwatcher_rebirth.dm" #include "code\modules\antagonists\heretic\magic\realignment.dm" +#include "code\modules\antagonists\heretic\magic\rust_charge.dm" #include "code\modules\antagonists\heretic\magic\rust_construction.dm" #include "code\modules\antagonists\heretic\magic\rust_wave.dm" #include "code\modules\antagonists\heretic\magic\shadow_cloak.dm" @@ -2915,9 +2968,7 @@ #include "code\modules\antagonists\traitor\components\traitor_objective_limit_per_time.dm" #include "code\modules\antagonists\traitor\components\traitor_objective_mind_tracker.dm" #include "code\modules\antagonists\traitor\objectives\assassination.dm" -#include "code\modules\antagonists\traitor\objectives\demoralise_crew.dm" -#include "code\modules\antagonists\traitor\objectives\demoralise_graffiti.dm" -#include "code\modules\antagonists\traitor\objectives\demoralise_poster.dm" +#include "code\modules\antagonists\traitor\objectives\demoralise_assault.dm" #include "code\modules\antagonists\traitor\objectives\destroy_heirloom.dm" #include "code\modules\antagonists\traitor\objectives\destroy_item.dm" #include "code\modules\antagonists\traitor\objectives\eyesnatching.dm" @@ -3683,6 +3734,7 @@ #include "code\modules\food_and_drinks\recipes\tablecraft\recipes_frozen.dm" #include "code\modules\food_and_drinks\recipes\tablecraft\recipes_guide.dm" #include "code\modules\food_and_drinks\recipes\tablecraft\recipes_lizard.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_martian.dm" #include "code\modules\food_and_drinks\recipes\tablecraft\recipes_meat.dm" #include "code\modules\food_and_drinks\recipes\tablecraft\recipes_mexican.dm" #include "code\modules\food_and_drinks\recipes\tablecraft\recipes_misc.dm" @@ -4037,6 +4089,7 @@ #include "code\modules\mapfluff\ruins\lavalandruin_code\surface.dm" #include "code\modules\mapfluff\ruins\lavalandruin_code\syndicate_base.dm" #include "code\modules\mapfluff\ruins\objects_and_mobs\ash_walker_den.dm" +#include "code\modules\mapfluff\ruins\objects_and_mobs\cursed_slot_machine.dm" #include "code\modules\mapfluff\ruins\objects_and_mobs\necropolis_gate.dm" #include "code\modules\mapfluff\ruins\objects_and_mobs\sin_ruins.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\allamericandiner.dm" @@ -4112,6 +4165,7 @@ #include "code\modules\mining\equipment\marker_beacons.dm" #include "code\modules\mining\equipment\mineral_scanner.dm" #include "code\modules\mining\equipment\mining_tools.dm" +#include "code\modules\mining\equipment\miningradio.dm" #include "code\modules\mining\equipment\resonator.dm" #include "code\modules\mining\equipment\survival_pod.dm" #include "code\modules\mining\equipment\wormhole_jaunter.dm" @@ -4196,14 +4250,26 @@ #include "code\modules\mob\living\basic\farm_animals\cow\cow_moonicorn.dm" #include "code\modules\mob\living\basic\farm_animals\cow\cow_wisdom.dm" #include "code\modules\mob\living\basic\heretic\fire_shark.dm" +#include "code\modules\mob\living\basic\heretic\heretic_summon.dm" #include "code\modules\mob\living\basic\heretic\star_gazer.dm" +#include "code\modules\mob\living\basic\icemoon\ice_whelp\ice_whelp.dm" +#include "code\modules\mob\living\basic\icemoon\ice_whelp\ice_whelp_abilities.dm" +#include "code\modules\mob\living\basic\icemoon\ice_whelp\ice_whelp_ai.dm" +#include "code\modules\mob\living\basic\jungle\mega_arachnid\mega_arachnid.dm" +#include "code\modules\mob\living\basic\jungle\mega_arachnid\mega_arachnid_abilities.dm" +#include "code\modules\mob\living\basic\jungle\mega_arachnid\mega_arachnid_ai.dm" #include "code\modules\mob\living\basic\lavaland\mining.dm" +#include "code\modules\mob\living\basic\lavaland\basilisk\basilisk.dm" +#include "code\modules\mob\living\basic\lavaland\basilisk\basilisk_overheat.dm" #include "code\modules\mob\living\basic\lavaland\bileworm\_bileworm.dm" #include "code\modules\mob\living\basic\lavaland\bileworm\bileworm_actions.dm" #include "code\modules\mob\living\basic\lavaland\bileworm\bileworm_ai.dm" #include "code\modules\mob\living\basic\lavaland\bileworm\bileworm_instrument.dm" #include "code\modules\mob\living\basic\lavaland\bileworm\bileworm_loot.dm" #include "code\modules\mob\living\basic\lavaland\bileworm\bileworm_vileworm.dm" +#include "code\modules\mob\living\basic\lavaland\goldgrub\goldgrub.dm" +#include "code\modules\mob\living\basic\lavaland\goldgrub\goldgrub_abilities.dm" +#include "code\modules\mob\living\basic\lavaland\goldgrub\goldgrub_ai.dm" #include "code\modules\mob\living\basic\lavaland\goliath\goliath.dm" #include "code\modules\mob\living\basic\lavaland\goliath\goliath_actions.dm" #include "code\modules\mob\living\basic\lavaland\goliath\goliath_ai.dm" @@ -4212,6 +4278,11 @@ #include "code\modules\mob\living\basic\lavaland\lobstrosity\lobstrosity.dm" #include "code\modules\mob\living\basic\lavaland\lobstrosity\lobstrosity_ai.dm" #include "code\modules\mob\living\basic\lavaland\lobstrosity\lobstrosity_trophy.dm" +#include "code\modules\mob\living\basic\lavaland\watcher\watcher.dm" +#include "code\modules\mob\living\basic\lavaland\watcher\watcher_ai.dm" +#include "code\modules\mob\living\basic\lavaland\watcher\watcher_gaze.dm" +#include "code\modules\mob\living\basic\lavaland\watcher\watcher_overwatch.dm" +#include "code\modules\mob\living\basic\lavaland\watcher\watcher_projectiles.dm" #include "code\modules\mob\living\basic\pets\fox.dm" #include "code\modules\mob\living\basic\pets\penguin.dm" #include "code\modules\mob\living\basic\pets\pet.dm" @@ -4228,6 +4299,7 @@ #include "code\modules\mob\living\basic\space_fauna\headslug.dm" #include "code\modules\mob\living\basic\space_fauna\killer_tomato.dm" #include "code\modules\mob\living\basic\space_fauna\lightgeist.dm" +#include "code\modules\mob\living\basic\space_fauna\morph.dm" #include "code\modules\mob\living\basic\space_fauna\mushroom.dm" #include "code\modules\mob\living\basic\space_fauna\spaceman.dm" #include "code\modules\mob\living\basic\space_fauna\bear\_bear.dm" @@ -4244,6 +4316,10 @@ #include "code\modules\mob\living\basic\space_fauna\demon\demon.dm" #include "code\modules\mob\living\basic\space_fauna\demon\demon_items.dm" #include "code\modules\mob\living\basic\space_fauna\demon\demon_subtypes.dm" +#include "code\modules\mob\living\basic\space_fauna\eyeball\_eyeball.dm" +#include "code\modules\mob\living\basic\space_fauna\eyeball\eyeball_ability.dm" +#include "code\modules\mob\living\basic\space_fauna\eyeball\eyeball_ai_behavior.dm" +#include "code\modules\mob\living\basic\space_fauna\eyeball\eyeball_ai_subtree.dm" #include "code\modules\mob\living\basic\space_fauna\hivebot\_hivebot.dm" #include "code\modules\mob\living\basic\space_fauna\hivebot\hivebot_behavior.dm" #include "code\modules\mob\living\basic\space_fauna\hivebot\hivebot_subtree.dm" @@ -4257,10 +4333,13 @@ #include "code\modules\mob\living\basic\space_fauna\netherworld\migo.dm" #include "code\modules\mob\living\basic\space_fauna\paper_wizard\paper_abilities.dm" #include "code\modules\mob\living\basic\space_fauna\paper_wizard\paper_wizard.dm" -#include "code\modules\mob\living\basic\space_fauna\spider\giant_spider\giant_spider.dm" +#include "code\modules\mob\living\basic\space_fauna\regal_rat\regal_rat.dm" +#include "code\modules\mob\living\basic\space_fauna\regal_rat\regal_rat_actions.dm" +#include "code\modules\mob\living\basic\space_fauna\regal_rat\regal_rat_ai.dm" +#include "code\modules\mob\living\basic\space_fauna\spider\spider.dm" #include "code\modules\mob\living\basic\space_fauna\spider\giant_spider\giant_spider_ai.dm" #include "code\modules\mob\living\basic\space_fauna\spider\giant_spider\giant_spider_subtrees.dm" -#include "code\modules\mob\living\basic\space_fauna\spider\giant_spider\giant_spider_variants.dm" +#include "code\modules\mob\living\basic\space_fauna\spider\giant_spider\giant_spiders.dm" #include "code\modules\mob\living\basic\space_fauna\spider\spider_abilities\hivemind.dm" #include "code\modules\mob\living\basic\space_fauna\spider\spider_abilities\lay_eggs.dm" #include "code\modules\mob\living\basic\space_fauna\spider\spider_abilities\web.dm" @@ -4483,16 +4562,13 @@ #include "code\modules\mob\living\simple_animal\hostile\blobbernaut.dm" #include "code\modules\mob\living\simple_animal\hostile\blobspore.dm" #include "code\modules\mob\living\simple_animal\hostile\dark_wizard.dm" -#include "code\modules\mob\living\simple_animal\hostile\eyeballs.dm" #include "code\modules\mob\living\simple_animal\hostile\heretic_monsters.dm" #include "code\modules\mob\living\simple_animal\hostile\hostile.dm" #include "code\modules\mob\living\simple_animal\hostile\illusion.dm" #include "code\modules\mob\living\simple_animal\hostile\mimic.dm" -#include "code\modules\mob\living\simple_animal\hostile\morph.dm" #include "code\modules\mob\living\simple_animal\hostile\nanotrasen.dm" #include "code\modules\mob\living\simple_animal\hostile\ooze.dm" #include "code\modules\mob\living\simple_animal\hostile\pirate.dm" -#include "code\modules\mob\living\simple_animal\hostile\regalrat.dm" #include "code\modules\mob\living\simple_animal\hostile\skeleton.dm" #include "code\modules\mob\living\simple_animal\hostile\smspider.dm" #include "code\modules\mob\living\simple_animal\hostile\space_dragon.dm" @@ -4511,7 +4587,6 @@ #include "code\modules\mob\living\simple_animal\hostile\gorilla\visuals_icons.dm" #include "code\modules\mob\living\simple_animal\hostile\jungle\_jungle_mobs.dm" #include "code\modules\mob\living\simple_animal\hostile\jungle\leaper.dm" -#include "code\modules\mob\living\simple_animal\hostile\jungle\mega_arachnid.dm" #include "code\modules\mob\living\simple_animal\hostile\jungle\mook.dm" #include "code\modules\mob\living\simple_animal\hostile\jungle\seedling.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\_megafauna.dm" @@ -4524,14 +4599,11 @@ #include "code\modules\mob\living\simple_animal\hostile\megafauna\hierophant.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\wendigo.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\basilisk.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\brimdemon.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\curse_blob.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goldgrub.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\gutlunch.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ice_demon.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ice_whelp.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\mining_mobs.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\polarbear.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\wolf.dm" @@ -4574,6 +4646,7 @@ #include "code\modules\mod\mod_construction.dm" #include "code\modules\mod\mod_control.dm" #include "code\modules\mod\mod_core.dm" +#include "code\modules\mod\mod_link.dm" #include "code\modules\mod\mod_paint.dm" #include "code\modules\mod\mod_theme.dm" #include "code\modules\mod\mod_types.dm" @@ -4606,6 +4679,7 @@ #include "code\modules\modular_computers\computers\item\disks\computer_disk.dm" #include "code\modules\modular_computers\computers\item\disks\maintenance_disks.dm" #include "code\modules\modular_computers\computers\item\disks\role_disks.dm" +#include "code\modules\modular_computers\computers\item\disks\unique_disks.dm" #include "code\modules\modular_computers\computers\item\disks\virus_disk.dm" #include "code\modules\modular_computers\computers\machinery\console_presets.dm" #include "code\modules\modular_computers\computers\machinery\modular_computer.dm" @@ -5149,6 +5223,7 @@ #include "code\modules\spells\spell_types\conjure\invisible_wall.dm" #include "code\modules\spells\spell_types\conjure\link_worlds.dm" #include "code\modules\spells\spell_types\conjure\presents.dm" +#include "code\modules\spells\spell_types\conjure\simian.dm" #include "code\modules\spells\spell_types\conjure\soulstone.dm" #include "code\modules\spells\spell_types\conjure\the_traps.dm" #include "code\modules\spells\spell_types\conjure_item\_conjure_item.dm" @@ -5386,6 +5461,7 @@ #include "code\modules\vehicles\wheelchair.dm" #include "code\modules\vehicles\cars\car.dm" #include "code\modules\vehicles\cars\clowncar.dm" +#include "code\modules\vehicles\cars\speedwagon.dm" #include "code\modules\vehicles\cars\vim.dm" #include "code\modules\vehicles\mecha\_mecha.dm" #include "code\modules\vehicles\mecha\mech_bay.dm" @@ -5411,9 +5487,11 @@ #include "code\modules\vehicles\mecha\combat\reticence.dm" #include "code\modules\vehicles\mecha\combat\savannah_ivanov.dm" #include "code\modules\vehicles\mecha\equipment\mecha_equipment.dm" +#include "code\modules\vehicles\mecha\equipment\tools\air_tank.dm" #include "code\modules\vehicles\mecha\equipment\tools\medical_tools.dm" #include "code\modules\vehicles\mecha\equipment\tools\mining_tools.dm" #include "code\modules\vehicles\mecha\equipment\tools\other_tools.dm" +#include "code\modules\vehicles\mecha\equipment\tools\radio.dm" #include "code\modules\vehicles\mecha\equipment\tools\work_tools.dm" #include "code\modules\vehicles\mecha\equipment\weapons\mecha_ammo.dm" #include "code\modules\vehicles\mecha\equipment\weapons\weapons.dm" @@ -5452,6 +5530,7 @@ #include "code\modules\vending\wardrobes.dm" #include "code\modules\vending\youtool.dm" #include "code\modules\visuals\render_steps.dm" +#include "code\modules\wiremod\components\abstract\assoc_list_variable.dm" #include "code\modules\wiremod\components\abstract\compare.dm" #include "code\modules\wiremod\components\abstract\equpiment_action.dm" #include "code\modules\wiremod\components\abstract\list_variable.dm" @@ -5499,21 +5578,20 @@ #include "code\modules\wiremod\components\id\getter.dm" #include "code\modules\wiremod\components\id\info_reader.dm" #include "code\modules\wiremod\components\list\assoc_list_pick.dm" +#include "code\modules\wiremod\components\list\assoc_list_remove.dm" +#include "code\modules\wiremod\components\list\assoc_list_set.dm" #include "code\modules\wiremod\components\list\assoc_literal.dm" #include "code\modules\wiremod\components\list\concat.dm" #include "code\modules\wiremod\components\list\filter.dm" #include "code\modules\wiremod\components\list\foreach.dm" #include "code\modules\wiremod\components\list\format.dm" -#include "code\modules\wiremod\components\list\get_column.dm" #include "code\modules\wiremod\components\list\index.dm" -#include "code\modules\wiremod\components\list\index_table.dm" #include "code\modules\wiremod\components\list\list_add.dm" #include "code\modules\wiremod\components\list\list_clear.dm" -#include "code\modules\wiremod\components\list\list_in.dm" +#include "code\modules\wiremod\components\list\list_find.dm" #include "code\modules\wiremod\components\list\list_literal.dm" #include "code\modules\wiremod\components\list\list_pick.dm" #include "code\modules\wiremod\components\list\list_remove.dm" -#include "code\modules\wiremod\components\list\select.dm" #include "code\modules\wiremod\components\list\split.dm" #include "code\modules\wiremod\components\math\arithmetic.dm" #include "code\modules\wiremod\components\math\binary_conversion.dm" @@ -5534,6 +5612,9 @@ #include "code\modules\wiremod\components\string\textcase.dm" #include "code\modules\wiremod\components\string\tonumber.dm" #include "code\modules\wiremod\components\string\tostring.dm" +#include "code\modules\wiremod\components\table\get_column.dm" +#include "code\modules\wiremod\components\table\index_table.dm" +#include "code\modules\wiremod\components\table\select.dm" #include "code\modules\wiremod\components\utility\clock.dm" #include "code\modules\wiremod\components\utility\delay.dm" #include "code\modules\wiremod\components\utility\router.dm" @@ -5623,6 +5704,8 @@ #include "modular_skyrat\master_files\code\datums\id_trim\solfed.dm" #include "modular_skyrat\master_files\code\datums\id_trim\syndicate.dm" #include "modular_skyrat\master_files\code\datums\keybinding\mob.dm" +#include "modular_skyrat\master_files\code\datums\mind\_mind.dm" +#include "modular_skyrat\master_files\code\datums\mood_events\drink_events.dm" #include "modular_skyrat\master_files\code\datums\mood_events\generic_negative_events.dm" #include "modular_skyrat\master_files\code\datums\mood_events\needs_events.dm" #include "modular_skyrat\master_files\code\datums\mutations\_mutations.dm" @@ -5673,6 +5756,7 @@ #include "modular_skyrat\master_files\code\game\objects\structures\towel_bins.dm" #include "modular_skyrat\master_files\code\game\objects\structures\trash_pile.dm" #include "modular_skyrat\master_files\code\game\objects\structures\watercloset.dm" +#include "modular_skyrat\master_files\code\game\objects\structures\crates_lockers\secure\cargo.dm" #include "modular_skyrat\master_files\code\game\turfs\closed\_closed.dm" #include "modular_skyrat\master_files\code\game\turfs\open\floor\iron_floor.dm" #include "modular_skyrat\master_files\code\game\turfs\open\space\space.dm" @@ -5773,22 +5857,44 @@ #include "modular_skyrat\master_files\code\modules\clothing\under\jobs\civilian\civilian.dm" #include "modular_skyrat\master_files\code\modules\clothing\under\jobs\civilian\suits.dm" #include "modular_skyrat\master_files\code\modules\events\_event.dm" +#include "modular_skyrat\master_files\code\modules\experisci\experiment.dm" #include "modular_skyrat\master_files\code\modules\food_and_drinks\recipes\food_mixtures.dm" #include "modular_skyrat\master_files\code\modules\jobs\off_duty_check.dm" #include "modular_skyrat\master_files\code\modules\jobs\departments\departments.dm" #include "modular_skyrat\master_files\code\modules\jobs\job_types\_job.dm" #include "modular_skyrat\master_files\code\modules\jobs\job_types\_job_attire.dm" +#include "modular_skyrat\master_files\code\modules\jobs\job_types\atmospheric_technician.dm" #include "modular_skyrat\master_files\code\modules\jobs\job_types\blackmarket.dm" +#include "modular_skyrat\master_files\code\modules\jobs\job_types\botanist.dm" +#include "modular_skyrat\master_files\code\modules\jobs\job_types\captain.dm" #include "modular_skyrat\master_files\code\modules\jobs\job_types\chaplain.dm" +#include "modular_skyrat\master_files\code\modules\jobs\job_types\chemist.dm" +#include "modular_skyrat\master_files\code\modules\jobs\job_types\chief_engineer.dm" +#include "modular_skyrat\master_files\code\modules\jobs\job_types\chief_medical_officer.dm" #include "modular_skyrat\master_files\code\modules\jobs\job_types\clown.dm" +#include "modular_skyrat\master_files\code\modules\jobs\job_types\coroner.dm" #include "modular_skyrat\master_files\code\modules\jobs\job_types\curator.dm" #include "modular_skyrat\master_files\code\modules\jobs\job_types\cyborg.dm" #include "modular_skyrat\master_files\code\modules\jobs\job_types\ds2.dm" #include "modular_skyrat\master_files\code\modules\jobs\job_types\freighter_crew.dm" +#include "modular_skyrat\master_files\code\modules\jobs\job_types\geneticist.dm" #include "modular_skyrat\master_files\code\modules\jobs\job_types\ghostcafe.dm" +#include "modular_skyrat\master_files\code\modules\jobs\job_types\head_of_personnel.dm" +#include "modular_skyrat\master_files\code\modules\jobs\job_types\head_of_security.dm" #include "modular_skyrat\master_files\code\modules\jobs\job_types\janitor.dm" +#include "modular_skyrat\master_files\code\modules\jobs\job_types\medical_doctor.dm" #include "modular_skyrat\master_files\code\modules\jobs\job_types\mime.dm" +#include "modular_skyrat\master_files\code\modules\jobs\job_types\paramedic.dm" +#include "modular_skyrat\master_files\code\modules\jobs\job_types\psychologist.dm" +#include "modular_skyrat\master_files\code\modules\jobs\job_types\research_director.dm" +#include "modular_skyrat\master_files\code\modules\jobs\job_types\roboticist.dm" +#include "modular_skyrat\master_files\code\modules\jobs\job_types\scientist.dm" +#include "modular_skyrat\master_files\code\modules\jobs\job_types\security_officer.dm" +#include "modular_skyrat\master_files\code\modules\jobs\job_types\shaft_miner.dm" +#include "modular_skyrat\master_files\code\modules\jobs\job_types\station_engineer.dm" #include "modular_skyrat\master_files\code\modules\jobs\job_types\tarkon.dm" +#include "modular_skyrat\master_files\code\modules\jobs\job_types\virologist.dm" +#include "modular_skyrat\master_files\code\modules\jobs\job_types\warden.dm" #include "modular_skyrat\master_files\code\modules\language\language.dm" #include "modular_skyrat\master_files\code\modules\language\language_holder.dm" #include "modular_skyrat\master_files\code\modules\logging\categories\log_category_debug.dm" @@ -5796,6 +5902,7 @@ #include "modular_skyrat\master_files\code\modules\logging\categories\log_category_uplink.dm" #include "modular_skyrat\master_files\code\modules\mapfluff\ruins\objects_and_mobs\necropolis_gate.dm" #include "modular_skyrat\master_files\code\modules\mining\equipment\explorer_gear.dm" +#include "modular_skyrat\master_files\code\modules\mob\login.dm" #include "modular_skyrat\master_files\code\modules\mob\dead\new_player\latejoin_menu.dm" #include "modular_skyrat\master_files\code\modules\mob\dead\new_player\preferences_setup.dm" #include "modular_skyrat\master_files\code\modules\mob\living\blood.dm" @@ -5860,8 +5967,11 @@ #include "modular_skyrat\master_files\code\modules\research\techweb\all_nodes.dm" #include "modular_skyrat\master_files\code\modules\research\techweb\protolathe.dm" #include "modular_skyrat\master_files\code\modules\shuttle\shuttle.dm" +#include "modular_skyrat\master_files\code\modules\shuttle\shuttle_events\meteors.dm" #include "modular_skyrat\master_files\code\modules\surgery\surgery.dm" +#include "modular_skyrat\master_files\code\modules\surgery\bodyparts\_bodyparts.dm" #include "modular_skyrat\master_files\code\modules\surgery\organs\tongue.dm" +#include "modular_skyrat\master_files\code\modules\vehicles\sealed.dm" #include "modular_skyrat\master_files\code\modules\vehicles\snowmobile.dm" #include "modular_skyrat\modules\additional_circuit\code\_designs.dm" #include "modular_skyrat\modules\additional_circuit\code\cell_reader.dm" @@ -5871,7 +5981,7 @@ #include "modular_skyrat\modules\admin\code\aooc.dm" #include "modular_skyrat\modules\admin\code\fix_chat.dm" #include "modular_skyrat\modules\admin\code\loud_say.dm" -#include "modular_skyrat\modules\admin\code\manage_player_ranks.dm" +#include "modular_skyrat\modules\admin\code\player_ranks.dm" #include "modular_skyrat\modules\admin\code\sooc.dm" #include "modular_skyrat\modules\admin\code\smites\pie.dm" #include "modular_skyrat\modules\advanced_engineering\code\adv_engineering.dm" @@ -5903,7 +6013,6 @@ #include "modular_skyrat\modules\aesthetics\flag\code\signs_flags.dm" #include "modular_skyrat\modules\aesthetics\floors\code\floors.dm" #include "modular_skyrat\modules\aesthetics\furniture\bed.dm" -#include "modular_skyrat\modules\aesthetics\guns\code\conversion_kits.dm" #include "modular_skyrat\modules\aesthetics\guns\code\guns.dm" #include "modular_skyrat\modules\aesthetics\guns\code\magazine.dm" #include "modular_skyrat\modules\aesthetics\heater\code\spaceheater.dm" @@ -5921,12 +6030,9 @@ #include "modular_skyrat\modules\aesthetics\rack\code\rack.dm" #include "modular_skyrat\modules\aesthetics\rollerbed\code\rollerbed.dm" #include "modular_skyrat\modules\aesthetics\shieldgen\code\shieldgen.dm" -#include "modular_skyrat\modules\aesthetics\spaceship_navigation_beacon\spaceship_navigation_beacon.dm" #include "modular_skyrat\modules\aesthetics\stationobjs\stationobjs.dm" #include "modular_skyrat\modules\aesthetics\status_display\code\status_display.dm" #include "modular_skyrat\modules\aesthetics\storage\storage.dm" -#include "modular_skyrat\modules\aesthetics\surgery\surgery.dm" -#include "modular_skyrat\modules\aesthetics\syringe\syringe.dm" #include "modular_skyrat\modules\aesthetics\telescience\telescience.dm" #include "modular_skyrat\modules\aesthetics\tools\code\tools.dm" #include "modular_skyrat\modules\aesthetics\vending\access_vending.dm" @@ -6315,7 +6421,6 @@ #include "modular_skyrat\modules\customization\game\objects\items\storage\belt.dm" #include "modular_skyrat\modules\customization\game\objects\items\storage\rings.dm" #include "modular_skyrat\modules\customization\game\objects\items\tanks\n2_tanks.dm" -#include "modular_skyrat\modules\customization\modules\admin\donator_list.dm" #include "modular_skyrat\modules\customization\modules\client\preferences.dm" #include "modular_skyrat\modules\customization\modules\client\augment\_augment.dm" #include "modular_skyrat\modules\customization\modules\client\augment\implants.dm" @@ -6556,6 +6661,15 @@ #include "modular_skyrat\modules\faction\code\mapping\mapping_helpers.dm" #include "modular_skyrat\modules\faction\code\mapping\ruins.dm" #include "modular_skyrat\modules\fauna_reagent\fauna_reagent.dm" +#include "modular_skyrat\modules\food_replicator\code\clothing.dm" +#include "modular_skyrat\modules\food_replicator\code\medical.dm" +#include "modular_skyrat\modules\food_replicator\code\rationpacks.dm" +#include "modular_skyrat\modules\food_replicator\code\reagents.dm" +#include "modular_skyrat\modules\food_replicator\code\replicator.dm" +#include "modular_skyrat\modules\food_replicator\code\storage.dm" +#include "modular_skyrat\modules\food_replicator\code\replicator_designs\replicator_clothing.dm" +#include "modular_skyrat\modules\food_replicator\code\replicator_designs\replicator_food.dm" +#include "modular_skyrat\modules\food_replicator\code\replicator_designs\replicator_medical.dm" #include "modular_skyrat\modules\GAGS\greyscale_configs.dm" #include "modular_skyrat\modules\GAGS\nsfw\greyscale_configs.dm" #include "modular_skyrat\modules\ghostcafe\code\dusts_on_catatonia.dm" @@ -6649,7 +6763,6 @@ #include "modular_skyrat\modules\jukebox\code\jukebox_subsystem.dm" #include "modular_skyrat\modules\jungle\code\flora.dm" #include "modular_skyrat\modules\knives\knives.dm" -#include "modular_skyrat\modules\large_doors\code\large_doors.dm" #include "modular_skyrat\modules\layer_shift\code\mob_movement.dm" #include "modular_skyrat\modules\liquids\code\drains.dm" #include "modular_skyrat\modules\liquids\code\height_floors.dm" @@ -6709,6 +6822,7 @@ #include "modular_skyrat\modules\mapping\code\holocall.dm" #include "modular_skyrat\modules\mapping\code\icemoon.dm" #include "modular_skyrat\modules\mapping\code\interdyne_mining.dm" +#include "modular_skyrat\modules\mapping\code\interlink_helper.dm" #include "modular_skyrat\modules\mapping\code\jobs.dm" #include "modular_skyrat\modules\mapping\code\laptop_presets.dm" #include "modular_skyrat\modules\mapping\code\lavaland.dm" @@ -6765,9 +6879,8 @@ #include "modular_skyrat\modules\medical\code\carbon_defense.dm" #include "modular_skyrat\modules\medical\code\carbon_examine.dm" #include "modular_skyrat\modules\medical\code\carbon_update_icons.dm" -#include "modular_skyrat\modules\medical\code\crafting_recipes.dm" +#include "modular_skyrat\modules\medical\code\medical_stacks.dm" #include "modular_skyrat\modules\medical\code\smartdarts.dm" -#include "modular_skyrat\modules\medical\code\splint.dm" #include "modular_skyrat\modules\medical\code\wounds\_wounds.dm" #include "modular_skyrat\modules\medical\code\wounds\bones.dm" #include "modular_skyrat\modules\medical\code\wounds\burns.dm" @@ -6778,7 +6891,6 @@ #include "modular_skyrat\modules\medievalcrate_skyrat\code\vintageitems.dm" #include "modular_skyrat\modules\mentor\code\_globalvars.dm" #include "modular_skyrat\modules\mentor\code\client_procs.dm" -#include "modular_skyrat\modules\mentor\code\config.dm" #include "modular_skyrat\modules\mentor\code\dementor.dm" #include "modular_skyrat\modules\mentor\code\follow.dm" #include "modular_skyrat\modules\mentor\code\logging.dm" @@ -6973,12 +7085,15 @@ #include "modular_skyrat\modules\modular_vending\code\wardrobes.dm" #include "modular_skyrat\modules\modular_weapons\code\autolathe_designs.dm" #include "modular_skyrat\modules\modular_weapons\code\automatic.dm" +#include "modular_skyrat\modules\modular_weapons\code\conversion_kits.dm" #include "modular_skyrat\modules\modular_weapons\code\energy.dm" #include "modular_skyrat\modules\modular_weapons\code\melee.dm" #include "modular_skyrat\modules\modular_weapons\code\modular_projectiles.dm" #include "modular_skyrat\modules\modular_weapons\code\pistol.dm" #include "modular_skyrat\modules\modular_weapons\code\revolver.dm" #include "modular_skyrat\modules\modular_weapons\code\rifle.dm" +#include "modular_skyrat\modules\modular_weapons\code\company_and_or_faction_based\xhihao_light_arms\ammo.dm" +#include "modular_skyrat\modules\modular_weapons\code\company_and_or_faction_based\xhihao_light_arms\guns.dm" #include "modular_skyrat\modules\mold\code\_mold_defines.dm" #include "modular_skyrat\modules\mold\code\mold.dm" #include "modular_skyrat\modules\mold\code\mold_controller.dm" @@ -7062,7 +7177,6 @@ #include "modular_skyrat\modules\novaya_ert\code\id.dm" #include "modular_skyrat\modules\novaya_ert\code\mod_suit.dm" #include "modular_skyrat\modules\novaya_ert\code\outfit.dm" -#include "modular_skyrat\modules\novaya_ert\code\rationpacks.dm" #include "modular_skyrat\modules\novaya_ert\code\shield.dm" #include "modular_skyrat\modules\novaya_ert\code\suit.dm" #include "modular_skyrat\modules\novaya_ert\code\surplus_armor.dm" @@ -7109,6 +7223,11 @@ #include "modular_skyrat\modules\pixel_shift\code\pixel_shift_component.dm" #include "modular_skyrat\modules\pixel_shift\code\pixel_shift_keybind.dm" #include "modular_skyrat\modules\pixel_shift\code\pixel_shift_mob.dm" +#include "modular_skyrat\modules\player_ranks\code\player_rank_controller\_player_rank_controller.dm" +#include "modular_skyrat\modules\player_ranks\code\player_rank_controller\donator_controller.dm" +#include "modular_skyrat\modules\player_ranks\code\player_rank_controller\mentor_controller.dm" +#include "modular_skyrat\modules\player_ranks\code\player_rank_controller\veteran_controller.dm" +#include "modular_skyrat\modules\player_ranks\code\subsystem\player_ranks.dm" #include "modular_skyrat\modules\pod_locking\pod_locking.dm" #include "modular_skyrat\modules\polarized_windows\capacitor.dm" #include "modular_skyrat\modules\polarized_windows\polarization_controller.dm" @@ -7307,7 +7426,6 @@ #include "modular_skyrat\modules\verbs\code\subtle.dm" #include "modular_skyrat\modules\veteran_only\code\job_types.dm" #include "modular_skyrat\modules\veteran_only\code\species_types.dm" -#include "modular_skyrat\modules\veteran_players\code\veteran_players.dm" #include "modular_skyrat\modules\vox_sprites\code\color.dm" #include "modular_skyrat\modules\vox_sprites\code\head.dm" #include "modular_skyrat\modules\vox_sprites\code\security.dm" diff --git a/tgui/packages/tgui/interfaces/Achievements.js b/tgui/packages/tgui/interfaces/Achievements.js index 6ddb12427ce..1ab38ca3655 100644 --- a/tgui/packages/tgui/interfaces/Achievements.js +++ b/tgui/packages/tgui/interfaces/Achievements.js @@ -1,5 +1,5 @@ import { useBackend, useLocalState } from '../backend'; -import { Box, Flex, Icon, Table, Tabs } from '../components'; +import { Box, Flex, Icon, Table, Tabs, Tooltip } from '../components'; import { Window } from '../layouts'; export const Achievements = (props, context) => { @@ -52,7 +52,15 @@ const AchievementTable = (props, context) => { const Achievement = (props) => { const { achievement } = props; - const { name, desc, icon_class, value, score } = achievement; + const { + name, + desc, + icon_class, + value, + score, + achieve_info, + achieve_tooltip, + } = achievement; return ( @@ -70,6 +78,13 @@ const Achievement = (props) => { {value ? 'Unlocked' : 'Locked'} )} + {!!achieve_info && ( + + + {achieve_info} + + + )} ); diff --git a/tgui/packages/tgui/interfaces/AntagInfoMorph.tsx b/tgui/packages/tgui/interfaces/AntagInfoMorph.tsx index eb594cf0360..fb98e1aa35b 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoMorph.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoMorph.tsx @@ -23,7 +23,10 @@ export const AntagInfoMorph = (props, context) => {
...a shapeshifting abomination that can eat almost anything. You may take the form of anything you can see by{' '} - shift-clicking it. + + using your "Assume Form" ability on it. Shift-clicking + the object in question will also work. + {' '}  This process will alert any nearby observers. {' '} @@ -35,11 +38,14 @@ export const AntagInfoMorph = (props, context) => { {' '} You can attack any item or dead creature to consume it - -  creatures will restore your health. +  corpses will restore your health. {' '} Finally, you can restore yourself to your original form while - morphed by shift-clicking{' '} - yourself. + morphed by{' '} + + using the "Assume Form" ability on yourself. You can + also shift-click yourself. + {' '}
diff --git a/tgui/packages/tgui/interfaces/CommunicationsConsole.js b/tgui/packages/tgui/interfaces/CommunicationsConsole.js index e9b5e193a46..6e8ac4f2b6d 100644 --- a/tgui/packages/tgui/interfaces/CommunicationsConsole.js +++ b/tgui/packages/tgui/interfaces/CommunicationsConsole.js @@ -193,9 +193,14 @@ const PageBuyingShuttle = (props, context) => { /> }> {shuttle.description} - {shuttle.prerequisites ? ( - Prerequisites: {shuttle.prerequisites} - ) : null} + + Occupancy Limit: {shuttle.occupancy_limit} + + + {shuttle.prerequisites ? ( + Prerequisitces: {shuttle.prerequisites} + ) : null} + ))} diff --git a/tgui/packages/tgui/interfaces/Fishing.tsx b/tgui/packages/tgui/interfaces/Fishing.tsx index 7e5e0f3ea50..cd385bb4ebd 100644 --- a/tgui/packages/tgui/interfaces/Fishing.tsx +++ b/tgui/packages/tgui/interfaces/Fishing.tsx @@ -35,7 +35,7 @@ type FishingMinigameProps = { fish_ai: FishAI; special_rules: SpecialRule[]; background: string; - win: (perfect: boolean) => void; + win: () => void; lose: () => void; }; @@ -60,7 +60,6 @@ class FishingMinigame extends Component< animation_id: number; last_frame: number; reeling: ReelingState = ReelingState.Idle; - perfect: boolean = true; area_height: number = 1000; state: FishingMinigameState; currentVelocityLimit: number = 200; @@ -376,7 +375,6 @@ class FishingMinigame extends Component< completion_delta = seconds * completion_gain_per_second; } else { completion_delta = seconds * completion_lost_per_second; - this.perfect = false; } const rawCompletion = currentState.completion + completion_delta; const newCompletion = clamp(rawCompletion, 0, 100); @@ -391,7 +389,7 @@ class FishingMinigame extends Component< this.props.lose(); dispatch(backendSuspendStart()); } else if (newCompletion >= 100) { - this.props.win(this.perfect); + this.props.win(); dispatch(backendSuspendStart()); } @@ -500,7 +498,7 @@ export const Fishing = (props, context) => { fish_ai={data.fish_ai} special_rules={data.special_effects} background={data.background_image} - win={(perfect) => act('win', { perfect: perfect })} + win={() => act('win')} lose={() => act('lose')} /> diff --git a/tgui/packages/tgui/interfaces/FishingPortalGenerator.tsx b/tgui/packages/tgui/interfaces/FishingPortalGenerator.tsx deleted file mode 100644 index 4d34015344d..00000000000 --- a/tgui/packages/tgui/interfaces/FishingPortalGenerator.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { useBackend } from '../backend'; -import { Window } from '../layouts'; -import { Button, LabeledList, Section } from '../components'; - -type FishingPortalData = { - active: boolean; - presets: string[]; - active_preset: string; -}; - -export const FishingPortalGenerator = (props, context) => { - const { act, data } = useBackend(context); - - return ( - - -
- {!data.active && ( - - {data.presets.map((x) => ( - -
-
-
- ); -}; diff --git a/tgui/packages/tgui/interfaces/IntegratedCircuit/VariableMenu.js b/tgui/packages/tgui/interfaces/IntegratedCircuit/VariableMenu.js index 39726e9ab5d..5a75ebe4630 100644 --- a/tgui/packages/tgui/interfaces/IntegratedCircuit/VariableMenu.js +++ b/tgui/packages/tgui/interfaces/IntegratedCircuit/VariableMenu.js @@ -1,6 +1,7 @@ import { Box, Stack, Section, Button, Input, Dropdown, Icon } from '../../components'; import { Component } from 'inferno'; import { shallowDiffers } from 'common/react'; +import { VARIABLE_ASSOC_LIST, VARIABLE_LIST, VARIABLE_NOT_A_LIST } from './constants'; export class VariableMenu extends Component { constructor() { @@ -69,7 +70,7 @@ export class VariableMenu extends Component { {val.name} - + @@ -125,43 +126,69 @@ export class VariableMenu extends Component { } /> + + + this.setState({ + variable_type: selectedVal, + }) + } + /> + - - this.setState({ - variable_type: selectedVal, - }) - } - /> - - - + + + + diff --git a/tgui/packages/tgui/interfaces/IntegratedCircuit/constants.js b/tgui/packages/tgui/interfaces/IntegratedCircuit/constants.js index 5d410f1984f..2c91442de31 100644 --- a/tgui/packages/tgui/interfaces/IntegratedCircuit/constants.js +++ b/tgui/packages/tgui/interfaces/IntegratedCircuit/constants.js @@ -7,3 +7,7 @@ export const OPTION_DROPDOWN_LARGE_CHAR_AMOUNT = 12; export const TIME_UNTIL_PORT_RELEASE_WORKS = 100; export const DEFAULT_COMPONENT_MENU_LIMIT = 6; export const noop = () => {}; + +export const VARIABLE_NOT_A_LIST = 1; +export const VARIABLE_LIST = 2; +export const VARIABLE_ASSOC_LIST = 3; diff --git a/tgui/packages/tgui/interfaces/IntegratedCircuit/index.js b/tgui/packages/tgui/interfaces/IntegratedCircuit/index.js index 3e7e7afac9e..81d7b1dd5d0 100644 --- a/tgui/packages/tgui/interfaces/IntegratedCircuit/index.js +++ b/tgui/packages/tgui/interfaces/IntegratedCircuit/index.js @@ -4,7 +4,7 @@ import { Component } from 'inferno'; import { Window } from '../../layouts'; import { resolveAsset } from '../../assets'; import { CircuitInfo } from './CircuitInfo'; -import { ABSOLUTE_Y_OFFSET, MOUSE_BUTTON_LEFT, TIME_UNTIL_PORT_RELEASE_WORKS } from './constants'; +import { ABSOLUTE_Y_OFFSET, MOUSE_BUTTON_LEFT, TIME_UNTIL_PORT_RELEASE_WORKS, VARIABLE_ASSOC_LIST, VARIABLE_LIST } from './constants'; import { Connections } from '../common/Connections'; import { ObjectComponent } from './ObjectComponent'; import { DisplayComponent } from './DisplayComponent'; @@ -574,11 +574,12 @@ export class IntegratedCircuit extends Component { variables={variables} types={global_basic_types} onClose={(event) => this.setState({ variableMenuOpen: false })} - onAddVariable={(name, type, asList, event) => + onAddVariable={(name, type, listType, event) => act('add_variable', { variable_name: name, variable_datatype: type, - is_list: asList, + is_list: listType === VARIABLE_LIST, + is_assoc_list: listType === VARIABLE_ASSOC_LIST, }) } onRemoveVariable={(name, event) => diff --git a/tgui/packages/tgui/interfaces/MODsuit.tsx b/tgui/packages/tgui/interfaces/MODsuit.tsx index 6e737792447..53928a5efa0 100644 --- a/tgui/packages/tgui/interfaces/MODsuit.tsx +++ b/tgui/packages/tgui/interfaces/MODsuit.tsx @@ -35,6 +35,9 @@ type SuitStatus = { ai_name: string; has_pai: boolean; is_ai: boolean; + link_id: string; + link_freq: string; + link_call: string; }; type UserStatus = { @@ -317,6 +320,9 @@ const SuitStatusSection = (props, context) => { ai_name, has_pai, is_ai, + link_id, + link_freq, + link_call, } = data.suit_status; const { display_time, shift_time, shift_id } = data.module_custom_status; const status = malfunctioning @@ -377,6 +383,22 @@ const SuitStatusSection = (props, context) => { onClick={() => act('lock')} /> + + + ) + }> + + {!scanmod_rating ? ( + + Scanning module missing. + + ) : ( + Object.keys(internal_damage_keys).map((t) => ( + + + + + + {internal_damage & internal_damage_keys[t] + ? InternalDamageToDamagedDesc[t] + : InternalDamageToNormalDesc[t]} + + + {!!(internal_damage & internal_damage_keys[t]) && ( + + + + )} + - - - - - - ))} - + )) + )} + + ); }; diff --git a/tgui/packages/tgui/interfaces/Mecha/ArmPane.tsx b/tgui/packages/tgui/interfaces/Mecha/ArmPane.tsx deleted file mode 100644 index d1c25e2b9f8..00000000000 --- a/tgui/packages/tgui/interfaces/Mecha/ArmPane.tsx +++ /dev/null @@ -1,258 +0,0 @@ -import { toFixed } from 'common/math'; -import { useBackend } from '../../backend'; -import { Button, LabeledList, Stack, Section, ProgressBar } from '../../components'; -import { MechWeapon, OperatorData } from './data'; - -export const ArmPane = (props: { weapon: MechWeapon }, context) => { - const { act, data } = useBackend(context); - const { name, desc, integrity, energy_per_use } = props.weapon; - const { power_level, weapons_safety } = data; - return ( - - - {weapons_safety ? 'SAFETY OVERRIDE IN EFFECT' : name} - - - - - - - - - - - )} - {ammo_type} - - ); - } -}; - -const MECHA_SNOWFLAKE_ID_SLEEPER = 'sleeper_snowflake'; -const MECHA_SNOWFLAKE_ID_SYRINGE = 'syringe_snowflake'; -const MECHA_SNOWFLAKE_ID_MODE = 'mode_snowflake'; - -// Handles all the snowflake buttons and whatever -const Snowflake = (props: { weapon: MechWeapon }, context) => { - const { snowflake } = props.weapon; - switch (snowflake['snowflake_id']) { - case MECHA_SNOWFLAKE_ID_SLEEPER: - return ; - case MECHA_SNOWFLAKE_ID_SYRINGE: - return ; - case MECHA_SNOWFLAKE_ID_MODE: - return ; - default: - return null; - } -}; - -const SnowflakeSleeper = (props: { weapon: MechWeapon }, context) => { - const { act, data } = useBackend(context); - const { patient } = props.weapon.snowflake; - if (!patient) { - return null; - } else { - return ( -
- - - {patient.isdead ? 'DECEASED' : 'ALIVE'} - - - - - -
- ); - } -}; - -const SnowflakeSyringe = (props: { weapon: MechWeapon }, context) => { - const { act, data } = useBackend(context); - const { mode, syringe, max_syringe, reagents, total_reagents } = - props.weapon.snowflake; - return ( -
- - - {syringe}/{max_syringe} - - - {reagents}/{total_reagents} - - -
- ); -}; - -const SnowflakeExtinguisher = (props: { weapon: MechWeapon }, context) => { - const { reagents, total_reagents } = props.weapon.snowflake; - return ( -
- - - {reagents}/{total_reagents} - - -
- ); -}; - -const SnowflakeMode = (props: { weapon: MechWeapon }, context) => { - const { act, data } = useBackend(context); - const { mode, name } = props.weapon.snowflake; - return ( -
- - -
- ); -}; diff --git a/tgui/packages/tgui/interfaces/Mecha/ArmorPane.tsx b/tgui/packages/tgui/interfaces/Mecha/ArmorPane.tsx deleted file mode 100644 index b95c342bc27..00000000000 --- a/tgui/packages/tgui/interfaces/Mecha/ArmorPane.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { useBackend } from '../../backend'; -import { Stack, Button, Box } from '../../components'; -import { OperatorData } from './data'; -import { classes } from 'common/react'; - -export const ArmorPane = (props, context) => { - const { act, data } = useBackend(context); - const { mech_equipment } = data; - return ( - - {mech_equipment['armor'].map((module, i) => ( - - - {module.protect_name} - - - - - } - /> - - -
- - - - - - - - - - - -
-
- -
- - - - - - cabin_dangerous_highpressure ? 'red' : null - }> - {cabin_pressure} kPa - - - - {GetTempFormat(cabin_temp)} - - - -
-
- -
- -
-
- -
- - - - - - - - - - - -
-
-
- ); -}; - -const GetTempFormat = (temp) => { - return ( - toFixed(temp, 1) + '°K\n' + toFixed(temp - KelvinZeroCelcius, 1) + '°C' - ); -}; - -const EnviromentalAir = (props, context) => { - const { act, data } = useBackend(context); - const { airtank_pressure, airtank_temp } = data; - if (airtank_temp === null) { - return No air tank detected; - } else { - return ( - <> - - {airtank_pressure} kPa - - - {GetTempFormat(airtank_temp)} - - - ); - } -}; - -const DNABody = (props, context) => { - const { act, data } = useBackend(context); - const { dna_lock } = data; - if (dna_lock === null) { - return ( - - - - - - ); - } else { - return ( - - - - - - - - - - - - ); - } -}; - -const PowerBar = (props, context) => { - const { act, data } = useBackend(context); - const { power_level, power_max } = data; - if (power_max === null) { - return ; - } else { - return ( - - ); - } -}; diff --git a/tgui/packages/tgui/interfaces/Mecha/ModulesPane.tsx b/tgui/packages/tgui/interfaces/Mecha/ModulesPane.tsx new file mode 100644 index 00000000000..04a1100fa13 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Mecha/ModulesPane.tsx @@ -0,0 +1,889 @@ +import { useBackend } from '../../backend'; +import { Icon, NumberInput, ProgressBar, Box, Button, Section, Stack, LabeledList, NoticeBox, Collapsible } from '../../components'; +import { MainData, MechModule } from './data'; +import { classes } from 'common/react'; +import { toFixed } from 'common/math'; +import { formatPower } from '../../format'; +import { GasmixParser } from 'tgui/interfaces/common/GasmixParser'; + +const moduleSlotIcon = (param) => { + switch (param) { + case 'mecha_l_arm': + return 'hand'; + case 'mecha_r_arm': + return 'hand'; + case 'mecha_utility': + return 'screwdriver-wrench'; + case 'mecha_power': + return 'bolt'; + case 'mecha_armor': + return 'shield-halved'; + default: + return 'screwdriver-wrench'; + } +}; + +const moduleSlotLabel = (param) => { + switch (param) { + case 'mecha_l_arm': + return 'Left arm module'; + case 'mecha_r_arm': + return 'Right arm module'; + case 'mecha_utility': + return 'Utility module'; + case 'mecha_power': + return 'Power module'; + case 'mecha_armor': + return 'Armor module'; + default: + return 'Common module'; + } +}; + +export const ModulesPane = (props, context) => { + const { act, data } = useBackend(context); + const { modules, selected_module_index, weapons_safety } = data; + return ( +
act('toggle_safety')} + content={ + !weapons_safety + ? 'Safety Protocols Disabled' + : 'Safety Protocols Enabled' + } + /> + }> + + + {modules.map((module, i) => + !module.ref ? ( + + ) : ( + + ) + )} + + + {selected_module_index !== null && modules[selected_module_index] && ( + + )} + + +
+ ); +}; + +export const ModuleDetails = (props, context) => { + const { act, data } = useBackend(context); + const { slot, name, desc, icon, detachable, ref, snowflake } = props.module; + return ( + +
+ + + + +

{name}

+ + {moduleSlotLabel(slot)} + +
+ {!!detachable && ( + +
+
+ {snowflake && snowflake.snowflake_id === MECHA_SNOWFLAKE_ID_EJECTOR ? ( + + ) : snowflake && + snowflake.snowflake_id === MECHA_SNOWFLAKE_ID_AIR_TANK ? ( + + ) : snowflake && + snowflake.snowflake_id === MECHA_SNOWFLAKE_ID_OREBOX_MANAGER ? ( + + ) : ( + + + {!!snowflake && } + + )} +
+
+ ); +}; + +const ModuleDetailsBasic = (props, context) => { + const { act, data } = useBackend(context); + const { power_level, weapons_safety } = data; + const { + ref, + slot, + integrity, + can_be_toggled, + can_be_triggered, + active, + active_label, + equip_cooldown, + energy_per_use, + } = props.module; + return ( + <> + {integrity < 1 && ( + + act('equip_act', { + ref: ref, + gear_action: 'repair', + }) + } + /> + }> + + + )} + {!weapons_safety && ['mecha_l_arm', 'mecha_r_arm'].includes(slot) && ( + + SAFETY OFF + + )} + {!!energy_per_use && ( + + {`${formatPower(energy_per_use)}, ${ + power_level ? toFixed(power_level / energy_per_use) : 0 + } uses left`} + + )} + {!!equip_cooldown && ( + {equip_cooldown} + )} + {!!can_be_toggled && ( + + + ) + }> + + {`${projectiles} of ${max_magazine}`} + + + {!!projectiles_cache_max && ( + + + {`${projectiles_cache} of ${projectiles_cache_max}`} + + + )} + {!!mode && } + + ); +}; + +const SnowflakeSleeper = (props, context) => { + const { act, data } = useBackend(context); + const { ref } = props.module; + const { patient } = props.module.snowflake; + return !patient ? ( + None + ) : ( + <> + + act('equip_act', { + ref: ref, + gear_action: 'eject', + }) + } + /> + }> + {patient.patientname} + + + {patient.is_dead ? ( + Patient dead + ) : ( + + )} + + + + + + + + + toFixed(value, 1)} + onDrag={(e, value) => + act('equip_act', { + ref: ref, + gear_action: 'set_frequency', + new_frequency: value * 10, + }) + } + /> + + + ); +}; + +const SnowflakeAirTank = (props, context) => { + const { act, data } = useBackend(context); + const { cabin_sealed, one_atmosphere } = data; + const { ref, integrity, active } = props.module; + const { + auto_pressurize_on_seal, + port_connected, + tank_release_pressure, + tank_release_pressure_min, + tank_release_pressure_max, + tank_pump_active, + tank_pump_direction, + tank_pump_pressure, + tank_pump_pressure_min, + tank_pump_pressure_max, + tank_air, + cabin_air, + } = props.module.snowflake; + return ( + + + {integrity < 1 && ( + + act('equip_act', { + ref: ref, + gear_action: 'repair', + }) + } + /> + }> + + + )} + +
+ act('equip_act', { + ref: ref, + gear_action: 'toggle', + }) + } + selected={active} + /> + }> + + + + + +
+
+ act('equip_act', { + ref: ref, + gear_action: 'toggle_tank_pump', + }) + } + /> + }> + +
+
+ + + + {cabin_sealed ? ( + + + + ) : ( + + + Cabin Open + + )} +
+
+ ); +}; + +const SnowflakeOrebox = (props, context) => { + const { act, data } = useBackend(context); + const { ref } = props.module; + const { contents } = props.module.snowflake; + return ( +
+ act('equip_act', { + ref: ref, + gear_action: 'dump', + }) + } + disabled={!Object.keys(contents).length} + /> + }> + {Object.keys(contents).length ? ( + Object.keys(contents).map((item, i) => ( + + + + + + {`${contents[item].amount}x ${contents[item].name}`} + + + )) + ) : ( + Ore box is empty + )} +
+ ); +}; + +const SnowflakeCargo = (props, context) => { + const { act, data } = useBackend(context); + const { ref } = props.module; + const { cargo, cargo_capacity } = props.module.snowflake; + return ( + +
+ {!cargo.length ? ( + Compartment is empty + ) : ( + cargo.map((item, i) => ( + + )) + )} +
+
+ ); +}; + +const SnowflakeExtinguisher = (props, context) => { + const { act, data } = useBackend(context); + const { ref } = props.module; + const { reagents, total_reagents, reagents_required } = + props.module.snowflake; + return ( + <> + + act('equip_act', { + ref: ref, + gear_action: 'refill', + }) + } + /> + }> + + {reagents} + + + + - - - - - - toFixed(value, 1)} - width="80px" - onDrag={(e, value) => - act('set_frequency', { - new_frequency: value, - }) - } - /> - - - ); -}; diff --git a/tgui/packages/tgui/interfaces/Mecha/UtilityModulesPane.tsx b/tgui/packages/tgui/interfaces/Mecha/UtilityModulesPane.tsx deleted file mode 100644 index f411c6e327a..00000000000 --- a/tgui/packages/tgui/interfaces/Mecha/UtilityModulesPane.tsx +++ /dev/null @@ -1,198 +0,0 @@ -import { useBackend } from '../../backend'; -import { Box, Button, ProgressBar, Section, Tooltip } from '../../components'; -import { OperatorData, MechaUtility } from './data'; - -const UtilityName = (props: { name: string }) => { - const { name } = props; - return ( - - {`${name}:`} - - ); -}; - -type EquipmentProps = { - module: MechaUtility; -}; - -const Equipment = (props: EquipmentProps, context) => { - const { module } = props; - const { act } = useBackend(context); - - return ( -
- -
- ); -}; - -export const UtilityModulesPane = (props, context) => { - const { data } = useBackend(context); - const { mech_equipment } = data; - return ( - -
-
- {mech_equipment['utility'].map((module, i) => { - return module.snowflake.snowflake_id ? ( - - ) : ( - - ); - })} -
-
-
- ); -}; - -const MECHA_SNOWFLAKE_ID_EJECTOR = 'ejector_snowflake'; -const MECHA_SNOWFLAKE_ID_EXTINGUISHER = 'extinguisher_snowflake'; -const MECHA_SNOWFLAKE_ID_OREBOX_MANAGER = 'orebox_manager_snowflake'; - -// Handles all the snowflake buttons and whatever -const Snowflake = (props: { module: MechaUtility }, context) => { - const { snowflake } = props.module; - switch (snowflake['snowflake_id']) { - case MECHA_SNOWFLAKE_ID_EJECTOR: - return ; - case MECHA_SNOWFLAKE_ID_EXTINGUISHER: - return ; - case MECHA_SNOWFLAKE_ID_OREBOX_MANAGER: - return ; - default: - return null; - } -}; - -const SnowflakeOrebox = (props: { module: MechaUtility }, context) => { - const { act, data } = useBackend(context); - const { cargo } = props.module.snowflake; - return ( - -
- - -
-
- ); -}; - -const SnowflakeEjector = (props: { module: MechaUtility }, context) => { - const { act, data } = useBackend(context); - const { cargo } = props.module.snowflake; - return ( - <> - {cargo && cargo.length > 0 && Cargo} - - {cargo.map((item) => ( -
- - -
- ))} -
- - ); -}; - -const SnowflakeExtinguisher = (props: { module: MechaUtility }, context) => { - const { act, data } = useBackend(context); - return ( - <> - - {props.module.snowflake.reagents} - - @@ -108,7 +107,7 @@ export const RecordPrint = (props, context) => { onClick={() => swapTabs(PRINTOUT.Wanted)} selected={printType === PRINTOUT.Wanted} tooltip={`Prints a poster with mugshot and crimes.${ - innocent && ' (Requires crimes)' + innocent ? ' (Requires crimes)' : '' }`} tooltipPosition="bottom"> Wanted diff --git a/tgui/packages/tgui/interfaces/SimpleBot.tsx b/tgui/packages/tgui/interfaces/SimpleBot.tsx index 34c0a6ae84d..c4f11c08271 100644 --- a/tgui/packages/tgui/interfaces/SimpleBot.tsx +++ b/tgui/packages/tgui/interfaces/SimpleBot.tsx @@ -199,7 +199,7 @@ const SettingsDisplay = (props, context) => { /> - {allow_possession && ( + {!!allow_possession && ( { const { data } = useBackend(context); const { custom, inventory, selectedCategory } = props; - const { stock, onstation, user } = data; + const { + stock, + onstation, + user, + displayed_currency_icon, + displayed_currency_name, + } = data; return (
- {(user && user.cash) || 0} cr + {(user && user.cash) || 0} + {displayed_currency_name}{' '} + ) }> @@ -320,14 +330,14 @@ const ProductStock = (props) => { /** The main button to purchase an item. */ const ProductButton = (props, context) => { const { act, data } = useBackend(context); - const { access } = data; + const { access, displayed_currency_name } = data; const { custom, discount, disabled, free, product, redPrice } = props; - const customPrice = access ? 'FREE' : product.price + ' cr'; - let standardPrice = product.price + ' cr'; + const customPrice = access ? 'FREE' : product.price; + let standardPrice = product.price; if (free) { standardPrice = 'FREE'; } else if (discount) { - standardPrice = redPrice + ' cr'; + standardPrice = redPrice; } return custom ? ( ) : ( ); }; diff --git a/tools/UpdatePaths/Scripts/76115_toolbox_762_to_ammobox_762.txt b/tools/UpdatePaths/Scripts/76115_toolbox_762_to_ammobox_762.txt index e9569eaf0f9..97f30c1876c 100644 --- a/tools/UpdatePaths/Scripts/76115_toolbox_762_to_ammobox_762.txt +++ b/tools/UpdatePaths/Scripts/76115_toolbox_762_to_ammobox_762.txt @@ -1,4 +1,4 @@ #this changes a762 toolbox into a child of ammobox -/obj/item/storage/toolbox/a762 : /obj/item/storage/toolbox/ammobox/a762{@OLD} -/obj/item/storage/toolbox/a762/surplus : /obj/item/storage/toolbox/ammobox/a762/surplus{@OLD} \ No newline at end of file +/obj/item/storage/toolbox/strilka310 : /obj/item/storage/toolbox/ammobox/a762{@OLD} +/obj/item/storage/toolbox/strilka310/surplus : /obj/item/storage/toolbox/ammobox/a762/surplus{@OLD} diff --git a/tools/UpdatePaths/Scripts/76732_multi-tile_airlocks.txt b/tools/UpdatePaths/Scripts/76732_multi-tile_airlocks.txt new file mode 100644 index 00000000000..6541efbe8c9 --- /dev/null +++ b/tools/UpdatePaths/Scripts/76732_multi-tile_airlocks.txt @@ -0,0 +1,4 @@ +#comment Repathing for new multi-tile airlocks. + +/obj/machinery/door/airlock/multi_tile/glass : /obj/machinery/door/airlock/multi_tile/public/glass{@OLD} +/obj/machinery/door/airlock/glass_large : /obj/machinery/door/airlock/multi_tile/public/glass{@OLD} \ No newline at end of file diff --git a/tools/UpdatePaths/Scripts/77410_eyeballs.txt b/tools/UpdatePaths/Scripts/77410_eyeballs.txt new file mode 100644 index 00000000000..767c0dd4235 --- /dev/null +++ b/tools/UpdatePaths/Scripts/77410_eyeballs.txt @@ -0,0 +1 @@ +/mob/living/simple_animal/hostile/eyeball : /mob/living/basic/eyeball{@OLD} diff --git a/tools/UpdatePaths/Scripts/77489_ice_whelps.txt b/tools/UpdatePaths/Scripts/77489_ice_whelps.txt new file mode 100644 index 00000000000..a454c9785ca --- /dev/null +++ b/tools/UpdatePaths/Scripts/77489_ice_whelps.txt @@ -0,0 +1 @@ +/mob/living/simple_animal/hostile/asteroid/ice_whelp : /mob/living/basic/mining/ice_whelp{@OLD} \ No newline at end of file diff --git a/tools/UpdatePaths/Scripts/77503_simple_to_basic_morph.txt b/tools/UpdatePaths/Scripts/77503_simple_to_basic_morph.txt new file mode 100644 index 00000000000..baa722be823 --- /dev/null +++ b/tools/UpdatePaths/Scripts/77503_simple_to_basic_morph.txt @@ -0,0 +1 @@ +/mob/living/simple_animal/hostile/morph : /mob/living/basic/morph{@OLD} diff --git a/tools/UpdatePaths/Scripts/77523_giant_spider_repath.txt b/tools/UpdatePaths/Scripts/77523_giant_spider_repath.txt new file mode 100644 index 00000000000..1fb03473be8 --- /dev/null +++ b/tools/UpdatePaths/Scripts/77523_giant_spider_repath.txt @@ -0,0 +1,4 @@ +/mob/living/basic/spiderling/@SUBTYPES : /mob/living/basic/spider/growing/spiderling/@SUBTYPES{@OLD} +/mob/living/basic/spider_young/@SUBTYPES : /mob/living/basic/spider/growing/young/@SUBTYPES{@OLD} +/mob/living/basic/giant_spider/maintenance : /mob/living/basic/spider/maintenance{@OLD} +/mob/living/basic/giant_spider/@SUBTYPES : /mob/living/basic/spider/giant/@SUBTYPES{@OLD} diff --git a/tools/UpdatePaths/Scripts/77630_simple_to_basic_watcher.txt b/tools/UpdatePaths/Scripts/77630_simple_to_basic_watcher.txt new file mode 100644 index 00000000000..9d3679be4d4 --- /dev/null +++ b/tools/UpdatePaths/Scripts/77630_simple_to_basic_watcher.txt @@ -0,0 +1,5 @@ +/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random : /obj/effect/spawner/random/watcher +/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/@SUBTYPES : /mob/living/basic/mining/watcher/@SUBTYPES{@OLD} +/mob/living/simple_animal/hostile/asteroid/basilisk : /mob/living/basic/mining/basilisk{@OLD} + +/mob/living/basic/mining/goliath/random : /obj/effect/spawner/random/goliath diff --git a/tools/UpdatePaths/Scripts/77669_iron_floor_to_iron_floor_base.txt b/tools/UpdatePaths/Scripts/77669_iron_floor_to_iron_floor_base.txt new file mode 100644 index 00000000000..8a627f97972 --- /dev/null +++ b/tools/UpdatePaths/Scripts/77669_iron_floor_to_iron_floor_base.txt @@ -0,0 +1 @@ +/obj/item/stack/tile/iron : /obj/item/stack/tile/iron/base{@OLD} \ No newline at end of file diff --git a/tools/UpdatePaths/Scripts/77733_goldgrub.txt b/tools/UpdatePaths/Scripts/77733_goldgrub.txt new file mode 100644 index 00000000000..00e498f6a59 --- /dev/null +++ b/tools/UpdatePaths/Scripts/77733_goldgrub.txt @@ -0,0 +1 @@ +/mob/living/simple_animal/hostile/asteroid/goldgrub : /mob/living/basic/mining/goldgrub{@OLD;will_burrow=@SKIP} \ No newline at end of file diff --git a/tools/UpdatePaths/Scripts/77740_delete_atmos_disk.txt b/tools/UpdatePaths/Scripts/77740_delete_atmos_disk.txt new file mode 100644 index 00000000000..cdf22110923 --- /dev/null +++ b/tools/UpdatePaths/Scripts/77740_delete_atmos_disk.txt @@ -0,0 +1,3 @@ +/obj/item/computer_disk/atmos : @DELETE + + diff --git a/tools/UpdatePaths/Scripts_Skyrat/22951_medpen_bag_to_pouch.txt b/tools/UpdatePaths/Scripts_Skyrat/22951_medpen_bag_to_pouch.txt new file mode 100644 index 00000000000..2d6cb609cf7 --- /dev/null +++ b/tools/UpdatePaths/Scripts_Skyrat/22951_medpen_bag_to_pouch.txt @@ -0,0 +1,5 @@ +# Replaces modular bag types with pouches. They were only subtypes to fit in pockets, anyway. + +/obj/item/storage/bag/medpens : /obj/item/storage/pouch/medpens +/obj/item/storage/bag/ammo : /obj/item/storage/pouch/ammo +/obj/item/storage/bag/material : /obj/item/storage/pouch/material diff --git a/tools/ci/check_grep.sh b/tools/ci/check_grep.sh index 00dc3386d19..8763cca749e 100644 --- a/tools/ci/check_grep.sh +++ b/tools/ci/check_grep.sh @@ -140,6 +140,18 @@ if $grep 'can_perform_action\(\s*\)' $code_files; then st=1 fi; +part "src as a trait source" # ideally we'd lint / test for ANY datum reference as a trait source, but 'src' is the most common. +if $grep -i '(add_trait|remove_trait)\(.+,\s*.+,\s*src\)' $code_files; then + echo + echo -e "${RED}ERROR: Using 'src' as a trait source. Source must be a string key - dont't use references to datums as a source, perhaps use 'REF(src)'.${NC}" + st=1 +fi; +if $grep -i '(add_traits|remove_traits)\(.+,\s*src\)' $code_files; then + echo + echo -e "${RED}ERROR: Using 'src' as trait sources. Source must be a string key - dont't use references to datums as sources, perhaps use 'REF(src)'.${NC}" + st=1 +fi; + part "balloon_alert sanity" if $grep 'balloon_alert\(".*"\)' $code_files; then echo diff --git a/tools/define_sanity/check.py b/tools/define_sanity/check.py index bc80276c2cf..fbbbb170fff 100644 --- a/tools/define_sanity/check.py +++ b/tools/define_sanity/check.py @@ -38,10 +38,12 @@ excluded_files = [ "code/modules/tgs/**/*.dm", ] -define_regex = re.compile(r"^(\s+)?#define\s?([A-Z0-9_]+)\(?(.+)\)?") +define_regex = re.compile(r"(\s+)?#define\s?([A-Z0-9_]+)\(?(.+)\)?") files_to_scan = [] +number_of_defines = 0 + if not on_github: print(blue(f"Running define sanity check outside of Github Actions.\nFor assistance, a '{output_file_name}' file will be generated at the root of your directory if any errors are detected.")) @@ -67,10 +69,19 @@ for applicable_file in files_to_scan: with open(applicable_file, encoding="utf8") as file: file_contents = file.read() for define in define_regex.finditer(file_contents): + number_of_defines += 1 define_name = define.group(2) if not re.search("#undef\s" + define_name, file_contents): located_error_tuples.append((define_name, applicable_file)) +if number_of_defines == 0: + print(red("No defines found! This is likely an error.")) + sys.exit(1) + +if number_of_defines <= 1000: + print(red(f"Only found {number_of_defines} defines! Something has likely gone wrong as the number of local defines should not be this low.")) + sys.exit(1) + if len(located_error_tuples): string_list = [] @@ -90,4 +101,4 @@ if len(located_error_tuples): sys.exit(1) else: - print(green("No unhandled local defines found.")) + print(green(f"No unhandled local defines found (found {number_of_defines} defines).")) diff --git a/tools/tgs_scripts/PreCompile.sh b/tools/tgs_scripts/PreCompile.sh index acc8dcfe1cd..499073d9032 100755 --- a/tools/tgs_scripts/PreCompile.sh +++ b/tools/tgs_scripts/PreCompile.sh @@ -34,5 +34,4 @@ cd .. # compile tgui echo "Compiling tgui..." cd "$1" -chmod +x tools/bootstrap/node # Workaround for https://github.com/tgstation/tgstation-server/issues/1167 env TG_BOOTSTRAP_CACHE="$original_dir" TG_BOOTSTRAP_NODE_LINUX=1 CBT_BUILD_MODE="TGS" tools/bootstrap/node tools/build/build.js diff --git a/tools/ticked_file_enforcement/schemas/modular_skyrat.json b/tools/ticked_file_enforcement/schemas/modular_skyrat.json new file mode 100644 index 00000000000..10fdbaa08c4 --- /dev/null +++ b/tools/ticked_file_enforcement/schemas/modular_skyrat.json @@ -0,0 +1,7 @@ +{ + "file": "tgstation.dme", + "scannable_directory": "modular_skyrat/", + "subdirectories": true, + "excluded_files": [], + "forbidden_includes": [] +} diff --git a/tools/ticked_file_enforcement/schemas/tgstation_dme.json b/tools/ticked_file_enforcement/schemas/tgstation_dme.json index 7fe1840d753..d55457e8b4a 100644 --- a/tools/ticked_file_enforcement/schemas/tgstation_dme.json +++ b/tools/ticked_file_enforcement/schemas/tgstation_dme.json @@ -5,6 +5,7 @@ "excluded_files": [], "forbidden_includes": [ "code/modules/tgs/**/*.dm", - "code/modules/unit_tests/[!_]*.dm" + "code/modules/unit_tests/[!_]*.dm", + "code/modules/unit_tests/~skyrat/[!_]*.dm" ] } diff --git a/tools/ticked_file_enforcement/ticked_file_enforcement.py b/tools/ticked_file_enforcement/ticked_file_enforcement.py index 59ac016b753..758dfb491b0 100644 --- a/tools/ticked_file_enforcement/ticked_file_enforcement.py +++ b/tools/ticked_file_enforcement/ticked_file_enforcement.py @@ -37,7 +37,7 @@ for excluded_file in excluded_files: post_error(f"Excluded file {full_file_path} does not exist, please remove it!") sys.exit(1) -file_extensions = (".dm", ".dmf") +file_extensions = ("dm", "dmf") reading = False lines = [] @@ -55,6 +55,12 @@ with open(file_reference, 'r') as file: break elif not reading: continue + # SKYRAT EDIT START - Modular unit tests + elif line == "// SKYRAT EDIT START": + continue + elif line == "// SKYRAT EDIT END": + continue + # SKYRAT EDIT END lines.append(line) @@ -64,7 +70,12 @@ fail_no_include = False scannable_files = [] for file_extension in file_extensions: - scannable_files += glob.glob(scannable_directory + f"**/*.{file_extension}", recursive=True) + compiled_directory = f"{scannable_directory}/**/*.{file_extension}" + scannable_files += glob.glob(compiled_directory, recursive=True) + +if len(scannable_files) == 0: + post_error(f"No files were found in {scannable_directory}. Ticked File Enforcement has failed!") + sys.exit(1) for code_file in scannable_files: dm_path = "" @@ -73,6 +84,10 @@ for code_file in scannable_files: dm_path = code_file.replace('/', '\\') else: dm_path = os.path.basename(code_file) + # SKYRAT EDIT START - Modular unit tests - have to append this again after it gets removed; this was not designed upstream with subfolders for unit tests in mind so we must cope. + if("~skyrat/" in code_file): + dm_path = "~skyrat\\" + dm_path + # SKYRAT EDIT END included = f"#include \"{dm_path}\"" in lines @@ -148,4 +163,4 @@ for (index, line) in enumerate(lines): post_error(f"The include at line {index + offset} is out of order ({line}, expected {sorted_lines[index]})") sys.exit(1) -print(green(f"Ticked File Enforcement: [{file_reference}] All includes are in order!")) +print(green(f"Ticked File Enforcement: [{file_reference}] All includes (for {len(scannable_files)} scanned files) are in order!"))