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 @@
+
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 @@
+
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/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/LavaRuins/lavaland_battle_site.dmm b/_maps/RandomRuins/LavaRuins/lavaland_battle_site.dmm
new file mode 100644
index 00000000000..7dbc17d40f9
--- /dev/null
+++ b/_maps/RandomRuins/LavaRuins/lavaland_battle_site.dmm
@@ -0,0 +1,464 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/closed/mineral/strong/wasteland,
+/area/lavaland/surface/outdoors)
+"f" = (
+/obj/effect/mob_spawn/corpse/human/skeleton,
+/obj/item/clothing/head/costume/crown{
+ pixel_x = 15;
+ pixel_y = 6;
+ desc = "A crown that was fit for a king, looks like it didn't get them very far.";
+ name = "dented crown"
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"g" = (
+/obj/structure/water_source/puddle,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"h" = (
+/obj/effect/mob_spawn/corpse/human/skeleton,
+/obj/item/shield/buckler,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"j" = (
+/turf/template_noop,
+/area/template_noop)
+"m" = (
+/obj/effect/decal/cleanable/shreds,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"n" = (
+/obj/structure/stone_tile/block/burnt,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"o" = (
+/obj/structure/stone_tile/burnt{
+ dir = 1
+ },
+/obj/structure/stone_tile/burnt{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/blood/drip,
+/mob/living/basic/mining/goliath,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"p" = (
+/obj/item/stack/rods{
+ pixel_x = 10
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"q" = (
+/obj/structure/flora/rock,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"s" = (
+/mob/living/basic/mining/goliath,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"t" = (
+/obj/effect/decal/cleanable/blood/gibs/old,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"u" = (
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"x" = (
+/obj/effect/decal/cleanable/blood/drip,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"D" = (
+/obj/structure/statue/bone/rib{
+ name = "colossal tailbone"
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"F" = (
+/obj/effect/decal/cleanable/blood/drip,
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/obj/structure/statue/bone/rib,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"G" = (
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"H" = (
+/obj/structure/firepit,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"I" = (
+/obj/structure/closet/crate/wooden,
+/obj/item/stack/sheet/animalhide/goliath_hide,
+/obj/item/flashlight/flare/torch,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"J" = (
+/obj/structure/flora/ash/cap_shroom,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"K" = (
+/obj/structure/closet/crate/wooden,
+/obj/item/stack/sheet/sinew,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"L" = (
+/obj/effect/decal/cleanable/blood/hitsplatter{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"M" = (
+/obj/structure/statue/bone/skull,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"O" = (
+/obj/structure/statue/bone/rib{
+ dir = 1
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"P" = (
+/obj/effect/mob_spawn/corpse/human/skeleton,
+/obj/item/shovel/spade,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"S" = (
+/obj/structure/chair/wood/wings{
+ color = "#ffff00"
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"T" = (
+/obj/effect/mob_spawn/corpse/human/skeleton,
+/obj/item/spear/bonespear{
+ pixel_x = 13;
+ pixel_y = 12
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"U" = (
+/obj/structure/statue/bone/rib,
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"V" = (
+/obj/effect/mob_spawn/corpse/human/skeleton,
+/obj/item/stack/rods{
+ pixel_x = -1;
+ pixel_y = -7
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"X" = (
+/obj/structure/stone_tile/burnt,
+/obj/structure/stone_tile/burnt{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"Y" = (
+/obj/effect/mob_spawn/corpse/human/skeleton,
+/obj/item/stack/rods{
+ pixel_y = -12;
+ pixel_x = 2
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+
+(1,1,1) = {"
+j
+j
+j
+j
+j
+j
+j
+j
+j
+j
+j
+j
+j
+j
+j
+j
+"}
+(2,1,1) = {"
+j
+j
+a
+j
+j
+j
+j
+j
+j
+j
+j
+j
+a
+j
+j
+j
+"}
+(3,1,1) = {"
+j
+a
+a
+a
+j
+j
+J
+G
+G
+G
+j
+j
+a
+a
+a
+j
+"}
+(4,1,1) = {"
+j
+j
+a
+a
+G
+K
+G
+u
+T
+x
+J
+a
+a
+a
+j
+j
+"}
+(5,1,1) = {"
+j
+j
+j
+J
+I
+G
+G
+q
+L
+G
+s
+g
+a
+G
+j
+j
+"}
+(6,1,1) = {"
+j
+j
+j
+G
+s
+x
+x
+G
+x
+G
+x
+G
+G
+D
+j
+j
+"}
+(7,1,1) = {"
+j
+j
+V
+q
+G
+p
+t
+J
+G
+q
+J
+O
+q
+G
+j
+j
+"}
+(8,1,1) = {"
+j
+j
+m
+u
+G
+q
+f
+O
+J
+O
+G
+n
+J
+x
+j
+j
+"}
+(9,1,1) = {"
+j
+j
+G
+x
+G
+M
+S
+n
+o
+n
+X
+F
+u
+G
+j
+j
+"}
+(10,1,1) = {"
+j
+j
+J
+G
+G
+u
+J
+U
+G
+U
+J
+G
+G
+G
+j
+j
+"}
+(11,1,1) = {"
+j
+j
+j
+q
+h
+G
+G
+G
+q
+G
+G
+J
+m
+q
+j
+j
+"}
+(12,1,1) = {"
+j
+j
+j
+G
+G
+x
+H
+x
+G
+G
+q
+Y
+G
+a
+j
+j
+"}
+(13,1,1) = {"
+j
+j
+a
+G
+J
+G
+G
+P
+G
+u
+G
+a
+a
+a
+a
+j
+"}
+(14,1,1) = {"
+j
+a
+a
+a
+j
+j
+G
+G
+q
+G
+j
+j
+a
+a
+j
+j
+"}
+(15,1,1) = {"
+j
+a
+a
+j
+j
+j
+j
+j
+j
+j
+j
+a
+a
+a
+j
+j
+"}
+(16,1,1) = {"
+j
+j
+j
+j
+j
+j
+j
+j
+j
+j
+j
+j
+j
+j
+j
+j
+"}
diff --git a/_maps/RandomRuins/SpaceRuins/derelict9.dmm b/_maps/RandomRuins/SpaceRuins/derelict9.dmm
new file mode 100644
index 00000000000..2fa948a60fa
--- /dev/null
+++ b/_maps/RandomRuins/SpaceRuins/derelict9.dmm
@@ -0,0 +1,900 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/closed/mineral/random,
+/area/ruin/space)
+"b" = (
+/turf/closed/indestructible/riveted,
+/area/ruin/space/has_grav)
+"c" = (
+/obj/item/storage/toolbox/mechanical/old,
+/obj/structure/rack,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/spawner/random/maintenance/three,
+/turf/open/floor/plating/airless,
+/area/ruin/space)
+"h" = (
+/obj/structure/closet/crate,
+/obj/item/weldingtool,
+/obj/item/clothing/glasses/welding,
+/turf/open/misc/asteroid/airless,
+/area/ruin/space)
+"j" = (
+/obj/structure/closet/crate/secure/loot,
+/turf/open/floor/pod/dark,
+/area/ruin/space/has_grav)
+"l" = (
+/turf/template_noop,
+/area/template_noop)
+"m" = (
+/turf/closed/wall/rock,
+/area/ruin/space)
+"q" = (
+/obj/effect/mob_spawn/corpse/human/pirate/melee/space,
+/obj/effect/decal/cleanable/blood,
+/turf/open/misc/asteroid/airless,
+/area/ruin/space)
+"r" = (
+/obj/effect/decal/cleanable/blood,
+/turf/open/misc/asteroid/airless,
+/area/ruin/space)
+"s" = (
+/obj/effect/mapping_helpers/bombable_wall,
+/turf/closed/indestructible/riveted,
+/area/ruin/space/has_grav)
+"t" = (
+/obj/effect/gibspawner/human/bodypartless,
+/obj/effect/mob_spawn/corpse/human/charredskeleton,
+/turf/open/misc/asteroid/airless,
+/area/ruin/space)
+"u" = (
+/obj/structure/rack,
+/obj/effect/spawner/random/clothing/beret_or_rabbitears,
+/obj/effect/spawner/random/clothing/mafia_outfit,
+/turf/open/floor/pod/dark,
+/area/ruin/space/has_grav)
+"x" = (
+/turf/open/floor/pod,
+/area/ruin/space/has_grav)
+"B" = (
+/obj/structure/rack,
+/obj/effect/spawner/random/clothing/funny_hats,
+/obj/effect/spawner/random/clothing/gloves,
+/turf/open/floor/pod/dark,
+/area/ruin/space/has_grav)
+"C" = (
+/obj/structure/rack,
+/obj/effect/spawner/random/clothing/mafia_outfit,
+/obj/effect/spawner/random/clothing/pirate_or_bandana,
+/turf/open/floor/pod/dark,
+/area/ruin/space/has_grav)
+"E" = (
+/obj/structure/mineral_door/wood,
+/turf/open/misc/asteroid/airless,
+/area/ruin/space)
+"G" = (
+/obj/structure/safe,
+/obj/item/clothing/head/collectable/petehat,
+/turf/open/floor/pod/light,
+/area/ruin/space/has_grav)
+"I" = (
+/obj/machinery/porta_turret/syndicate/pod,
+/turf/closed/wall/r_wall,
+/area/ruin/space)
+"J" = (
+/obj/item/gun/energy/laser/musket,
+/obj/effect/decal/cleanable/blood,
+/turf/open/misc/asteroid/airless,
+/area/ruin/space)
+"K" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating/airless,
+/area/ruin/space)
+"M" = (
+/obj/structure/reagent_dispensers/fueltank,
+/turf/open/misc/asteroid/airless,
+/area/ruin/space)
+"O" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/spawner/random/maintenance,
+/turf/open/floor/plating/airless,
+/area/ruin/space)
+"Q" = (
+/turf/open/floor/pod/light,
+/area/ruin/space/has_grav)
+"S" = (
+/obj/item/flashlight/lantern,
+/turf/open/misc/asteroid/airless,
+/area/ruin/space)
+"T" = (
+/turf/open/misc/asteroid/airless,
+/area/ruin/space)
+"U" = (
+/obj/structure/rack,
+/obj/effect/spawner/random/clothing/kittyears_or_rabbitears,
+/obj/effect/spawner/random/clothing/lizardboots,
+/turf/open/floor/pod/dark,
+/area/ruin/space/has_grav)
+"X" = (
+/obj/structure/rack,
+/obj/effect/spawner/random/clothing/twentyfive_percent_cyborg_mask,
+/obj/effect/spawner/random/clothing/costume,
+/turf/open/floor/pod/dark,
+/area/ruin/space/has_grav)
+"Y" = (
+/obj/machinery/light/dim/directional/north,
+/turf/open/floor/pod,
+/area/ruin/space/has_grav)
+"Z" = (
+/turf/closed/indestructible/fakedoor,
+/area/ruin/space/has_grav)
+
+(1,1,1) = {"
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+a
+a
+a
+l
+l
+l
+l
+"}
+(2,1,1) = {"
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+T
+l
+l
+a
+l
+"}
+(3,1,1) = {"
+l
+l
+l
+l
+l
+l
+l
+a
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+a
+a
+l
+l
+l
+l
+l
+l
+l
+l
+l
+"}
+(4,1,1) = {"
+l
+l
+l
+l
+T
+a
+a
+a
+T
+l
+l
+I
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+T
+l
+l
+l
+l
+l
+l
+l
+l
+l
+a
+"}
+(5,1,1) = {"
+T
+T
+T
+T
+T
+a
+a
+m
+r
+T
+r
+a
+l
+a
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+T
+a
+a
+l
+l
+T
+"}
+(6,1,1) = {"
+l
+T
+T
+a
+a
+a
+a
+T
+q
+T
+m
+a
+a
+a
+a
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+T
+a
+a
+T
+l
+l
+l
+"}
+(7,1,1) = {"
+l
+T
+a
+a
+a
+a
+a
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+l
+l
+l
+l
+l
+l
+l
+l
+l
+a
+a
+T
+l
+l
+l
+"}
+(8,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+O
+m
+a
+a
+a
+a
+a
+T
+T
+T
+T
+l
+l
+l
+a
+r
+l
+l
+l
+l
+"}
+(9,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+T
+T
+K
+K
+T
+O
+a
+a
+a
+a
+T
+T
+T
+T
+T
+l
+l
+l
+l
+l
+l
+l
+"}
+(10,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+b
+b
+b
+s
+b
+b
+r
+T
+T
+K
+a
+a
+a
+a
+T
+T
+T
+l
+l
+l
+l
+l
+l
+T
+T
+"}
+(11,1,1) = {"
+l
+a
+a
+a
+a
+a
+a
+a
+b
+j
+B
+X
+U
+b
+T
+t
+T
+m
+a
+a
+a
+a
+T
+T
+T
+l
+l
+l
+l
+l
+l
+a
+a
+"}
+(12,1,1) = {"
+l
+l
+a
+a
+a
+a
+a
+a
+b
+x
+x
+x
+x
+b
+K
+T
+T
+a
+a
+a
+a
+a
+a
+T
+T
+l
+l
+l
+l
+l
+l
+l
+l
+"}
+(13,1,1) = {"
+l
+T
+T
+a
+a
+a
+a
+a
+b
+Y
+G
+Q
+x
+Z
+K
+K
+r
+a
+a
+a
+a
+a
+a
+T
+T
+l
+l
+l
+l
+l
+l
+l
+l
+"}
+(14,1,1) = {"
+l
+l
+T
+T
+a
+a
+a
+a
+b
+x
+x
+x
+x
+b
+c
+T
+S
+m
+a
+a
+a
+a
+T
+T
+l
+l
+l
+l
+l
+T
+l
+l
+l
+"}
+(15,1,1) = {"
+l
+l
+l
+l
+l
+a
+a
+a
+b
+u
+j
+C
+j
+b
+r
+r
+T
+T
+r
+m
+a
+a
+T
+l
+l
+l
+l
+T
+T
+T
+l
+l
+l
+"}
+(16,1,1) = {"
+l
+l
+l
+l
+a
+a
+a
+a
+b
+b
+b
+b
+b
+b
+K
+r
+m
+a
+r
+E
+T
+T
+T
+l
+l
+T
+T
+T
+T
+T
+a
+l
+l
+"}
+(17,1,1) = {"
+l
+l
+l
+l
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+m
+T
+r
+T
+T
+T
+a
+T
+T
+a
+a
+a
+l
+l
+"}
+(18,1,1) = {"
+l
+l
+l
+l
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+M
+h
+a
+a
+a
+a
+a
+a
+a
+a
+l
+l
+"}
+(19,1,1) = {"
+l
+l
+l
+l
+l
+a
+a
+a
+a
+a
+a
+T
+T
+T
+T
+T
+T
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+T
+l
+"}
+(20,1,1) = {"
+l
+l
+l
+l
+l
+l
+T
+T
+a
+a
+T
+T
+l
+l
+l
+T
+T
+T
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+l
+l
+l
+"}
+(21,1,1) = {"
+l
+l
+l
+l
+l
+l
+l
+l
+T
+T
+T
+l
+l
+l
+l
+l
+l
+T
+T
+a
+a
+a
+a
+a
+a
+a
+a
+T
+T
+T
+l
+l
+l
+"}
+(22,1,1) = {"
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+l
+a
+a
+T
+T
+T
+l
+l
+l
+l
+"}
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/debug/gateway_test.dmm b/_maps/map_files/debug/gateway_test.dmm
new file mode 100644
index 00000000000..d3cc2563d47
--- /dev/null
+++ b/_maps/map_files/debug/gateway_test.dmm
@@ -0,0 +1,392 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/closed/indestructible/reinforced,
+/area/misc/testroom/gateway_room)
+"c" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/stripes/white/full,
+/turf/open/indestructible/dark,
+/area/misc/testroom/gateway_room)
+"d" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 1
+ },
+/turf/open/indestructible/dark,
+/area/misc/testroom/gateway_room)
+"f" = (
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 9
+ },
+/turf/open/indestructible,
+/area/misc/testroom/gateway_room)
+"g" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/structure/extinguisher_cabinet/directional/west,
+/turf/open/indestructible,
+/area/misc/testroom/gateway_room)
+"h" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/vending/wallmed/directional/west,
+/turf/open/indestructible,
+/area/misc/testroom/gateway_room)
+"j" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/stripes/white/full,
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 6
+ },
+/obj/structure/sign/flag/ssc/directional/north,
+/turf/open/indestructible/dark,
+/area/misc/testroom/gateway_room)
+"l" = (
+/obj/machinery/computer/communications{
+ dir = 8
+ },
+/obj/effect/turf_decal/bot{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/indestructible,
+/area/misc/testroom/gateway_room)
+"m" = (
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 4
+ },
+/turf/open/indestructible,
+/area/misc/testroom/gateway_room)
+"n" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/stripes/white/full,
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 4
+ },
+/turf/open/indestructible/dark,
+/area/misc/testroom/gateway_room)
+"p" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/stripes/white/full,
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 10
+ },
+/obj/structure/sign/flag/nanotrasen/directional/north,
+/turf/open/indestructible/dark,
+/area/misc/testroom/gateway_room)
+"q" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/stripes/white/full,
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 8
+ },
+/turf/open/indestructible/dark,
+/area/misc/testroom/gateway_room)
+"r" = (
+/obj/effect/turf_decal/delivery,
+/obj/machinery/door/poddoor/shutters/indestructible,
+/turf/open/floor/iron,
+/area/misc/testroom/gateway_room)
+"t" = (
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 5
+ },
+/turf/open/indestructible,
+/area/misc/testroom/gateway_room)
+"u" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/stripes/white/full,
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 1
+ },
+/obj/structure/sign/flag/terragov/directional/north,
+/turf/open/indestructible/dark,
+/area/misc/testroom/gateway_room)
+"v" = (
+/obj/machinery/gateway/centerstation,
+/obj/effect/turf_decal/stripes/white/box,
+/obj/effect/turf_decal/trimline/blue,
+/turf/open/indestructible/dark,
+/area/misc/testroom/gateway_room)
+"y" = (
+/obj/machinery/light/directional/east,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 1
+ },
+/turf/open/indestructible/dark,
+/area/misc/testroom/gateway_room)
+"z" = (
+/obj/effect/landmark/blobstart,
+/obj/effect/turf_decal/stripes/red/line,
+/turf/open/indestructible,
+/area/misc/testroom/gateway_room)
+"B" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/indestructible,
+/area/misc/testroom/gateway_room)
+"C" = (
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 8
+ },
+/turf/open/indestructible,
+/area/misc/testroom/gateway_room)
+"D" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/structure/sign/warning/secure_area/directional/south,
+/obj/effect/landmark/latejoin,
+/obj/effect/landmark/observer_start,
+/obj/effect/landmark/start,
+/turf/open/indestructible,
+/area/misc/testroom/gateway_room)
+"E" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Gateway Chamber"
+ },
+/turf/open/indestructible,
+/area/misc/testroom/gateway_room)
+"G" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/structure/table,
+/obj/item/toy/figure/curator{
+ pixel_y = 5
+ },
+/obj/item/card/id/advanced/debug,
+/turf/open/indestructible,
+/area/misc/testroom/gateway_room)
+"H" = (
+/turf/open/space/basic,
+/area/space)
+"I" = (
+/obj/machinery/computer/gateway_control{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/full,
+/turf/open/indestructible,
+/area/misc/testroom/gateway_room)
+"J" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 1
+ },
+/turf/open/indestructible/dark,
+/area/misc/testroom/gateway_room)
+"K" = (
+/obj/structure/closet/crate/preopen,
+/obj/item/stack/sheet/rglass{
+ amount = 50
+ },
+/obj/item/stack/sheet/iron/fifty,
+/obj/item/stack/rods/fifty,
+/obj/item/toy/plush/lizard_plushie/space/green{
+ name = "Travels-The-Stars";
+ desc = "The greatest gateway explorer ever created."
+ },
+/obj/effect/spawner/random/engineering/flashlight,
+/obj/item/storage/toolbox/emergency,
+/obj/machinery/firealarm/directional/west,
+/obj/effect/turf_decal/bot{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/obj/structure/sign/calendar/directional/north,
+/turf/open/indestructible,
+/area/misc/testroom/gateway_room)
+"M" = (
+/obj/structure/chair/stool/directional/east,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/keycard_auth/directional/west{
+ pixel_y = 7
+ },
+/obj/machinery/keycard_auth/directional/west{
+ pixel_y = -7
+ },
+/turf/open/indestructible,
+/area/misc/testroom/gateway_room)
+"N" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/stripes/white/full,
+/obj/effect/turf_decal/stripes/red/line{
+ dir = 4
+ },
+/obj/structure/sign/warning/radiation/directional/east,
+/turf/open/indestructible/dark,
+/area/misc/testroom/gateway_room)
+"O" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/machinery/suit_storage_unit/centcom,
+/obj/structure/sign/warning/engine_safety/directional/south,
+/obj/structure/sign/warning/no_smoking/circle/directional/west,
+/turf/open/indestructible,
+/area/misc/testroom/gateway_room)
+"P" = (
+/obj/machinery/light/directional/west,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/structure/sign/poster/official/corporate_perks_vacation/directional/west,
+/turf/open/indestructible,
+/area/misc/testroom/gateway_room)
+"Q" = (
+/turf/open/indestructible,
+/area/misc/testroom/gateway_room)
+"R" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/obj/structure/table,
+/obj/item/paper/pamphlet/gateway{
+ desc = "The Iris and You: How Not To Smash Against Steel At The End of the Event Horizon"
+ },
+/obj/effect/turf_decal/bot{
+ dir = 1
+ },
+/obj/item/radio/intercom/directional/north,
+/turf/open/indestructible,
+/area/misc/testroom/gateway_room)
+"W" = (
+/turf/closed/indestructible/fakeglass,
+/area/misc/testroom/gateway_room)
+
+(1,1,1) = {"
+H
+H
+H
+H
+H
+H
+H
+H
+H
+H
+"}
+(2,1,1) = {"
+H
+a
+a
+a
+a
+a
+a
+a
+a
+H
+"}
+(3,1,1) = {"
+H
+a
+K
+M
+g
+P
+h
+O
+a
+H
+"}
+(4,1,1) = {"
+H
+a
+R
+I
+l
+G
+B
+D
+a
+H
+"}
+(5,1,1) = {"
+H
+a
+W
+W
+W
+W
+E
+W
+a
+H
+"}
+(6,1,1) = {"
+H
+a
+j
+q
+q
+d
+C
+t
+r
+H
+"}
+(7,1,1) = {"
+H
+a
+u
+v
+c
+J
+Q
+z
+r
+H
+"}
+(8,1,1) = {"
+H
+a
+p
+N
+n
+y
+m
+f
+r
+H
+"}
+(9,1,1) = {"
+H
+a
+a
+a
+a
+a
+a
+a
+a
+H
+"}
+(10,1,1) = {"
+H
+H
+H
+H
+H
+H
+H
+H
+H
+H
+"}
diff --git a/_maps/safehouses/README.md b/_maps/safehouses/README.md
new file mode 100644
index 00000000000..8027ea38e21
--- /dev/null
+++ b/_maps/safehouses/README.md
@@ -0,0 +1,17 @@
+# Safe House
+
+## Creating a new safe house
+
+1. Create a new map inside the `_maps\safe_houses` folder using the TGM format.
+2. Create a new dm file inside `modules\bitrunning\virtual_domain\safe_houses` folder..
+4. Place exit and goal landmarks (obj/effect/landmark/bitrunning/..). Generally, 3 exits and 2 goals are ok.
+5. Ideally, leave 3 spaces for gear. This has usually been xy [1x1] [1x2] [1x3]
+
+## Notes
+
+- Safe houses are intended to be 7x6 in size. You're not technically limited to this, but consider maps other maps might be using this size if you want it to be modular.
+- Consider that avatars are not invincible and still require air. If you're making a safe house, it should start with an area that accommodates for this.
+- For compatibility, your safe house should have a route open from the top center xy [3x0] of the map.
+- If you want a custom safehouse for a custom map with no modularity, no problem. Make whatever sizes you want, just ensure there are exit and goal effects placed.
+- Some maps can alter what is spawned into the safehouse by placing objects in the safehouse area. I'm using the left corner, starting from the top, for things like space gear.
+
diff --git a/_maps/safehouses/TEMPLATES/TEMPLATE.dmm b/_maps/safehouses/TEMPLATES/TEMPLATE.dmm
new file mode 100644
index 00000000000..c8e5059f0d0
--- /dev/null
+++ b/_maps/safehouses/TEMPLATES/TEMPLATE.dmm
@@ -0,0 +1,82 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/virtual_domain/safehouse)
+"c" = (
+/obj/effect/mapping_helpers/airlock/access/all,
+/obj/machinery/door/airlock/external/glass,
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/virtual_domain/safehouse)
+"p" = (
+/turf/open/floor/plating,
+/area/virtual_domain/safehouse)
+"v" = (
+/obj/effect/bitrunning/exit_spawn,
+/turf/open/floor/plating,
+/area/virtual_domain/safehouse)
+"N" = (
+/obj/effect/bitrunning/goal_turf,
+/turf/open/floor/plating,
+/area/virtual_domain/safehouse)
+"R" = (
+/turf/closed/wall,
+/area/virtual_domain/safehouse)
+
+(1,1,1) = {"
+R
+R
+a
+a
+R
+R
+"}
+(2,1,1) = {"
+a
+p
+p
+p
+p
+R
+"}
+(3,1,1) = {"
+R
+p
+p
+p
+v
+a
+"}
+(4,1,1) = {"
+c
+p
+p
+p
+v
+R
+"}
+(5,1,1) = {"
+R
+p
+p
+p
+v
+a
+"}
+(6,1,1) = {"
+a
+p
+N
+N
+p
+R
+"}
+(7,1,1) = {"
+R
+R
+a
+a
+R
+R
+"}
diff --git a/_maps/safehouses/den.dmm b/_maps/safehouses/den.dmm
new file mode 100644
index 00000000000..235d786d6e9
--- /dev/null
+++ b/_maps/safehouses/den.dmm
@@ -0,0 +1,224 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/obj/structure/chair/office{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/pod,
+/area/virtual_domain/safehouse)
+"c" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/directional/east,
+/obj/effect/landmark/bitrunning/cache_goal_turf,
+/obj/effect/turf_decal/loading_area{
+ dir = 4
+ },
+/turf/open/floor/bitrunning_transport,
+/area/virtual_domain/safehouse)
+"e" = (
+/obj/structure/table/reinforced/plastitaniumglass,
+/obj/effect/spawner/random/food_or_drink/snack{
+ pixel_x = 4;
+ pixel_y = 2
+ },
+/turf/open/floor/pod/dark,
+/area/virtual_domain/safehouse)
+"i" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/shutters/preopen{
+ dir = 1;
+ id = "safehouseshutter"
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/safehouse)
+"l" = (
+/obj/structure/railing/corner/end{
+ dir = 4
+ },
+/turf/open/floor/pod/dark,
+/area/virtual_domain/safehouse)
+"p" = (
+/turf/open/floor/pod,
+/area/virtual_domain/safehouse)
+"r" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 9
+ },
+/turf/open/floor/pod/dark,
+/area/virtual_domain/safehouse)
+"u" = (
+/obj/structure/railing,
+/obj/effect/turf_decal/siding/dark,
+/obj/structure/sign/poster/contraband/hacking_guide/directional/east,
+/obj/effect/landmark/bitrunning/cache_goal_turf,
+/obj/effect/turf_decal/loading_area{
+ dir = 4
+ },
+/turf/open/floor/bitrunning_transport,
+/area/virtual_domain/safehouse)
+"z" = (
+/obj/effect/turf_decal/trimline/yellow/corner{
+ dir = 4
+ },
+/obj/effect/landmark/bitrunning/hololadder_spawn,
+/turf/open/floor/pod/light,
+/area/virtual_domain/safehouse)
+"C" = (
+/turf/closed/wall,
+/area/virtual_domain/safehouse)
+"D" = (
+/obj/effect/decal/cleanable/generic,
+/obj/effect/turf_decal/trimline/yellow/warning{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/yellow/corner{
+ dir = 1
+ },
+/turf/open/floor/pod,
+/area/virtual_domain/safehouse)
+"E" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/generic,
+/obj/effect/landmark/bitrunning/hololadder_spawn,
+/turf/open/floor/pod/light,
+/area/virtual_domain/safehouse)
+"G" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/shutters/preopen{
+ dir = 4;
+ id = "safehouseshutter"
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/safehouse)
+"I" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 5
+ },
+/obj/effect/landmark/bitrunning/hololadder_spawn,
+/turf/open/floor/pod/light,
+/area/virtual_domain/safehouse)
+"J" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/shutters/preopen{
+ dir = 8;
+ id = "safehouseshutter"
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/safehouse)
+"K" = (
+/obj/effect/spawner/random/vending/colavend,
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/pod,
+/area/virtual_domain/safehouse)
+"M" = (
+/turf/open/floor/pod/dark,
+/area/virtual_domain/safehouse)
+"O" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 8
+ },
+/turf/open/floor/pod/dark,
+/area/virtual_domain/safehouse)
+"R" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 4
+ },
+/turf/open/floor/pod/dark,
+/area/virtual_domain/safehouse)
+"U" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/sign/departments/cargo/directional/west,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/pod,
+/area/virtual_domain/safehouse)
+"W" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "safehouseshutter"
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/safehouse)
+"X" = (
+/obj/machinery/door/airlock/grunge,
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/virtual_domain/safehouse)
+"Y" = (
+/obj/structure/table/reinforced/plastitaniumglass,
+/obj/machinery/button/door{
+ pixel_x = 4;
+ pixel_y = 4;
+ id = "safehouseshutter"
+ },
+/obj/effect/spawner/random/food_or_drink/refreshing_beverage{
+ pixel_y = 6;
+ pixel_x = -10
+ },
+/turf/open/floor/pod/dark,
+/area/virtual_domain/safehouse)
+"Z" = (
+/obj/effect/turf_decal/trimline/yellow/warning{
+ dir = 4
+ },
+/turf/open/floor/pod/dark,
+/area/virtual_domain/safehouse)
+
+(1,1,1) = {"
+C
+C
+C
+G
+G
+C
+"}
+(2,1,1) = {"
+W
+U
+p
+M
+K
+C
+"}
+(3,1,1) = {"
+C
+r
+O
+O
+E
+i
+"}
+(4,1,1) = {"
+X
+D
+Z
+R
+z
+i
+"}
+(5,1,1) = {"
+C
+M
+l
+e
+I
+i
+"}
+(6,1,1) = {"
+W
+c
+u
+Y
+a
+C
+"}
+(7,1,1) = {"
+C
+C
+C
+J
+J
+C
+"}
diff --git a/_maps/safehouses/dig.dmm b/_maps/safehouses/dig.dmm
new file mode 100644
index 00000000000..7fbbd3e5549
--- /dev/null
+++ b/_maps/safehouses/dig.dmm
@@ -0,0 +1,165 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/effect/turf_decal/siding/yellow/corner,
+/obj/effect/turf_decal/sand/plating,
+/obj/item/flashlight/glowstick{
+ on = 1
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/safehouse)
+"c" = (
+/obj/effect/turf_decal/siding/yellow/corner{
+ dir = 8
+ },
+/turf/open/misc/asteroid,
+/area/virtual_domain/safehouse)
+"h" = (
+/obj/effect/turf_decal/loading_area,
+/obj/effect/turf_decal/box/corners{
+ dir = 8
+ },
+/obj/effect/landmark/bitrunning/cache_goal_turf,
+/turf/open/floor/bitrunning_transport,
+/area/virtual_domain/safehouse)
+"i" = (
+/obj/effect/turf_decal/siding/yellow{
+ dir = 8
+ },
+/obj/effect/decal/remains/xeno/larva,
+/turf/open/misc/asteroid,
+/area/virtual_domain/safehouse)
+"l" = (
+/obj/structure/table,
+/obj/item/coin/gold{
+ pixel_x = -6;
+ pixel_y = 2
+ },
+/obj/item/flashlight/lantern{
+ pixel_y = 8;
+ pixel_x = 4;
+ on = 1
+ },
+/turf/open/misc/asteroid,
+/area/virtual_domain/safehouse)
+"o" = (
+/obj/effect/turf_decal/siding/yellow{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/misc/asteroid,
+/area/virtual_domain/safehouse)
+"u" = (
+/obj/effect/turf_decal/siding/yellow{
+ dir = 8
+ },
+/obj/effect/turf_decal/siding/yellow,
+/obj/effect/decal/cleanable/oil/streak,
+/turf/open/misc/asteroid,
+/area/virtual_domain/safehouse)
+"x" = (
+/obj/effect/turf_decal/sand/plating,
+/turf/open/floor/plating,
+/area/virtual_domain/safehouse)
+"A" = (
+/turf/closed/wall/rock,
+/area/virtual_domain/safehouse)
+"B" = (
+/turf/open/misc/asteroid,
+/area/virtual_domain/safehouse)
+"H" = (
+/turf/closed/mineral/asteroid,
+/area/virtual_domain/safehouse)
+"I" = (
+/obj/machinery/door/airlock/maintenance/glass,
+/obj/structure/fans/tiny,
+/obj/effect/turf_decal/sand/plating,
+/turf/open/floor/plating,
+/area/virtual_domain/safehouse)
+"M" = (
+/obj/effect/turf_decal/siding/yellow,
+/obj/effect/decal/remains/xeno,
+/turf/open/misc/asteroid,
+/area/virtual_domain/safehouse)
+"N" = (
+/obj/effect/turf_decal/sand/plating,
+/obj/effect/turf_decal/sand/plating,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/virtual_domain/safehouse)
+"S" = (
+/obj/structure/railing{
+ dir = 4
+ },
+/obj/effect/turf_decal/loading_area,
+/obj/effect/turf_decal/box/corners,
+/obj/effect/landmark/bitrunning/cache_goal_turf,
+/turf/open/floor/bitrunning_transport,
+/area/virtual_domain/safehouse)
+"T" = (
+/obj/effect/landmark/bitrunning/hololadder_spawn,
+/turf/open/misc/asteroid,
+/area/virtual_domain/safehouse)
+"U" = (
+/obj/effect/turf_decal/siding/yellow{
+ dir = 8
+ },
+/turf/open/misc/asteroid,
+/area/virtual_domain/safehouse)
+
+(1,1,1) = {"
+H
+H
+A
+A
+H
+H
+"}
+(2,1,1) = {"
+A
+N
+x
+a
+H
+A
+"}
+(3,1,1) = {"
+A
+i
+U
+u
+h
+A
+"}
+(4,1,1) = {"
+I
+B
+B
+M
+S
+A
+"}
+(5,1,1) = {"
+A
+l
+B
+c
+o
+H
+"}
+(6,1,1) = {"
+A
+A
+T
+T
+T
+A
+"}
+(7,1,1) = {"
+H
+A
+H
+H
+A
+A
+"}
diff --git a/_maps/safehouses/ice.dmm b/_maps/safehouses/ice.dmm
new file mode 100644
index 00000000000..a8293f9502a
--- /dev/null
+++ b/_maps/safehouses/ice.dmm
@@ -0,0 +1,254 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/obj/effect/spawner/structure/window/ice,
+/turf/open/floor/plating/snowed,
+/area/virtual_domain/safehouse)
+"c" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 6
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/directional/east,
+/obj/structure/chair/wood{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"f" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating/snowed,
+/area/virtual_domain/safehouse)
+"g" = (
+/obj/effect/spawner/structure/window/ice,
+/obj/structure/barricade/wooden/crude/snow,
+/turf/open/floor/plating/snowed,
+/area/virtual_domain/safehouse)
+"i" = (
+/turf/closed/wall/ice,
+/area/virtual_domain/safehouse)
+"m" = (
+/obj/effect/turf_decal/weather/snow/corner,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/trimline/dark_blue/line{
+ dir = 1
+ },
+/obj/effect/landmark/bitrunning/hololadder_spawn,
+/turf/open/floor/pod,
+/area/virtual_domain/safehouse)
+"n" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/rack,
+/obj/item/grown/log,
+/obj/item/grown/log,
+/obj/item/grown/log,
+/obj/item/hatchet/wooden,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"o" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/landmark/bitrunning/cache_goal_turf,
+/obj/effect/turf_decal/loading_area{
+ dir = 4
+ },
+/turf/open/floor/bitrunning_transport,
+/area/virtual_domain/safehouse)
+"p" = (
+/obj/structure/railing,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/landmark/bitrunning/cache_goal_turf,
+/obj/effect/turf_decal/loading_area{
+ dir = 4
+ },
+/turf/open/floor/bitrunning_transport,
+/area/virtual_domain/safehouse)
+"u" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/virtual_domain/safehouse)
+"v" = (
+/obj/effect/turf_decal/weather/snow/corner,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/trimline/dark_blue/line{
+ dir = 5
+ },
+/obj/effect/landmark/bitrunning/hololadder_spawn,
+/turf/open/floor/pod,
+/area/virtual_domain/safehouse)
+"x" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/vending/coffee,
+/turf/open/floor/plating/snowed,
+/area/virtual_domain/safehouse)
+"z" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/generic,
+/turf/open/floor/plating/snowed,
+/area/virtual_domain/safehouse)
+"A" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 4
+ },
+/obj/structure/railing/corner/end{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating/snowed,
+/area/virtual_domain/safehouse)
+"B" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating/snowed,
+/area/virtual_domain/safehouse)
+"C" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 1
+ },
+/obj/structure/table/wood,
+/obj/item/reagent_containers/cup/glass/coffee{
+ pixel_x = 7;
+ pixel_y = 13
+ },
+/obj/item/reagent_containers/cup/glass/coffee/no_lid{
+ pixel_x = -4;
+ pixel_y = 14
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/safehouse)
+"D" = (
+/obj/effect/turf_decal/weather/snow/corner,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/generic,
+/obj/effect/turf_decal/trimline/dark_blue/line{
+ dir = 9
+ },
+/obj/effect/landmark/bitrunning/hololadder_spawn,
+/turf/open/floor/pod,
+/area/virtual_domain/safehouse)
+"I" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"L" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 9
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/small/directional/west,
+/obj/machinery/smartfridge/drying_rack,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"O" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/door/airlock/freezer,
+/obj/structure/fans/tiny,
+/turf/open/floor/plating/snowed,
+/area/virtual_domain/safehouse)
+"S" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 5
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table/wood,
+/obj/item/trash/chips{
+ pixel_x = 8;
+ pixel_y = 15
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"W" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/crate/internals,
+/obj/item/tank/internals/oxygen,
+/obj/item/tank/internals/oxygen,
+/obj/item/tank/internals/oxygen,
+/obj/item/clothing/mask/breath,
+/obj/item/clothing/mask/breath,
+/obj/item/clothing/mask/breath,
+/obj/item/clothing/suit/hooded/wintercoat,
+/obj/item/clothing/suit/hooded/wintercoat,
+/obj/item/clothing/suit/hooded/wintercoat,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"Z" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 10
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+
+(1,1,1) = {"
+i
+i
+g
+a
+i
+i
+"}
+(2,1,1) = {"
+i
+L
+n
+W
+Z
+i
+"}
+(3,1,1) = {"
+a
+x
+u
+I
+D
+i
+"}
+(4,1,1) = {"
+O
+z
+B
+I
+m
+i
+"}
+(5,1,1) = {"
+a
+f
+A
+C
+v
+i
+"}
+(6,1,1) = {"
+i
+o
+p
+S
+c
+i
+"}
+(7,1,1) = {"
+i
+i
+g
+g
+i
+i
+"}
diff --git a/_maps/safehouses/lavaland_boss.dmm b/_maps/safehouses/lavaland_boss.dmm
new file mode 100644
index 00000000000..7482846e61f
--- /dev/null
+++ b/_maps/safehouses/lavaland_boss.dmm
@@ -0,0 +1,243 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/obj/effect/turf_decal/trimline/brown/filled/line,
+/obj/effect/landmark/bitrunning/hololadder_spawn,
+/turf/open/floor/iron/dark/smooth_edge{
+ dir = 1
+ },
+/area/virtual_domain/safehouse)
+"f" = (
+/turf/closed/wall,
+/area/virtual_domain/safehouse)
+"p" = (
+/obj/effect/turf_decal/trimline/brown/filled/line{
+ dir = 5
+ },
+/obj/structure/tank_dispenser/oxygen,
+/turf/open/floor/iron/dark,
+/area/virtual_domain/safehouse)
+"v" = (
+/obj/structure/table,
+/obj/item/borg/upgrade/modkit/damage{
+ pixel_x = 8;
+ pixel_y = 8
+ },
+/obj/item/borg/upgrade/modkit/damage{
+ pixel_y = 4;
+ pixel_x = 8
+ },
+/obj/item/borg/upgrade/modkit/damage{
+ pixel_x = 8
+ },
+/obj/item/borg/upgrade/modkit/range{
+ pixel_y = 8
+ },
+/obj/item/borg/upgrade/modkit/range{
+ pixel_y = 4
+ },
+/obj/item/borg/upgrade/modkit/range,
+/obj/item/borg/upgrade/modkit/cooldown{
+ pixel_x = -8;
+ pixel_y = 8
+ },
+/obj/item/borg/upgrade/modkit/cooldown{
+ pixel_x = -8;
+ pixel_y = 4
+ },
+/obj/item/borg/upgrade/modkit/cooldown{
+ pixel_x = -8
+ },
+/obj/item/reagent_containers/hypospray/medipen/survival/luxury{
+ pixel_x = 6;
+ pixel_y = 6
+ },
+/obj/item/reagent_containers/hypospray/medipen/survival/luxury{
+ pixel_x = 6
+ },
+/turf/open/floor/iron/dark/textured_large,
+/area/virtual_domain/safehouse)
+"w" = (
+/obj/effect/turf_decal/loading_area{
+ dir = 4
+ },
+/obj/machinery/light/directional/east,
+/obj/structure/railing,
+/obj/effect/landmark/bitrunning/cache_goal_turf,
+/turf/open/floor/bitrunning_transport,
+/area/virtual_domain/safehouse)
+"A" = (
+/obj/effect/turf_decal/trimline/brown/filled/line{
+ dir = 1
+ },
+/obj/structure/extinguisher_cabinet/directional/north,
+/turf/open/floor/iron/dark/smooth_edge,
+/area/virtual_domain/safehouse)
+"B" = (
+/obj/effect/turf_decal/trimline/brown/filled/line{
+ dir = 10
+ },
+/obj/structure/table,
+/obj/item/flashlight/lantern{
+ pixel_x = 8;
+ pixel_y = null
+ },
+/obj/item/flashlight/lantern{
+ pixel_y = 4
+ },
+/obj/item/flashlight/lantern{
+ pixel_x = -8;
+ pixel_y = 8
+ },
+/obj/item/clothing/glasses/meson/night,
+/obj/item/clothing/glasses/meson/night,
+/obj/item/clothing/glasses/meson/night,
+/turf/open/floor/iron/dark,
+/area/virtual_domain/safehouse)
+"C" = (
+/obj/effect/turf_decal/trimline/brown/filled/line{
+ dir = 4
+ },
+/obj/structure/closet,
+/obj/item/gun/ballistic/rocketlauncher/unrestricted,
+/obj/item/ammo_casing/rocket,
+/obj/item/ammo_casing/rocket,
+/obj/item/ammo_casing/rocket,
+/obj/item/energy_katana,
+/obj/item/ammo_box/magazine/m7mm,
+/turf/open/floor/iron/dark/smooth_edge{
+ dir = 8
+ },
+/area/virtual_domain/safehouse)
+"H" = (
+/obj/machinery/door/airlock/external/glass{
+ name = "Mining External Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/access/all,
+/obj/structure/fans/tiny,
+/turf/open/floor/iron/dark/textured_large,
+/area/virtual_domain/safehouse)
+"K" = (
+/obj/effect/turf_decal/trimline/brown/filled/line{
+ dir = 1
+ },
+/turf/open/floor/iron/dark/smooth_edge,
+/area/virtual_domain/safehouse)
+"O" = (
+/obj/item/gun/energy/recharge/kinetic_accelerator{
+ pixel_x = -6;
+ pixel_y = 6
+ },
+/obj/item/gun/energy/recharge/kinetic_accelerator{
+ pixel_x = -1;
+ pixel_y = 1
+ },
+/obj/item/gun/energy/recharge/kinetic_accelerator{
+ pixel_x = 4;
+ pixel_y = -4
+ },
+/obj/structure/closet,
+/obj/item/kinetic_crusher,
+/obj/item/kinetic_crusher,
+/turf/open/floor/iron/dark/textured_large,
+/area/virtual_domain/safehouse)
+"P" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/virtual_domain/safehouse)
+"S" = (
+/turf/open/floor/iron/dark/textured_large,
+/area/virtual_domain/safehouse)
+"T" = (
+/obj/effect/turf_decal/trimline/brown/filled/line{
+ dir = 6
+ },
+/obj/structure/sign/departments/cargo/directional/south,
+/obj/structure/closet,
+/obj/item/gun/ballistic/automatic/l6_saw/unrestricted,
+/obj/item/ammo_box/magazine/sniper_rounds,
+/obj/item/gun/ballistic/rifle/sniper_rifle,
+/turf/open/floor/iron/dark,
+/area/virtual_domain/safehouse)
+"X" = (
+/obj/effect/turf_decal/trimline/brown/filled/line{
+ dir = 8
+ },
+/obj/machinery/suit_storage_unit/mining,
+/turf/open/floor/iron/dark/smooth_edge{
+ dir = 4
+ },
+/area/virtual_domain/safehouse)
+"Y" = (
+/obj/effect/turf_decal/trimline/brown/filled/line{
+ dir = 8
+ },
+/obj/machinery/suit_storage_unit/mining,
+/obj/machinery/light/directional/west,
+/turf/open/floor/iron/dark/smooth_edge{
+ dir = 4
+ },
+/area/virtual_domain/safehouse)
+"Z" = (
+/obj/effect/turf_decal/trimline/brown/filled/line{
+ dir = 9
+ },
+/obj/machinery/suit_storage_unit/mining,
+/turf/open/floor/iron/dark,
+/area/virtual_domain/safehouse)
+
+(1,1,1) = {"
+f
+f
+f
+P
+P
+f
+"}
+(2,1,1) = {"
+P
+Z
+Y
+X
+B
+f
+"}
+(3,1,1) = {"
+f
+A
+S
+S
+a
+P
+"}
+(4,1,1) = {"
+H
+K
+O
+v
+a
+P
+"}
+(5,1,1) = {"
+f
+A
+S
+S
+a
+P
+"}
+(6,1,1) = {"
+P
+p
+w
+C
+T
+f
+"}
+(7,1,1) = {"
+f
+f
+f
+P
+P
+f
+"}
diff --git a/_maps/safehouses/mine.dmm b/_maps/safehouses/mine.dmm
new file mode 100644
index 00000000000..551e2ca0c00
--- /dev/null
+++ b/_maps/safehouses/mine.dmm
@@ -0,0 +1,164 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/obj/effect/turf_decal/trimline/brown/filled/line,
+/obj/effect/landmark/bitrunning/hololadder_spawn,
+/turf/open/floor/iron/dark/smooth_edge{
+ dir = 1
+ },
+/area/virtual_domain/safehouse)
+"f" = (
+/turf/closed/wall,
+/area/virtual_domain/safehouse)
+"p" = (
+/obj/effect/turf_decal/trimline/brown/filled/line{
+ dir = 5
+ },
+/obj/structure/tank_dispenser/oxygen,
+/turf/open/floor/iron/dark,
+/area/virtual_domain/safehouse)
+"w" = (
+/obj/effect/turf_decal/loading_area{
+ dir = 4
+ },
+/obj/machinery/light/directional/east,
+/obj/effect/landmark/bitrunning/cache_goal_turf,
+/turf/open/floor/bitrunning_transport,
+/area/virtual_domain/safehouse)
+"B" = (
+/obj/effect/turf_decal/trimline/brown/filled/line{
+ dir = 10
+ },
+/obj/structure/table,
+/obj/item/flashlight/lantern{
+ pixel_x = 8;
+ pixel_y = null
+ },
+/obj/item/flashlight/lantern{
+ pixel_y = 4
+ },
+/obj/item/flashlight/lantern{
+ pixel_x = -8;
+ pixel_y = 8
+ },
+/turf/open/floor/iron/dark,
+/area/virtual_domain/safehouse)
+"C" = (
+/obj/effect/turf_decal/loading_area{
+ dir = 4
+ },
+/obj/structure/railing,
+/obj/effect/landmark/bitrunning/cache_goal_turf,
+/turf/open/floor/bitrunning_transport,
+/area/virtual_domain/safehouse)
+"H" = (
+/obj/machinery/door/airlock/external/glass{
+ name = "Mining External Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/access/all,
+/obj/structure/fans/tiny,
+/turf/open/floor/iron/dark/textured_large,
+/area/virtual_domain/safehouse)
+"K" = (
+/obj/effect/turf_decal/trimline/brown/filled/line{
+ dir = 1
+ },
+/turf/open/floor/iron/dark/smooth_edge,
+/area/virtual_domain/safehouse)
+"P" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/virtual_domain/safehouse)
+"S" = (
+/turf/open/floor/iron/dark/textured_large,
+/area/virtual_domain/safehouse)
+"T" = (
+/obj/effect/turf_decal/trimline/brown/filled/line{
+ dir = 6
+ },
+/obj/item/kirbyplants/random,
+/obj/structure/sign/departments/cargo/directional/south,
+/turf/open/floor/iron/dark,
+/area/virtual_domain/safehouse)
+"X" = (
+/obj/effect/turf_decal/trimline/brown/filled/line{
+ dir = 8
+ },
+/obj/machinery/suit_storage_unit/mining,
+/turf/open/floor/iron/dark/smooth_edge{
+ dir = 4
+ },
+/area/virtual_domain/safehouse)
+"Y" = (
+/obj/effect/turf_decal/trimline/brown/filled/line{
+ dir = 8
+ },
+/obj/machinery/suit_storage_unit/mining,
+/obj/machinery/light/directional/west,
+/turf/open/floor/iron/dark/smooth_edge{
+ dir = 4
+ },
+/area/virtual_domain/safehouse)
+"Z" = (
+/obj/effect/turf_decal/trimline/brown/filled/line{
+ dir = 9
+ },
+/obj/machinery/suit_storage_unit/mining,
+/turf/open/floor/iron/dark,
+/area/virtual_domain/safehouse)
+
+(1,1,1) = {"
+f
+f
+f
+P
+P
+f
+"}
+(2,1,1) = {"
+P
+Z
+Y
+X
+B
+f
+"}
+(3,1,1) = {"
+f
+K
+S
+S
+a
+P
+"}
+(4,1,1) = {"
+H
+K
+S
+S
+a
+P
+"}
+(5,1,1) = {"
+f
+K
+S
+S
+a
+P
+"}
+(6,1,1) = {"
+P
+p
+w
+C
+T
+f
+"}
+(7,1,1) = {"
+f
+f
+f
+P
+P
+f
+"}
diff --git a/_maps/safehouses/shuttle.dmm b/_maps/safehouses/shuttle.dmm
new file mode 100644
index 00000000000..92228c95bd3
--- /dev/null
+++ b/_maps/safehouses/shuttle.dmm
@@ -0,0 +1,228 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/closed/wall/mineral/titanium,
+/area/virtual_domain/safehouse)
+"e" = (
+/obj/effect/spawner/structure/window/reinforced/shuttle,
+/turf/open/floor/plating,
+/area/virtual_domain/safehouse)
+"f" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"g" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/landmark/bitrunning/cache_goal_turf,
+/obj/effect/turf_decal/loading_area,
+/turf/open/floor/bitrunning_transport,
+/area/virtual_domain/safehouse)
+"i" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"k" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/obj/structure/table/reinforced,
+/obj/effect/decal/cleanable/dirt,
+/obj/item/storage/toolbox/emergency,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"l" = (
+/obj/machinery/light/small/directional/south,
+/obj/effect/landmark/bitrunning/cache_goal_turf,
+/obj/effect/turf_decal/loading_area,
+/turf/open/floor/bitrunning_transport,
+/area/virtual_domain/safehouse)
+"q" = (
+/obj/effect/turf_decal/stripes/end,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"r" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"t" = (
+/obj/machinery/power/shuttle_engine/propulsion/burst{
+ dir = 8
+ },
+/obj/structure/window/reinforced/spawner/directional/east,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plating/airless,
+/area/virtual_domain/safehouse)
+"u" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"x" = (
+/obj/effect/turf_decal/tile/neutral/half/contrasted,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/light/small/directional/north,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"y" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/door/airlock/shuttle/glass,
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/sand/volcanic,
+/obj/structure/fans/tiny,
+/turf/open/floor/iron/white,
+/area/virtual_domain/safehouse)
+"A" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/computer{
+ dir = 8;
+ name = "shuttle console";
+ icon_screen = "shuttle"
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"E" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/effect/decal/cleanable/generic,
+/obj/effect/landmark/bitrunning/hololadder_spawn,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"G" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/machinery/light/small/directional/south,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/landmark/bitrunning/hololadder_spawn,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"H" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"I" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/structure/table/reinforced,
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/clothing/mask/gas,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"L" = (
+/obj/effect/turf_decal/stripes/end{
+ dir = 1
+ },
+/obj/effect/turf_decal/sand/volcanic,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"M" = (
+/obj/effect/turf_decal/tile/neutral/half/contrasted,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/light/small/directional/north,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"T" = (
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/landmark/bitrunning/hololadder_spawn,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"X" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+
+(1,1,1) = {"
+a
+t
+e
+e
+t
+a
+"}
+(2,1,1) = {"
+e
+L
+i
+q
+l
+a
+"}
+(3,1,1) = {"
+a
+x
+r
+u
+g
+e
+"}
+(4,1,1) = {"
+y
+f
+r
+H
+E
+a
+"}
+(5,1,1) = {"
+a
+M
+X
+H
+T
+e
+"}
+(6,1,1) = {"
+e
+k
+A
+I
+G
+a
+"}
+(7,1,1) = {"
+a
+a
+e
+e
+a
+a
+"}
diff --git a/_maps/safehouses/shuttle_space.dmm b/_maps/safehouses/shuttle_space.dmm
new file mode 100644
index 00000000000..a5afaa475c6
--- /dev/null
+++ b/_maps/safehouses/shuttle_space.dmm
@@ -0,0 +1,231 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/obj/effect/spawner/structure/window/reinforced/shuttle,
+/turf/open/floor/plating,
+/area/virtual_domain/safehouse)
+"b" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"c" = (
+/obj/effect/turf_decal/tile/neutral/half/contrasted,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/light/small/directional/north,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"i" = (
+/turf/closed/wall/mineral/titanium/overspace,
+/area/virtual_domain/safehouse)
+"l" = (
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/landmark/bitrunning/hololadder_spawn,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"n" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/computer{
+ dir = 8;
+ name = "shuttle console";
+ icon_screen = "shuttle"
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"o" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"q" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/obj/structure/table/reinforced,
+/obj/effect/decal/cleanable/dirt,
+/obj/item/storage/toolbox/emergency,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"r" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/landmark/bitrunning/cache_goal_turf,
+/obj/effect/turf_decal/loading_area,
+/turf/open/floor/bitrunning_transport,
+/area/virtual_domain/safehouse)
+"z" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"A" = (
+/obj/effect/turf_decal/stripes/end{
+ dir = 1
+ },
+/obj/effect/turf_decal/sand/volcanic,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"B" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/machinery/light/small/directional/south,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/landmark/bitrunning/hololadder_spawn,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"D" = (
+/obj/machinery/light/small/directional/south,
+/obj/effect/landmark/bitrunning/cache_goal_turf,
+/obj/effect/turf_decal/loading_area,
+/turf/open/floor/bitrunning_transport,
+/area/virtual_domain/safehouse)
+"E" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/door/airlock/shuttle/glass,
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/sand/volcanic,
+/obj/structure/fans/tiny,
+/turf/open/floor/iron/white,
+/area/virtual_domain/safehouse)
+"G" = (
+/turf/closed/wall/mineral/titanium,
+/area/virtual_domain/safehouse)
+"H" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"I" = (
+/obj/effect/turf_decal/tile/neutral/half/contrasted,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/machinery/light/small/directional/north,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"L" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/structure/table/reinforced,
+/obj/item/tank/internals/emergency_oxygen{
+ pixel_x = 3
+ },
+/obj/item/clothing/mask/gas,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"N" = (
+/obj/machinery/power/shuttle_engine/propulsion/burst{
+ dir = 8
+ },
+/obj/structure/window/reinforced/spawner/directional/east,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plating/airless,
+/area/virtual_domain/safehouse)
+"O" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"U" = (
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"W" = (
+/obj/effect/turf_decal/stripes/end,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+"Y" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/effect/decal/cleanable/generic,
+/obj/effect/landmark/bitrunning/hololadder_spawn,
+/turf/open/floor/iron,
+/area/virtual_domain/safehouse)
+
+(1,1,1) = {"
+i
+N
+a
+a
+N
+i
+"}
+(2,1,1) = {"
+a
+A
+o
+W
+D
+G
+"}
+(3,1,1) = {"
+G
+I
+H
+U
+r
+a
+"}
+(4,1,1) = {"
+E
+z
+H
+b
+Y
+G
+"}
+(5,1,1) = {"
+G
+c
+O
+b
+l
+a
+"}
+(6,1,1) = {"
+a
+q
+n
+L
+B
+G
+"}
+(7,1,1) = {"
+i
+G
+a
+a
+G
+i
+"}
diff --git a/_maps/safehouses/test_only_safehouse.dmm b/_maps/safehouses/test_only_safehouse.dmm
new file mode 100644
index 00000000000..c23f8c4a22b
--- /dev/null
+++ b/_maps/safehouses/test_only_safehouse.dmm
@@ -0,0 +1,29 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/obj/effect/landmark/bitrunning/cache_goal_turf,
+/turf/open/floor/plating,
+/area/virtual_domain/safehouse)
+"d" = (
+/obj/effect/landmark/bitrunning/hololadder_spawn,
+/turf/open/floor/plating,
+/area/virtual_domain/safehouse)
+"u" = (
+/turf/open/floor/plating,
+/area/virtual_domain/safehouse)
+
+(1,1,1) = {"
+u
+d
+"}
+(2,1,1) = {"
+u
+d
+"}
+(3,1,1) = {"
+u
+d
+"}
+(4,1,1) = {"
+u
+a
+"}
diff --git a/_maps/safehouses/wood.dmm b/_maps/safehouses/wood.dmm
new file mode 100644
index 00000000000..0bb6b273fce
--- /dev/null
+++ b/_maps/safehouses/wood.dmm
@@ -0,0 +1,120 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/open/indestructible/hotelwood,
+/area/virtual_domain/safehouse)
+"i" = (
+/obj/effect/spawner/structure/window,
+/turf/open/floor/plating,
+/area/virtual_domain/safehouse)
+"o" = (
+/turf/open/floor/carpet/green,
+/area/virtual_domain/safehouse)
+"p" = (
+/obj/item/kirbyplants/random/fullysynthetic,
+/turf/open/indestructible/hotelwood,
+/area/virtual_domain/safehouse)
+"s" = (
+/obj/machinery/light/small/directional/east,
+/obj/effect/landmark/bitrunning/cache_goal_turf,
+/obj/effect/turf_decal/loading_area{
+ dir = 4
+ },
+/turf/open/floor/bitrunning_transport,
+/area/virtual_domain/safehouse)
+"v" = (
+/obj/machinery/light/small/directional/east,
+/obj/structure/table/wood,
+/obj/item/newspaper,
+/turf/open/indestructible/hotelwood,
+/area/virtual_domain/safehouse)
+"x" = (
+/obj/structure/railing/corner/end{
+ dir = 4
+ },
+/turf/open/floor/carpet/green,
+/area/virtual_domain/safehouse)
+"z" = (
+/obj/structure/sign/poster/random/directional/east,
+/turf/open/indestructible/hotelwood,
+/area/virtual_domain/safehouse)
+"G" = (
+/turf/closed/wall/mineral/wood,
+/area/virtual_domain/safehouse)
+"J" = (
+/obj/structure/railing,
+/obj/effect/landmark/bitrunning/cache_goal_turf,
+/obj/effect/turf_decal/loading_area{
+ dir = 4
+ },
+/turf/open/floor/bitrunning_transport,
+/area/virtual_domain/safehouse)
+"T" = (
+/obj/effect/landmark/bitrunning/hololadder_spawn,
+/turf/open/indestructible/hotelwood,
+/area/virtual_domain/safehouse)
+"X" = (
+/obj/machinery/door/airlock/wood/glass,
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/virtual_domain/safehouse)
+"Z" = (
+/obj/machinery/light/small/directional/west,
+/turf/open/indestructible/hotelwood,
+/area/virtual_domain/safehouse)
+
+(1,1,1) = {"
+G
+G
+i
+G
+G
+G
+"}
+(2,1,1) = {"
+i
+Z
+a
+a
+Z
+i
+"}
+(3,1,1) = {"
+G
+p
+o
+o
+T
+G
+"}
+(4,1,1) = {"
+X
+a
+o
+o
+T
+G
+"}
+(5,1,1) = {"
+G
+a
+x
+o
+T
+G
+"}
+(6,1,1) = {"
+i
+s
+J
+z
+v
+i
+"}
+(7,1,1) = {"
+G
+G
+i
+G
+G
+G
+"}
diff --git a/_maps/shuttles/emergency_humpback.dmm b/_maps/shuttles/emergency_humpback.dmm
new file mode 100644
index 00000000000..f4c50bf6b84
--- /dev/null
+++ b/_maps/shuttles/emergency_humpback.dmm
@@ -0,0 +1,1308 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"ao" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"at" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"bL" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"bS" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/structure/chair/comfy/shuttle,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"bT" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"cK" = (
+/turf/open/floor/iron/smooth_half/airless,
+/area/shuttle/escape)
+"df" = (
+/obj/machinery/door/airlock/external,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/effect/turf_decal/siding/blue,
+/obj/effect/mapping_helpers/airlock/access/all/command/general,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
+ cycle_id = "evac3"
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"dl" = (
+/obj/structure/chair/sofa/right{
+ dir = 4
+ },
+/turf/open/floor/iron/smooth,
+/area/shuttle/escape)
+"dF" = (
+/obj/machinery/power/shuttle_engine/propulsion{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/escape/brig)
+"dP" = (
+/obj/structure/table/reinforced/plastitaniumglass,
+/obj/effect/spawner/random/food_or_drink/booze,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"ed" = (
+/obj/structure/table,
+/obj/item/storage/medkit/regular,
+/obj/item/storage/medkit/toxin{
+ pixel_x = 4;
+ pixel_y = 4
+ },
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"ez" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Cyborg Bay"
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"eK" = (
+/obj/structure/window/reinforced/spawner/directional/south,
+/obj/machinery/power/shuttle_engine/heater{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"eU" = (
+/obj/machinery/door/airlock/external/glass,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
+ cycle_id = "evac3"
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"eW" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/machinery/status_display/evac/directional/east,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"fu" = (
+/obj/machinery/computer/emergency_shuttle{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"gL" = (
+/obj/machinery/door/airlock/security/glass{
+ name = "Escape Shuttle Brig"
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/effect/mapping_helpers/airlock/access/all/security/general,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"gW" = (
+/obj/structure/window/reinforced/plasma/spawner/directional/east,
+/obj/machinery/vending/boozeomat/all_access,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"hd" = (
+/obj/machinery/atmospherics/components/binary/pump/on/supply{
+ dir = 4
+ },
+/obj/structure/extinguisher_cabinet/directional/south,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"he" = (
+/obj/machinery/vending/wallmed/directional/east,
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"hk" = (
+/obj/machinery/light/directional/north,
+/obj/structure/table,
+/obj/machinery/recharger,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"hp" = (
+/obj/structure/lattice/catwalk,
+/turf/template_noop,
+/area/shuttle/escape)
+"hs" = (
+/obj/effect/turf_decal/siding/wood,
+/turf/open/floor/iron/showroomfloor,
+/area/shuttle/escape)
+"hA" = (
+/turf/open/floor/iron/smooth_half/airless{
+ dir = 1
+ },
+/area/shuttle/escape)
+"ig" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"iW" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/structure/chair/comfy/shuttle,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"ji" = (
+/obj/machinery/door/airlock/external,
+/obj/effect/turf_decal/siding/blue,
+/obj/effect/mapping_helpers/airlock/access/all/command/general,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
+ cycle_id = "evac3"
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"jJ" = (
+/obj/machinery/computer/arcade/orion_trail{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"kB" = (
+/obj/machinery/door/airlock/external,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
+ cycle_id = "evac3"
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"kZ" = (
+/obj/structure/table,
+/obj/item/storage/medkit/fire,
+/obj/item/storage/medkit/brute{
+ pixel_x = 4;
+ pixel_y = 4
+ },
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"my" = (
+/obj/machinery/computer/security{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"mF" = (
+/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"mI" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/railing{
+ dir = 8
+ },
+/obj/structure/chair/plastic{
+ dir = 8
+ },
+/turf/template_noop,
+/area/shuttle/escape)
+"mO" = (
+/obj/structure/lattice/catwalk,
+/obj/machinery/light/small/dim/directional/east,
+/turf/template_noop,
+/area/shuttle/escape)
+"nm" = (
+/obj/structure/chair/stool/directional/south,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"ns" = (
+/obj/structure/table/reinforced/plastitaniumglass,
+/obj/machinery/cell_charger,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"nG" = (
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"nQ" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/shuttle/escape/brig)
+"oj" = (
+/obj/structure/table/reinforced/plastitaniumglass,
+/obj/item/storage/fancy/donut_box,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"oO" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/turf/open/floor/iron/smooth,
+/area/shuttle/escape)
+"oP" = (
+/obj/structure/window/reinforced/plasma/spawner/directional/west,
+/obj/structure/table/reinforced/plastitaniumglass,
+/obj/machinery/chem_dispenser/drinks{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"po" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/turf/open/floor/iron/smooth_corner/airless,
+/area/shuttle/escape)
+"pE" = (
+/obj/machinery/door/window/brigdoor/left/directional/east,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"qp" = (
+/obj/machinery/recharge_station,
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"qP" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/machinery/light/small/dim/directional/west,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"rr" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/machinery/status_display/evac/directional/west,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"rt" = (
+/obj/machinery/power/shuttle_engine/propulsion{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"rw" = (
+/obj/machinery/computer/crew{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"ry" = (
+/obj/structure/table,
+/obj/item/trash/chips,
+/turf/open/floor/iron/smooth,
+/area/shuttle/escape)
+"rA" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/machinery/vending/wallmed/directional/west,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"rL" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/marker_beacon/jade,
+/turf/template_noop,
+/area/shuttle/escape)
+"sQ" = (
+/obj/structure/window/reinforced/plasma/spawner/directional/south,
+/obj/structure/window/reinforced/plasma/spawner/directional/east,
+/obj/structure/window/reinforced/plasma/spawner/directional/west,
+/obj/structure/window/reinforced/plasma/spawner/directional/north,
+/obj/structure/bonfire/prelit,
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/turf/open/floor/iron/smooth_corner/airless{
+ dir = 1
+ },
+/area/shuttle/escape)
+"tY" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/machinery/button/flasher{
+ pixel_y = 26;
+ pixel_x = 26;
+ id = "evacflash"
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"uw" = (
+/obj/machinery/computer/atmos_control/air_tank{
+ atmos_chambers = list("evacair" = "Mixed Air Supply")
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"uW" = (
+/obj/machinery/recharge_station,
+/obj/structure/extinguisher_cabinet/directional/south,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"vk" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/turf/open/floor/iron/smooth_half/airless,
+/area/shuttle/escape)
+"vn" = (
+/obj/structure/window/reinforced/spawner/directional/south,
+/obj/machinery/power/shuttle_engine/heater{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/escape/brig)
+"vw" = (
+/turf/template_noop,
+/area/template_noop)
+"vF" = (
+/obj/structure/chair/stool/bar/directional/south{
+ can_buckle = 1
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"vO" = (
+/obj/structure/closet,
+/obj/item/multitool,
+/obj/effect/spawner/random/engineering/toolbox,
+/obj/machinery/light/small/directional/north,
+/obj/effect/spawner/random/contraband/narcotics,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"vR" = (
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"wf" = (
+/obj/machinery/door/airlock/mining/glass{
+ name = "Emergency Shuttle Cargo Hold"
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"xb" = (
+/obj/structure/sign/departments/medbay/alt,
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/shuttle/escape/brig)
+"xy" = (
+/obj/machinery/suit_storage_unit/standard_unit,
+/obj/machinery/light/small/dim/directional/east,
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"yc" = (
+/obj/structure/statue/gold/hos,
+/obj/machinery/light/floor,
+/turf/open/floor/mineral/diamond,
+/area/shuttle/escape)
+"yh" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/railing{
+ dir = 8
+ },
+/obj/structure/table,
+/obj/item/binoculars,
+/turf/template_noop,
+/area/shuttle/escape)
+"yH" = (
+/obj/structure/chair/sofa/middle{
+ dir = 4
+ },
+/obj/machinery/light/directional/west,
+/turf/open/floor/iron/smooth,
+/area/shuttle/escape)
+"yN" = (
+/obj/machinery/door/airlock/grunge{
+ name = "Emergency Shuttle Airlock"
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"zn" = (
+/obj/structure/table,
+/obj/item/surgery_tray/full,
+/turf/open/floor/iron/showroomfloor,
+/area/shuttle/escape)
+"zr" = (
+/obj/structure/railing{
+ dir = 4
+ },
+/turf/open/floor/iron/smooth_half/airless{
+ dir = 1
+ },
+/area/shuttle/escape)
+"zG" = (
+/obj/machinery/chem_master,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"zH" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"zZ" = (
+/obj/structure/table/reinforced/plastitaniumglass,
+/obj/machinery/recharger,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"Af" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/machinery/light/dim/directional/west,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"Ax" = (
+/obj/structure/railing/corner,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/turf/open/floor/iron/smooth_half/airless{
+ dir = 4
+ },
+/area/shuttle/escape)
+"AA" = (
+/obj/machinery/suit_storage_unit/standard_unit,
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"Bu" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/structure/extinguisher_cabinet/directional/east,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"Ch" = (
+/obj/structure/chair/sofa/left{
+ dir = 4
+ },
+/turf/open/floor/iron/smooth,
+/area/shuttle/escape)
+"Cl" = (
+/obj/machinery/door/airlock/medical/glass{
+ name = "Medbay"
+ },
+/obj/effect/turf_decal/siding/wood,
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"CA" = (
+/obj/effect/spawner/random/structure/crate_loot,
+/obj/effect/spawner/random/maintenance/seven,
+/obj/item/reagent_containers/pill/maintenance,
+/obj/item/reagent_containers/pill/maintenance,
+/obj/item/reagent_containers/pill/maintenance,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"CH" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"CW" = (
+/obj/structure/railing{
+ dir = 4
+ },
+/obj/structure/table,
+/obj/item/binoculars,
+/turf/open/floor/iron/smooth_corner/airless{
+ dir = 1
+ },
+/area/shuttle/escape)
+"Df" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"Dj" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/monitored/air_output{
+ dir = 1;
+ chamber_id = "evacair"
+ },
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/engine/air,
+/area/shuttle/escape/brig)
+"Ef" = (
+/obj/machinery/smartfridge/chemistry/preloaded,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"EJ" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/structure/extinguisher_cabinet/directional/west,
+/turf/open/floor/iron/showroomfloor,
+/area/shuttle/escape)
+"EO" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"Fw" = (
+/obj/machinery/door/airlock/external/glass,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
+ cycle_id = "evac3"
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"FG" = (
+/obj/machinery/door/airlock/security/glass{
+ name = "Escape Shuttle Brig"
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/effect/mapping_helpers/airlock/access/all/security/general,
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"FZ" = (
+/obj/structure/railing/corner,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/turf/open/floor/iron/smooth_half/airless{
+ dir = 1
+ },
+/area/shuttle/escape)
+"GR" = (
+/turf/open/floor/iron/smooth,
+/area/shuttle/escape)
+"IB" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/turf/open/floor/mineral/diamond,
+/area/shuttle/escape)
+"JB" = (
+/obj/machinery/suit_storage_unit/standard_unit,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"JW" = (
+/obj/machinery/light/directional/north,
+/obj/machinery/computer/operating,
+/turf/open/floor/iron/showroomfloor,
+/area/shuttle/escape)
+"Kf" = (
+/obj/structure/table/reinforced/plastitaniumglass,
+/obj/item/storage/box/drinkingglasses,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"Ko" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/machinery/airalarm/directional/east,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"Kv" = (
+/obj/structure/tank_dispenser/oxygen,
+/obj/machinery/light/small/directional/west,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"KP" = (
+/obj/structure/window/reinforced/plasma/spawner/directional/west,
+/obj/structure/table/reinforced/plastitaniumglass,
+/obj/machinery/reagentgrinder,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"KX" = (
+/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium,
+/turf/open/floor/plating,
+/area/shuttle/escape/brig)
+"Lk" = (
+/obj/structure/statue/diamond/ai2,
+/obj/machinery/light/floor,
+/turf/open/floor/mineral/diamond,
+/area/shuttle/escape)
+"Lp" = (
+/obj/structure/closet/crate/secure/loot,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"LB" = (
+/obj/machinery/door/airlock/command{
+ name = "Cockpit"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/command/general,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/effect/turf_decal/siding/dark{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"LC" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"LN" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"LY" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/machinery/flasher/directional/east{
+ id = "evacflash"
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"MP" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/machinery/status_display/evac/directional/west,
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"MU" = (
+/obj/machinery/door/airlock/external,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
+ cycle_id = "evac3"
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"MY" = (
+/obj/structure/railing/corner/end/flip,
+/obj/structure/railing/corner/end{
+ dir = 1
+ },
+/turf/open/floor/iron/smooth_half/airless{
+ dir = 1
+ },
+/area/shuttle/escape)
+"NR" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"Oj" = (
+/turf/closed/wall/mineral/plastitanium,
+/area/shuttle/escape)
+"Oo" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"Oq" = (
+/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible,
+/turf/open/floor/plating,
+/area/shuttle/escape/brig)
+"Ot" = (
+/obj/machinery/door/airlock/external,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
+ cycle_id = "evac3"
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"OO" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"Pt" = (
+/obj/machinery/stasis,
+/turf/open/floor/iron/showroomfloor,
+/area/shuttle/escape)
+"PS" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/turf/open/floor/wood/large,
+/area/shuttle/escape)
+"PX" = (
+/obj/structure/chair/comfy/shuttle,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"Qe" = (
+/obj/machinery/light/directional/north,
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"Sl" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/shuttle/escape)
+"Sx" = (
+/obj/structure/table/optable,
+/turf/open/floor/iron/showroomfloor,
+/area/shuttle/escape)
+"SC" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/structure/extinguisher_cabinet/directional/west,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"SJ" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/machinery/light/directional/west,
+/obj/machinery/vending/cigarette,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"Ta" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
+ },
+/turf/open/floor/mineral/diamond,
+/area/shuttle/escape)
+"Te" = (
+/turf/closed/wall/mineral/plastitanium,
+/area/shuttle/escape/brig)
+"Ty" = (
+/obj/machinery/door/airlock/grunge{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/docking_port/mobile/emergency,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"UR" = (
+/obj/machinery/status_display/evac/directional/north,
+/turf/open/floor/iron/smooth,
+/area/shuttle/escape)
+"VH" = (
+/obj/structure/railing,
+/turf/open/floor/iron/smooth_corner/airless{
+ dir = 1
+ },
+/area/shuttle/escape)
+"VL" = (
+/obj/machinery/door/airlock/external,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{
+ cycle_id = "evac3"
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"WG" = (
+/obj/structure/chair/comfy/shuttle,
+/obj/item/restraints/handcuffs,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape/brig)
+"Xh" = (
+/obj/structure/window/reinforced/plasma/spawner/directional/west,
+/obj/structure/table/reinforced/plastitaniumglass,
+/obj/machinery/chem_dispenser/drinks/beer{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"Xi" = (
+/obj/structure/window/reinforced/plasma/spawner/directional/east,
+/obj/machinery/light/directional/south,
+/obj/structure/closet/cabinet,
+/obj/item/reagent_containers/cup/glass/shaker,
+/obj/item/storage/fancy/cigarettes/cigars/havana,
+/obj/item/instrument/guitar,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/escape)
+"Xv" = (
+/obj/machinery/door/airlock/external/glass,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"XQ" = (
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"Ys" = (
+/obj/machinery/computer/communications{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"YF" = (
+/obj/machinery/air_sensor/air_tank{
+ chamber_id = "evacair"
+ },
+/turf/open/floor/engine/air,
+/area/shuttle/escape/brig)
+"Zs" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/structure/extinguisher_cabinet/directional/east,
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"ZG" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+"ZR" = (
+/obj/machinery/light/directional/west,
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/shuttle/escape)
+
+(1,1,1) = {"
+vw
+Te
+Te
+Te
+Te
+KX
+nQ
+yN
+Sl
+Ty
+Sl
+mI
+yh
+Sl
+Oj
+yN
+Sl
+yN
+Sl
+Sl
+Oj
+vw
+vw
+vw
+vw
+vw
+"}
+(2,1,1) = {"
+dF
+vn
+WG
+NR
+KX
+YF
+KX
+XQ
+Oj
+XQ
+mF
+hp
+hp
+mF
+SJ
+LN
+ez
+LN
+at
+qp
+Sl
+vw
+vw
+vw
+vw
+vw
+"}
+(3,1,1) = {"
+dF
+vn
+WG
+ao
+Oq
+Dj
+KX
+XQ
+ZR
+XQ
+mF
+hp
+mO
+mF
+iW
+XQ
+Sl
+ns
+XQ
+uW
+Sl
+vw
+vw
+vw
+vw
+vw
+"}
+(4,1,1) = {"
+Te
+nQ
+hk
+hd
+Te
+Te
+nQ
+ZG
+ZG
+ZG
+Sl
+Xv
+Oj
+Sl
+bS
+ZG
+Sl
+Xh
+oP
+KP
+Sl
+Sl
+mF
+mF
+mF
+vw
+"}
+(5,1,1) = {"
+dF
+vn
+uw
+ao
+gL
+bL
+FG
+EO
+vR
+vR
+rr
+vR
+Af
+rA
+EO
+vF
+dP
+vR
+vR
+Kf
+mF
+oj
+my
+zZ
+mF
+mF
+"}
+(6,1,1) = {"
+dF
+vn
+nQ
+Te
+Te
+Te
+xb
+EO
+EO
+EO
+EO
+EO
+EO
+vR
+EO
+vF
+dP
+zH
+EO
+zG
+mF
+XQ
+ig
+XQ
+rw
+mF
+"}
+(7,1,1) = {"
+rt
+eK
+Pt
+EJ
+MP
+OO
+Cl
+EO
+CH
+vR
+vR
+vR
+EO
+EO
+EO
+Df
+Sl
+gW
+pE
+Xi
+Sl
+Qe
+LN
+PX
+fu
+mF
+"}
+(8,1,1) = {"
+rt
+eK
+Pt
+hs
+OO
+nG
+mF
+vR
+vR
+Oo
+Bu
+Oo
+EO
+Oo
+Ko
+EO
+EO
+eW
+EO
+LY
+LB
+tY
+Zs
+XQ
+Ys
+mF
+"}
+(9,1,1) = {"
+Oj
+Sl
+JW
+hs
+PS
+nG
+Ef
+bT
+LC
+Sl
+Sl
+Sl
+wf
+Sl
+Sl
+Oj
+Oj
+Oj
+Oj
+Oj
+Sl
+mF
+Sl
+mF
+mF
+mF
+"}
+(10,1,1) = {"
+rt
+eK
+Sx
+hs
+nG
+ed
+Sl
+nm
+jJ
+Sl
+CA
+SC
+EO
+Sl
+ry
+Ch
+yH
+dl
+GR
+cK
+VL
+XQ
+ji
+Ta
+Lk
+mF
+"}
+(11,1,1) = {"
+rt
+eK
+zn
+hs
+he
+kZ
+Oj
+Sl
+Sl
+Oj
+vO
+EO
+Lp
+Oj
+UR
+GR
+oO
+oO
+oO
+vk
+MU
+LN
+df
+IB
+yc
+mF
+"}
+(12,1,1) = {"
+vw
+Oj
+Oj
+Oj
+Oj
+Oj
+Oj
+JB
+Kv
+Oj
+Oj
+wf
+Oj
+Sl
+GR
+po
+FZ
+zr
+MY
+CW
+Sl
+mF
+Sl
+mF
+mF
+mF
+"}
+(13,1,1) = {"
+vw
+vw
+vw
+vw
+rt
+eK
+AA
+zH
+EO
+Fw
+qP
+EO
+qP
+Ot
+oO
+Ax
+sQ
+vw
+rL
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+"}
+(14,1,1) = {"
+vw
+vw
+vw
+vw
+rt
+eK
+xy
+vR
+vR
+eU
+vR
+CH
+vR
+kB
+hA
+VH
+vw
+vw
+hp
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+"}
+(15,1,1) = {"
+vw
+vw
+vw
+vw
+vw
+Oj
+Sl
+kB
+kB
+Sl
+mF
+mF
+mF
+Sl
+Oj
+mF
+vw
+vw
+rL
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+"}
+(16,1,1) = {"
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+hp
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+"}
+(17,1,1) = {"
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+rL
+vw
+vw
+vw
+vw
+vw
+vw
+vw
+"}
diff --git a/_maps/shuttles/pirate_ex_interdyne.dmm b/_maps/shuttles/pirate_ex_interdyne.dmm
new file mode 100644
index 00000000000..5d2149c049f
--- /dev/null
+++ b/_maps/shuttles/pirate_ex_interdyne.dmm
@@ -0,0 +1,1155 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aa" = (
+/obj/machinery/door/poddoor/shutters/preopen{
+ dir = 8;
+ id = "interdynebridge"
+ },
+/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium,
+/turf/open/floor/plating,
+/area/shuttle/pirate)
+"ab" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/machinery/turretid{
+ icon_state = "control_kill";
+ lethal = 1;
+ locked = 0;
+ pixel_y = -24;
+ req_access = null
+ },
+/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{
+ dir = 8
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"ad" = (
+/obj/machinery/button/door/directional/south{
+ id = "interdynebridge";
+ name = "Bridge Bolt Control";
+ specialfunctions = 4
+ },
+/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted,
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"ae" = (
+/obj/machinery/shuttle_scrambler,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"af" = (
+/turf/template_noop,
+/area/template_noop)
+"ag" = (
+/obj/machinery/door/airlock/hatch{
+ id_tag = "piratebridgebolt";
+ name = "Bridge";
+ req_access = null
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/effect/mapping_helpers/airlock/cutaiwire,
+/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/effect/turf_decal/tile/dark_blue/fourcorners,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"ah" = (
+/obj/machinery/computer/shuttle/pirate,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"aj" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/shuttle/pirate)
+"ak" = (
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
+ dir = 8
+ },
+/obj/structure/table/reinforced/plastitaniumglass,
+/obj/machinery/reagentgrinder/constructed,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"al" = (
+/obj/machinery/loot_locator{
+ dir = 8
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"an" = (
+/obj/effect/turf_decal/tile/dark_blue{
+ dir = 8
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"ao" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/obj/machinery/light/floor,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"ap" = (
+/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{
+ dir = 1
+ },
+/obj/machinery/chem_master,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"ar" = (
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted,
+/obj/item/stack/sheet/mineral/plasma/five,
+/obj/item/stack/sheet/mineral/plasma/five,
+/obj/structure/table/reinforced/plastitaniumglass,
+/obj/item/storage/box/beakers/variety,
+/obj/item/storage/box/beakers/variety,
+/obj/item/storage/box/beakers/variety,
+/obj/item/stack/sheet/iron/fifty,
+/obj/item/stack/cable_coil,
+/obj/item/stack/cable_coil,
+/obj/item/screwdriver/nuke,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"av" = (
+/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{
+ dir = 4
+ },
+/obj/machinery/door/window/brigdoor/right/directional/west{
+ req_access = list("syndicate")
+ },
+/obj/structure/bed,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"aw" = (
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
+ dir = 8
+ },
+/obj/machinery/chem_heater,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"ax" = (
+/obj/structure/chair/office{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"ay" = (
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
+ dir = 4
+ },
+/obj/structure/extinguisher_cabinet/directional/east,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"az" = (
+/obj/effect/turf_decal/tile/dark_blue,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"aC" = (
+/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted,
+/obj/structure/extinguisher_cabinet/directional/north,
+/obj/effect/mob_spawn/ghost_role/human/pirate/interdyne/junior{
+ dir = 8
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"aD" = (
+/obj/machinery/power/apc/auto_name/directional/north{
+ cell_type = /obj/item/stock_parts/cell/bluespace;
+ start_charge = 100
+ },
+/obj/effect/mapping_helpers/apc/cut_AI_wire,
+/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/machinery/power/smes/engineering{
+ charge = 1e+600
+ },
+/obj/structure/cable,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"aF" = (
+/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/pirate{
+ dir = 4;
+ x_offset = -3;
+ y_offset = 7
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"aG" = (
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
+ dir = 8
+ },
+/obj/machinery/piratepad,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/machinery/power/terminal{
+ dir = 1
+ },
+/obj/structure/cable,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"aH" = (
+/obj/machinery/computer/crew/syndie{
+ dir = 8
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"aI" = (
+/obj/effect/turf_decal/tile/dark_blue/opposingcorners,
+/obj/machinery/portable_atmospherics/canister/healium,
+/obj/machinery/atmospherics/components/unary/portables_connector/visible,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"aJ" = (
+/obj/effect/turf_decal/tile/dark_blue/opposingcorners,
+/obj/machinery/computer/operating,
+/obj/machinery/defibrillator_mount/charging{
+ pixel_y = 28
+ },
+/obj/item/disk/surgery/brainwashing{
+ name = "Interdyne Brainwashing Protocol Surgery Disk";
+ pixel_x = -8
+ },
+/obj/item/disk/surgery/sleeper_protocol{
+ name = "Interdyne Sleeper Protocol Surgery Disk";
+ pixel_x = 1
+ },
+/obj/item/disk/surgery/forgottenship{
+ name = "Interdyne Advanced Surgery Procedures Disk";
+ pixel_x = 9
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"aK" = (
+/obj/machinery/door/airlock/external/glass/ruin{
+ cyclelinkeddir = 666666;
+ id_tag = "pirateportexternal";
+ req_access = null
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/obj/docking_port/mobile/pirate{
+ launch_status = 0;
+ movement_force = list("KNOCKDOWN"=0,"THROW"=0);
+ name = "Pirate Ship";
+ port_direction = 2
+ },
+/obj/docking_port/stationary{
+ dwidth = 11;
+ height = 100;
+ name = "Deep Space";
+ shuttle_id = "pirate_home";
+ width = 100
+ },
+/obj/effect/mapping_helpers/airlock/cutaiwire,
+/obj/effect/turf_decal/tile/dark_blue/fourcorners,
+/obj/structure/fans/tiny,
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"aL" = (
+/obj/machinery/door/airlock/external/glass/ruin{
+ cyclelinkeddir = 666666;
+ id_tag = "pirateportexternal";
+ req_access = null
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/effect/turf_decal/tile/dark_blue/fourcorners,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/structure/fans/tiny,
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"aM" = (
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
+ dir = 1
+ },
+/obj/structure/table/reinforced/plastitaniumglass,
+/obj/item/reagent_containers/cup/beaker/noreact,
+/obj/item/reagent_containers/cup/beaker/noreact,
+/obj/item/storage/box/syringes,
+/obj/machinery/light/no_nightlight/directional/north,
+/obj/item/storage/box/syringes,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"aO" = (
+/obj/machinery/porta_turret/syndicate/energy/heavy{
+ faction = list("pirate","Syndicate")
+ },
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/shuttle/pirate)
+"aQ" = (
+/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{
+ dir = 4
+ },
+/obj/machinery/chem_dispenser/fullupgrade,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"aR" = (
+/obj/effect/turf_decal/tile/dark_blue/opposingcorners,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"aS" = (
+/obj/effect/turf_decal/tile/dark_blue/opposingcorners,
+/obj/structure/closet/crate/freezer/blood,
+/obj/machinery/light/small/blacklight/directional/south,
+/obj/machinery/iv_drip,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"aW" = (
+/obj/effect/turf_decal/tile/dark_blue/opposingcorners,
+/obj/machinery/cryo_cell,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"be" = (
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
+ dir = 4
+ },
+/obj/machinery/computer/pandemic,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"bf" = (
+/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{
+ dir = 8
+ },
+/obj/structure/table/reinforced/plastitaniumglass,
+/obj/item/storage/box/syndie_kit/chemical,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"bk" = (
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
+ dir = 4
+ },
+/obj/machinery/suit_storage_unit/interdyne,
+/obj/item/screwdriver/nuke,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"bl" = (
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted,
+/obj/structure/table/reinforced/plastitaniumglass,
+/obj/item/storage/box/syndie_kit/tuberculosisgrenade,
+/obj/machinery/light/small/blacklight/directional/south,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"bm" = (
+/obj/effect/turf_decal/tile/dark_blue/opposingcorners,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"bo" = (
+/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted,
+/obj/structure/table/reinforced/plastitaniumglass,
+/obj/item/gun/medbeam,
+/obj/item/gun/syringe/rapidsyringe,
+/obj/item/pen/sleepy{
+ name = "Interdyne Chem Pen"
+ },
+/obj/item/defibrillator/compact/combat/loaded,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"br" = (
+/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted,
+/obj/machinery/suit_storage_unit/interdyne,
+/obj/item/screwdriver/nuke,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"bu" = (
+/obj/structure/window/reinforced,
+/obj/item/storage/box/handcuffs,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"bv" = (
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
+ dir = 4
+ },
+/obj/structure/window/reinforced,
+/obj/structure/window/reinforced/unanchored/spawner/directional/north,
+/obj/structure/bed,
+/obj/machinery/door/window/brigdoor/right/directional/west{
+ req_access = list("syndicate")
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"bx" = (
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/dark_blue,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"bA" = (
+/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"bB" = (
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/dark_blue{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"bC" = (
+/obj/effect/turf_decal/tile/dark_blue{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"bF" = (
+/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{
+ dir = 8
+ },
+/obj/structure/table/reinforced/plastitaniumglass,
+/obj/item/reagent_containers/cup/beaker/meta,
+/obj/item/reagent_containers/cup/beaker/meta,
+/obj/item/reagent_containers/cup/beaker/meta,
+/obj/item/reagent_containers/cup/beaker/meta,
+/obj/item/reagent_containers/dropper,
+/obj/item/reagent_containers/dropper,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"bH" = (
+/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted,
+/obj/machinery/vending/drugs{
+ name = "\improper SyndicateDrug Plus"
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"bK" = (
+/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted,
+/obj/machinery/smartfridge/chemistry/virology/preloaded,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"bQ" = (
+/obj/machinery/airalarm/directional/north,
+/obj/effect/mapping_helpers/airalarm/all_access,
+/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{
+ dir = 4
+ },
+/obj/machinery/suit_storage_unit/interdyne,
+/obj/item/screwdriver/nuke,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"bX" = (
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"dV" = (
+/obj/machinery/door/airlock/hatch{
+ req_access = null
+ },
+/obj/effect/turf_decal/tile/dark_blue/opposingcorners,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"ek" = (
+/obj/machinery/door/airlock/hatch{
+ req_access = null
+ },
+/obj/effect/turf_decal/tile/dark_blue/opposingcorners,
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"ep" = (
+/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{
+ dir = 8
+ },
+/obj/machinery/computer/piratepad_control{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"ey" = (
+/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{
+ dir = 8
+ },
+/obj/effect/mob_spawn/ghost_role/human/pirate/interdyne/junior{
+ dir = 4
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"eE" = (
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
+ dir = 8
+ },
+/obj/machinery/door/window/brigdoor/right/directional/south{
+ req_access = list("syndicate")
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"fO" = (
+/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" = (
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"gY" = (
+/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{
+ dir = 1
+ },
+/obj/structure/window/reinforced,
+/obj/structure/bed{
+ dir = 1
+ },
+/obj/machinery/door/window/brigdoor/left/directional/east{
+ req_access = list("syndicate")
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"ic" = (
+/obj/machinery/power/shuttle_engine/heater{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/yellow/warning{
+ dir = 1
+ },
+/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium,
+/obj/machinery/power/shuttle_engine/heater,
+/turf/open/floor/plating/airless,
+/area/shuttle/pirate)
+"iD" = (
+/obj/machinery/light/small/directional/south,
+/obj/machinery/button/door/directional/south{
+ id = "pirateportexternal";
+ name = "External Bolt Control";
+ normaldoorcontrol = 1;
+ specialfunctions = 4
+ },
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted,
+/obj/effect/mob_spawn/ghost_role/human/pirate/interdyne/senior{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"jv" = (
+/obj/effect/turf_decal/tile/dark_blue/opposingcorners,
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"jY" = (
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"lW" = (
+/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"mD" = (
+/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted,
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/shuttle/pirate)
+"mU" = (
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"ne" = (
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "interdynebridge"
+ },
+/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium,
+/turf/open/floor/plating,
+/area/shuttle/pirate)
+"qy" = (
+/obj/machinery/power/shuttle_engine/propulsion{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/yellow/warning{
+ dir = 5
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/pirate)
+"sP" = (
+/obj/effect/turf_decal/tile/dark_blue/opposingcorners,
+/obj/structure/table/optable,
+/obj/item/defibrillator/loaded,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"ua" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"vz" = (
+/obj/machinery/door/poddoor/shutters/preopen{
+ dir = 1;
+ id = "interdynebridge"
+ },
+/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium,
+/turf/open/floor/plating,
+/area/shuttle/pirate)
+"vB" = (
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
+ dir = 4
+ },
+/obj/structure/table/reinforced/plastitaniumglass,
+/obj/item/scalpel/advanced,
+/obj/item/scalpel/advanced,
+/obj/item/scalpel/advanced,
+/obj/item/retractor/advanced,
+/obj/item/retractor/advanced,
+/obj/item/retractor/advanced,
+/obj/item/cautery/advanced,
+/obj/item/cautery/advanced,
+/obj/item/cautery/advanced,
+/obj/item/surgical_drapes,
+/obj/item/surgical_drapes,
+/obj/item/surgical_drapes,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"wf" = (
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted,
+/obj/structure/table/reinforced/plastitaniumglass,
+/obj/item/stack/sheet/mineral/plasma,
+/obj/item/stack/sheet/mineral/plasma,
+/obj/item/stack/sheet/mineral/plasma,
+/obj/machinery/reagentgrinder/constructed,
+/obj/item/storage/box/monkeycubes/syndicate,
+/obj/item/storage/box/monkeycubes/syndicate,
+/obj/item/reagent_containers/cup/bottle,
+/obj/item/reagent_containers/cup/bottle,
+/obj/item/reagent_containers/cup/bottle,
+/obj/item/reagent_containers/cup/beaker/meta,
+/obj/item/stack/sheet/mineral/plasma/thirty,
+/obj/item/stack/sheet/mineral/uranium/five,
+/obj/item/stack/sheet/mineral/uranium/five,
+/obj/item/stack/sheet/mineral/uranium/five,
+/obj/item/stack/sheet/mineral/silver,
+/obj/item/stack/sheet/mineral/silver,
+/obj/item/stack/sheet/mineral/silver,
+/obj/item/stack/sheet/mineral/silver,
+/obj/item/stack/sheet/mineral/silver,
+/obj/item/stack/sheet/mineral/silver,
+/obj/item/stack/sheet/mineral/silver,
+/obj/item/stack/sheet/mineral/silver,
+/obj/item/stack/sheet/mineral/silver,
+/obj/item/stack/sheet/mineral/silver,
+/obj/item/stack/sheet/mineral/silver,
+/obj/item/stack/sheet/mineral/silver,
+/obj/item/stack/sheet/mineral/silver,
+/obj/item/stack/sheet/mineral/silver,
+/obj/item/stack/sheet/mineral/silver,
+/obj/item/stack/sheet/mineral/silver,
+/obj/item/stack/sheet/mineral/gold,
+/obj/item/stack/sheet/mineral/gold,
+/obj/item/stack/sheet/mineral/gold,
+/obj/item/stack/sheet/mineral/gold,
+/obj/item/stack/sheet/mineral/gold,
+/obj/item/stack/sheet/mineral/gold,
+/obj/item/stack/sheet/mineral/gold,
+/obj/item/stack/sheet/mineral/gold,
+/obj/item/stack/sheet/mineral/gold,
+/obj/item/stack/sheet/mineral/gold,
+/obj/item/stack/sheet/mineral/gold,
+/obj/item/stack/sheet/mineral/gold,
+/obj/item/stack/sheet/mineral/gold,
+/obj/item/stack/sheet/mineral/gold,
+/obj/item/stack/sheet/mineral/gold,
+/obj/item/stack/sheet/mineral/gold,
+/obj/item/stack/sheet/mineral/gold,
+/obj/item/reagent_containers/condiment/milk,
+/obj/item/reagent_containers/condiment/milk,
+/obj/item/reagent_containers/condiment/milk,
+/obj/item/reagent_containers/condiment/milk,
+/obj/item/reagent_containers/condiment/milk,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"yi" = (
+/obj/machinery/door/airlock/hatch{
+ id_tag = "piratebridgebolt";
+ name = "Bridge";
+ req_access = null
+ },
+/obj/effect/turf_decal/tile/dark_blue/fourcorners,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"BT" = (
+/obj/machinery/power/shuttle_engine/propulsion{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/yellow/warning{
+ dir = 10
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/pirate)
+"Cb" = (
+/obj/machinery/power/shuttle_engine/propulsion,
+/obj/effect/turf_decal/trimline/yellow/warning{
+ dir = 10
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/pirate)
+"DD" = (
+/obj/machinery/door/poddoor/shutters/preopen{
+ dir = 4;
+ id = "interdynebridge"
+ },
+/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium,
+/turf/open/floor/plating,
+/area/shuttle/pirate)
+"En" = (
+/obj/effect/turf_decal/tile/dark_blue/opposingcorners,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible,
+/obj/machinery/light/small/blacklight/directional/south,
+/obj/item/reagent_containers/cup/beaker/meta/salbutamol{
+ list_reagents = list(/datum/reagent/medicine/c2/convermol=180)
+ },
+/obj/item/wrench/medical,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"ED" = (
+/obj/machinery/power/shuttle_engine/heater{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/yellow/warning{
+ dir = 1
+ },
+/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium,
+/turf/open/floor/plating/airless,
+/area/shuttle/pirate)
+"GS" = (
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted,
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"Hg" = (
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted,
+/obj/structure/closet/l3closet/virology,
+/obj/structure/extinguisher_cabinet/directional/south,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"Iv" = (
+/obj/machinery/power/shuttle_engine/propulsion{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/yellow/warning{
+ dir = 5
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/pirate)
+"JT" = (
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
+ dir = 8
+ },
+/obj/structure/table/reinforced/plastitaniumglass,
+/obj/item/reagent_containers/spray/chemsprayer/bioterror,
+/obj/item/reagent_containers/spray/chemsprayer/bioterror,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"Ks" = (
+/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium,
+/obj/machinery/door/poddoor/shutters/preopen{
+ dir = 8;
+ id = "interdynebridge"
+ },
+/turf/open/floor/plating,
+/area/shuttle/pirate)
+"Oe" = (
+/obj/effect/turf_decal/tile/dark_blue{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"OL" = (
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted,
+/obj/machinery/vending/medical/syndicate_access,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"Po" = (
+/obj/machinery/power/shuttle_engine/propulsion{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/yellow/warning{
+ dir = 10
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/pirate)
+"Rq" = (
+/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
+ dir = 1
+ },
+/obj/machinery/light/no_nightlight/directional/north,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"SD" = (
+/obj/machinery/door/airlock/hatch{
+ req_access = null
+ },
+/obj/effect/turf_decal/tile/dark_blue/fourcorners,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"Tr" = (
+/obj/machinery/porta_turret/syndicate/energy/heavy{
+ faction = list("pirate","Syndicate");
+ max_integrity = 10000
+ },
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/shuttle/pirate)
+"Ur" = (
+/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{
+ dir = 8
+ },
+/obj/machinery/atmospherics/components/tank/air,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"UM" = (
+/obj/machinery/power/shuttle_engine/propulsion,
+/obj/effect/turf_decal/trimline/yellow/warning{
+ dir = 5
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/pirate)
+"VF" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"Wp" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+"Xk" = (
+/obj/effect/turf_decal/tile/dark_blue/opposingcorners,
+/obj/machinery/light/small/directional/west,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/obj/structure/mirror/directional/east,
+/turf/open/floor/iron/dark,
+/area/shuttle/pirate)
+
+(1,1,1) = {"
+af
+af
+af
+af
+af
+aO
+aa
+aa
+Ks
+aa
+aO
+af
+af
+af
+af
+af
+"}
+(2,1,1) = {"
+af
+af
+af
+af
+af
+aj
+ap
+aw
+ak
+bF
+aj
+af
+af
+af
+af
+af
+"}
+(3,1,1) = {"
+af
+af
+af
+af
+af
+aj
+aM
+ax
+fO
+ar
+aj
+af
+af
+af
+af
+af
+"}
+(4,1,1) = {"
+af
+af
+af
+af
+Po
+aj
+aQ
+ay
+Oe
+OL
+aj
+af
+af
+af
+af
+af
+"}
+(5,1,1) = {"
+af
+af
+af
+BT
+ED
+aj
+aj
+aj
+bx
+bH
+aj
+Po
+af
+af
+af
+af
+"}
+(6,1,1) = {"
+af
+aO
+Ks
+aj
+aj
+aI
+En
+aj
+yi
+aj
+aj
+ic
+Cb
+af
+af
+af
+"}
+(7,1,1) = {"
+aO
+aj
+ey
+aF
+aj
+aW
+aR
+ek
+lW
+JT
+bf
+aj
+aj
+aa
+aj
+Tr
+"}
+(8,1,1) = {"
+vz
+ae
+an
+ab
+aj
+aj
+aj
+aj
+fY
+bX
+iD
+aj
+aD
+aG
+ep
+aj
+"}
+(9,1,1) = {"
+vz
+ah
+ao
+GS
+ag
+bm
+Xk
+bm
+fY
+ua
+jY
+aL
+fY
+Wp
+mU
+aK
+"}
+(10,1,1) = {"
+vz
+al
+az
+ad
+aj
+aj
+aj
+aj
+fY
+VF
+bl
+aj
+bQ
+bk
+br
+aj
+"}
+(11,1,1) = {"
+aO
+aj
+aC
+aH
+aj
+sP
+jv
+dV
+bA
+vB
+bo
+aj
+aj
+DD
+aj
+Tr
+"}
+(12,1,1) = {"
+af
+aO
+ne
+aj
+aj
+aJ
+aS
+aj
+SD
+aj
+aj
+ED
+UM
+af
+af
+af
+"}
+(13,1,1) = {"
+af
+af
+af
+qy
+ED
+aj
+aj
+mD
+bB
+Ur
+aj
+Iv
+af
+af
+af
+af
+"}
+(14,1,1) = {"
+af
+af
+af
+af
+Iv
+aj
+gY
+eE
+bC
+Hg
+aj
+af
+af
+af
+af
+af
+"}
+(15,1,1) = {"
+af
+af
+af
+af
+af
+aj
+Rq
+bu
+VF
+wf
+aj
+af
+af
+af
+af
+af
+"}
+(16,1,1) = {"
+af
+af
+af
+af
+af
+aj
+av
+bv
+be
+bK
+aj
+af
+af
+af
+af
+af
+"}
+(17,1,1) = {"
+af
+af
+af
+af
+af
+aO
+DD
+mD
+DD
+DD
+aO
+af
+af
+af
+af
+af
+"}
diff --git a/_maps/skyrat/automapper/templates/birdshot/birdshot_supermatter.dmm b/_maps/skyrat/automapper/templates/birdshot/birdshot_supermatter.dmm
new file mode 100644
index 00000000000..fc0d26771fb
--- /dev/null
+++ b/_maps/skyrat/automapper/templates/birdshot/birdshot_supermatter.dmm
@@ -0,0 +1,71 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"b" = (
+/obj/effect/turf_decal/stripes/red/box,
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
+ dir = 8
+ },
+/turf/open/floor/iron/smooth,
+/area/station/engineering/supermatter/room)
+"j" = (
+/obj/machinery/airalarm/directional/south,
+/turf/template_noop,
+/area/template_noop)
+"v" = (
+/obj/structure/sign/delam_procedure,
+/turf/template_noop,
+/area/template_noop)
+"B" = (
+/obj/machinery/button/delam_scram,
+/turf/closed/wall,
+/area/station/engineering/supermatter/room)
+"D" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 4
+ },
+/obj/structure/cable,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
+/turf/open/floor/iron/smooth,
+/area/station/engineering/supermatter/room)
+"T" = (
+/obj/machinery/atmospherics/components/unary/delam_scram/directional/east,
+/turf/template_noop,
+/area/template_noop)
+
+(1,1,1) = {"
+T
+a
+a
+a
+a
+a
+"}
+(2,1,1) = {"
+a
+a
+a
+a
+j
+a
+"}
+(3,1,1) = {"
+a
+v
+a
+b
+B
+a
+"}
+(4,1,1) = {"
+a
+a
+a
+a
+D
+a
+"}
diff --git a/_maps/skyrat/automapper/templates/deltastation/deltastation_supermatter.dmm b/_maps/skyrat/automapper/templates/deltastation/deltastation_supermatter.dmm
new file mode 100644
index 00000000000..3a91788fd6a
--- /dev/null
+++ b/_maps/skyrat/automapper/templates/deltastation/deltastation_supermatter.dmm
@@ -0,0 +1,92 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"i" = (
+/obj/effect/turf_decal/stripes/red/box,
+/turf/template_noop,
+/area/template_noop)
+"j" = (
+/obj/structure/sign/delam_procedure,
+/turf/template_noop,
+/area/template_noop)
+"l" = (
+/obj/machinery/button/delam_scram,
+/turf/closed/wall/r_wall,
+/area/station/engineering/supermatter/room)
+"t" = (
+/obj/machinery/atmospherics/components/unary/delam_scram{
+ dir = 4
+ },
+/turf/template_noop,
+/area/template_noop)
+"M" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
+/obj/machinery/meter,
+/turf/open/floor/iron,
+/area/station/engineering/supermatter/room)
+
+(1,1,1) = {"
+t
+a
+a
+a
+a
+a
+a
+"}
+(2,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+"}
+(3,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+"}
+(4,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+"}
+(5,1,1) = {"
+a
+a
+a
+a
+M
+j
+a
+"}
+(6,1,1) = {"
+a
+a
+a
+a
+i
+l
+i
+"}
+(7,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+"}
diff --git a/_maps/skyrat/automapper/templates/icebox/icebox_supermatter.dmm b/_maps/skyrat/automapper/templates/icebox/icebox_supermatter.dmm
new file mode 100644
index 00000000000..07732061300
--- /dev/null
+++ b/_maps/skyrat/automapper/templates/icebox/icebox_supermatter.dmm
@@ -0,0 +1,118 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"c" = (
+/obj/machinery/button/delam_scram,
+/turf/template_noop,
+/area/template_noop)
+"i" = (
+/obj/effect/turf_decal/stripes/red/box,
+/turf/template_noop,
+/area/template_noop)
+"n" = (
+/obj/effect/spawner/structure/window/reinforced/plasma,
+/turf/template_noop,
+/area/station/engineering/supermatter/room)
+"p" = (
+/obj/machinery/atmospherics/components/unary/delam_scram/directional/east,
+/turf/template_noop,
+/area/template_noop)
+"s" = (
+/obj/structure/sign/delam_procedure,
+/turf/closed/wall/r_wall,
+/area/station/engineering/supermatter/room)
+"y" = (
+/obj/effect/turf_decal/stripes/red/box,
+/turf/open/floor/engine,
+/area/station/engineering/supermatter/room)
+"H" = (
+/obj/structure/table/reinforced,
+/obj/item/clothing/suit/utility/radiation,
+/obj/item/clothing/head/utility/radiation,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/item/geiger_counter,
+/obj/item/clothing/glasses/meson,
+/turf/open/floor/engine,
+/area/station/engineering/supermatter/room)
+
+(1,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+p
+"}
+(2,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(3,1,1) = {"
+i
+c
+y
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(4,1,1) = {"
+a
+s
+H
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(5,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(6,1,1) = {"
+a
+n
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
diff --git a/_maps/skyrat/automapper/templates/metastation/metastation_supermatter.dmm b/_maps/skyrat/automapper/templates/metastation/metastation_supermatter.dmm
new file mode 100644
index 00000000000..280a852105d
--- /dev/null
+++ b/_maps/skyrat/automapper/templates/metastation/metastation_supermatter.dmm
@@ -0,0 +1,91 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"h" = (
+/obj/machinery/button/delam_scram,
+/turf/closed/wall/r_wall,
+/area/station/engineering/supermatter/room)
+"x" = (
+/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/turf_decal/stripes/red/box,
+/turf/open/floor/iron,
+/area/station/engineering/main)
+"C" = (
+/obj/effect/turf_decal/stripes/red/box,
+/turf/open/floor/engine,
+/area/station/engineering/supermatter/room)
+"R" = (
+/obj/structure/sign/delam_procedure,
+/turf/closed/wall/r_wall,
+/area/station/engineering/supermatter/room)
+"V" = (
+/obj/machinery/atmospherics/components/unary/delam_scram/directional/west,
+/turf/template_noop,
+/area/template_noop)
+
+(1,1,1) = {"
+x
+h
+C
+a
+a
+a
+a
+a
+"}
+(2,1,1) = {"
+a
+R
+a
+a
+a
+a
+a
+a
+"}
+(3,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(4,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(5,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(6,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+V
+"}
diff --git a/_maps/skyrat/automapper/templates/northstar/northstar_supermatter.dmm b/_maps/skyrat/automapper/templates/northstar/northstar_supermatter.dmm
new file mode 100644
index 00000000000..a02542f376a
--- /dev/null
+++ b/_maps/skyrat/automapper/templates/northstar/northstar_supermatter.dmm
@@ -0,0 +1,170 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"b" = (
+/obj/machinery/atmospherics/components/unary/delam_scram/directional/west,
+/turf/template_noop,
+/area/template_noop)
+"c" = (
+/obj/effect/spawner/structure/window/reinforced/plasma,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/station/engineering/supermatter/room)
+"e" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/incident_display/delam/directional/north,
+/turf/open/floor/iron,
+/area/station/engineering/lobby)
+"n" = (
+/obj/machinery/button/door/directional/north{
+ id = "Secure Storage";
+ req_access = list("engineering")
+ },
+/turf/template_noop,
+/area/template_noop)
+"o" = (
+/obj/structure/sign/delam_procedure/directional/west,
+/turf/template_noop,
+/area/template_noop)
+"q" = (
+/obj/effect/turf_decal/stripes/red/box,
+/turf/template_noop,
+/area/template_noop)
+"v" = (
+/obj/structure/cable,
+/turf/open/floor/iron/half{
+ dir = 1
+ },
+/area/station/engineering/lobby)
+"y" = (
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/station/engineering/lobby)
+"A" = (
+/obj/machinery/button/delam_scram,
+/turf/closed/wall/r_wall,
+/area/station/engineering/supermatter/room)
+"C" = (
+/obj/effect/turf_decal/stripes/red/box,
+/turf/open/floor/iron/half{
+ dir = 1
+ },
+/area/station/engineering/lobby)
+"P" = (
+/obj/structure/sign/delam_procedure,
+/turf/template_noop,
+/area/template_noop)
+
+(1,1,1) = {"
+n
+a
+a
+a
+a
+a
+a
+"}
+(2,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+"}
+(3,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+"}
+(4,1,1) = {"
+e
+a
+P
+v
+C
+a
+a
+"}
+(5,1,1) = {"
+y
+a
+a
+c
+A
+a
+a
+"}
+(6,1,1) = {"
+a
+a
+a
+a
+q
+o
+a
+"}
+(7,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+"}
+(8,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+"}
+(9,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+"}
+(10,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+"}
+(11,1,1) = {"
+a
+a
+a
+a
+a
+a
+b
+"}
diff --git a/_maps/skyrat/automapper/templates/tramstation/tramstation_supermatter.dmm b/_maps/skyrat/automapper/templates/tramstation/tramstation_supermatter.dmm
new file mode 100644
index 00000000000..ca7e23d65df
--- /dev/null
+++ b/_maps/skyrat/automapper/templates/tramstation/tramstation_supermatter.dmm
@@ -0,0 +1,85 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"k" = (
+/obj/effect/turf_decal/stripes/red/box,
+/obj/structure/sign/delam_procedure,
+/turf/closed/wall/r_wall,
+/area/station/engineering/supermatter/room)
+"l" = (
+/obj/machinery/power/apc/auto_name/directional/east,
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/red/box,
+/turf/open/floor/iron,
+/area/station/engineering/main)
+"m" = (
+/obj/structure/table/reinforced,
+/obj/item/clothing/head/utility/radiation,
+/obj/item/clothing/glasses/meson,
+/obj/item/geiger_counter,
+/obj/item/geiger_counter,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/engine,
+/area/station/engineering/supermatter/room)
+"q" = (
+/obj/effect/turf_decal/stripes/red/box,
+/obj/machinery/button/delam_scram,
+/turf/closed/wall/r_wall,
+/area/station/engineering/supermatter/room)
+"D" = (
+/obj/machinery/atmospherics/components/unary/delam_scram/directional/east,
+/turf/template_noop,
+/area/template_noop)
+"E" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/red/box,
+/turf/open/floor/engine,
+/area/station/engineering/supermatter/room)
+
+(1,1,1) = {"
+a
+a
+m
+a
+a
+a
+a
+a
+a
+"}
+(2,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(3,1,1) = {"
+a
+k
+a
+a
+a
+a
+a
+a
+D
+"}
+(4,1,1) = {"
+l
+q
+E
+a
+a
+a
+a
+a
+a
+"}
diff --git a/_maps/templates/lazy_templates/heretic_sacrifice.dmm b/_maps/templates/lazy_templates/heretic_sacrifice.dmm
new file mode 100644
index 00000000000..cbabb4c6485
--- /dev/null
+++ b/_maps/templates/lazy_templates/heretic_sacrifice.dmm
@@ -0,0 +1,2026 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"ab" = (
+/turf/open/space/basic,
+/area/space)
+"cd" = (
+/obj/effect/decal/cleanable/ash{
+ pixel_x = -8;
+ pixel_y = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/misc/dirt/jungle/dark{
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"cS" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/bonfire/prelit,
+/turf/open/floor/stone,
+/area/centcom/heretic_sacrifice/flesh)
+"cW" = (
+/obj/structure/no_effect_signpost/void,
+/turf/open/misc/asteroid,
+/area/centcom/heretic_sacrifice/void)
+"dX" = (
+/obj/effect/decal/cleanable/oil,
+/turf/open/misc/ashplanet/wateryrock{
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15";
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"dZ" = (
+/obj/effect/decal/fakelattice{
+ density = 0
+ },
+/turf/open/misc/ironsand,
+/area/centcom/heretic_sacrifice/rust)
+"fh" = (
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/centcom/heretic_sacrifice/rust)
+"fL" = (
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/indestructible/plating,
+/area/centcom/heretic_sacrifice/knock)
+"fO" = (
+/turf/open/indestructible,
+/area/space)
+"gJ" = (
+/obj/effect/decal/remains/human,
+/turf/open/misc/dirt/jungle/dark{
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"hE" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/storage/toolbox/mechanical/old,
+/turf/open/indestructible/plating,
+/area/centcom/heretic_sacrifice/knock)
+"hZ" = (
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/indestructible/necropolis/air,
+/area/centcom/heretic_sacrifice/flesh)
+"jg" = (
+/obj/effect/decal/cleanable/blood/old,
+/obj/structure/cable,
+/turf/open/floor/plating/rust,
+/area/centcom/heretic_sacrifice/rust)
+"jt" = (
+/turf/closed/indestructible/reinforced,
+/area/centcom/heretic_sacrifice/knock)
+"jB" = (
+/obj/machinery/light/very_dim/directional/south,
+/turf/open/misc/asteroid,
+/area/centcom/heretic_sacrifice/void)
+"lz" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/misc/ashplanet/wateryrock{
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15";
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"mb" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/remains/human,
+/turf/open/misc/ironsand,
+/area/centcom/heretic_sacrifice/rust)
+"mG" = (
+/obj/effect/turf_decal/weather,
+/obj/structure/cable,
+/turf/open/floor/plating/rust,
+/area/centcom/heretic_sacrifice/rust)
+"mR" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/fakelattice{
+ density = 0
+ },
+/turf/open/floor/plating,
+/area/centcom/heretic_sacrifice/rust)
+"mW" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/spear,
+/turf/open/indestructible/plating,
+/area/centcom/heretic_sacrifice/knock)
+"mZ" = (
+/obj/effect/decal/fakelattice{
+ density = 0
+ },
+/turf/open/floor/plating,
+/area/centcom/heretic_sacrifice/rust)
+"nG" = (
+/obj/structure/bonfire/prelit,
+/turf/open/misc/dirt/jungle/wasteland{
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"nL" = (
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/block/cracked{
+ dir = 10
+ },
+/turf/open/misc/ashplanet/wateryrock{
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15";
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"nP" = (
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/turf/open/misc/dirt/jungle/dark{
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"oh" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating/rust,
+/area/centcom/heretic_sacrifice/rust)
+"ps" = (
+/obj/effect/turf_decal/weather,
+/turf/open/floor/plating,
+/area/centcom/heretic_sacrifice/rust)
+"pt" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/fakelattice{
+ density = 0
+ },
+/turf/open/misc/ironsand,
+/area/centcom/heretic_sacrifice/rust)
+"pN" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 9
+ },
+/obj/effect/decal/cleanable/oil,
+/turf/open/misc/ashplanet/wateryrock{
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15";
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"qn" = (
+/obj/effect/decal/remains/human,
+/turf/open/misc/asteroid,
+/area/centcom/heretic_sacrifice/void)
+"qo" = (
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/storage/toolbox/mechanical/old,
+/turf/open/indestructible/plating,
+/area/centcom/heretic_sacrifice/knock)
+"qu" = (
+/obj/effect/turf_decal/weather/dirt,
+/turf/open/misc/ashplanet/wateryrock{
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15";
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"qM" = (
+/obj/structure/stone_tile/block/cracked,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/weather/dirt{
+ dir = 5
+ },
+/turf/open/misc/ashplanet/wateryrock{
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15";
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"rP" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/indestructible/necropolis/air,
+/area/centcom/heretic_sacrifice/flesh)
+"sb" = (
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/misc/ashplanet/wateryrock{
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15";
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"tF" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 9
+ },
+/turf/open/misc/ashplanet/wateryrock{
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15";
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"ui" = (
+/turf/open/floor/stone,
+/area/centcom/heretic_sacrifice/flesh)
+"uu" = (
+/obj/effect/turf_decal/trimline/brown/corner{
+ dir = 1
+ },
+/turf/open/floor/plating/rust,
+/area/centcom/heretic_sacrifice/rust)
+"uM" = (
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/clothing/under/color/grey/ancient,
+/turf/open/indestructible/plating,
+/area/centcom/heretic_sacrifice/knock)
+"uT" = (
+/obj/structure/cable,
+/turf/open/floor/plating/rust,
+/area/centcom/heretic_sacrifice/rust)
+"vs" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 1
+ },
+/turf/open/misc/dirt/jungle/dark{
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"vv" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 4
+ },
+/turf/open/misc/ashplanet/wateryrock{
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15";
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"wo" = (
+/turf/closed/indestructible/grille,
+/area/centcom/heretic_sacrifice/knock)
+"wt" = (
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/turf/open/misc/dirt/jungle/dark{
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"wE" = (
+/turf/open/misc/dirt/jungle/wasteland{
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"wP" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/flashlight/flare{
+ fuel = 1e+031;
+ randomize_fuel = 0;
+ icon_state = "flare-on";
+ on = 1
+ },
+/turf/open/indestructible/plating,
+/area/centcom/heretic_sacrifice/knock)
+"wS" = (
+/turf/open/misc/dirt/jungle/dark{
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"wY" = (
+/turf/open/floor/glass{
+ desc = "A peek into the other side.";
+ name = "void glass floor"
+ },
+/area/centcom/heretic_sacrifice/void)
+"xc" = (
+/turf/open/indestructible/white,
+/area/space)
+"yC" = (
+/obj/effect/turf_decal/trimline/brown/line{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/centcom/heretic_sacrifice/rust)
+"zb" = (
+/obj/structure/stone_tile/slab,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/misc/ashplanet/wateryrock{
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15";
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"zU" = (
+/obj/effect/decal/fakelattice{
+ density = 0
+ },
+/turf/open/floor/plating/rust,
+/area/centcom/heretic_sacrifice/rust)
+"Aw" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/clothing/mask/gas,
+/turf/open/indestructible/plating,
+/area/centcom/heretic_sacrifice/knock)
+"AH" = (
+/obj/effect/turf_decal/trimline/brown/corner,
+/turf/open/floor/plating/rust,
+/area/centcom/heretic_sacrifice/rust)
+"AN" = (
+/obj/machinery/light/floor,
+/obj/effect/decal/fakelattice{
+ density = 0
+ },
+/turf/open/misc/ironsand,
+/area/centcom/heretic_sacrifice/rust)
+"AO" = (
+/turf/open/floor/fakespace,
+/area/centcom/heretic_sacrifice/void)
+"AW" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/clothing/mask/gas/tiki_mask/yalp_elor,
+/turf/open/indestructible/plating,
+/area/centcom/heretic_sacrifice/knock)
+"AY" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/indestructible/plating,
+/area/centcom/heretic_sacrifice/knock)
+"Bv" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/trimline/brown/line,
+/turf/open/floor/plating/rust,
+/area/centcom/heretic_sacrifice/rust)
+"Bw" = (
+/turf/open/misc/ashplanet/wateryrock{
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15";
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"By" = (
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/plating,
+/area/centcom/heretic_sacrifice/rust)
+"Cf" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/weather,
+/turf/open/floor/plating/rust,
+/area/centcom/heretic_sacrifice/rust)
+"Ck" = (
+/obj/effect/turf_decal/trimline/brown/corner{
+ dir = 8
+ },
+/turf/open/floor/plating/rust,
+/area/centcom/heretic_sacrifice/rust)
+"CB" = (
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/stone,
+/area/centcom/heretic_sacrifice/flesh)
+"CG" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/stone,
+/area/centcom/heretic_sacrifice/flesh)
+"CV" = (
+/obj/effect/decal/cleanable/plasma,
+/obj/effect/landmark/heretic/ash,
+/turf/open/misc/dirt/jungle/wasteland{
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"DL" = (
+/obj/structure/stone_tile/block/burnt{
+ dir = 4
+ },
+/turf/open/misc/dirt/jungle/dark{
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"En" = (
+/turf/closed/indestructible/fakedoor/maintenance,
+/area/centcom/heretic_sacrifice/knock)
+"ER" = (
+/turf/open/misc/ironsand,
+/area/centcom/heretic_sacrifice/rust)
+"Fd" = (
+/turf/closed/indestructible/riveted,
+/area/space)
+"Gl" = (
+/obj/structure/stone_tile/block/burnt{
+ dir = 1
+ },
+/turf/open/misc/ashplanet/wateryrock{
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15";
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"GX" = (
+/obj/effect/landmark/heretic/flesh,
+/turf/open/indestructible/necropolis/air,
+/area/centcom/heretic_sacrifice/flesh)
+"HE" = (
+/obj/effect/turf_decal/weather,
+/turf/open/floor/plating/rust,
+/area/centcom/heretic_sacrifice/rust)
+"HJ" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/gibspawner/human,
+/turf/open/floor/stone,
+/area/centcom/heretic_sacrifice/flesh)
+"HQ" = (
+/turf/closed/indestructible/necropolis,
+/area/centcom/heretic_sacrifice/flesh)
+"Ie" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/misc/ashplanet/wateryrock{
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15";
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"Ii" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 5
+ },
+/turf/open/misc/ashplanet/wateryrock{
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15";
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"Je" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/misc/ironsand,
+/area/centcom/heretic_sacrifice/rust)
+"Jy" = (
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/turf/open/misc/ashplanet/wateryrock{
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15";
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"JJ" = (
+/obj/effect/decal/remains/human,
+/turf/open/indestructible/necropolis/air,
+/area/centcom/heretic_sacrifice/flesh)
+"Ko" = (
+/obj/machinery/light/very_dim/directional/east,
+/turf/open/floor/fakespace,
+/area/centcom/heretic_sacrifice/void)
+"Ku" = (
+/obj/structure/stone_tile/block{
+ dir = 4
+ },
+/turf/open/misc/dirt/jungle/dark{
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"Kz" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/misc/dirt/jungle/dark{
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"KO" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/gibspawner/generic/animal,
+/obj/structure/bonfire/prelit,
+/turf/open/floor/stone,
+/area/centcom/heretic_sacrifice/flesh)
+"KP" = (
+/obj/structure/stone_tile/surrounding_tile,
+/turf/open/misc/ashplanet/wateryrock{
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15";
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"La" = (
+/turf/closed/indestructible/riveted/plastinum,
+/area/centcom/heretic_sacrifice/void)
+"LA" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/trimline/brown/corner{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/centcom/heretic_sacrifice/rust)
+"Mf" = (
+/obj/effect/decal/cleanable/ash/large,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/misc/dirt/jungle/wasteland{
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"Mw" = (
+/obj/machinery/light/very_dim/directional/west,
+/turf/open/floor/fakespace,
+/area/centcom/heretic_sacrifice/void)
+"MZ" = (
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/flashlight/flare{
+ fuel = 1e+031;
+ randomize_fuel = 0;
+ icon_state = "flare-on";
+ on = 1
+ },
+/turf/open/indestructible/plating,
+/area/centcom/heretic_sacrifice/knock)
+"Nh" = (
+/obj/effect/turf_decal/trimline/brown/line{
+ dir = 1
+ },
+/turf/open/floor/plating/rust,
+/area/centcom/heretic_sacrifice/rust)
+"NA" = (
+/obj/structure/stone_tile/burnt,
+/turf/open/misc/ashplanet/wateryrock{
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15";
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"NQ" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/turf/open/misc/ashplanet/wateryrock{
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15";
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"OD" = (
+/obj/effect/landmark/heretic,
+/turf/open/misc/dirt/jungle/wasteland{
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"OG" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 10
+ },
+/turf/open/misc/ashplanet/wateryrock{
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15";
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"OW" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/clothing/under/color/grey/ancient,
+/turf/open/indestructible/plating,
+/area/centcom/heretic_sacrifice/knock)
+"Pl" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 6
+ },
+/turf/open/misc/ashplanet/wateryrock{
+ initial_gas_mix = "o2=22;n2=82;TEMP=293.15";
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"Qi" = (
+/obj/structure/stone_tile,
+/turf/open/misc/dirt/jungle/dark{
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"QL" = (
+/obj/effect/decal/cleanable/ash/large{
+ pixel_x = -2;
+ pixel_y = -8
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/misc/dirt/jungle/dark{
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"Rb" = (
+/obj/effect/landmark/heretic/void,
+/turf/open/misc/asteroid,
+/area/centcom/heretic_sacrifice/void)
+"Rh" = (
+/obj/effect/turf_decal/trimline/brown/line{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/centcom/heretic_sacrifice/rust)
+"RW" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/stone,
+/area/centcom/heretic_sacrifice/flesh)
+"Se" = (
+/turf/open/floor/plating,
+/area/centcom/heretic_sacrifice/rust)
+"St" = (
+/turf/open/indestructible/necropolis/air,
+/area/centcom/heretic_sacrifice/flesh)
+"Sy" = (
+/obj/structure/stone_tile/block,
+/turf/open/misc/dirt/jungle/dark{
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"Tf" = (
+/obj/effect/decal/cleanable/food/salt,
+/turf/open/indestructible/necropolis/air,
+/area/centcom/heretic_sacrifice/flesh)
+"TC" = (
+/obj/effect/decal/cleanable/ash,
+/turf/open/misc/dirt/jungle/dark{
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"TS" = (
+/obj/effect/turf_decal/trimline/brown/line{
+ dir = 8
+ },
+/turf/open/floor/plating/rust,
+/area/centcom/heretic_sacrifice/rust)
+"Ue" = (
+/obj/machinery/light/very_dim/directional/north,
+/turf/open/floor/fakespace,
+/area/centcom/heretic_sacrifice/void)
+"UO" = (
+/obj/effect/landmark/heretic/rust,
+/turf/open/floor/plating,
+/area/centcom/heretic_sacrifice/rust)
+"Vd" = (
+/obj/structure/bonfire/prelit,
+/turf/open/floor/stone,
+/area/centcom/heretic_sacrifice/flesh)
+"VK" = (
+/obj/effect/decal/cleanable/ash,
+/obj/effect/decal/cleanable/ash{
+ pixel_x = 4;
+ pixel_y = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/misc/dirt/jungle/dark{
+ planetary_atmos = 0;
+ slowdown = 0
+ },
+/area/centcom/heretic_sacrifice/ash)
+"Wb" = (
+/turf/open/misc/asteroid,
+/area/centcom/heretic_sacrifice/void)
+"WD" = (
+/turf/closed/indestructible/iron{
+ opacity = 1
+ },
+/area/centcom/heretic_sacrifice/rust)
+"Xk" = (
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/misc/asteroid,
+/area/centcom/heretic_sacrifice/void)
+"Xr" = (
+/turf/open/floor/plating/rust,
+/area/centcom/heretic_sacrifice/rust)
+"Xt" = (
+/obj/effect/gibspawner/generic/animal,
+/turf/open/floor/stone,
+/area/centcom/heretic_sacrifice/flesh)
+"Yp" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/indestructible/necropolis/air,
+/area/centcom/heretic_sacrifice/flesh)
+"Zw" = (
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/landmark/heretic/knock,
+/turf/open/indestructible/plating,
+/area/centcom/heretic_sacrifice/knock)
+"ZA" = (
+/turf/closed/indestructible/riveted/boss,
+/area/centcom/heretic_sacrifice/ash)
+
+(1,1,1) = {"
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+"}
+(2,1,1) = {"
+ab
+ab
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+ab
+"}
+(3,1,1) = {"
+ab
+ab
+Fd
+jt
+jt
+wo
+wo
+jt
+En
+En
+jt
+wo
+wo
+jt
+jt
+Fd
+ZA
+ZA
+ZA
+ZA
+ZA
+ZA
+ZA
+ZA
+ZA
+ZA
+ZA
+ZA
+Fd
+La
+La
+La
+La
+La
+La
+La
+La
+La
+La
+La
+La
+Fd
+ab
+"}
+(4,1,1) = {"
+ab
+ab
+Fd
+jt
+AY
+AY
+AY
+AY
+AY
+AY
+AY
+AY
+fL
+AY
+jt
+Fd
+ZA
+Pl
+wS
+Ii
+Bw
+Bw
+Bw
+Bw
+Pl
+wS
+Ii
+ZA
+Fd
+La
+AO
+AO
+AO
+AO
+Mw
+AO
+AO
+AO
+wY
+Wb
+La
+Fd
+ab
+"}
+(5,1,1) = {"
+ab
+ab
+Fd
+wo
+AY
+fL
+uM
+AY
+AY
+qo
+fL
+AY
+mW
+MZ
+wo
+Fd
+ZA
+wS
+nG
+VK
+sb
+Bw
+Bw
+Bw
+Qi
+nG
+Kz
+ZA
+Fd
+La
+AO
+wY
+AO
+AO
+AO
+AO
+AO
+AO
+AO
+wY
+La
+Fd
+ab
+"}
+(6,1,1) = {"
+ab
+ab
+Fd
+wo
+AY
+Aw
+fL
+AY
+wP
+fL
+fL
+AY
+qo
+AY
+wo
+Fd
+ZA
+OG
+cd
+pN
+Bw
+Bw
+vv
+Bw
+OG
+TC
+tF
+ZA
+Fd
+La
+wY
+cW
+wY
+AO
+AO
+AO
+AO
+AO
+AO
+AO
+La
+Fd
+ab
+"}
+(7,1,1) = {"
+ab
+ab
+Fd
+jt
+AY
+fL
+fL
+AY
+AY
+fL
+AY
+AY
+fL
+Aw
+jt
+Fd
+ZA
+Bw
+Bw
+Bw
+Pl
+nP
+nP
+Ii
+Bw
+Bw
+Bw
+ZA
+Fd
+La
+AO
+wY
+AO
+AO
+wY
+wY
+AO
+AO
+AO
+wY
+La
+Fd
+ab
+"}
+(8,1,1) = {"
+ab
+ab
+Fd
+En
+AY
+MZ
+fL
+AY
+Zw
+OW
+AY
+AY
+AY
+fL
+En
+Fd
+ZA
+Bw
+Bw
+qu
+vs
+wE
+Mf
+Sy
+NQ
+lz
+lz
+ZA
+Fd
+La
+AO
+AO
+AO
+wY
+Wb
+Rb
+wY
+AO
+wY
+jB
+La
+Fd
+ab
+"}
+(9,1,1) = {"
+ab
+ab
+Fd
+En
+fL
+AY
+AY
+AY
+fL
+fL
+AY
+AY
+fL
+AY
+En
+Fd
+ZA
+Bw
+Bw
+Bw
+wt
+CV
+OD
+Sy
+NQ
+lz
+Bw
+ZA
+Fd
+La
+Ue
+AO
+AO
+wY
+Xk
+Wb
+wY
+AO
+wY
+Wb
+La
+Fd
+ab
+"}
+(10,1,1) = {"
+ab
+ab
+Fd
+jt
+AY
+AY
+fL
+AY
+fL
+AY
+fL
+AY
+AW
+fL
+jt
+Fd
+ZA
+Bw
+Bw
+Bw
+OG
+DL
+Ku
+Ie
+Bw
+dX
+Bw
+ZA
+Fd
+La
+AO
+AO
+AO
+AO
+wY
+wY
+AO
+AO
+wY
+Wb
+La
+Fd
+ab
+"}
+(11,1,1) = {"
+ab
+ab
+Fd
+wo
+fL
+AY
+hE
+MZ
+AY
+AY
+hE
+fL
+wP
+AY
+wo
+Fd
+ZA
+Pl
+gJ
+qM
+Bw
+Bw
+nL
+lz
+Pl
+Kz
+Ii
+ZA
+Fd
+La
+wY
+AO
+AO
+AO
+AO
+AO
+AO
+AO
+AO
+wY
+La
+Fd
+ab
+"}
+(12,1,1) = {"
+ab
+ab
+Fd
+wo
+AY
+fL
+AY
+AY
+AY
+fL
+AY
+OW
+fL
+fL
+wo
+Fd
+ZA
+wS
+nG
+Sy
+lz
+Gl
+zb
+NA
+QL
+nG
+wS
+ZA
+Fd
+La
+Wb
+wY
+AO
+AO
+AO
+AO
+AO
+wY
+AO
+AO
+La
+Fd
+ab
+"}
+(13,1,1) = {"
+ab
+ab
+Fd
+jt
+AY
+AY
+fL
+fL
+AY
+AY
+AY
+AY
+AY
+AY
+jt
+Fd
+ZA
+OG
+wS
+tF
+Bw
+Jy
+KP
+Bw
+OG
+wS
+tF
+ZA
+Fd
+La
+Wb
+Xk
+wY
+AO
+AO
+Ko
+wY
+qn
+wY
+AO
+La
+Fd
+ab
+"}
+(14,1,1) = {"
+ab
+ab
+Fd
+jt
+jt
+wo
+wo
+jt
+En
+En
+jt
+wo
+wo
+jt
+jt
+Fd
+ZA
+ZA
+ZA
+ZA
+ZA
+ZA
+ZA
+ZA
+ZA
+ZA
+ZA
+ZA
+Fd
+La
+La
+La
+La
+La
+La
+La
+La
+La
+La
+La
+La
+Fd
+ab
+"}
+(15,1,1) = {"
+ab
+ab
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+ab
+"}
+(16,1,1) = {"
+ab
+ab
+Fd
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+Fd
+WD
+WD
+WD
+WD
+WD
+WD
+WD
+WD
+WD
+WD
+WD
+WD
+Fd
+HQ
+HQ
+HQ
+HQ
+HQ
+HQ
+HQ
+HQ
+HQ
+HQ
+HQ
+HQ
+Fd
+ab
+"}
+(17,1,1) = {"
+ab
+ab
+Fd
+fO
+fO
+fO
+fO
+fO
+fO
+xc
+xc
+xc
+xc
+xc
+fO
+Fd
+WD
+dZ
+dZ
+dZ
+ER
+Je
+fh
+Xr
+Xr
+Xr
+Xr
+WD
+Fd
+HQ
+St
+ui
+St
+St
+St
+Yp
+Yp
+St
+ui
+St
+HQ
+Fd
+ab
+"}
+(18,1,1) = {"
+ab
+ab
+Fd
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+xc
+fO
+fO
+fO
+Fd
+WD
+dZ
+AN
+mb
+HE
+oh
+fh
+Xr
+ps
+AN
+Xr
+WD
+Fd
+HQ
+Xt
+cS
+RW
+ui
+ui
+ui
+RW
+Xt
+Vd
+ui
+HQ
+Fd
+ab
+"}
+(19,1,1) = {"
+ab
+ab
+Fd
+fO
+fO
+fO
+fO
+fO
+fO
+xc
+xc
+xc
+xc
+xc
+fO
+Fd
+WD
+ER
+mG
+jg
+fh
+fh
+uT
+By
+dZ
+pt
+ER
+WD
+Fd
+HQ
+St
+CB
+JJ
+ui
+St
+St
+ui
+hZ
+ui
+St
+HQ
+Fd
+ab
+"}
+(20,1,1) = {"
+ab
+ab
+Fd
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+Fd
+WD
+Se
+mR
+zU
+AH
+Rh
+Rh
+LA
+ER
+ps
+Je
+WD
+Fd
+HQ
+St
+ui
+ui
+HJ
+RW
+RW
+ui
+RW
+RW
+St
+HQ
+Fd
+ab
+"}
+(21,1,1) = {"
+ab
+ab
+Fd
+fO
+fO
+fO
+fO
+fO
+fO
+xc
+fO
+xc
+xc
+xc
+fO
+Fd
+WD
+Xr
+mZ
+Se
+Bv
+Xr
+Xr
+Nh
+Xr
+Se
+Se
+WD
+Fd
+HQ
+St
+RW
+St
+ui
+hZ
+Tf
+ui
+St
+RW
+St
+HQ
+Fd
+ab
+"}
+(22,1,1) = {"
+ab
+ab
+Fd
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+Fd
+WD
+Se
+Se
+Xr
+Bv
+UO
+Se
+yC
+Se
+zU
+Xr
+WD
+Fd
+HQ
+St
+RW
+Yp
+ui
+GX
+Yp
+ui
+JJ
+ui
+St
+HQ
+Fd
+ab
+"}
+(23,1,1) = {"
+ab
+ab
+Fd
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+Fd
+WD
+Xr
+oh
+Xr
+Ck
+TS
+TS
+uu
+Xr
+Xr
+HE
+WD
+Fd
+HQ
+St
+ui
+ui
+ui
+ui
+RW
+CG
+ui
+ui
+St
+HQ
+Fd
+ab
+"}
+(24,1,1) = {"
+ab
+ab
+Fd
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+Fd
+WD
+ps
+Se
+Se
+By
+Se
+oh
+Xr
+ps
+pt
+ER
+WD
+Fd
+HQ
+hZ
+ui
+St
+ui
+St
+St
+ui
+rP
+ui
+St
+HQ
+Fd
+ab
+"}
+(25,1,1) = {"
+ab
+ab
+Fd
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+Fd
+WD
+Je
+AN
+Cf
+oh
+mR
+zU
+ps
+ER
+AN
+ER
+WD
+Fd
+HQ
+RW
+KO
+ui
+ui
+RW
+ui
+ui
+RW
+cS
+ui
+HQ
+Fd
+ab
+"}
+(26,1,1) = {"
+ab
+ab
+Fd
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+Fd
+WD
+ER
+pt
+ER
+HE
+Xr
+Se
+Se
+Je
+ER
+Xr
+WD
+Fd
+HQ
+St
+ui
+JJ
+Yp
+Yp
+St
+St
+Yp
+Xt
+St
+HQ
+Fd
+ab
+"}
+(27,1,1) = {"
+ab
+ab
+Fd
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+fO
+Fd
+WD
+WD
+WD
+WD
+WD
+WD
+WD
+WD
+WD
+WD
+WD
+WD
+Fd
+HQ
+HQ
+HQ
+HQ
+HQ
+HQ
+HQ
+HQ
+HQ
+HQ
+HQ
+HQ
+Fd
+ab
+"}
+(28,1,1) = {"
+ab
+ab
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+Fd
+ab
+"}
+(29,1,1) = {"
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+"}
diff --git a/_maps/virtual_domains/README.md b/_maps/virtual_domains/README.md
new file mode 100644
index 00000000000..a02d43e1575
--- /dev/null
+++ b/_maps/virtual_domains/README.md
@@ -0,0 +1,32 @@
+# Making new virtual domains
+
+## From scratch
+
+1. Create a new map using TGM format. It can be any size, but please, consider limiting to 75x75 max.
+2. Ensure that the map has ONE tile marked with the safehouse bottom left landmark. If you're using modular safehouses, it will need to be a 7x6 area.
+4. Provide a way for players to enter your new map via the north door, which is 4th tile over.
+5. Enclose your area with a single wall binary closed wall.
+
+## From an existing map
+
+1. Create a new map using the existing map's size - give yourself enough room to enclose it with a binary wall. There's no need for any space outside of it, so ensure that it fits and is enclosed, nothing outside of this.
+2. Copy and paste the existing map into it.
+3. Find an accessible area for a safehouse, 7x6 - or with a custom, just ensure the necessary landmarks are placed.
+4. Place a bottom left safehouse landmark somewhere on the map to load the safehouse.
+
+## BOTH.
+1. You need to have one (1) way that the encrypted cache can spawn. This can be from a mob drop, a landmark (place a few, it'll pick one), or a signable landmark if you have a points system.
+2. Make note of the size of the map. Make sure this is in the dm file.
+3. Create the dm file that defines the map qualities. Examples are in the bitrunning file.
+
+### Notes
+
+You shouldn't need to fully enclose your map in 15 tiles of binary filler. Using one solid wall should do the trick.
+
+Adding some open tile padding around the safehouse is a good touch. About 7 tiles West/East for the visual effect of a larger map.
+
+If you want to add prep gear, you can do so within the safehouse's area as long you don't overlap with goal turfs or exit spawners. The top left corner is a good spot for this, with respect for the walls, therefore [1, 1], [1, 2], [1, 3]
+
+You can also create safehouses if you find yourself needing the same gear over and over again. There is a readme for that as well.
+
+Boss zones should give players pretty ample space, I've been using a 23x23 minimum area.
diff --git a/_maps/virtual_domains/ash_drake.dmm b/_maps/virtual_domains/ash_drake.dmm
new file mode 100644
index 00000000000..50fbac8696a
--- /dev/null
+++ b/_maps/virtual_domains/ash_drake.dmm
@@ -0,0 +1,1750 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"c" = (
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"e" = (
+/obj/structure/marker_beacon/cerulean,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"f" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"g" = (
+/obj/structure/marker_beacon/lime,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"h" = (
+/obj/machinery/light/small/blacklight/directional/south,
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/virtual_domain/powered)
+"i" = (
+/obj/structure/marker_beacon/jade,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"j" = (
+/obj/structure/marker_beacon/teal,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"l" = (
+/obj/structure/marker_beacon/bronze,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"q" = (
+/mob/living/simple_animal/hostile/megafauna/dragon/virtual_domain,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"s" = (
+/turf/closed/mineral/volcanic/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"u" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/closed/indestructible/binary,
+/area/lavaland/surface/outdoors/virtual_domain)
+"v" = (
+/turf/closed/indestructible/binary,
+/area/lavaland/surface/outdoors/virtual_domain)
+"G" = (
+/obj/structure/marker_beacon/purple,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"J" = (
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"L" = (
+/obj/effect/landmark/bitrunning/safehouse_spawn,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"P" = (
+/obj/structure/marker_beacon/fuchsia,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Z" = (
+/obj/effect/mob_spawn/corpse/human/miner,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+
+(1,1,1) = {"
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+u
+"}
+(2,1,1) = {"
+v
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+v
+"}
+(3,1,1) = {"
+v
+s
+s
+s
+s
+J
+J
+s
+s
+J
+J
+s
+s
+J
+J
+J
+J
+s
+s
+s
+J
+J
+J
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+J
+J
+s
+s
+s
+J
+J
+s
+s
+J
+J
+s
+v
+"}
+(4,1,1) = {"
+v
+s
+s
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+a
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+s
+v
+"}
+(5,1,1) = {"
+v
+s
+s
+J
+a
+J
+J
+J
+J
+a
+J
+J
+J
+J
+a
+a
+J
+J
+J
+J
+J
+a
+a
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+s
+s
+v
+"}
+(6,1,1) = {"
+v
+s
+s
+J
+a
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+a
+a
+a
+a
+a
+J
+J
+J
+a
+a
+J
+J
+J
+a
+a
+J
+a
+J
+a
+a
+J
+J
+J
+s
+s
+v
+"}
+(7,1,1) = {"
+v
+s
+s
+J
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+J
+J
+s
+v
+"}
+(8,1,1) = {"
+v
+s
+s
+J
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+J
+s
+s
+v
+"}
+(9,1,1) = {"
+v
+s
+J
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+i
+a
+a
+a
+a
+a
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+J
+s
+v
+"}
+(10,1,1) = {"
+v
+s
+J
+J
+J
+a
+a
+a
+a
+a
+a
+G
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+J
+s
+v
+"}
+(11,1,1) = {"
+v
+s
+s
+J
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+J
+s
+v
+"}
+(12,1,1) = {"
+v
+s
+s
+J
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+J
+J
+s
+v
+"}
+(13,1,1) = {"
+v
+s
+s
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+g
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+J
+s
+v
+"}
+(14,1,1) = {"
+v
+s
+s
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+J
+s
+v
+"}
+(15,1,1) = {"
+v
+s
+J
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+h
+c
+c
+c
+c
+c
+L
+a
+a
+J
+J
+s
+v
+"}
+(16,1,1) = {"
+v
+s
+J
+J
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+c
+c
+c
+c
+c
+c
+a
+a
+J
+J
+s
+v
+"}
+(17,1,1) = {"
+v
+s
+s
+J
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+l
+a
+a
+c
+c
+c
+c
+c
+c
+a
+a
+J
+J
+s
+v
+"}
+(18,1,1) = {"
+v
+s
+s
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+q
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+c
+c
+c
+c
+c
+c
+a
+J
+J
+s
+s
+v
+"}
+(19,1,1) = {"
+v
+s
+J
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+c
+c
+c
+c
+c
+c
+a
+a
+J
+J
+s
+v
+"}
+(20,1,1) = {"
+v
+s
+J
+J
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+c
+c
+c
+c
+c
+c
+a
+a
+J
+J
+s
+v
+"}
+(21,1,1) = {"
+v
+s
+s
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+e
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+h
+c
+c
+c
+c
+c
+f
+a
+a
+J
+s
+s
+v
+"}
+(22,1,1) = {"
+v
+s
+s
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+s
+s
+v
+"}
+(23,1,1) = {"
+v
+s
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+s
+s
+v
+"}
+(24,1,1) = {"
+v
+s
+J
+J
+a
+a
+a
+a
+j
+a
+a
+a
+a
+a
+P
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+J
+s
+v
+"}
+(25,1,1) = {"
+v
+s
+s
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+J
+J
+s
+v
+"}
+(26,1,1) = {"
+v
+s
+s
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+J
+s
+v
+"}
+(27,1,1) = {"
+v
+s
+s
+J
+J
+J
+a
+a
+a
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+j
+a
+a
+a
+a
+a
+a
+a
+J
+J
+s
+v
+"}
+(28,1,1) = {"
+v
+s
+J
+J
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+J
+J
+s
+v
+"}
+(29,1,1) = {"
+v
+s
+J
+J
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+J
+s
+s
+v
+"}
+(30,1,1) = {"
+v
+s
+s
+J
+J
+J
+J
+a
+a
+J
+J
+J
+a
+a
+a
+a
+J
+J
+J
+a
+a
+a
+J
+J
+J
+a
+a
+a
+J
+J
+a
+a
+a
+a
+a
+a
+J
+J
+a
+a
+a
+J
+J
+s
+s
+v
+"}
+(31,1,1) = {"
+v
+s
+s
+a
+J
+J
+J
+J
+J
+J
+J
+J
+J
+a
+a
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+a
+a
+a
+J
+J
+J
+J
+J
+J
+J
+J
+J
+s
+v
+"}
+(32,1,1) = {"
+v
+s
+s
+a
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+a
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+s
+v
+"}
+(33,1,1) = {"
+v
+s
+s
+s
+s
+s
+J
+J
+s
+s
+s
+s
+J
+J
+s
+s
+s
+s
+s
+s
+J
+J
+s
+s
+s
+s
+J
+J
+s
+s
+s
+s
+J
+J
+J
+s
+s
+s
+s
+s
+s
+J
+J
+J
+s
+v
+"}
+(34,1,1) = {"
+v
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+v
+"}
+(35,1,1) = {"
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+"}
diff --git a/_maps/virtual_domains/beach_bar.dmm b/_maps/virtual_domains/beach_bar.dmm
new file mode 100644
index 00000000000..408d3c0cda1
--- /dev/null
+++ b/_maps/virtual_domains/beach_bar.dmm
@@ -0,0 +1,2932 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"ab" = (
+/obj/machinery/vending/cigarette/beach,
+/obj/effect/turf_decal/sand,
+/obj/structure/sign/poster/contraband/have_a_puff/directional/west,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"ag" = (
+/turf/open/floor/carpet/red,
+/area/virtual_domain/powered)
+"as" = (
+/obj/structure/closet/crate/bin,
+/obj/item/tank/internals/emergency_oxygen,
+/obj/item/trash/candy,
+/obj/item/toy/talking/owl,
+/obj/effect/turf_decal/sand,
+/obj/machinery/light/directional/west,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"aw" = (
+/obj/machinery/grill,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"aE" = (
+/turf/open/floor/pod/light,
+/area/virtual_domain/powered)
+"aZ" = (
+/obj/machinery/light/small/directional/east,
+/obj/structure/closet/crate{
+ name = "fuel crate"
+ },
+/obj/item/stack/sheet/mineral/coal/ten,
+/obj/item/stack/sheet/mineral/coal/ten,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"bf" = (
+/mob/living/basic/crab{
+ name = "Jonny"
+ },
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"bC" = (
+/obj/effect/turf_decal/sand,
+/mob/living/basic/crab{
+ name = "James"
+ },
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"bM" = (
+/mob/living/basic/crab{
+ name = "Jon"
+ },
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"bQ" = (
+/obj/structure/fluff/beach_umbrella/cap,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"bS" = (
+/obj/machinery/chem_master/condimaster{
+ name = "CondiMaster Neo";
+ pixel_x = -4
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"cb" = (
+/obj/structure/table/wood,
+/obj/item/reagent_containers/pill/lsd,
+/obj/item/reagent_containers/pill/lsd,
+/obj/item/reagent_containers/pill/lsd,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"cv" = (
+/turf/open/floor/carpet/royalblue,
+/area/virtual_domain/powered)
+"cz" = (
+/obj/effect/turf_decal/sand,
+/obj/machinery/jukebox,
+/obj/item/coin/gold,
+/turf/open/floor/sepia,
+/area/virtual_domain/powered)
+"cG" = (
+/obj/structure/flora/bush/sparsegrass/style_random,
+/turf/open/water/beach,
+/area/virtual_domain/powered)
+"db" = (
+/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/virtual_domain/powered)
+"di" = (
+/obj/machinery/vending/boozeomat,
+/obj/effect/mapping_helpers/atom_injector/obj_flag{
+ inject_flags = 1;
+ target_type = /obj/machinery/vending/boozeomat
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"dj" = (
+/turf/open/misc/beach/coast{
+ dir = 1
+ },
+/area/virtual_domain/powered)
+"dx" = (
+/obj/effect/turf_decal/sand,
+/obj/effect/turf_decal/stripes/asteroid/line{
+ dir = 8
+ },
+/turf/open/floor/sepia,
+/area/virtual_domain/powered)
+"dI" = (
+/obj/machinery/light/directional/south,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"dZ" = (
+/obj/structure/bookcase/random/reference,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"ed" = (
+/obj/machinery/atmospherics/components/tank/air{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"er" = (
+/obj/structure/noticeboard/staff,
+/turf/closed/wall/mineral/wood/nonmetal,
+/area/virtual_domain/powered)
+"fc" = (
+/obj/structure/table/wood,
+/obj/item/reagent_containers/pill/happy,
+/obj/item/toy/figure/bartender{
+ pixel_x = -8;
+ pixel_y = -1
+ },
+/obj/item/reagent_containers/cup/glass/drinkingglass/virtual_domain{
+ pixel_y = 8;
+ pixel_x = 5
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"fr" = (
+/obj/item/melee/skateboard/hoverboard,
+/obj/machinery/light/directional/west,
+/turf/open/floor/pod/light,
+/area/virtual_domain/powered)
+"gh" = (
+/obj/structure/flora/bush/stalky/style_random,
+/obj/structure/flora/bush/sparsegrass/style_random,
+/turf/open/water/beach,
+/area/virtual_domain/powered)
+"gl" = (
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"gJ" = (
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/open/misc/beach/coast{
+ dir = 4
+ },
+/area/virtual_domain/powered)
+"hk" = (
+/obj/structure/reagent_dispensers/watertank,
+/turf/open/floor/pod/light,
+/area/virtual_domain/powered)
+"hE" = (
+/obj/structure/sign/departments/restroom/directional/east,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"hG" = (
+/obj/machinery/door/airlock/sandstone{
+ name = "Surfer Shack 1"
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"iz" = (
+/turf/closed/indestructible/binary,
+/area/lavaland/surface/outdoors/virtual_domain)
+"iR" = (
+/obj/structure/table,
+/obj/item/book/manual/wiki/barman_recipes,
+/obj/item/reagent_containers/cup/glass/shaker,
+/obj/item/reagent_containers/cup/rag,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"jc" = (
+/turf/open/floor/iron/stairs/right,
+/area/virtual_domain/powered)
+"jg" = (
+/obj/machinery/vending/hydronutrients,
+/turf/open/floor/iron/grimy,
+/area/virtual_domain/powered)
+"jl" = (
+/obj/structure/flora/rock/pile/jungle/style_random,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"jy" = (
+/obj/effect/turf_decal/sand{
+ density = 1
+ },
+/obj/effect/decal/fakelattice,
+/turf/open/floor/pod/light{
+ density = 1
+ },
+/area/virtual_domain/powered)
+"ke" = (
+/obj/structure/marker_beacon/bronze,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"kn" = (
+/obj/effect/turf_decal/sand,
+/obj/effect/turf_decal/stripes/asteroid/line{
+ dir = 8
+ },
+/obj/structure/chair/stool/bar/directional/west,
+/turf/open/floor/sepia,
+/area/virtual_domain/powered)
+"kv" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/closed/indestructible/binary,
+/area/lavaland/surface/outdoors/virtual_domain)
+"kG" = (
+/obj/structure/table,
+/obj/machinery/reagentgrinder,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"kK" = (
+/obj/structure/mirror/directional/west,
+/obj/structure/sink/kitchen/directional/south,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"kT" = (
+/obj/structure/chair/stool/bar/directional/south,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"lq" = (
+/obj/item/melee/skateboard/hoverboard,
+/turf/open/floor/pod/light,
+/area/virtual_domain/powered)
+"lB" = (
+/obj/item/toy/seashell,
+/obj/effect/turf_decal/sand,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"lS" = (
+/turf/open/floor/light/colour_cycle/dancefloor_a,
+/area/virtual_domain/powered)
+"ml" = (
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"mq" = (
+/obj/structure/closet/secure_closet/freezer/kitchen/all_access,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"mG" = (
+/obj/structure/easel,
+/obj/item/canvas/twentythree_twentythree,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"mP" = (
+/turf/open/misc/beach/coast/corner{
+ dir = 1
+ },
+/area/virtual_domain/powered)
+"mX" = (
+/obj/structure/closet/secure_closet/freezer/meat/all_access,
+/obj/item/food/meat/rawbacon,
+/obj/item/food/meat/rawbacon,
+/obj/item/food/meat/rawcutlet,
+/obj/item/food/meat/rawcutlet,
+/obj/item/food/meat/slab/rawcrab,
+/obj/item/food/meat/slab/rawcrab,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"nP" = (
+/obj/item/stack/sheet/iron/fifty,
+/obj/effect/mapping_helpers/burnt_floor,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"oE" = (
+/obj/structure/railing/corner{
+ dir = 1
+ },
+/obj/machinery/light/directional/south,
+/turf/open/misc/beach/coast/corner{
+ dir = 8
+ },
+/area/virtual_domain/powered)
+"oP" = (
+/obj/structure/table/wood,
+/obj/machinery/reagentgrinder,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"pr" = (
+/turf/template_noop,
+/area/template_noop)
+"pC" = (
+/obj/machinery/computer/arcade/battle,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"pT" = (
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"pZ" = (
+/obj/machinery/light/directional/south,
+/turf/open/misc/beach/coast{
+ dir = 1
+ },
+/area/virtual_domain/powered)
+"qc" = (
+/obj/structure/extinguisher_cabinet/directional/south,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"qg" = (
+/obj/structure/sign/poster/contraband/space_up/directional/west,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"qR" = (
+/obj/effect/spawner/structure/window,
+/obj/structure/curtain,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"qW" = (
+/obj/item/melee/skateboard/hoverboard,
+/mob/living/basic/chicken{
+ name = "Chicken Joe"
+ },
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"rc" = (
+/obj/machinery/light/directional/east,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"ri" = (
+/obj/structure/sign/poster/official/fruit_bowl,
+/turf/closed/wall/mineral/wood/nonmetal,
+/area/virtual_domain/powered)
+"rm" = (
+/obj/item/storage/crayons,
+/obj/structure/closet/crate/wooden,
+/obj/item/canvas/twentythree_twentythree,
+/obj/item/canvas/twentythree_twentythree,
+/obj/item/canvas/twentythree_twentythree,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"rT" = (
+/obj/item/toy/seashell,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"sT" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"tE" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Resort Casino"
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"tF" = (
+/obj/structure/extinguisher_cabinet/directional/east,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"tZ" = (
+/obj/structure/toilet,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"uc" = (
+/obj/machinery/light/small/directional/east,
+/obj/machinery/light/small/directional/east,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/virtual_domain/powered)
+"ug" = (
+/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/virtual_domain/powered)
+"uk" = (
+/obj/structure/closet/crate/hydroponics,
+/obj/item/shovel/spade,
+/obj/item/reagent_containers/cup/bucket,
+/obj/item/cultivator,
+/turf/open/floor/iron/grimy,
+/area/virtual_domain/powered)
+"uq" = (
+/obj/structure/table/wood,
+/obj/item/reagent_containers/cup/glass/drinkingglass/virtual_domain,
+/obj/item/reagent_containers/cup/glass/drinkingglass/virtual_domain{
+ pixel_x = -4;
+ pixel_y = 8
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"uU" = (
+/obj/effect/turf_decal/sand,
+/turf/open/floor/sepia,
+/area/virtual_domain/powered)
+"uV" = (
+/obj/structure/flora/coconuts,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"ve" = (
+/obj/item/toy/dodgeball,
+/obj/item/toy/dodgeball,
+/obj/item/toy/dodgeball,
+/obj/item/toy/dodgeball,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"vp" = (
+/obj/machinery/light/directional/east,
+/obj/structure/chair/stool/bar/directional/south,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"vq" = (
+/obj/machinery/oven/range,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"vv" = (
+/obj/structure/chair/stool/directional/south,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"vN" = (
+/obj/structure/table/wood,
+/obj/item/reagent_containers/pill/morphine,
+/obj/item/reagent_containers/pill/morphine,
+/obj/item/reagent_containers/pill/morphine,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"vT" = (
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/open/misc/beach/coast/corner,
+/area/virtual_domain/powered)
+"wb" = (
+/obj/structure/closet/crate/freezer{
+ name = "Cooler"
+ },
+/obj/item/reagent_containers/cup/glass/ice,
+/obj/item/reagent_containers/cup/glass/colocup,
+/obj/item/reagent_containers/cup/glass/colocup,
+/obj/item/reagent_containers/cup/glass/bottle/beer{
+ desc = "Beer advertised to be the best in space.";
+ name = "Masterbrand Beer"
+ },
+/obj/item/reagent_containers/cup/glass/bottle/beer{
+ desc = "Beer advertised to be the best in space.";
+ name = "Masterbrand Beer"
+ },
+/obj/item/reagent_containers/cup/glass/bottle/beer{
+ desc = "Beer advertised to be the best in space.";
+ name = "Masterbrand Beer"
+ },
+/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,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"wD" = (
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"xb" = (
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"xk" = (
+/obj/structure/table/wood/poker,
+/obj/item/storage/dice,
+/obj/item/stack/spacecash/c1000,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"xq" = (
+/obj/structure/window/reinforced/spawner/directional/west,
+/obj/structure/window/reinforced/spawner/directional/south,
+/obj/item/megaphone,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"xw" = (
+/turf/open/floor/pod/dark,
+/area/virtual_domain/powered)
+"xJ" = (
+/obj/structure/closet/cabinet,
+/obj/item/storage/backpack/duffelbag,
+/obj/item/clothing/under/shorts/blue,
+/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/virtual_domain/powered)
+"xR" = (
+/obj/structure/window/reinforced/spawner/directional/east,
+/obj/structure/window/reinforced/spawner/directional/north{
+ layer = 2.9
+ },
+/obj/structure/chair/stool/directional/south,
+/obj/item/storage/backpack/duffelbag,
+/obj/item/clothing/under/shorts/red,
+/obj/item/clothing/glasses/sunglasses,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"xW" = (
+/turf/open/space/basic,
+/area/space)
+"ya" = (
+/obj/structure/table/wood,
+/obj/item/reagent_containers/pill/zoom,
+/obj/item/reagent_containers/pill/zoom,
+/obj/item/reagent_containers/pill/zoom,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"yi" = (
+/obj/structure/sink/kitchen/directional/west{
+ desc = "A sink used for washing one's hands and face. It looks rusty and home-made";
+ name = "old sink"
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"yl" = (
+/obj/item/reagent_containers/cup/glass/colocup{
+ pixel_x = -7;
+ pixel_y = -2
+ },
+/obj/item/reagent_containers/cup/glass/colocup{
+ pixel_x = 5;
+ pixel_y = 6
+ },
+/obj/item/reagent_containers/cup/glass/bottle/rum{
+ pixel_x = 4;
+ pixel_y = -3
+ },
+/turf/open/floor/carpet/red,
+/area/virtual_domain/powered)
+"ys" = (
+/obj/effect/turf_decal/sand,
+/obj/machinery/light/directional/east,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"yv" = (
+/obj/effect/turf_decal/sand,
+/obj/machinery/food_cart,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"yB" = (
+/obj/item/instrument/guitar,
+/turf/open/floor/carpet/blue,
+/area/virtual_domain/powered)
+"yU" = (
+/obj/structure/sign/warning/gas_mask/directional/north,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"yX" = (
+/obj/structure/chair/stool/bar/directional/south,
+/turf/open/floor/carpet/red,
+/area/virtual_domain/powered)
+"zn" = (
+/obj/machinery/light/directional/east,
+/turf/open/misc/beach/coast{
+ dir = 8
+ },
+/area/virtual_domain/powered)
+"zw" = (
+/obj/structure/punching_bag,
+/turf/open/floor/pod/dark,
+/area/virtual_domain/powered)
+"zI" = (
+/obj/structure/marker_beacon/indigo,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"zU" = (
+/obj/structure/flora/rock/pile/style_random,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"Aa" = (
+/obj/effect/turf_decal/sand,
+/obj/effect/turf_decal/stripes/asteroid/line{
+ dir = 8
+ },
+/obj/machinery/light/directional/west,
+/turf/open/floor/sepia,
+/area/virtual_domain/powered)
+"Ae" = (
+/obj/structure/chair,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"Al" = (
+/turf/closed/mineral/random/volcanic,
+/area/lavaland/surface/outdoors/virtual_domain)
+"An" = (
+/obj/structure/marker_beacon/yellow,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Au" = (
+/obj/structure/fluff/beach_umbrella/science,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"AI" = (
+/obj/structure/table/reinforced,
+/obj/machinery/reagentgrinder,
+/turf/open/floor/pod/light,
+/area/virtual_domain/powered)
+"AP" = (
+/obj/machinery/chem_dispenser/drinks/beer/fullupgrade{
+ dir = 1
+ },
+/obj/structure/table/wood,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Br" = (
+/obj/structure/table/wood/poker,
+/obj/item/toy/cards/deck/cas{
+ pixel_x = -6
+ },
+/obj/item/toy/cards/deck/cas/black{
+ pixel_x = -6;
+ pixel_y = 2
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Bu" = (
+/turf/open/misc/beach/coast{
+ dir = 8
+ },
+/area/virtual_domain/powered)
+"Bw" = (
+/obj/structure/flora/bush/sparsegrass/style_random,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"BD" = (
+/obj/structure/table/wood,
+/obj/item/reagent_containers/condiment/saltshaker,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"BJ" = (
+/obj/structure/table/wood/poker,
+/obj/item/toy/cards/deck,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"BM" = (
+/turf/closed/wall/mineral/wood/nonmetal,
+/area/virtual_domain/powered)
+"BQ" = (
+/obj/machinery/seed_extractor,
+/turf/open/floor/pod/light,
+/area/virtual_domain/powered)
+"Cb" = (
+/obj/machinery/light/directional/north,
+/mob/living/basic/crab{
+ name = "Eddie"
+ },
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"Cv" = (
+/obj/machinery/hydroponics/constructable,
+/turf/open/floor/iron/grimy,
+/area/virtual_domain/powered)
+"CA" = (
+/obj/structure/window/reinforced/spawner/directional/east,
+/obj/effect/mob_spawn/ghost_role/human/beach/lifeguard,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"CO" = (
+/obj/machinery/vending/dinnerware,
+/obj/machinery/light/directional/east,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Db" = (
+/obj/machinery/barsign/all_access,
+/turf/closed/wall/mineral/wood/nonmetal,
+/area/virtual_domain/powered)
+"Ds" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Resort Lobby"
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Dt" = (
+/obj/machinery/light/directional/east,
+/obj/effect/turf_decal/sand,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"DL" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/closed/wall/mineral/sandstone,
+/area/virtual_domain/powered)
+"Em" = (
+/obj/item/reagent_containers/condiment/enzyme{
+ layer = 5
+ },
+/obj/item/reagent_containers/cup/beaker{
+ pixel_x = 5
+ },
+/obj/structure/table,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Et" = (
+/obj/machinery/light/small/directional/east,
+/obj/effect/mapping_helpers/burnt_floor,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Ev" = (
+/obj/structure/reagent_dispensers/beerkeg,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"EC" = (
+/obj/structure/sign/warning/gas_mask/directional/west,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"EP" = (
+/obj/machinery/light/directional/north,
+/obj/machinery/washing_machine,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Fn" = (
+/turf/closed/wall/mineral/sandstone,
+/area/virtual_domain/powered)
+"FM" = (
+/obj/effect/landmark/bitrunning/safehouse_spawn,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"FQ" = (
+/obj/structure/table/reinforced,
+/obj/item/secateurs,
+/obj/item/reagent_containers/cup/bottle/nutrient/ez,
+/turf/open/floor/pod/light,
+/area/virtual_domain/powered)
+"FS" = (
+/obj/effect/turf_decal/sand,
+/obj/structure/sign/warning/no_smoking/circle/directional/east,
+/obj/machinery/light/directional/east,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"FY" = (
+/obj/structure/mineral_door/wood,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Gh" = (
+/obj/effect/turf_decal/sand,
+/obj/structure/sign/poster/contraband/starkist/directional/north,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"Gz" = (
+/obj/structure/flora/tree/palm,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"GA" = (
+/obj/structure/window/reinforced/spawner/directional/north,
+/obj/structure/window/reinforced/spawner/directional/west,
+/obj/item/bikehorn/airhorn,
+/obj/structure/table/wood,
+/obj/item/storage/medkit/regular,
+/obj/item/storage/medkit/brute,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Hs" = (
+/obj/machinery/shower/directional/west,
+/turf/open/floor/iron/white,
+/area/virtual_domain/powered)
+"HF" = (
+/obj/machinery/deepfryer,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Ia" = (
+/obj/structure/urinal/directional/north,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Ii" = (
+/obj/machinery/light/directional/west,
+/turf/open/floor/iron/stairs/left,
+/area/virtual_domain/powered)
+"Ir" = (
+/obj/machinery/vending/cola,
+/obj/effect/turf_decal/sand,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Iv" = (
+/obj/structure/table/wood,
+/obj/item/reagent_containers/condiment/peppermill,
+/obj/item/reagent_containers/condiment/soysauce,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"IH" = (
+/obj/item/toy/beach_ball,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"IM" = (
+/obj/machinery/hydroponics/constructable,
+/obj/machinery/light/directional/east,
+/turf/open/floor/iron/grimy,
+/area/virtual_domain/powered)
+"IP" = (
+/obj/machinery/vending/snack,
+/obj/effect/turf_decal/sand,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Jt" = (
+/obj/item/reagent_containers/cup/glass/bottle/beer,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"JC" = (
+/obj/structure/fluff/beach_umbrella/engine,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"JE" = (
+/obj/structure/closet/secure_closet/freezer/kitchen/all_access,
+/obj/item/reagent_containers/condiment/milk,
+/obj/item/reagent_containers/condiment/mayonnaise,
+/obj/item/reagent_containers/condiment/flour,
+/obj/item/reagent_containers/condiment/flour,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"JY" = (
+/obj/structure/flora/rock/style_random,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"Kd" = (
+/obj/structure/sign/warning/secure_area,
+/turf/closed/wall/mineral/sandstone,
+/area/virtual_domain/powered)
+"KH" = (
+/obj/structure/mineral_door/wood{
+ name = "Croupier's Booth"
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"KZ" = (
+/obj/structure/flora/bush/stalky/style_random,
+/turf/open/water/beach,
+/area/virtual_domain/powered)
+"LD" = (
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"LW" = (
+/obj/item/storage/cans/sixbeer,
+/turf/open/floor/carpet/orange,
+/area/virtual_domain/powered)
+"Mp" = (
+/obj/structure/table/wood,
+/obj/item/reagent_containers/cup/glass/drinkingglass/virtual_domain{
+ pixel_y = 7;
+ pixel_x = 4
+ },
+/obj/item/reagent_containers/cup/glass/drinkingglass/virtual_domain,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Mw" = (
+/obj/structure/chair/sofa/right/brown,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Mz" = (
+/obj/structure/chair/sofa/left/brown,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Nr" = (
+/obj/machinery/light/directional/north,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"Nw" = (
+/obj/item/bedsheet/dorms{
+ dir = 4
+ },
+/obj/structure/bed{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"NM" = (
+/obj/structure/closet/crate/hydroponics,
+/obj/item/food/grown/ambrosia/vulgaris,
+/obj/item/food/grown/ambrosia/vulgaris,
+/obj/item/food/grown/ambrosia/vulgaris,
+/obj/item/food/grown/ambrosia/vulgaris,
+/obj/item/food/grown/ambrosia/vulgaris,
+/obj/item/food/grown/ambrosia/vulgaris,
+/obj/item/food/grown/ambrosia/vulgaris,
+/obj/item/food/grown/ambrosia/vulgaris,
+/obj/item/food/grown/ambrosia/vulgaris,
+/obj/item/food/grown/ambrosia/vulgaris,
+/turf/open/floor/iron/grimy,
+/area/virtual_domain/powered)
+"NX" = (
+/obj/effect/landmark/bitrunning/loot_signal,
+/turf/open/floor/light/colour_cycle/dancefloor_a,
+/area/virtual_domain/powered)
+"OE" = (
+/obj/effect/mob_spawn/ghost_role/human/beach{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"OK" = (
+/obj/structure/sign/warning/gas_mask/directional/north,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"OR" = (
+/obj/machinery/light/directional/south,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"OW" = (
+/obj/structure/sink/kitchen/directional/east{
+ desc = "A sink used for washing one's hands and face. It looks rusty and home-made";
+ name = "old sink"
+ },
+/turf/open/floor/pod/light,
+/area/virtual_domain/powered)
+"OZ" = (
+/obj/structure/marker_beacon/teal,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Pc" = (
+/obj/structure/chair/wood,
+/obj/machinery/light/directional/west,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"Pg" = (
+/obj/structure/sign/poster/official/high_class_martini/directional/west,
+/obj/effect/mob_spawn/ghost_role/human/bartender{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"PM" = (
+/obj/machinery/door/airlock/external/ruin,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Qb" = (
+/obj/machinery/griddle,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Qu" = (
+/obj/structure/curtain,
+/turf/open/floor/iron/white,
+/area/virtual_domain/powered)
+"QP" = (
+/obj/structure/extinguisher_cabinet/directional/north,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"QX" = (
+/obj/machinery/chem_dispenser/drinks/fullupgrade{
+ dir = 1
+ },
+/obj/structure/table/wood,
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Rx" = (
+/turf/open/floor/iron/stairs/medium,
+/area/virtual_domain/powered)
+"RL" = (
+/obj/structure/closet/cabinet,
+/obj/item/storage/backpack/duffelbag,
+/obj/item/clothing/under/shorts/purple,
+/obj/item/clothing/shoes/cookflops{
+ desc = "A very fashionable pair of flip flops.";
+ name = "flip-flops"
+ },
+/obj/item/clothing/glasses/sunglasses/big,
+/obj/item/clothing/neck/beads,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Sg" = (
+/obj/structure/flora/coconuts,
+/obj/machinery/light/directional/north,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"SB" = (
+/obj/machinery/door/airlock/sandstone{
+ name = "Resort Bathroom"
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"SD" = (
+/obj/machinery/door/airlock/sandstone{
+ name = "Bar Access"
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"SY" = (
+/obj/machinery/door/airlock/sandstone{
+ name = "Surfer Shack 2"
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"TG" = (
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"TJ" = (
+/obj/structure/fluff/beach_umbrella/security,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"TX" = (
+/obj/structure/sign/poster/contraband/ambrosia_vulgaris/directional/north,
+/turf/open/floor/iron/grimy,
+/area/virtual_domain/powered)
+"Ud" = (
+/obj/effect/turf_decal/sand,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"Uh" = (
+/turf/open/floor/iron/stairs/old,
+/area/virtual_domain/powered)
+"Uq" = (
+/obj/structure/weightmachine/weightlifter,
+/turf/open/floor/pod/dark,
+/area/virtual_domain/powered)
+"UU" = (
+/obj/structure/flora/bush/large/style_random,
+/obj/structure/flora/bush/jungle/a/style_random,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"Ve" = (
+/obj/machinery/processor,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"VA" = (
+/obj/machinery/computer/slot_machine,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"VH" = (
+/obj/machinery/light/directional/west,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"VX" = (
+/obj/structure/flora/bush/large/style_random,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"We" = (
+/obj/structure/table/wood,
+/obj/item/book/manual/wiki/cooking_to_serve_man,
+/obj/item/clothing/suit/apron/chef,
+/obj/item/clothing/head/utility/chefhat,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Wg" = (
+/obj/structure/dresser,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Ww" = (
+/turf/open/water/beach,
+/area/virtual_domain/powered)
+"WL" = (
+/obj/machinery/light/directional/north,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"WO" = (
+/obj/structure/flora/bush/jungle/a/style_random,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"WW" = (
+/obj/effect/turf_decal/sand,
+/obj/machinery/icecream_vat,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"WX" = (
+/obj/item/toy/plush/lizard_plushie/green{
+ name = "Soaks-The-Rays"
+ },
+/turf/open/floor/carpet/orange,
+/area/virtual_domain/powered)
+"Xt" = (
+/turf/open/misc/beach/coast/corner{
+ dir = 4
+ },
+/area/virtual_domain/powered)
+"Xv" = (
+/obj/structure/table/wood,
+/obj/structure/bedsheetbin,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"XL" = (
+/obj/machinery/light/directional/east,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"XM" = (
+/turf/open/misc/beach/coast,
+/area/virtual_domain/powered)
+"XP" = (
+/turf/open/floor/carpet/blue,
+/area/virtual_domain/powered)
+"XT" = (
+/obj/effect/turf_decal/sand,
+/obj/structure/sign/departments/botany/directional/south,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"Yi" = (
+/obj/structure/flora/bush/sparsegrass/style_random,
+/obj/item/toy/seashell,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"Yq" = (
+/obj/machinery/portable_atmospherics/canister/air,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"YI" = (
+/obj/machinery/door/airlock/maintenance{
+ name = "Supply Room"
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"YJ" = (
+/turf/open/floor/carpet/purple,
+/area/virtual_domain/powered)
+"YN" = (
+/obj/effect/turf_decal/sand,
+/obj/machinery/light/directional/west,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"Zb" = (
+/obj/structure/sign/poster/official/cohiba_robusto_ad/directional/west,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Zd" = (
+/obj/structure/sign/poster/contraband/space_cola/directional/north,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"Zg" = (
+/obj/structure/table,
+/obj/machinery/microwave,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Zt" = (
+/obj/structure/table/wood,
+/obj/item/reagent_containers/pill/morphine,
+/obj/item/storage/fancy/donut_box,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+
+(1,1,1) = {"
+pr
+pr
+pr
+pr
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+kv
+"}
+(2,1,1) = {"
+pr
+pr
+pr
+pr
+iz
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+iz
+"}
+(3,1,1) = {"
+pr
+pr
+pr
+pr
+iz
+Al
+gl
+gl
+gl
+gl
+gl
+Al
+Al
+gl
+gl
+gl
+gl
+gl
+Al
+Al
+gl
+gl
+gl
+Al
+gl
+gl
+gl
+gl
+Al
+Al
+gl
+gl
+gl
+Al
+Al
+gl
+gl
+gl
+gl
+Al
+iz
+"}
+(4,1,1) = {"
+pr
+pr
+pr
+pr
+iz
+Al
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+Al
+iz
+"}
+(5,1,1) = {"
+pr
+pr
+pr
+pr
+iz
+Al
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+zI
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+Al
+iz
+"}
+(6,1,1) = {"
+pr
+pr
+pr
+pr
+iz
+Al
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+OZ
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+Al
+iz
+"}
+(7,1,1) = {"
+pr
+pr
+pr
+pr
+iz
+Al
+gl
+gl
+gl
+An
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+ke
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+ml
+ml
+ml
+ml
+ml
+FM
+gl
+Al
+iz
+"}
+(8,1,1) = {"
+pr
+pr
+pr
+pr
+iz
+Al
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+ml
+ml
+ml
+ml
+ml
+ml
+gl
+Al
+iz
+"}
+(9,1,1) = {"
+pr
+pr
+pr
+pr
+iz
+Al
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+gl
+gl
+ml
+ml
+ml
+ml
+ml
+ml
+gl
+Al
+iz
+"}
+(10,1,1) = {"
+pr
+pr
+pr
+pr
+iz
+Al
+Al
+Al
+Al
+xb
+xb
+uc
+Al
+Al
+gl
+gl
+gl
+Al
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+Al
+gl
+gl
+ml
+ml
+ml
+ml
+ml
+ml
+gl
+Al
+iz
+"}
+(11,1,1) = {"
+iz
+iz
+iz
+iz
+iz
+Al
+Al
+Al
+Fn
+PM
+PM
+Fn
+Fn
+Al
+Al
+Al
+Fn
+Fn
+Fn
+Pc
+bf
+Bw
+Fn
+Ev
+Pg
+iR
+kG
+di
+Fn
+DL
+Al
+gl
+ml
+ml
+ml
+ml
+ml
+ml
+gl
+Al
+iz
+"}
+(12,1,1) = {"
+iz
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Fn
+pT
+LD
+LD
+Fn
+Fn
+Kd
+Fn
+Fn
+bQ
+cv
+wD
+Bw
+JY
+Fn
+db
+TG
+TG
+TG
+TG
+AP
+Fn
+Al
+gl
+ml
+ml
+ml
+ml
+ml
+ml
+gl
+Al
+iz
+"}
+(13,1,1) = {"
+iz
+Al
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+LD
+pT
+LD
+EC
+LD
+pT
+PM
+wD
+wD
+cv
+wD
+wD
+OR
+Fn
+ug
+TG
+TG
+TG
+TG
+QX
+Fn
+Al
+gl
+ml
+ml
+ml
+ml
+ml
+sT
+gl
+Al
+iz
+"}
+(14,1,1) = {"
+iz
+Al
+Fn
+VA
+kT
+Zb
+TG
+Fn
+Fn
+Fn
+yU
+LD
+Et
+LD
+LD
+PM
+wD
+wD
+wD
+wD
+wD
+qc
+Fn
+Fn
+SD
+Mp
+uq
+fc
+Fn
+Fn
+Al
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+Al
+iz
+"}
+(15,1,1) = {"
+iz
+Al
+Fn
+VA
+yX
+ag
+kT
+Br
+TG
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+Gz
+wD
+Bw
+rm
+wD
+wD
+wD
+Ii
+dx
+kn
+kn
+kn
+Aa
+Fn
+Al
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+Al
+iz
+"}
+(16,1,1) = {"
+iz
+Al
+Fn
+pC
+yX
+ag
+kT
+BJ
+kT
+Fn
+as
+ab
+Ir
+IP
+YN
+uV
+wD
+wD
+wD
+mG
+vv
+Bw
+wD
+Rx
+uU
+lS
+lS
+lS
+uU
+Fn
+Al
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+Al
+iz
+"}
+(17,1,1) = {"
+iz
+Al
+Fn
+Mw
+ag
+ag
+vp
+xk
+TG
+Fn
+Ud
+Ud
+bC
+Ud
+Ud
+wD
+IH
+wD
+wD
+Bw
+wD
+wD
+wD
+Rx
+uU
+lS
+NX
+lS
+cz
+Fn
+Al
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+Al
+iz
+"}
+(18,1,1) = {"
+iz
+Al
+Fn
+Mz
+TG
+TG
+Fn
+Fn
+KH
+Fn
+Zd
+wD
+wD
+Bw
+wD
+VX
+wD
+UU
+wD
+wD
+wD
+wD
+wD
+Rx
+uU
+lS
+lS
+lS
+uU
+Fn
+Al
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+Al
+iz
+"}
+(19,1,1) = {"
+iz
+Al
+Fn
+Fn
+tE
+tE
+Fn
+uV
+wD
+wD
+wD
+wD
+wD
+wD
+wD
+wD
+wD
+wD
+wD
+wD
+wD
+wD
+wD
+jc
+uU
+uU
+uU
+uU
+uU
+Fn
+Fn
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+gl
+Al
+iz
+"}
+(20,1,1) = {"
+iz
+Al
+Fn
+zU
+wD
+wD
+wD
+wD
+Dt
+Ud
+Ud
+Ud
+Ud
+Ud
+Ud
+Ud
+ys
+wD
+wD
+TJ
+wb
+wD
+wD
+vT
+gJ
+gJ
+gJ
+gJ
+gJ
+oE
+Fn
+gl
+gl
+Al
+Al
+gl
+gl
+Al
+gl
+Al
+iz
+"}
+(21,1,1) = {"
+iz
+Al
+Fn
+wD
+wD
+Bw
+wD
+wD
+BM
+BM
+BM
+We
+Zt
+BD
+Iv
+BM
+Db
+Nr
+wD
+yl
+ag
+wD
+wD
+XM
+KZ
+Ww
+Ww
+Ww
+cG
+dj
+Fn
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+iz
+"}
+(22,1,1) = {"
+iz
+Al
+Fn
+Fn
+wD
+wD
+wD
+wD
+BM
+Zg
+VH
+TG
+TG
+TG
+TG
+mX
+BM
+wD
+wD
+Au
+wD
+rT
+wD
+XM
+Ww
+Ww
+Ww
+Ww
+Ww
+dj
+Fn
+Al
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+"}
+(23,1,1) = {"
+iz
+Al
+xb
+Fn
+Cb
+wD
+JC
+wD
+BM
+HF
+TG
+JE
+BM
+aw
+TG
+TG
+ya
+wD
+wD
+YJ
+YJ
+wD
+wD
+XM
+Ww
+Ww
+Ww
+Ww
+Ww
+dj
+Fn
+Al
+iz
+pr
+pr
+pr
+pr
+pr
+pr
+pr
+xW
+"}
+(24,1,1) = {"
+iz
+Al
+xb
+Fn
+wD
+Gz
+WX
+wD
+BM
+Em
+TG
+mq
+ri
+Qb
+TG
+TG
+cb
+wD
+wD
+bQ
+wD
+wD
+wD
+XM
+Ww
+Ww
+KZ
+KZ
+Ww
+pZ
+Fn
+Al
+iz
+pr
+pr
+pr
+pr
+pr
+pr
+pr
+xW
+"}
+(25,1,1) = {"
+iz
+Al
+xb
+Fn
+OK
+Gz
+LW
+wD
+BM
+bS
+TG
+oP
+BM
+vq
+TG
+TG
+vN
+wD
+wD
+XP
+yB
+wD
+wD
+XM
+KZ
+Ww
+KZ
+gh
+Ww
+dj
+Fn
+Al
+iz
+pr
+pr
+pr
+pr
+pr
+pr
+pr
+xW
+"}
+(26,1,1) = {"
+iz
+Al
+xb
+Fn
+Sg
+wD
+wD
+wD
+BM
+Ve
+rc
+yi
+TG
+TG
+TG
+CO
+BM
+wD
+Yi
+XL
+wD
+wD
+wD
+XM
+Ww
+Ww
+Ww
+Ww
+Ww
+dj
+Fn
+Al
+iz
+pr
+pr
+pr
+pr
+pr
+pr
+pr
+xW
+"}
+(27,1,1) = {"
+iz
+Al
+Fn
+Fn
+Bw
+wD
+wD
+wD
+BM
+BM
+BM
+BM
+FY
+BM
+BM
+BM
+er
+wD
+GA
+xq
+jy
+wD
+wD
+XM
+Ww
+cG
+Ww
+Ww
+KZ
+dj
+Fn
+Al
+iz
+pr
+pr
+pr
+pr
+pr
+pr
+pr
+xW
+"}
+(28,1,1) = {"
+iz
+Al
+Fn
+Nr
+wD
+wD
+Bw
+wD
+YN
+Ud
+WW
+yv
+Ud
+Ud
+Ud
+Ud
+YN
+wD
+xR
+CA
+Uh
+wD
+qW
+XM
+Ww
+Ww
+Ww
+Ww
+Ww
+pZ
+Fn
+Al
+iz
+pr
+pr
+pr
+pr
+pr
+pr
+pr
+xW
+"}
+(29,1,1) = {"
+iz
+Al
+Fn
+wD
+wD
+wD
+wD
+wD
+wD
+wD
+wD
+wD
+wD
+wD
+wD
+wD
+wD
+wD
+wD
+wD
+wD
+Jt
+wD
+mP
+zn
+Bu
+Bu
+Bu
+Bu
+Xt
+Fn
+Al
+iz
+pr
+pr
+pr
+pr
+pr
+pr
+pr
+xW
+"}
+(30,1,1) = {"
+iz
+Al
+Fn
+Ds
+Ds
+Fn
+VX
+wD
+wD
+wD
+wD
+wD
+XL
+wD
+wD
+wD
+wD
+wD
+wD
+wD
+wD
+XT
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+Al
+iz
+pr
+pr
+pr
+pr
+pr
+pr
+pr
+xW
+"}
+(31,1,1) = {"
+iz
+Al
+Fn
+TG
+TG
+Fn
+Fn
+jl
+Fn
+Fn
+qR
+Fn
+Fn
+WO
+wD
+Bw
+wD
+wD
+wD
+wD
+bM
+Ud
+aE
+aE
+aE
+lq
+fr
+hk
+Fn
+Al
+Al
+Al
+iz
+pr
+pr
+pr
+pr
+pr
+pr
+pr
+xW
+"}
+(32,1,1) = {"
+iz
+Al
+Fn
+TG
+TG
+TG
+Fn
+Fn
+Fn
+dZ
+OE
+Nw
+Fn
+Fn
+qR
+Fn
+Fn
+wD
+wD
+wD
+Ae
+Ud
+zw
+xw
+Uq
+aE
+aE
+aE
+Fn
+Fn
+Al
+Al
+iz
+pr
+pr
+pr
+pr
+pr
+pr
+pr
+xW
+"}
+(33,1,1) = {"
+iz
+Al
+Fn
+EP
+TG
+TG
+TG
+TG
+hG
+TG
+TG
+TG
+Fn
+dZ
+OE
+Nw
+Fn
+Gz
+uV
+wD
+wD
+Ud
+xw
+xw
+xw
+aE
+aE
+aE
+OW
+Fn
+Fn
+Al
+iz
+pr
+pr
+pr
+pr
+pr
+pr
+pr
+xW
+"}
+(34,1,1) = {"
+iz
+Al
+Fn
+Xv
+TG
+hE
+TG
+TG
+Fn
+Wg
+rc
+xJ
+Fn
+TG
+TG
+dI
+Fn
+wD
+wD
+Bw
+wD
+lB
+zw
+xw
+Uq
+aE
+FQ
+aE
+aE
+jg
+Fn
+Al
+iz
+pr
+pr
+pr
+pr
+pr
+pr
+pr
+xW
+"}
+(35,1,1) = {"
+iz
+Al
+Fn
+Fn
+SB
+Fn
+WL
+TG
+Fn
+Fn
+Fn
+Fn
+Fn
+Wg
+TG
+RL
+Fn
+Gh
+Ud
+Ud
+Ud
+FS
+aE
+aE
+aE
+aE
+AI
+BQ
+aE
+NM
+Fn
+Al
+iz
+pr
+pr
+pr
+pr
+pr
+pr
+pr
+xW
+"}
+(36,1,1) = {"
+iz
+Al
+Fn
+kK
+TG
+Fn
+TG
+TG
+TG
+TG
+qg
+TG
+Fn
+Fn
+SY
+Fn
+Fn
+Ds
+Ds
+Fn
+YI
+Fn
+Fn
+Fn
+TX
+aE
+aE
+aE
+aE
+uk
+Fn
+Al
+iz
+pr
+pr
+pr
+pr
+pr
+pr
+pr
+xW
+"}
+(37,1,1) = {"
+iz
+Al
+Fn
+Ia
+dI
+Fn
+Fn
+Fn
+QP
+TG
+TG
+TG
+TG
+TG
+TG
+TG
+TG
+TG
+TG
+Fn
+ve
+nP
+ed
+Fn
+Cv
+Cv
+IM
+Cv
+Cv
+Fn
+Fn
+Al
+iz
+pr
+pr
+pr
+pr
+pr
+pr
+pr
+xW
+"}
+(38,1,1) = {"
+iz
+Al
+Fn
+tZ
+TG
+Qu
+Hs
+Fn
+Fn
+Fn
+TG
+rc
+TG
+TG
+TG
+tF
+rc
+TG
+TG
+Fn
+Yq
+aZ
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+Al
+Al
+iz
+pr
+pr
+pr
+pr
+pr
+pr
+pr
+xW
+"}
+(39,1,1) = {"
+iz
+Al
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+Al
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+Fn
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+iz
+pr
+pr
+pr
+pr
+pr
+pr
+pr
+xW
+"}
+(40,1,1) = {"
+iz
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+Al
+iz
+pr
+pr
+pr
+pr
+pr
+pr
+pr
+xW
+"}
+(41,1,1) = {"
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+iz
+pr
+pr
+pr
+pr
+pr
+pr
+pr
+xW
+"}
diff --git a/_maps/virtual_domains/blood_drunk_miner.dmm b/_maps/virtual_domains/blood_drunk_miner.dmm
new file mode 100644
index 00000000000..c3369a1c822
--- /dev/null
+++ b/_maps/virtual_domains/blood_drunk_miner.dmm
@@ -0,0 +1,1887 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"b" = (
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"c" = (
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"d" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/closed/indestructible/binary,
+/area/lavaland/surface/outdoors/virtual_domain)
+"f" = (
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile/block/cracked,
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"h" = (
+/obj/machinery/light/small/blacklight/directional/south,
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/virtual_domain/powered)
+"i" = (
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile/cracked,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"j" = (
+/obj/structure/marker_beacon/jade,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"k" = (
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"l" = (
+/obj/structure/stone_tile/block,
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"m" = (
+/obj/structure/marker_beacon/olive,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"n" = (
+/obj/structure/marker_beacon/cerulean,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"o" = (
+/obj/structure/marker_beacon/yellow,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"q" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"r" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"s" = (
+/turf/closed/mineral/volcanic/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"t" = (
+/obj/structure/marker_beacon/indigo,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"u" = (
+/obj/structure/stone_tile/cracked,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"v" = (
+/turf/closed/indestructible/binary,
+/area/lavaland/surface/outdoors/virtual_domain)
+"w" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"x" = (
+/obj/structure/stone_tile,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"y" = (
+/obj/structure/marker_beacon/violet,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"z" = (
+/obj/structure/stone_tile/block,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"A" = (
+/obj/structure/stone_tile,
+/obj/structure/stone_tile/block/cracked{
+ dir = 8
+ },
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"C" = (
+/obj/effect/mob_spawn/corpse/human/miner,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"G" = (
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"H" = (
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"I" = (
+/obj/structure/stone_tile/block{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"J" = (
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"K" = (
+/obj/structure/marker_beacon/teal,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"L" = (
+/obj/effect/landmark/bitrunning/safehouse_spawn,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"O" = (
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"P" = (
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"S" = (
+/obj/structure/stone_tile/surrounding/cracked{
+ dir = 6
+ },
+/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/virtual_domain,
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"T" = (
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"W" = (
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"X" = (
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Y" = (
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Z" = (
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+
+(1,1,1) = {"
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+d
+"}
+(2,1,1) = {"
+v
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+v
+"}
+(3,1,1) = {"
+v
+s
+s
+s
+s
+J
+J
+s
+s
+J
+J
+s
+s
+J
+J
+J
+J
+s
+s
+s
+J
+J
+J
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+J
+J
+s
+s
+s
+J
+J
+s
+s
+J
+J
+s
+v
+"}
+(4,1,1) = {"
+v
+s
+s
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+a
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+s
+v
+"}
+(5,1,1) = {"
+v
+s
+s
+J
+a
+J
+J
+J
+J
+a
+J
+J
+J
+J
+a
+a
+J
+J
+J
+J
+J
+a
+a
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+s
+s
+v
+"}
+(6,1,1) = {"
+v
+s
+s
+J
+a
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+a
+a
+a
+a
+a
+J
+J
+J
+a
+a
+J
+J
+J
+a
+a
+J
+a
+J
+a
+a
+J
+J
+J
+s
+s
+v
+"}
+(7,1,1) = {"
+v
+s
+s
+J
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+J
+J
+s
+v
+"}
+(8,1,1) = {"
+v
+s
+s
+J
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+J
+s
+s
+v
+"}
+(9,1,1) = {"
+v
+s
+J
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+j
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+J
+s
+v
+"}
+(10,1,1) = {"
+v
+s
+J
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+t
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+J
+s
+v
+"}
+(11,1,1) = {"
+v
+s
+s
+J
+J
+J
+a
+a
+a
+y
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+J
+s
+v
+"}
+(12,1,1) = {"
+v
+s
+s
+J
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+C
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+J
+J
+s
+v
+"}
+(13,1,1) = {"
+v
+s
+s
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+J
+s
+v
+"}
+(14,1,1) = {"
+v
+s
+s
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+T
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+J
+s
+v
+"}
+(15,1,1) = {"
+v
+s
+J
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+X
+z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+h
+c
+c
+c
+c
+c
+L
+a
+a
+J
+J
+s
+v
+"}
+(16,1,1) = {"
+v
+s
+J
+J
+J
+J
+a
+a
+a
+a
+a
+a
+a
+T
+W
+a
+r
+a
+i
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+c
+c
+c
+c
+c
+c
+a
+a
+J
+J
+s
+v
+"}
+(17,1,1) = {"
+v
+s
+s
+J
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+I
+b
+k
+l
+x
+a
+T
+k
+a
+a
+a
+m
+a
+a
+a
+a
+a
+o
+a
+a
+c
+c
+c
+c
+c
+c
+a
+a
+J
+J
+s
+v
+"}
+(18,1,1) = {"
+v
+s
+s
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+P
+S
+A
+O
+u
+r
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+c
+c
+c
+c
+c
+c
+a
+J
+J
+s
+s
+v
+"}
+(19,1,1) = {"
+v
+s
+J
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+k
+G
+H
+x
+f
+k
+a
+Y
+T
+u
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+c
+c
+c
+c
+c
+c
+a
+a
+J
+J
+s
+v
+"}
+(20,1,1) = {"
+v
+s
+J
+J
+J
+J
+a
+a
+a
+a
+a
+a
+a
+Y
+x
+a
+Z
+a
+z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+c
+c
+c
+c
+c
+c
+a
+a
+J
+J
+s
+v
+"}
+(21,1,1) = {"
+v
+s
+s
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+h
+c
+c
+c
+c
+c
+q
+a
+a
+J
+s
+s
+v
+"}
+(22,1,1) = {"
+v
+s
+s
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+w
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+s
+s
+v
+"}
+(23,1,1) = {"
+v
+s
+J
+J
+a
+a
+a
+a
+a
+a
+n
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+s
+s
+v
+"}
+(24,1,1) = {"
+v
+s
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+C
+a
+a
+a
+a
+a
+J
+J
+s
+v
+"}
+(25,1,1) = {"
+v
+s
+s
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+J
+J
+s
+v
+"}
+(26,1,1) = {"
+v
+s
+s
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+K
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+J
+s
+v
+"}
+(27,1,1) = {"
+v
+s
+s
+J
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+j
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+J
+s
+v
+"}
+(28,1,1) = {"
+v
+s
+J
+J
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+J
+J
+s
+v
+"}
+(29,1,1) = {"
+v
+s
+J
+J
+J
+J
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+J
+J
+s
+s
+v
+"}
+(30,1,1) = {"
+v
+s
+s
+J
+J
+J
+J
+a
+a
+J
+J
+J
+a
+a
+a
+a
+J
+J
+J
+a
+a
+a
+J
+J
+J
+a
+a
+a
+J
+J
+a
+a
+a
+a
+a
+a
+J
+J
+a
+a
+a
+J
+J
+s
+s
+v
+"}
+(31,1,1) = {"
+v
+s
+s
+a
+J
+J
+J
+J
+J
+J
+J
+J
+J
+a
+a
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+a
+a
+a
+J
+J
+J
+J
+J
+J
+J
+J
+J
+s
+v
+"}
+(32,1,1) = {"
+v
+s
+s
+a
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+a
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+J
+s
+v
+"}
+(33,1,1) = {"
+v
+s
+s
+s
+s
+s
+J
+J
+s
+s
+s
+s
+J
+J
+s
+s
+s
+s
+s
+s
+J
+J
+s
+s
+s
+s
+J
+J
+s
+s
+s
+s
+J
+J
+J
+s
+s
+s
+s
+s
+s
+J
+J
+J
+s
+v
+"}
+(34,1,1) = {"
+v
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+s
+v
+"}
+(35,1,1) = {"
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+"}
diff --git a/_maps/virtual_domains/bubblegum.dmm b/_maps/virtual_domains/bubblegum.dmm
new file mode 100644
index 00000000000..3381b173539
--- /dev/null
+++ b/_maps/virtual_domains/bubblegum.dmm
@@ -0,0 +1,2250 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"c" = (
+/obj/effect/mob_spawn/corpse/human/miner,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"d" = (
+/obj/structure/marker_beacon/jade,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"f" = (
+/obj/structure/marker_beacon/burgundy,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"g" = (
+/obj/structure/marker_beacon/teal,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"p" = (
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"r" = (
+/obj/structure/marker_beacon/fuchsia,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"w" = (
+/obj/machinery/light/small/blacklight/directional/south,
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/virtual_domain/powered)
+"x" = (
+/obj/structure/marker_beacon/olive,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"z" = (
+/obj/structure/marker_beacon/purple,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"A" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"C" = (
+/mob/living/simple_animal/hostile/megafauna/bubblegum/virtual_domain,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"F" = (
+/turf/open/indestructible/binary,
+/area/lavaland/surface/outdoors/virtual_domain)
+"G" = (
+/obj/structure/marker_beacon/violet,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"I" = (
+/obj/structure/marker_beacon/bronze,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"M" = (
+/obj/structure/marker_beacon/indigo,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"R" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/open/indestructible/binary,
+/area/lavaland/surface/outdoors/virtual_domain)
+"S" = (
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"T" = (
+/obj/effect/landmark/bitrunning/safehouse_spawn,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"W" = (
+/obj/structure/marker_beacon/cerulean,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"X" = (
+/obj/structure/marker_beacon/lime,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Y" = (
+/obj/structure/marker_beacon/yellow,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Z" = (
+/turf/closed/mineral/volcanic/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+
+(1,1,1) = {"
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+R
+"}
+(2,1,1) = {"
+F
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+F
+"}
+(3,1,1) = {"
+F
+Z
+a
+a
+Z
+Z
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+Z
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+Z
+a
+a
+a
+a
+a
+a
+Z
+Z
+Z
+F
+"}
+(4,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+F
+"}
+(5,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+p
+Z
+F
+"}
+(6,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+G
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+p
+p
+Z
+F
+"}
+(7,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+x
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+a
+a
+a
+a
+p
+Z
+F
+"}
+(8,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+Z
+a
+a
+a
+Z
+Z
+F
+"}
+(9,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+a
+p
+p
+p
+p
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+Z
+F
+"}
+(10,1,1) = {"
+F
+Z
+Z
+a
+a
+a
+a
+a
+Z
+Z
+Z
+p
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+Z
+F
+"}
+(11,1,1) = {"
+F
+Z
+Z
+a
+a
+a
+a
+a
+Z
+Z
+Z
+p
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+p
+p
+a
+a
+a
+a
+a
+Z
+F
+"}
+(12,1,1) = {"
+F
+Z
+Z
+a
+a
+a
+a
+a
+p
+Z
+p
+p
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+Z
+a
+a
+a
+a
+a
+a
+a
+p
+a
+a
+a
+a
+a
+Z
+F
+"}
+(13,1,1) = {"
+F
+Z
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+Z
+Z
+a
+a
+a
+a
+a
+M
+a
+a
+a
+a
+a
+a
+a
+Z
+F
+"}
+(14,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+Z
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+F
+"}
+(15,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+c
+a
+a
+a
+a
+a
+a
+Z
+F
+"}
+(16,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+I
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+F
+"}
+(17,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+W
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+F
+"}
+(18,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+F
+"}
+(19,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+F
+"}
+(20,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+F
+"}
+(21,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+w
+S
+S
+S
+S
+S
+T
+a
+Z
+F
+"}
+(22,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+S
+S
+S
+S
+S
+S
+a
+Z
+F
+"}
+(23,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+C
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+S
+S
+S
+S
+S
+S
+a
+Z
+F
+"}
+(24,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+X
+a
+a
+S
+S
+S
+S
+S
+S
+a
+Z
+F
+"}
+(25,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+S
+S
+S
+S
+S
+S
+a
+Z
+F
+"}
+(26,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+S
+S
+S
+S
+S
+S
+a
+Z
+F
+"}
+(27,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+w
+S
+S
+S
+S
+S
+A
+a
+Z
+F
+"}
+(28,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+f
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+F
+"}
+(29,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+a
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+r
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+F
+"}
+(30,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+a
+Z
+Z
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+F
+"}
+(31,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+a
+Z
+Z
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+F
+"}
+(32,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+a
+a
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+F
+"}
+(33,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+d
+a
+a
+a
+a
+a
+a
+a
+Z
+F
+"}
+(34,1,1) = {"
+F
+Z
+Z
+a
+a
+a
+a
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+F
+"}
+(35,1,1) = {"
+F
+Z
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+X
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+Z
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+F
+"}
+(36,1,1) = {"
+F
+Z
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+Z
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+F
+"}
+(37,1,1) = {"
+F
+Z
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+Z
+F
+"}
+(38,1,1) = {"
+F
+Z
+a
+a
+a
+p
+p
+a
+a
+a
+a
+a
+g
+a
+a
+a
+a
+Z
+a
+a
+a
+a
+a
+a
+p
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+Z
+F
+"}
+(39,1,1) = {"
+F
+Z
+a
+a
+a
+p
+p
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+Z
+Z
+a
+a
+a
+a
+a
+p
+p
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+F
+"}
+(40,1,1) = {"
+F
+Z
+a
+c
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+F
+"}
+(41,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Y
+a
+a
+a
+a
+a
+a
+a
+Z
+F
+"}
+(42,1,1) = {"
+F
+Z
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+Z
+F
+"}
+(43,1,1) = {"
+F
+Z
+a
+Z
+Z
+Z
+Z
+a
+a
+a
+a
+a
+Z
+Z
+Z
+Z
+a
+a
+a
+Z
+Z
+Z
+Z
+Z
+a
+a
+a
+a
+a
+a
+Z
+Z
+Z
+Z
+a
+a
+a
+a
+a
+a
+Z
+Z
+a
+a
+Z
+F
+"}
+(44,1,1) = {"
+F
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+Z
+F
+"}
+(45,1,1) = {"
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+F
+"}
diff --git a/_maps/virtual_domains/clown_planet.dmm b/_maps/virtual_domains/clown_planet.dmm
new file mode 100644
index 00000000000..01d7b88a5ef
--- /dev/null
+++ b/_maps/virtual_domains/clown_planet.dmm
@@ -0,0 +1,2323 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"ai" = (
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/light/small/directional/west,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"aI" = (
+/obj/item/bikehorn/airhorn,
+/turf/open/floor/carpet,
+/area/virtual_domain/powered)
+"aM" = (
+/obj/item/bikehorn,
+/turf/open/indestructible/honk,
+/area/virtual_domain/powered)
+"aP" = (
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/obj/effect/decal/cleanable/food/pie_smudge,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"ba" = (
+/obj/structure/mecha_wreckage/honker,
+/obj/structure/disposalpipe/segment{
+ dir = 4;
+ invisibility = 101
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"bi" = (
+/obj/item/bikehorn,
+/obj/structure/disposalpipe/segment{
+ invisibility = 101
+ },
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"bp" = (
+/turf/open/indestructible/light,
+/area/virtual_domain/powered)
+"bq" = (
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/turf/open/indestructible/white,
+/area/virtual_domain/powered)
+"by" = (
+/turf/closed/wall/r_wall,
+/area/lavaland/surface/outdoors/virtual_domain)
+"bQ" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4;
+ invisibility = 101
+ },
+/obj/effect/turf_decal/tile/red/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"bR" = (
+/obj/item/paper/crumpled/bloody/ruins/lavaland/clown_planet/hope,
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/mapping_helpers/no_lava,
+/turf/open/floor/noslip,
+/area/virtual_domain/powered)
+"bU" = (
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"cw" = (
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"cM" = (
+/obj/structure/disposalpipe/trunk{
+ dir = 8
+ },
+/obj/structure/disposaloutlet{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"cW" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/disposalpipe/segment{
+ invisibility = 101
+ },
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"ed" = (
+/obj/structure/disposalpipe/segment{
+ invisibility = 101
+ },
+/obj/machinery/light/small/directional/west,
+/turf/open/indestructible/white,
+/area/virtual_domain/powered)
+"eE" = (
+/obj/structure/window/reinforced/spawner/directional/south,
+/obj/structure/disposalpipe/segment{
+ invisibility = 101
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"fh" = (
+/obj/effect/mob_spawn/corpse/human/damaged,
+/obj/effect/decal/cleanable/blood/old,
+/obj/structure/disposalpipe/segment{
+ invisibility = 101
+ },
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"gr" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"gy" = (
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"gH" = (
+/obj/item/bikehorn,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/indestructible/honk,
+/area/virtual_domain/powered)
+"gK" = (
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/turf/open/indestructible/white,
+/area/virtual_domain/powered)
+"hK" = (
+/obj/item/clothing/head/cone,
+/obj/effect/mapping_helpers/no_lava,
+/turf/open/floor/noslip,
+/area/virtual_domain/powered)
+"hY" = (
+/turf/template_noop,
+/area/template_noop)
+"ij" = (
+/obj/structure/disposalpipe/trunk{
+ dir = 8
+ },
+/obj/machinery/disposal/delivery_chute{
+ dir = 4
+ },
+/turf/open/floor/noslip,
+/area/virtual_domain/powered)
+"ik" = (
+/turf/open/lava/smooth,
+/area/virtual_domain/powered)
+"iR" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4;
+ invisibility = 101
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"ki" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4;
+ invisibility = 101
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"kn" = (
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"lj" = (
+/obj/structure/disposalpipe/trunk{
+ dir = 4
+ },
+/obj/machinery/disposal/delivery_chute{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"lm" = (
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/obj/machinery/light/small/directional/east,
+/turf/open/indestructible/white,
+/area/virtual_domain/powered)
+"lr" = (
+/obj/item/bikehorn,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/disposalpipe/segment{
+ invisibility = 101
+ },
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"lx" = (
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"ly" = (
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/turf/closed/indestructible/binary,
+/area/lavaland/surface/outdoors/virtual_domain)
+"lP" = (
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"mD" = (
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"mE" = (
+/obj/structure/disposalpipe/segment,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"mF" = (
+/turf/open/floor/carpet,
+/area/virtual_domain/powered)
+"nE" = (
+/obj/effect/mapping_helpers/no_lava,
+/turf/closed/wall/r_wall,
+/area/virtual_domain/powered)
+"oA" = (
+/obj/effect/turf_decal/tile/red/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"oI" = (
+/obj/structure/table/glass,
+/obj/item/grown/bananapeel/bluespace,
+/turf/open/floor/carpet,
+/area/virtual_domain/powered)
+"pl" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"ps" = (
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/obj/effect/turf_decal/tile/red/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"qM" = (
+/obj/structure/disposalpipe/segment{
+ invisibility = 101
+ },
+/obj/machinery/light/small/directional/north,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"rg" = (
+/obj/item/coin/bananium,
+/obj/item/coin/bananium,
+/obj/item/coin/bananium,
+/obj/item/coin/bananium,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/carpet,
+/area/virtual_domain/powered)
+"rh" = (
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/turf/open/indestructible/white,
+/area/virtual_domain/powered)
+"rr" = (
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
+/turf/closed/indestructible/binary,
+/area/lavaland/surface/outdoors/virtual_domain)
+"rH" = (
+/obj/structure/disposalpipe/junction/yjunction{
+ dir = 1;
+ invisibility = 101
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"rT" = (
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/turf/closed/indestructible/binary,
+/area/lavaland/surface/outdoors/virtual_domain)
+"sq" = (
+/obj/machinery/light/directional/north,
+/obj/effect/turf_decal/tile/red/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"sT" = (
+/obj/structure/disposalpipe/sorting/mail/flip{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/mail_sorting/supply/qm_office,
+/turf/closed/wall/r_wall,
+/area/virtual_domain/powered)
+"tq" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"tt" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4;
+ invisibility = 101
+ },
+/turf/open/indestructible/light,
+/area/virtual_domain/powered)
+"tv" = (
+/obj/effect/mob_spawn/corpse/human/damaged,
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"tF" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/closed/indestructible/binary,
+/area/lavaland/surface/outdoors/virtual_domain)
+"tI" = (
+/obj/item/coin/bananium,
+/obj/item/coin/bananium,
+/obj/item/coin/bananium,
+/obj/item/coin/bananium,
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/carpet,
+/area/virtual_domain/powered)
+"uX" = (
+/obj/effect/mapping_helpers/no_lava,
+/mob/living/basic/clown,
+/turf/open/floor/noslip,
+/area/virtual_domain/powered)
+"uY" = (
+/turf/closed/mineral/bananium,
+/area/virtual_domain/powered)
+"uZ" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4;
+ invisibility = 101
+ },
+/obj/structure/table,
+/obj/item/paper/crumpled/bloody/ruins/lavaland/clown_planet/escape,
+/obj/item/pen/fourcolor,
+/turf/open/indestructible/white,
+/area/virtual_domain/powered)
+"wz" = (
+/obj/machinery/light/small/directional/south,
+/obj/effect/mapping_helpers/no_lava,
+/mob/living/basic/clown,
+/turf/open/floor/noslip,
+/area/virtual_domain/powered)
+"xt" = (
+/obj/effect/landmark/bitrunning/safehouse_spawn,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"yd" = (
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"yz" = (
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/turf/closed/wall/r_wall,
+/area/virtual_domain/powered)
+"yS" = (
+/obj/structure/marker_beacon/yellow,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"yZ" = (
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"zm" = (
+/obj/effect/decal/cleanable/cobweb,
+/obj/effect/turf_decal/tile/red/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"zA" = (
+/obj/structure/statue/bananium/clown,
+/turf/open/floor/carpet,
+/area/virtual_domain/powered)
+"zF" = (
+/obj/structure/disposalpipe/trunk{
+ dir = 4
+ },
+/obj/structure/disposaloutlet{
+ dir = 8
+ },
+/turf/open/floor/noslip,
+/area/virtual_domain/powered)
+"Aa" = (
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/obj/effect/turf_decal/tile/red/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"Bi" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4;
+ invisibility = 101
+ },
+/obj/effect/decal/cleanable/cobweb,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"Cp" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4;
+ invisibility = 101
+ },
+/obj/machinery/light/small/directional/west,
+/turf/open/indestructible/white,
+/area/virtual_domain/powered)
+"Cs" = (
+/obj/item/bikehorn,
+/obj/structure/disposalpipe/segment{
+ dir = 4;
+ invisibility = 101
+ },
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"Dh" = (
+/turf/closed/wall/r_wall,
+/area/virtual_domain/powered)
+"Do" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4;
+ invisibility = 101
+ },
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"DL" = (
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
+/obj/item/bikehorn,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"Ex" = (
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"FI" = (
+/obj/item/reagent_containers/cup/glass/trophy/gold_cup,
+/obj/structure/table/glass,
+/turf/open/floor/carpet,
+/area/virtual_domain/powered)
+"Gg" = (
+/obj/structure/table/glass,
+/obj/item/gun/magic/staff/honk,
+/turf/open/floor/carpet,
+/area/virtual_domain/powered)
+"Hq" = (
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Hr" = (
+/obj/structure/table/glass,
+/obj/item/clothing/shoes/clown_shoes/banana_shoes,
+/turf/open/floor/carpet,
+/area/virtual_domain/powered)
+"HQ" = (
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/obj/machinery/light/small/directional/east,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"Ie" = (
+/turf/closed/indestructible/binary,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Iz" = (
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"IN" = (
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/turf/closed/wall/r_wall,
+/area/virtual_domain/powered)
+"IY" = (
+/turf/open/indestructible/honk,
+/area/virtual_domain/powered)
+"Jv" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/indestructible/honk,
+/area/virtual_domain/powered)
+"JB" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4;
+ invisibility = 101
+ },
+/obj/machinery/light/small/directional/north,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"Ka" = (
+/obj/effect/decal/cleanable/food/pie_smudge,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"Kh" = (
+/obj/effect/mob_spawn/corpse/human/damaged,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/indestructible/honk,
+/area/virtual_domain/powered)
+"KG" = (
+/obj/item/pickaxe,
+/turf/open/indestructible/white,
+/area/virtual_domain/powered)
+"KI" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4;
+ invisibility = 101
+ },
+/turf/closed/wall/r_wall,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Lv" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4;
+ invisibility = 101
+ },
+/obj/machinery/light/small/directional/east,
+/turf/open/indestructible/white,
+/area/virtual_domain/powered)
+"Nv" = (
+/obj/effect/decal/cleanable/cobweb,
+/turf/open/indestructible/honk,
+/area/virtual_domain/powered)
+"NB" = (
+/obj/machinery/disposal/delivery_chute,
+/obj/structure/disposalpipe/trunk{
+ dir = 1
+ },
+/turf/open/floor/carpet,
+/area/virtual_domain/powered)
+"NL" = (
+/obj/machinery/disposal/delivery_chute{
+ desc = "The following is engraved upon the chute: A FATE WORSE THAN DEATH LIES WITHIN";
+ dir = 1;
+ name = "THE TRIAL OF HONKITUDE"
+ },
+/obj/structure/disposalpipe/trunk,
+/obj/effect/mapping_helpers/no_lava,
+/turf/open/floor/noslip,
+/area/virtual_domain/powered)
+"NW" = (
+/obj/structure/table/glass,
+/obj/item/reagent_containers/spray/waterflower/superlube,
+/turf/open/floor/carpet,
+/area/virtual_domain/powered)
+"Ok" = (
+/obj/item/bikehorn,
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"Ov" = (
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"PJ" = (
+/obj/structure/disposalpipe/trunk,
+/obj/structure/disposaloutlet{
+ dir = 1
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/open/floor/noslip,
+/area/virtual_domain/powered)
+"PM" = (
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"PQ" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4;
+ invisibility = 101
+ },
+/obj/item/pickaxe,
+/turf/open/indestructible/white,
+/area/virtual_domain/powered)
+"QP" = (
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"QX" = (
+/obj/structure/closet/crate/secure/bitrunning/encrypted,
+/turf/open/floor/carpet,
+/area/virtual_domain/powered)
+"Rh" = (
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
+/turf/open/indestructible/white,
+/area/virtual_domain/powered)
+"Rx" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4;
+ invisibility = 101
+ },
+/obj/structure/table,
+/obj/item/flashlight/lamp/bananalamp,
+/turf/open/indestructible/white,
+/area/virtual_domain/powered)
+"RU" = (
+/obj/structure/disposalpipe/segment{
+ invisibility = 101
+ },
+/turf/closed/indestructible/binary,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Sg" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4;
+ invisibility = 101
+ },
+/obj/effect/decal/cleanable/food/pie_smudge,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"Sm" = (
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
+/turf/closed/wall/r_wall,
+/area/virtual_domain/powered)
+"Tm" = (
+/obj/effect/decal/cleanable/food/pie_smudge,
+/obj/structure/disposalpipe/segment{
+ invisibility = 101
+ },
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"Tx" = (
+/obj/structure/disposalpipe/segment{
+ invisibility = 101
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"TH" = (
+/obj/structure/disposalpipe/trunk{
+ dir = 4
+ },
+/obj/structure/disposaloutlet{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"TK" = (
+/obj/structure/disposalpipe/segment{
+ invisibility = 101
+ },
+/turf/closed/wall/r_wall,
+/area/virtual_domain/powered)
+"Ug" = (
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/carpet,
+/area/virtual_domain/powered)
+"UL" = (
+/obj/effect/decal/cleanable/oil,
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"UN" = (
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"UQ" = (
+/obj/structure/disposalpipe/segment{
+ invisibility = 101
+ },
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"UY" = (
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"Vv" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4;
+ invisibility = 101
+ },
+/turf/closed/wall/r_wall,
+/area/virtual_domain/powered)
+"Vx" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4;
+ invisibility = 101
+ },
+/turf/closed/indestructible/binary,
+/area/lavaland/surface/outdoors/virtual_domain)
+"VI" = (
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/turf/closed/indestructible/binary,
+/area/lavaland/surface/outdoors/virtual_domain)
+"VQ" = (
+/turf/open/floor/noslip,
+/area/virtual_domain/powered)
+"Ww" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4;
+ invisibility = 101
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/turf/open/indestructible/permalube,
+/area/virtual_domain/powered)
+"WB" = (
+/obj/machinery/disposal/delivery_chute{
+ dir = 1
+ },
+/obj/structure/disposalpipe/trunk,
+/turf/open/indestructible/white,
+/area/virtual_domain/powered)
+"WT" = (
+/obj/machinery/door/airlock/bananium,
+/turf/open/indestructible/honk,
+/area/virtual_domain/powered)
+"WX" = (
+/turf/open/indestructible/white,
+/area/virtual_domain/powered)
+"Xp" = (
+/obj/machinery/light/directional/south,
+/turf/open/indestructible/honk,
+/area/virtual_domain/powered)
+"XB" = (
+/obj/machinery/light/directional/north,
+/turf/open/indestructible/honk,
+/area/virtual_domain/powered)
+"Yb" = (
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/turf/open/indestructible/honk,
+/area/virtual_domain/powered)
+"YP" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4;
+ invisibility = 101
+ },
+/turf/open/indestructible/white,
+/area/virtual_domain/powered)
+"ZR" = (
+/obj/structure/disposalpipe/trunk{
+ dir = 8
+ },
+/obj/structure/disposaloutlet{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+
+(1,1,1) = {"
+Ie
+Ie
+rT
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+rr
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+"}
+(2,1,1) = {"
+Ie
+Ie
+Vx
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Vx
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+"}
+(3,1,1) = {"
+Ie
+Ie
+Vx
+Ie
+Ie
+Ie
+Ie
+Ie
+Dh
+Dh
+Dh
+Dh
+Dh
+Dh
+Dh
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Dh
+Dh
+Dh
+Dh
+Dh
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Vx
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+"}
+(4,1,1) = {"
+Ie
+Ie
+Vx
+Ie
+Ie
+Ie
+Dh
+Dh
+Dh
+ik
+ik
+ik
+ik
+ik
+Dh
+Dh
+Ie
+Ie
+Ie
+Ie
+Ie
+Dh
+Dh
+ik
+ik
+ik
+Dh
+Dh
+Dh
+Ie
+Ie
+Ie
+Ie
+Vx
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+"}
+(5,1,1) = {"
+Ie
+Ie
+Vx
+Ie
+Ie
+Dh
+Dh
+ik
+ik
+ik
+Hq
+Sm
+Hq
+Sm
+ik
+Dh
+Dh
+Ie
+Ie
+Ie
+Dh
+Dh
+ik
+ik
+tq
+mD
+ik
+ik
+Dh
+Dh
+Ie
+Ie
+Ie
+Vx
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+"}
+(6,1,1) = {"
+Ie
+Ie
+Vx
+Ie
+Dh
+Dh
+ik
+ik
+IN
+Tx
+bU
+ai
+yZ
+aP
+Sm
+ik
+Dh
+Dh
+Dh
+Dh
+Dh
+Nv
+IY
+tq
+ik
+ik
+ik
+ik
+ik
+Dh
+Dh
+Ie
+Ie
+Vx
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+"}
+(7,1,1) = {"
+Ie
+Ie
+Vx
+Ie
+Dh
+ik
+ik
+Dh
+Bi
+cw
+UQ
+lr
+UQ
+UY
+Vv
+ik
+Dh
+IY
+Jv
+IY
+Dh
+IY
+Jv
+Kh
+IY
+tq
+ik
+tq
+ik
+ik
+Dh
+Ie
+Ie
+Vx
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+"}
+(8,1,1) = {"
+Ie
+Ie
+Vx
+Dh
+Dh
+ik
+IN
+Tm
+lx
+Ww
+cw
+UQ
+Sm
+Vv
+Vv
+Dh
+zm
+oA
+IY
+Jv
+Jv
+IY
+Jv
+IY
+IY
+IY
+Dh
+ik
+mD
+ik
+Dh
+Dh
+Ie
+Vx
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+"}
+(9,1,1) = {"
+Ie
+Ie
+Vx
+Dh
+ik
+ik
+UN
+UQ
+UY
+Ww
+Vv
+TH
+Vv
+YP
+Cp
+uY
+Dh
+sq
+oA
+IY
+Dh
+Dh
+Jv
+Dh
+IY
+IY
+IY
+tq
+ik
+ik
+ik
+Dh
+Ie
+Vx
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+tF
+"}
+(10,1,1) = {"
+Ie
+Ie
+Vx
+Dh
+ik
+IN
+UQ
+UQ
+yZ
+Do
+Do
+Vv
+YP
+YP
+YP
+KG
+uY
+Dh
+Dh
+oA
+IY
+IY
+Jv
+IY
+IY
+gH
+Jv
+Xp
+Dh
+ik
+ik
+Dh
+by
+KI
+by
+by
+by
+by
+by
+by
+by
+by
+by
+Ie
+"}
+(11,1,1) = {"
+Ie
+Ie
+Vx
+Dh
+ik
+yz
+fh
+UQ
+UY
+Vv
+Ww
+Vv
+YP
+YP
+tt
+bp
+WX
+oA
+oA
+oA
+IY
+Dh
+IY
+IY
+Jv
+Jv
+IY
+IY
+ik
+tq
+ik
+Dh
+by
+iR
+PM
+PM
+PM
+PM
+PM
+PM
+PM
+PM
+by
+Ie
+"}
+(12,1,1) = {"
+Ie
+Ie
+Vx
+Dh
+ik
+Hq
+TK
+qM
+yZ
+Ww
+Ww
+Vv
+YP
+PQ
+tt
+bp
+uY
+Dh
+oA
+oA
+IY
+IY
+Dh
+IY
+IY
+IY
+IY
+Jv
+ik
+tq
+ik
+ik
+by
+iR
+yS
+PM
+PM
+PM
+PM
+PM
+yS
+PM
+by
+Ie
+"}
+(13,1,1) = {"
+Ie
+Ie
+Vx
+Dh
+ik
+UN
+UQ
+UQ
+DL
+Ww
+yz
+lx
+Vv
+YP
+Lv
+WX
+Dh
+Dh
+oA
+IY
+IY
+Dh
+Dh
+IY
+IY
+Dh
+IY
+Jv
+ik
+mD
+tq
+ik
+by
+iR
+PM
+PM
+PM
+PM
+PM
+PM
+PM
+PM
+by
+Ie
+"}
+(14,1,1) = {"
+Ie
+Dh
+Vv
+nE
+nE
+mD
+cw
+UQ
+lx
+Ex
+Tm
+UQ
+lx
+Vv
+Vv
+ps
+TK
+Sm
+Dh
+Dh
+Dh
+zA
+rg
+Dh
+XB
+IY
+Jv
+gH
+IY
+ik
+tq
+ik
+by
+iR
+PM
+QP
+QP
+QP
+QP
+QP
+xt
+PM
+by
+Ie
+"}
+(15,1,1) = {"
+Ie
+Dh
+ij
+hK
+nE
+Dh
+yz
+UQ
+UQ
+UQ
+UQ
+bi
+UQ
+yZ
+Do
+Iz
+kn
+Ww
+Dh
+Dh
+FI
+mF
+mF
+mF
+Dh
+IY
+Jv
+Jv
+IY
+ik
+tq
+ik
+by
+ZR
+PM
+QP
+QP
+QP
+QP
+QP
+QP
+PM
+by
+Ie
+"}
+(16,1,1) = {"
+Ie
+Dh
+VQ
+uX
+NL
+TK
+Tx
+UQ
+TK
+UQ
+cW
+TK
+Tm
+UQ
+yZ
+pl
+Do
+Ex
+UY
+Dh
+Ug
+oI
+NW
+mF
+Dh
+Dh
+Jv
+IY
+IY
+ik
+tq
+ik
+by
+PM
+PM
+QP
+QP
+QP
+QP
+QP
+QP
+PM
+by
+Ie
+"}
+(17,1,1) = {"
+Ie
+Dh
+VQ
+bR
+wz
+Dh
+Hq
+UQ
+Sm
+cw
+UY
+cw
+UQ
+UQ
+Tx
+gy
+Ex
+UY
+Iz
+TK
+NB
+mF
+aI
+mF
+WT
+IY
+Jv
+IY
+Dh
+ik
+tq
+ik
+by
+PM
+PM
+QP
+QP
+QP
+QP
+QP
+QP
+PM
+by
+Ie
+"}
+(18,1,1) = {"
+Ie
+Dh
+VQ
+uX
+PJ
+TK
+sT
+kn
+Do
+Do
+Vv
+Do
+Ov
+UQ
+UY
+Ok
+mE
+rH
+pl
+Dh
+mF
+Hr
+Gg
+mF
+Dh
+IY
+IY
+IY
+IY
+ik
+tq
+ik
+by
+PM
+PM
+QP
+QP
+QP
+QP
+QP
+QP
+PM
+by
+Ie
+"}
+(19,1,1) = {"
+Ie
+Dh
+zF
+uX
+nE
+Dh
+Dh
+Ww
+Ww
+Ww
+Do
+Do
+Do
+lP
+Ex
+UY
+Ka
+Vv
+tv
+Dh
+FI
+mF
+mF
+QX
+Dh
+IY
+IY
+IY
+IY
+ik
+tq
+ik
+by
+lj
+PM
+QP
+QP
+QP
+QP
+QP
+QP
+PM
+by
+Ie
+"}
+(20,1,1) = {"
+Ie
+Dh
+Vv
+nE
+nE
+ik
+Dh
+Ww
+Ww
+Cs
+Do
+Do
+Vv
+Dh
+Dh
+bQ
+Dh
+ba
+Dh
+IY
+Dh
+zA
+tI
+Dh
+XB
+IY
+Jv
+Jv
+IY
+ik
+tq
+ik
+by
+iR
+PM
+QP
+QP
+QP
+QP
+QP
+gr
+PM
+by
+Ie
+"}
+(21,1,1) = {"
+Ie
+Ie
+Vx
+Dh
+ik
+Dh
+Dh
+Do
+Do
+Do
+Ww
+Do
+Vv
+rh
+ed
+gK
+Dh
+UL
+Sm
+IY
+IY
+Dh
+Dh
+Kh
+IY
+IY
+Jv
+IY
+ik
+tq
+mD
+ik
+by
+iR
+PM
+PM
+PM
+PM
+PM
+PM
+PM
+PM
+by
+Ie
+"}
+(22,1,1) = {"
+Ie
+Ie
+Vx
+Dh
+ik
+Dh
+Dh
+JB
+Sg
+Vv
+Ww
+Vv
+uZ
+YP
+bp
+bp
+uY
+Dh
+bQ
+oA
+IY
+IY
+Dh
+IY
+Jv
+IY
+IY
+IY
+ik
+tq
+ik
+ik
+by
+iR
+PM
+PM
+yS
+PM
+PM
+PM
+PM
+PM
+by
+Ie
+"}
+(23,1,1) = {"
+Ie
+Ie
+Vx
+Dh
+ik
+cM
+eE
+lx
+Vv
+ki
+Ww
+Vv
+Rx
+YP
+bp
+bp
+WB
+TK
+Aa
+Dh
+IY
+IY
+Jv
+Jv
+Jv
+IY
+aM
+Xp
+Dh
+tq
+ik
+Dh
+by
+iR
+PM
+PM
+PM
+PM
+PM
+PM
+PM
+PM
+by
+Ie
+"}
+(24,1,1) = {"
+Ie
+Ie
+Vx
+Dh
+ik
+Dh
+Dh
+lP
+Do
+Do
+Cs
+bQ
+YP
+bq
+Rh
+WX
+uY
+Dh
+oA
+oA
+IY
+IY
+Jv
+Jv
+IY
+IY
+Dh
+Dh
+ik
+mD
+ik
+Dh
+by
+KI
+by
+by
+by
+by
+by
+by
+by
+by
+by
+Ie
+"}
+(25,1,1) = {"
+Ie
+Ie
+Vx
+Dh
+ik
+Dh
+Dh
+pl
+Do
+Vv
+Do
+Vv
+Vv
+rh
+lm
+uY
+Dh
+sq
+oA
+IY
+IY
+IY
+IY
+IY
+Dh
+IY
+IY
+ik
+mD
+ik
+ik
+Dh
+Ie
+Vx
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+"}
+(26,1,1) = {"
+Ie
+Ie
+Vx
+Dh
+ik
+ik
+Dh
+yd
+Do
+Do
+Do
+Ex
+lx
+Vv
+Dh
+Dh
+oA
+oA
+IY
+IY
+IY
+Jv
+aM
+IY
+IY
+IY
+Dh
+ik
+tq
+ik
+Dh
+Dh
+Ie
+Vx
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+"}
+(27,1,1) = {"
+Ie
+Ie
+Vx
+Dh
+Dh
+ik
+Dh
+Dh
+Ex
+lx
+HQ
+UQ
+UQ
+bU
+Dh
+ik
+Dh
+Yb
+IY
+IY
+Dh
+IY
+IY
+Dh
+IY
+IY
+ik
+mD
+ik
+ik
+Dh
+Ie
+Ie
+Vx
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+"}
+(28,1,1) = {"
+Ie
+Ie
+Vx
+Ie
+Dh
+Dh
+ik
+ik
+Dh
+mD
+Dh
+Ka
+lP
+mD
+Dh
+ik
+Dh
+Dh
+Dh
+Dh
+Dh
+IY
+IY
+IY
+ik
+ik
+ik
+ik
+ik
+Dh
+Dh
+Ie
+Ie
+Vx
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+"}
+(29,1,1) = {"
+Ie
+Ie
+Vx
+Ie
+Ie
+Dh
+Dh
+ik
+ik
+ik
+tq
+tq
+tq
+Dh
+ik
+Dh
+Dh
+Ie
+Ie
+Ie
+Dh
+Dh
+ik
+ik
+mD
+tq
+ik
+ik
+Dh
+Dh
+Ie
+Ie
+Ie
+Vx
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+"}
+(30,1,1) = {"
+Ie
+Ie
+Vx
+Ie
+Ie
+Ie
+Dh
+Dh
+Dh
+ik
+ik
+ik
+ik
+ik
+Dh
+Dh
+Ie
+Ie
+Ie
+Ie
+Ie
+Dh
+Dh
+ik
+ik
+ik
+Dh
+Dh
+Dh
+Ie
+Ie
+Ie
+Ie
+Vx
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+"}
+(31,1,1) = {"
+Ie
+Ie
+Vx
+Ie
+Ie
+Ie
+Ie
+Ie
+Dh
+Dh
+Dh
+Dh
+Dh
+Dh
+Dh
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Dh
+Dh
+Dh
+Dh
+Dh
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Vx
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+"}
+(32,1,1) = {"
+Ie
+Ie
+VI
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+RU
+ly
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+"}
+(33,1,1) = {"
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+Ie
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+hY
+"}
diff --git a/_maps/virtual_domains/colossus.dmm b/_maps/virtual_domains/colossus.dmm
new file mode 100644
index 00000000000..a9c3c6e6d79
--- /dev/null
+++ b/_maps/virtual_domains/colossus.dmm
@@ -0,0 +1,2250 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"c" = (
+/obj/structure/marker_beacon/olive,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"e" = (
+/obj/structure/marker_beacon/bronze,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"j" = (
+/obj/structure/marker_beacon/cerulean,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"k" = (
+/turf/closed/mineral/volcanic/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"l" = (
+/obj/structure/marker_beacon/lime,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"m" = (
+/obj/structure/marker_beacon/violet,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"o" = (
+/obj/effect/mob_spawn/corpse/human/miner,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"p" = (
+/mob/living/simple_animal/hostile/megafauna/colossus/virtual_domain,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"q" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/open/indestructible/binary,
+/area/lavaland/surface/outdoors/virtual_domain)
+"r" = (
+/obj/machinery/light/small/blacklight/directional/south,
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/virtual_domain/powered)
+"s" = (
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"u" = (
+/obj/structure/marker_beacon/indigo,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"v" = (
+/turf/open/indestructible/binary,
+/area/lavaland/surface/outdoors/virtual_domain)
+"x" = (
+/obj/structure/marker_beacon/purple,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"z" = (
+/obj/structure/marker_beacon/jade,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"B" = (
+/obj/structure/marker_beacon/teal,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"D" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"L" = (
+/obj/structure/marker_beacon/yellow,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"N" = (
+/obj/effect/landmark/bitrunning/safehouse_spawn,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"T" = (
+/obj/structure/marker_beacon/burgundy,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"U" = (
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"W" = (
+/obj/structure/marker_beacon/fuchsia,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+
+(1,1,1) = {"
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+q
+"}
+(2,1,1) = {"
+v
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+v
+"}
+(3,1,1) = {"
+v
+k
+a
+a
+k
+k
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+k
+k
+a
+a
+a
+a
+a
+a
+a
+a
+k
+k
+a
+a
+a
+a
+a
+a
+k
+k
+k
+v
+"}
+(4,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+v
+"}
+(5,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+s
+k
+v
+"}
+(6,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+m
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+s
+s
+k
+v
+"}
+(7,1,1) = {"
+v
+k
+a
+a
+a
+a
+o
+a
+a
+a
+a
+a
+a
+a
+a
+a
+c
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+a
+a
+a
+a
+s
+k
+v
+"}
+(8,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+k
+a
+a
+a
+k
+k
+v
+"}
+(9,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+a
+s
+s
+s
+s
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+k
+v
+"}
+(10,1,1) = {"
+v
+k
+k
+a
+a
+a
+a
+a
+k
+k
+k
+s
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+k
+v
+"}
+(11,1,1) = {"
+v
+k
+k
+a
+a
+a
+a
+a
+k
+k
+k
+s
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+k
+a
+a
+a
+a
+a
+a
+a
+a
+s
+s
+a
+a
+a
+a
+a
+k
+v
+"}
+(12,1,1) = {"
+v
+k
+k
+a
+a
+a
+a
+a
+s
+k
+s
+s
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+k
+a
+a
+a
+a
+a
+a
+a
+s
+a
+a
+a
+a
+a
+k
+v
+"}
+(13,1,1) = {"
+v
+k
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+k
+k
+a
+a
+a
+a
+a
+u
+a
+a
+a
+a
+a
+a
+a
+k
+v
+"}
+(14,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+k
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+v
+"}
+(15,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+v
+"}
+(16,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+e
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+v
+"}
+(17,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+j
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+v
+"}
+(18,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+v
+"}
+(19,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+v
+"}
+(20,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+x
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+v
+"}
+(21,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+r
+U
+U
+U
+U
+U
+N
+a
+k
+v
+"}
+(22,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+U
+U
+U
+U
+U
+U
+a
+k
+v
+"}
+(23,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+p
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+U
+U
+U
+U
+U
+U
+a
+k
+v
+"}
+(24,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+l
+a
+a
+U
+U
+U
+U
+U
+U
+a
+k
+v
+"}
+(25,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+U
+U
+U
+U
+U
+U
+a
+k
+v
+"}
+(26,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+U
+U
+U
+U
+U
+U
+a
+k
+v
+"}
+(27,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+o
+a
+r
+U
+U
+U
+U
+U
+D
+a
+k
+v
+"}
+(28,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+T
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+v
+"}
+(29,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+a
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+W
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+v
+"}
+(30,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+a
+k
+k
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+v
+"}
+(31,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+a
+k
+k
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+v
+"}
+(32,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+a
+a
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+v
+"}
+(33,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+z
+a
+a
+a
+a
+a
+a
+a
+k
+v
+"}
+(34,1,1) = {"
+v
+k
+k
+a
+a
+a
+a
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+v
+"}
+(35,1,1) = {"
+v
+k
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+l
+a
+a
+a
+a
+a
+a
+a
+a
+k
+k
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+v
+"}
+(36,1,1) = {"
+v
+k
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+k
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+v
+"}
+(37,1,1) = {"
+v
+k
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+k
+v
+"}
+(38,1,1) = {"
+v
+k
+a
+a
+a
+s
+s
+a
+a
+a
+a
+a
+B
+a
+a
+a
+a
+k
+a
+a
+a
+a
+a
+a
+s
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+k
+v
+"}
+(39,1,1) = {"
+v
+k
+a
+a
+a
+s
+s
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+k
+k
+a
+a
+a
+a
+a
+s
+s
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+v
+"}
+(40,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+v
+"}
+(41,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+L
+a
+a
+a
+a
+a
+a
+a
+k
+v
+"}
+(42,1,1) = {"
+v
+k
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+k
+v
+"}
+(43,1,1) = {"
+v
+k
+a
+k
+k
+k
+k
+a
+a
+a
+a
+a
+k
+k
+k
+k
+a
+a
+a
+k
+k
+k
+k
+k
+a
+a
+a
+a
+a
+a
+k
+k
+k
+k
+a
+a
+a
+a
+a
+a
+k
+k
+a
+a
+k
+v
+"}
+(44,1,1) = {"
+v
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+k
+v
+"}
+(45,1,1) = {"
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+v
+"}
diff --git a/_maps/virtual_domains/gondola_asteroid.dmm b/_maps/virtual_domains/gondola_asteroid.dmm
new file mode 100644
index 00000000000..d6377a4a4c1
--- /dev/null
+++ b/_maps/virtual_domains/gondola_asteroid.dmm
@@ -0,0 +1,1784 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/closed/indestructible/binary,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"c" = (
+/turf/open/space/basic,
+/area/space)
+"e" = (
+/turf/open/misc/asteroid/airless,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"g" = (
+/obj/structure/marker_beacon{
+ light_color = "#FFE8AA";
+ light_range = 20
+ },
+/turf/open/floor/grass,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"h" = (
+/turf/closed/mineral/random,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"m" = (
+/obj/structure/closet/crate/secure/bitrunning/encrypted/gondola,
+/turf/open/floor/grass,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"n" = (
+/obj/structure/flora/bush/fullgrass/style_random,
+/turf/open/floor/grass,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"o" = (
+/turf/template_noop,
+/area/template_noop)
+"q" = (
+/obj/structure/flora/tree/palm,
+/turf/open/floor/grass,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"r" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"s" = (
+/obj/structure/flora/bush/sparsegrass/style_random,
+/turf/open/floor/grass,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"t" = (
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"w" = (
+/obj/structure/water_source/puddle,
+/turf/open/floor/grass,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"y" = (
+/obj/structure/flora/bush/stalky/style_random,
+/turf/open/floor/grass,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"z" = (
+/mob/living/simple_animal/pet/gondola/virtual_domain,
+/turf/open/floor/grass,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"A" = (
+/obj/structure/chair/wood{
+ dir = 8
+ },
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"C" = (
+/turf/open/floor/grass,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"D" = (
+/obj/structure/flora/bush/flowers_br/style_random,
+/turf/open/floor/grass,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"F" = (
+/obj/structure/flora/bush/grassy/style_random,
+/turf/open/floor/grass,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"I" = (
+/obj/structure/flora/bush/reed/style_random,
+/turf/open/floor/grass,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"J" = (
+/obj/structure/flora/bush/flowers_yw/style_random,
+/turf/open/floor/grass,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"K" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/closed/indestructible/binary,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"M" = (
+/obj/structure/table/wood,
+/obj/item/storage/bag/tray,
+/obj/item/kitchen/fork,
+/obj/item/knife/kitchen,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"N" = (
+/obj/structure/flora/bush/large/style_random,
+/turf/open/floor/grass,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"O" = (
+/obj/effect/landmark/bitrunning/safehouse_spawn,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"Q" = (
+/obj/structure/flora/bush/lavendergrass/style_random,
+/turf/open/floor/grass,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"T" = (
+/obj/structure/flora/bush/sunny/style_random,
+/turf/open/floor/grass,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"V" = (
+/obj/structure/flora/coconuts,
+/turf/open/floor/grass,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"W" = (
+/obj/structure/flora/bush/ferny/style_random,
+/turf/open/floor/grass,
+/area/ruin/space/has_grav/powered/virtual_domain)
+
+(1,1,1) = {"
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+a
+a
+a
+a
+a
+a
+a
+a
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+"}
+(2,1,1) = {"
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+a
+a
+a
+h
+h
+h
+h
+h
+h
+a
+a
+o
+o
+o
+o
+o
+o
+o
+o
+o
+"}
+(3,1,1) = {"
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+a
+a
+a
+a
+a
+h
+h
+h
+h
+h
+h
+h
+h
+h
+a
+a
+K
+o
+o
+o
+o
+o
+o
+o
+"}
+(4,1,1) = {"
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+a
+a
+a
+a
+a
+a
+a
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+e
+a
+o
+o
+o
+o
+o
+o
+o
+"}
+(5,1,1) = {"
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+a
+a
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+C
+h
+h
+h
+h
+h
+a
+o
+o
+o
+o
+o
+o
+o
+"}
+(6,1,1) = {"
+o
+o
+o
+o
+o
+o
+o
+o
+a
+a
+a
+a
+a
+a
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+C
+C
+C
+C
+C
+C
+C
+h
+h
+h
+a
+o
+o
+o
+o
+o
+o
+o
+"}
+(7,1,1) = {"
+o
+o
+o
+o
+o
+o
+o
+a
+a
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+C
+C
+C
+C
+J
+C
+C
+C
+z
+C
+h
+h
+a
+o
+o
+o
+o
+o
+o
+o
+"}
+(8,1,1) = {"
+o
+o
+o
+o
+o
+a
+a
+a
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+C
+C
+C
+C
+Q
+C
+q
+C
+h
+h
+h
+h
+h
+e
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(9,1,1) = {"
+o
+o
+o
+o
+a
+a
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+C
+h
+C
+C
+C
+C
+C
+C
+C
+C
+V
+C
+C
+C
+C
+h
+h
+h
+e
+c
+c
+c
+c
+c
+c
+c
+a
+"}
+(10,1,1) = {"
+o
+o
+a
+a
+a
+h
+h
+h
+h
+h
+h
+h
+h
+C
+q
+C
+C
+W
+C
+C
+V
+C
+C
+q
+C
+C
+C
+C
+F
+C
+C
+h
+h
+h
+e
+c
+c
+c
+c
+c
+c
+c
+a
+"}
+(11,1,1) = {"
+o
+a
+a
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+C
+C
+C
+C
+C
+N
+C
+C
+C
+C
+C
+C
+s
+C
+C
+C
+h
+h
+h
+e
+c
+c
+c
+c
+c
+c
+c
+a
+"}
+(12,1,1) = {"
+o
+a
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+C
+s
+I
+J
+C
+C
+g
+C
+C
+V
+C
+z
+C
+y
+C
+g
+C
+h
+h
+h
+e
+c
+c
+c
+c
+c
+c
+c
+a
+"}
+(13,1,1) = {"
+a
+a
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+C
+C
+C
+C
+Q
+Q
+C
+z
+C
+C
+C
+C
+C
+C
+C
+s
+Q
+C
+C
+h
+h
+h
+e
+c
+c
+c
+c
+c
+c
+c
+a
+"}
+(14,1,1) = {"
+a
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+C
+C
+w
+C
+s
+C
+W
+C
+C
+C
+C
+C
+C
+N
+C
+C
+C
+C
+h
+h
+h
+h
+e
+c
+c
+c
+c
+c
+c
+c
+a
+"}
+(15,1,1) = {"
+a
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+z
+C
+C
+C
+C
+y
+C
+C
+C
+F
+s
+C
+C
+C
+C
+C
+w
+C
+h
+h
+h
+h
+h
+e
+c
+c
+c
+c
+c
+c
+c
+a
+"}
+(16,1,1) = {"
+a
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+C
+C
+C
+C
+C
+s
+Q
+C
+C
+C
+C
+C
+C
+C
+C
+h
+h
+h
+h
+e
+c
+c
+c
+c
+c
+c
+c
+a
+"}
+(17,1,1) = {"
+a
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+C
+C
+C
+Q
+D
+C
+C
+C
+C
+q
+C
+C
+C
+C
+h
+h
+h
+h
+t
+t
+t
+t
+t
+O
+c
+a
+"}
+(18,1,1) = {"
+a
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+C
+n
+I
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+h
+h
+h
+t
+t
+M
+M
+t
+t
+c
+a
+"}
+(19,1,1) = {"
+a
+h
+h
+h
+h
+h
+h
+h
+h
+h
+C
+n
+C
+h
+h
+h
+h
+h
+C
+C
+C
+C
+C
+C
+s
+T
+C
+C
+C
+s
+C
+C
+h
+C
+C
+t
+t
+A
+A
+t
+t
+c
+a
+"}
+(20,1,1) = {"
+a
+h
+h
+h
+h
+h
+h
+h
+h
+C
+C
+C
+C
+C
+C
+h
+h
+h
+C
+C
+q
+V
+C
+C
+C
+J
+C
+C
+C
+C
+C
+C
+C
+C
+C
+t
+t
+t
+t
+t
+t
+c
+a
+"}
+(21,1,1) = {"
+a
+e
+h
+h
+h
+h
+h
+h
+h
+z
+C
+C
+g
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+t
+t
+t
+t
+t
+t
+c
+a
+"}
+(22,1,1) = {"
+a
+e
+e
+h
+h
+h
+h
+h
+h
+C
+C
+C
+q
+C
+s
+s
+C
+C
+W
+C
+m
+C
+C
+C
+g
+C
+z
+C
+C
+C
+C
+C
+h
+h
+h
+t
+t
+t
+t
+t
+t
+c
+a
+"}
+(23,1,1) = {"
+a
+e
+e
+h
+h
+h
+h
+h
+h
+C
+C
+C
+C
+C
+C
+y
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+q
+C
+C
+h
+h
+h
+t
+t
+t
+t
+t
+r
+c
+a
+"}
+(24,1,1) = {"
+a
+e
+e
+h
+h
+h
+h
+h
+h
+C
+C
+V
+C
+C
+C
+C
+C
+C
+C
+w
+C
+z
+N
+C
+C
+C
+N
+C
+C
+C
+C
+C
+h
+h
+h
+c
+c
+c
+c
+c
+c
+c
+a
+"}
+(25,1,1) = {"
+a
+a
+e
+e
+h
+h
+h
+h
+n
+C
+C
+C
+C
+C
+z
+C
+C
+C
+C
+C
+C
+C
+C
+C
+F
+C
+C
+C
+C
+C
+C
+C
+h
+h
+h
+c
+c
+c
+c
+c
+c
+c
+a
+"}
+(26,1,1) = {"
+o
+a
+e
+e
+h
+h
+h
+C
+C
+C
+C
+C
+C
+C
+C
+C
+s
+y
+C
+C
+C
+C
+C
+C
+I
+F
+C
+C
+C
+C
+C
+h
+h
+h
+c
+c
+c
+c
+c
+c
+c
+c
+a
+"}
+(27,1,1) = {"
+o
+a
+e
+e
+h
+h
+h
+C
+C
+C
+w
+C
+C
+C
+C
+F
+D
+s
+C
+J
+C
+C
+C
+C
+C
+C
+q
+C
+C
+V
+C
+h
+h
+h
+c
+c
+c
+c
+c
+c
+c
+c
+a
+"}
+(28,1,1) = {"
+o
+a
+e
+e
+h
+h
+h
+h
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+g
+F
+s
+C
+C
+C
+C
+C
+C
+C
+C
+h
+h
+h
+c
+c
+c
+c
+c
+c
+c
+c
+c
+a
+"}
+(29,1,1) = {"
+o
+a
+a
+e
+e
+h
+h
+h
+C
+C
+C
+C
+C
+n
+C
+C
+C
+C
+C
+C
+s
+y
+D
+C
+C
+C
+C
+w
+C
+h
+h
+h
+h
+c
+c
+c
+c
+c
+c
+c
+c
+c
+a
+"}
+(30,1,1) = {"
+o
+o
+a
+e
+e
+h
+h
+C
+C
+C
+n
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+C
+s
+C
+C
+C
+h
+h
+h
+e
+e
+c
+c
+c
+c
+c
+c
+c
+c
+a
+"}
+(31,1,1) = {"
+o
+o
+a
+e
+h
+h
+C
+g
+J
+C
+s
+C
+C
+C
+h
+C
+C
+C
+C
+C
+V
+C
+C
+C
+C
+C
+C
+C
+h
+h
+h
+e
+e
+e
+c
+c
+c
+c
+c
+c
+c
+c
+a
+"}
+(32,1,1) = {"
+o
+o
+a
+h
+h
+h
+h
+C
+C
+C
+C
+C
+C
+h
+h
+h
+C
+C
+C
+q
+C
+C
+C
+C
+C
+C
+h
+h
+h
+h
+e
+e
+e
+h
+h
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(33,1,1) = {"
+o
+o
+a
+h
+h
+h
+C
+C
+C
+C
+C
+C
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+e
+e
+h
+h
+h
+a
+o
+o
+o
+o
+o
+o
+o
+"}
+(34,1,1) = {"
+o
+o
+a
+h
+h
+C
+C
+C
+C
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+a
+a
+h
+h
+h
+a
+a
+o
+o
+o
+o
+o
+o
+o
+"}
+(35,1,1) = {"
+o
+o
+a
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+e
+e
+e
+e
+e
+h
+h
+h
+h
+h
+a
+a
+a
+a
+a
+a
+a
+h
+h
+h
+a
+a
+o
+o
+o
+o
+o
+o
+o
+"}
+(36,1,1) = {"
+o
+o
+a
+a
+h
+h
+h
+h
+h
+h
+h
+h
+h
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+o
+o
+o
+o
+o
+a
+a
+a
+a
+a
+o
+o
+o
+o
+o
+o
+o
+o
+"}
+(37,1,1) = {"
+o
+o
+o
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+o
+"}
diff --git a/_maps/virtual_domains/hierophant.dmm b/_maps/virtual_domains/hierophant.dmm
new file mode 100644
index 00000000000..02b11ad4e1e
--- /dev/null
+++ b/_maps/virtual_domains/hierophant.dmm
@@ -0,0 +1,1066 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/open/indestructible/hierophant,
+/area/lavaland/surface/outdoors/virtual_domain)
+"c" = (
+/obj/effect/light_emitter{
+ set_cap = 3;
+ set_luminosity = 5
+ },
+/turf/open/indestructible/hierophant/two,
+/area/lavaland/surface/outdoors/virtual_domain)
+"h" = (
+/obj/effect/light_emitter{
+ set_cap = 3;
+ set_luminosity = 5
+ },
+/turf/open/indestructible/hierophant,
+/area/lavaland/surface/outdoors/virtual_domain)
+"n" = (
+/obj/structure/marker_beacon/indigo,
+/turf/open/indestructible/hierophant,
+/area/lavaland/surface/outdoors/virtual_domain)
+"o" = (
+/turf/template_noop,
+/area/template_noop)
+"r" = (
+/turf/closed/indestructible/riveted/hierophant,
+/area/lavaland/surface/outdoors/virtual_domain)
+"u" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"w" = (
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"y" = (
+/turf/closed/indestructible/binary,
+/area/lavaland/surface/outdoors/virtual_domain)
+"E" = (
+/mob/living/simple_animal/hostile/megafauna/hierophant/virtual_domain,
+/turf/open/indestructible/hierophant/two,
+/area/lavaland/surface/outdoors/virtual_domain)
+"H" = (
+/obj/effect/landmark/bitrunning/safehouse_spawn,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"K" = (
+/turf/open/indestructible/hierophant/two,
+/area/lavaland/surface/outdoors/virtual_domain)
+"N" = (
+/obj/machinery/light/small/blacklight/directional/south,
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/open/indestructible/hierophant,
+/area/virtual_domain/powered)
+"S" = (
+/obj/effect/mob_spawn/corpse/human/miner,
+/turf/open/indestructible/hierophant,
+/area/lavaland/surface/outdoors/virtual_domain)
+"W" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/closed/indestructible/binary,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Y" = (
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+
+(1,1,1) = {"
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+o
+o
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+W
+"}
+(2,1,1) = {"
+y
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+y
+o
+o
+y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+y
+"}
+(3,1,1) = {"
+y
+r
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+h
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+r
+y
+o
+o
+y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+y
+"}
+(4,1,1) = {"
+y
+r
+a
+a
+a
+h
+h
+a
+a
+a
+r
+a
+a
+a
+r
+a
+a
+a
+h
+h
+a
+a
+a
+r
+y
+y
+y
+y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+y
+"}
+(5,1,1) = {"
+y
+r
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+r
+r
+y
+y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+y
+"}
+(6,1,1) = {"
+y
+r
+a
+h
+a
+r
+r
+a
+h
+n
+a
+a
+h
+a
+a
+a
+h
+a
+r
+r
+a
+h
+a
+a
+a
+a
+r
+y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+y
+"}
+(7,1,1) = {"
+y
+r
+a
+h
+a
+r
+r
+a
+h
+a
+a
+a
+h
+a
+a
+a
+h
+a
+r
+r
+a
+h
+a
+a
+a
+a
+a
+r
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+y
+"}
+(8,1,1) = {"
+y
+r
+a
+a
+a
+a
+a
+K
+K
+K
+K
+K
+K
+K
+K
+K
+K
+K
+a
+a
+a
+n
+a
+a
+r
+a
+a
+a
+r
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+y
+"}
+(9,1,1) = {"
+y
+r
+a
+a
+a
+h
+h
+K
+K
+K
+r
+K
+K
+K
+r
+K
+K
+K
+h
+h
+a
+a
+a
+r
+y
+r
+S
+a
+a
+r
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+y
+"}
+(10,1,1) = {"
+y
+r
+a
+a
+a
+a
+a
+K
+K
+K
+K
+K
+c
+K
+K
+K
+K
+K
+a
+a
+a
+a
+a
+r
+y
+y
+r
+a
+a
+N
+w
+w
+w
+w
+w
+H
+Y
+y
+"}
+(11,1,1) = {"
+y
+r
+a
+r
+a
+a
+a
+K
+r
+K
+K
+K
+K
+K
+K
+K
+r
+K
+a
+a
+a
+r
+a
+r
+y
+y
+y
+r
+a
+a
+w
+w
+w
+w
+w
+w
+Y
+y
+"}
+(12,1,1) = {"
+y
+r
+a
+a
+a
+a
+a
+K
+K
+K
+K
+K
+K
+K
+K
+K
+K
+K
+a
+a
+a
+a
+a
+r
+y
+y
+y
+r
+a
+a
+w
+w
+w
+w
+w
+w
+Y
+y
+"}
+(13,1,1) = {"
+y
+r
+h
+a
+a
+h
+h
+K
+K
+c
+K
+K
+E
+K
+K
+c
+K
+K
+h
+h
+a
+a
+h
+r
+y
+y
+y
+r
+a
+a
+w
+w
+w
+w
+w
+w
+Y
+y
+"}
+(14,1,1) = {"
+y
+r
+a
+a
+a
+a
+a
+K
+K
+K
+K
+K
+K
+K
+K
+K
+K
+K
+a
+a
+a
+a
+a
+r
+y
+y
+y
+r
+a
+a
+w
+w
+w
+w
+w
+w
+Y
+y
+"}
+(15,1,1) = {"
+y
+r
+a
+r
+a
+a
+a
+K
+r
+K
+K
+K
+K
+K
+K
+K
+r
+K
+a
+a
+a
+r
+a
+r
+y
+y
+y
+r
+a
+a
+w
+w
+w
+w
+w
+w
+Y
+y
+"}
+(16,1,1) = {"
+y
+r
+a
+a
+a
+a
+a
+K
+K
+K
+K
+K
+c
+K
+K
+K
+K
+K
+a
+a
+a
+a
+a
+r
+y
+y
+r
+a
+a
+N
+w
+w
+w
+w
+w
+u
+Y
+y
+"}
+(17,1,1) = {"
+y
+r
+a
+a
+a
+h
+h
+K
+K
+K
+r
+K
+K
+K
+r
+K
+K
+K
+h
+h
+a
+a
+a
+r
+y
+r
+a
+a
+a
+r
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+y
+"}
+(18,1,1) = {"
+y
+r
+a
+a
+a
+a
+a
+K
+K
+K
+K
+K
+K
+K
+K
+K
+K
+K
+a
+a
+a
+a
+a
+a
+r
+a
+a
+a
+r
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+y
+"}
+(19,1,1) = {"
+y
+r
+a
+h
+a
+r
+r
+a
+h
+a
+a
+a
+h
+a
+a
+a
+h
+a
+r
+r
+a
+h
+a
+a
+a
+a
+a
+r
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+y
+"}
+(20,1,1) = {"
+y
+r
+a
+h
+a
+r
+r
+S
+h
+a
+a
+a
+h
+a
+n
+a
+h
+a
+r
+r
+a
+h
+a
+a
+a
+a
+r
+y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+y
+"}
+(21,1,1) = {"
+y
+r
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+r
+r
+y
+y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+y
+"}
+(22,1,1) = {"
+y
+r
+a
+a
+a
+h
+h
+a
+a
+a
+r
+a
+a
+a
+r
+a
+a
+a
+h
+h
+a
+a
+a
+r
+y
+y
+y
+y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+y
+"}
+(23,1,1) = {"
+y
+r
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+h
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+r
+y
+o
+o
+y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+y
+"}
+(24,1,1) = {"
+y
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+r
+y
+o
+o
+y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+Y
+y
+"}
+(25,1,1) = {"
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+o
+o
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+y
+"}
diff --git a/_maps/virtual_domains/legion.dmm b/_maps/virtual_domains/legion.dmm
new file mode 100644
index 00000000000..55843177ad0
--- /dev/null
+++ b/_maps/virtual_domains/legion.dmm
@@ -0,0 +1,6370 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"ah" = (
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/obj/structure/stone_tile,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"ak" = (
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"aI" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 8
+ },
+/obj/structure/stone_tile/cracked,
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"aR" = (
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"bd" = (
+/obj/structure/stone_tile/block,
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"be" = (
+/obj/structure/stone_tile/block{
+ dir = 4
+ },
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"bt" = (
+/obj/effect/decal/cleanable/blood,
+/obj/effect/decal/cleanable/blood/drip,
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 1
+ },
+/turf/open/floor/pod/dark,
+/area/lavaland/surface/outdoors/virtual_domain)
+"bu" = (
+/obj/structure/marker_beacon/bronze,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"ca" = (
+/obj/effect/mob_spawn/corpse/human/legioninfested,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"cf" = (
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/obj/structure/stone_tile,
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"cp" = (
+/turf/template_noop,
+/area/template_noop)
+"dm" = (
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"dn" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 8
+ },
+/obj/structure/stone_tile/cracked,
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/obj/effect/mob_spawn/corpse/human/legioninfested,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"dr" = (
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/obj/structure/stone_tile/block/cracked,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"dx" = (
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/blood/drip,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"dL" = (
+/obj/structure/stone_tile/block{
+ dir = 4
+ },
+/obj/structure/stone_tile/block/cracked{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"dQ" = (
+/turf/closed/wall/mineral/titanium/survival/pod,
+/area/lavaland/surface/outdoors/virtual_domain)
+"et" = (
+/obj/structure/stone_tile/block/cracked,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"ew" = (
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"eJ" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/block/cracked{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"fA" = (
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"fG" = (
+/obj/structure/marker_beacon/violet,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"gh" = (
+/obj/structure/stone_tile/cracked,
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/turf/open/indestructible/boss,
+/area/lavaland/surface/outdoors/virtual_domain)
+"gk" = (
+/obj/structure/necropolis_gate/locked,
+/obj/structure/stone_tile/slab,
+/turf/open/indestructible/boss,
+/area/lavaland/surface/outdoors/virtual_domain)
+"gK" = (
+/obj/effect/decal/cleanable/blood/footprints,
+/obj/effect/decal/cleanable/blood/drip,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"gQ" = (
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/obj/structure/stone_tile,
+/turf/open/indestructible/boss,
+/area/lavaland/surface/outdoors/virtual_domain)
+"hc" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/block/cracked{
+ dir = 8
+ },
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"hw" = (
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/obj/structure/stone_tile/block/cracked{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"hx" = (
+/obj/structure/stone_tile,
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"hU" = (
+/obj/structure/stone_tile/block{
+ dir = 4
+ },
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"ib" = (
+/turf/closed/mineral/volcanic/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"ie" = (
+/obj/structure/stone_tile/cracked,
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"iP" = (
+/obj/structure/fluff/drake_statue/falling,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"iR" = (
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/turf/open/indestructible/boss,
+/area/lavaland/surface/outdoors/virtual_domain)
+"iV" = (
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/obj/structure/stone_tile,
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/turf/open/indestructible/boss,
+/area/lavaland/surface/outdoors/virtual_domain)
+"jk" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 8
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"jt" = (
+/obj/structure/stone_tile/slab/cracked,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"jw" = (
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/turf/open/indestructible/boss,
+/area/lavaland/surface/outdoors/virtual_domain)
+"jN" = (
+/obj/machinery/sleeper/survival_pod,
+/turf/open/floor/pod/dark,
+/area/lavaland/surface/outdoors/virtual_domain)
+"ka" = (
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile,
+/turf/open/indestructible/boss,
+/area/lavaland/surface/outdoors/virtual_domain)
+"kg" = (
+/turf/closed/indestructible/riveted/boss,
+/area/lavaland/surface/outdoors/virtual_domain)
+"kT" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"kZ" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"ll" = (
+/obj/structure/stone_tile/cracked,
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"lz" = (
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile,
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"lC" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"lO" = (
+/obj/structure/stone_tile/cracked,
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"lT" = (
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/turf/open/indestructible/boss,
+/area/lavaland/surface/outdoors/virtual_domain)
+"mz" = (
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"mG" = (
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"nm" = (
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"nu" = (
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"nv" = (
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"ny" = (
+/obj/structure/stone_tile,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"nI" = (
+/obj/structure/stone_tile/block,
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"nO" = (
+/obj/structure/stone_tile/surrounding_tile,
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile/center,
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 8
+ },
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"ob" = (
+/obj/structure/necropolis_gate/legion_gate,
+/obj/structure/necropolis_arch,
+/obj/structure/stone_tile/slab,
+/turf/open/indestructible/boss,
+/area/lavaland/surface/outdoors/virtual_domain)
+"og" = (
+/obj/effect/landmark/bitrunning/safehouse_spawn,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"oo" = (
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/obj/structure/stone_tile/block/cracked{
+ dir = 1
+ },
+/turf/open/indestructible/boss,
+/area/lavaland/surface/outdoors/virtual_domain)
+"ox" = (
+/turf/closed/indestructible/binary,
+/area/lavaland/surface/outdoors/virtual_domain)
+"oS" = (
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"pP" = (
+/obj/structure/stone_tile/block{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"qo" = (
+/obj/structure/stone_tile/slab/cracked,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"qs" = (
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"qW" = (
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 1
+ },
+/obj/machinery/door/airlock/survival_pod/glass,
+/turf/open/floor/pod/dark,
+/area/lavaland/surface/outdoors/virtual_domain)
+"rt" = (
+/obj/effect/mob_spawn/corpse/human/miner,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"rU" = (
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"sd" = (
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/obj/structure/stone_tile/block{
+ dir = 4
+ },
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"sk" = (
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"sz" = (
+/obj/structure/stone_tile/center,
+/obj/structure/stone_tile/surrounding_tile,
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"sA" = (
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"tk" = (
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"tF" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"uK" = (
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/obj/structure/stone_tile/block{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"vf" = (
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/cracked,
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"wq" = (
+/obj/structure/marker_beacon/teal,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"wy" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/turf/open/indestructible/boss,
+/area/lavaland/surface/outdoors/virtual_domain)
+"xd" = (
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"xm" = (
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"xw" = (
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/turf/open/indestructible/boss,
+/area/lavaland/surface/outdoors/virtual_domain)
+"xD" = (
+/obj/structure/stone_tile/cracked,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"yu" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 1
+ },
+/obj/structure/stone_tile/block,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"yZ" = (
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"zg" = (
+/obj/machinery/light/small/directional/south,
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/virtual_domain/powered)
+"zo" = (
+/obj/effect/turf_decal/mining/survival,
+/turf/closed/wall/mineral/titanium/survival/pod,
+/area/lavaland/surface/outdoors/virtual_domain)
+"zW" = (
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 8
+ },
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile/surrounding_tile,
+/obj/structure/stone_tile/center/cracked,
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Ah" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/closed/indestructible/binary,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Aj" = (
+/obj/structure/marker_beacon/burgundy,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Ak" = (
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 8
+ },
+/obj/structure/stone_tile/surrounding_tile,
+/obj/structure/stone_tile/center/cracked,
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 4
+ },
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"As" = (
+/obj/structure/marker_beacon/cerulean,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"AY" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Bo" = (
+/obj/structure/marker_beacon/indigo,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"BO" = (
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"CX" = (
+/obj/effect/decal/cleanable/blood/drip,
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Dm" = (
+/turf/closed/mineral/random/volcanic,
+/area/lavaland/surface/outdoors/virtual_domain)
+"DP" = (
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 8
+ },
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 1
+ },
+/obj/structure/stone_tile/center,
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Ek" = (
+/obj/structure/stone_tile/block,
+/obj/structure/stone_tile/block/cracked{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Ep" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 8
+ },
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile,
+/turf/open/indestructible/boss,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Ez" = (
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/obj/structure/stone_tile/cracked,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"EC" = (
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Fg" = (
+/obj/structure/stone_tile/surrounding/cracked{
+ dir = 6
+ },
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Fp" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"Fq" = (
+/obj/structure/marker_beacon/fuchsia,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"FV" = (
+/obj/structure/stone_tile/block,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Gj" = (
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Gn" = (
+/turf/closed/indestructible/riveted/boss/see_through,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Go" = (
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/turf/open/indestructible/boss,
+/area/lavaland/surface/outdoors/virtual_domain)
+"GH" = (
+/obj/structure/fans,
+/turf/open/floor/pod/dark,
+/area/lavaland/surface/outdoors/virtual_domain)
+"GM" = (
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Hi" = (
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Hu" = (
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/turf/open/indestructible/boss,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Hw" = (
+/obj/structure/stone_tile/surrounding_tile,
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile/center/cracked,
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 8
+ },
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"HK" = (
+/obj/structure/stone_tile/cracked,
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"HQ" = (
+/obj/structure/stone_tile/block/cracked,
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"HZ" = (
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Ii" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 8
+ },
+/obj/structure/stone_tile/cracked,
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Io" = (
+/obj/structure/marker_beacon/jade,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Ip" = (
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/turf/open/indestructible/boss,
+/area/lavaland/surface/outdoors/virtual_domain)
+"IB" = (
+/obj/structure/stone_tile,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"IG" = (
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"IL" = (
+/obj/structure/stone_tile/surrounding,
+/obj/structure/stone_tile/center/cracked,
+/mob/living/simple_animal/hostile/megafauna/legion/virtual_domain,
+/turf/open/indestructible/boss,
+/area/lavaland/surface/outdoors/virtual_domain)
+"IQ" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Jc" = (
+/obj/structure/stone_tile/slab,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Jp" = (
+/obj/structure/stone_tile/block/cracked,
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Jt" = (
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/obj/structure/stone_tile,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Jw" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 8
+ },
+/obj/structure/stone_tile/cracked,
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"JD" = (
+/obj/structure/fluff/drake_statue,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"KG" = (
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Le" = (
+/obj/structure/stone_tile,
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Lx" = (
+/obj/effect/decal/cleanable/blood/footprints{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"LH" = (
+/obj/structure/stone_tile/cracked,
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Ml" = (
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Mm" = (
+/obj/structure/stone_tile/surrounding_tile,
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile/center/cracked,
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 1
+ },
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Mo" = (
+/obj/structure/stone_tile/block/cracked,
+/obj/structure/stone_tile/block/cracked{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"MH" = (
+/obj/structure/stone_tile/cracked,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"MP" = (
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/obj/structure/stone_tile/block/cracked{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"MW" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 8
+ },
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Nl" = (
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 8
+ },
+/obj/structure/stone_tile/center,
+/turf/open/indestructible/boss,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Ot" = (
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 8
+ },
+/obj/structure/stone_tile/center,
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Pv" = (
+/obj/effect/turf_decal/mining/survival{
+ dir = 4
+ },
+/turf/closed/wall/mineral/titanium/survival/pod,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Px" = (
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"PO" = (
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/obj/structure/stone_tile/block{
+ dir = 4
+ },
+/turf/open/indestructible/boss,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Qi" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 8
+ },
+/obj/structure/stone_tile/cracked,
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Qx" = (
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/structure/marker_beacon/burgundy,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"QD" = (
+/obj/item/pickaxe,
+/obj/effect/decal/cleanable/blood,
+/turf/open/floor/pod/dark,
+/area/lavaland/surface/outdoors/virtual_domain)
+"RC" = (
+/obj/effect/turf_decal/mining/survival{
+ dir = 1
+ },
+/turf/closed/wall/mineral/titanium/survival/pod,
+/area/lavaland/surface/outdoors/virtual_domain)
+"RV" = (
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"So" = (
+/obj/structure/stone_tile/cracked,
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Sw" = (
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"SI" = (
+/obj/effect/turf_decal/mining,
+/turf/closed/wall/mineral/titanium/survival/pod,
+/area/lavaland/surface/outdoors/virtual_domain)
+"SJ" = (
+/obj/structure/stone_tile/slab/cracked,
+/turf/open/indestructible/boss,
+/area/lavaland/surface/outdoors/virtual_domain)
+"SX" = (
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Ti" = (
+/turf/closed/mineral/random/high_chance/volcanic,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Tm" = (
+/obj/structure/bed/pod,
+/obj/item/bedsheet/black,
+/obj/structure/tubes,
+/obj/machinery/light/small/broken/directional/east,
+/turf/open/floor/pod/dark,
+/area/lavaland/surface/outdoors/virtual_domain)
+"TC" = (
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"TJ" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Ud" = (
+/obj/machinery/light/small/directional/north,
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/virtual_domain/powered)
+"UD" = (
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile/surrounding_tile,
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile/center/cracked,
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"UM" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Vc" = (
+/obj/structure/tubes,
+/obj/item/crowbar,
+/obj/effect/decal/cleanable/blood/drip,
+/turf/open/floor/pod/dark,
+/area/lavaland/surface/outdoors/virtual_domain)
+"VI" = (
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/surrounding_tile,
+/obj/structure/stone_tile/center,
+/turf/open/indestructible/boss,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Wa" = (
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 1
+ },
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 8
+ },
+/obj/structure/stone_tile/center/cracked,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Wm" = (
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"WM" = (
+/obj/structure/stone_tile/block,
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"WR" = (
+/obj/structure/stone_tile/block,
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"WS" = (
+/obj/item/gps/computer,
+/obj/structure/tubes,
+/turf/open/floor/pod/dark,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Xb" = (
+/obj/structure/marker_beacon/yellow,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Xn" = (
+/obj/structure/stone_tile,
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Xo" = (
+/obj/structure/stone_tile/block,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Xv" = (
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/stone_tile/cracked,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"XO" = (
+/obj/effect/turf_decal/mining/survival{
+ dir = 8
+ },
+/turf/closed/wall/mineral/titanium/survival/pod,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Yu" = (
+/obj/structure/stone_tile/block{
+ dir = 4
+ },
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/turf/open/indestructible/boss,
+/area/lavaland/surface/outdoors/virtual_domain)
+"YN" = (
+/obj/structure/stone_tile/block/cracked,
+/obj/structure/stone_tile/block/cracked{
+ dir = 1
+ },
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"YV" = (
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Zc" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
+/turf/open/indestructible/boss,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Zh" = (
+/obj/structure/marker_beacon/purple,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Zj" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 8
+ },
+/obj/structure/stone_tile/block{
+ dir = 4
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Zq" = (
+/obj/structure/stone_tile/block{
+ dir = 4
+ },
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/turf/open/indestructible/boss,
+/area/lavaland/surface/outdoors/virtual_domain)
+"Zu" = (
+/obj/machinery/smartfridge/survival_pod{
+ desc = "A heated storage unit. This one's seen better days.";
+ name = "dusty survival pod storage"
+ },
+/turf/open/floor/pod/dark,
+/area/lavaland/surface/outdoors/virtual_domain)
+"ZM" = (
+/obj/structure/stone_tile/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/virtual_domain)
+"ZN" = (
+/obj/structure/table/survival_pod,
+/obj/item/knife/combat/survival,
+/turf/open/floor/pod/dark,
+/area/lavaland/surface/outdoors/virtual_domain)
+
+(1,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+Ah
+"}
+(2,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ox
+"}
+(3,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ib
+ib
+nu
+nu
+ib
+ib
+ib
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+nu
+nu
+ib
+ox
+"}
+(4,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ib
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ox
+"}
+(5,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ox
+"}
+(6,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+wq
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ox
+"}
+(7,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+fA
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+ox
+"}
+(8,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ib
+ib
+nu
+nu
+nu
+nu
+nu
+fA
+fA
+fA
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+rt
+nu
+nu
+ib
+ib
+ox
+"}
+(9,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ib
+ib
+nu
+nu
+nu
+nu
+fA
+fA
+fA
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+ox
+"}
+(10,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+ib
+ib
+ib
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+ox
+"}
+(11,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+ib
+ib
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ox
+"}
+(12,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+ib
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+fA
+fA
+fA
+nu
+nu
+nu
+nu
+ib
+ox
+"}
+(13,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ib
+ib
+nu
+fG
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+fA
+fA
+fA
+nu
+nu
+nu
+nu
+ib
+ox
+"}
+(14,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ib
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+fA
+fA
+nu
+nu
+nu
+nu
+ib
+ox
+"}
+(15,1,1) = {"
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+ib
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ox
+"}
+(16,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+nu
+nu
+nu
+nu
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ox
+"}
+(17,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+Ti
+Ti
+Ti
+Ti
+GM
+nu
+nu
+nu
+nu
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+Io
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+Xb
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ox
+"}
+(18,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+et
+Ti
+GM
+GM
+GM
+nu
+nu
+nu
+nu
+GM
+GM
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ox
+"}
+(19,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+GM
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+GM
+GM
+GM
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+nu
+nu
+nu
+nu
+wq
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ox
+"}
+(20,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+Ti
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+GM
+GM
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ox
+"}
+(21,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+Ti
+nu
+nu
+nu
+nu
+GM
+Ti
+GM
+GM
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+Zh
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ox
+"}
+(22,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+FV
+nu
+nu
+nu
+nu
+Ti
+Dm
+Dm
+GM
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ox
+"}
+(23,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+Ti
+GM
+GM
+GM
+Ti
+Ti
+Dm
+Dm
+Ti
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ox
+"}
+(24,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+FV
+Ml
+Ti
+Dm
+Dm
+Ti
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+ox
+"}
+(25,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+GM
+GM
+Ti
+Dm
+Dm
+IB
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+GM
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+ox
+"}
+(26,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+GM
+GM
+GM
+GM
+GM
+GM
+fA
+fA
+fA
+fA
+RV
+fA
+fA
+fA
+fA
+fA
+fA
+Xn
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+As
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+ox
+"}
+(27,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+Ek
+Le
+be
+be
+kT
+GM
+GM
+GM
+GM
+fA
+fA
+xm
+fA
+fA
+fA
+GM
+ZM
+fA
+fA
+fA
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ox
+"}
+(28,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+dr
+KG
+mz
+KG
+KG
+jt
+GM
+GM
+GM
+GM
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+nu
+HZ
+nu
+bu
+nu
+nu
+nu
+MH
+nu
+nu
+lz
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+nu
+nu
+ib
+ox
+"}
+(29,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+bd
+mG
+Hw
+hU
+Mm
+lO
+et
+GM
+tk
+fA
+fA
+fA
+fA
+ak
+fA
+fA
+fA
+fA
+fA
+fA
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+YV
+nu
+nu
+So
+nu
+nu
+nu
+nu
+nu
+nu
+bu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+nu
+nu
+ib
+ox
+"}
+(30,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+Ez
+WR
+JD
+rU
+KG
+dm
+GM
+GM
+fA
+Hi
+fA
+fA
+fA
+ll
+fA
+fA
+Wm
+fA
+fA
+YV
+qs
+MH
+nu
+nu
+nu
+ny
+ca
+oS
+nu
+nu
+Qx
+nu
+nu
+hx
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+nu
+nu
+ib
+ox
+"}
+(31,1,1) = {"
+ox
+kg
+kg
+kg
+Hu
+Zq
+wy
+Zq
+lT
+kg
+kg
+Gn
+Gn
+KG
+Ak
+nv
+Ot
+mG
+hw
+kg
+kg
+Wm
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+ak
+nu
+nu
+qs
+nu
+nu
+TC
+nu
+YV
+nu
+ny
+nu
+oS
+nu
+nu
+nu
+SX
+nu
+nu
+nu
+zg
+BO
+BO
+BO
+BO
+BO
+og
+Ud
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+nu
+nu
+ib
+ox
+"}
+(32,1,1) = {"
+ox
+kg
+kg
+Gn
+VI
+xw
+gQ
+ka
+iR
+kg
+kg
+Gn
+Gn
+sz
+KG
+KG
+KG
+KG
+mz
+kg
+kZ
+kZ
+sd
+kZ
+lC
+kZ
+TJ
+UM
+kZ
+IQ
+UM
+UM
+AY
+nu
+nI
+nu
+nu
+nu
+nu
+oS
+nu
+nu
+nu
+nu
+nu
+qs
+nu
+nu
+nu
+nu
+nu
+nu
+BO
+BO
+BO
+BO
+BO
+BO
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+nu
+nu
+ib
+ox
+"}
+(33,1,1) = {"
+ox
+PO
+PO
+gk
+PO
+Zc
+IL
+Yu
+SJ
+Yu
+Yu
+Yu
+ob
+dL
+uK
+MP
+uK
+uK
+dL
+Jc
+Mo
+eJ
+Mo
+hc
+yu
+eJ
+Fg
+eJ
+YN
+tF
+Mo
+Zj
+HQ
+qo
+Jp
+nu
+aR
+nu
+TC
+nu
+YV
+nu
+nu
+oS
+nu
+nu
+ny
+Sw
+nu
+nu
+nu
+nu
+BO
+BO
+BO
+BO
+BO
+BO
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+Io
+ib
+ib
+nu
+nu
+ib
+ox
+"}
+(34,1,1) = {"
+ox
+kg
+kg
+Gn
+Nl
+gh
+jw
+lT
+oo
+kg
+kg
+Gn
+Gn
+Wa
+KG
+xd
+Ez
+mz
+HK
+kg
+ie
+Jw
+Jw
+jk
+Jw
+jk
+dn
+Jw
+Jw
+LH
+Ii
+Qi
+aI
+nu
+Xo
+nu
+nu
+YV
+Sw
+nu
+nu
+nu
+sA
+nu
+Gj
+nu
+nu
+HZ
+nu
+YV
+nu
+nu
+BO
+BO
+BO
+BO
+BO
+BO
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+nu
+nu
+ib
+ox
+"}
+(35,1,1) = {"
+ox
+kg
+kg
+kg
+Hu
+Ep
+iV
+Go
+Ip
+kg
+kg
+Gn
+Gn
+lO
+nO
+hU
+UD
+KG
+dm
+kg
+kg
+ll
+fA
+fA
+fA
+ak
+fA
+fA
+fA
+fA
+ll
+fA
+nu
+nu
+ny
+nu
+nu
+Aj
+HZ
+nu
+ew
+nu
+nu
+bu
+nu
+nu
+nu
+nu
+nu
+Aj
+nu
+nu
+BO
+BO
+BO
+BO
+BO
+BO
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+nu
+nu
+ib
+ox
+"}
+(36,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+KG
+WR
+iP
+rU
+Ez
+cf
+GM
+GM
+fA
+fA
+yZ
+vf
+ll
+fA
+fA
+fA
+ak
+fA
+fA
+oS
+ny
+qs
+YV
+qs
+nu
+nu
+nu
+nu
+nu
+nu
+Sw
+nu
+qs
+oS
+nu
+nu
+Sw
+nu
+nu
+BO
+BO
+BO
+BO
+BO
+BO
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+nu
+nu
+ib
+ox
+"}
+(37,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+bd
+xd
+zW
+nv
+DP
+KG
+FV
+GM
+GM
+fA
+fA
+fA
+GM
+Px
+fA
+IG
+GM
+Hi
+fA
+fA
+nu
+nu
+nu
+nu
+TC
+nu
+ah
+nu
+nu
+nm
+nu
+nu
+nu
+nu
+nu
+nu
+sk
+nu
+nu
+zg
+BO
+BO
+BO
+BO
+BO
+Fp
+Ud
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+nu
+nu
+ib
+ox
+"}
+(38,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+bd
+KG
+KG
+KG
+lO
+Jc
+GM
+GM
+GM
+fA
+fA
+fA
+fA
+fA
+fA
+GM
+Jt
+fA
+fA
+fA
+nu
+TC
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ox
+"}
+(39,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+Ek
+KG
+lO
+MW
+pP
+GM
+GM
+GM
+GM
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+xD
+fA
+fA
+fA
+oS
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ox
+"}
+(40,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+IB
+nu
+nu
+nu
+nu
+GM
+RV
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ox
+"}
+(41,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+GM
+nu
+nu
+Sw
+Xv
+GM
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+GM
+GM
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ox
+"}
+(42,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+GM
+nu
+nu
+nu
+ny
+GM
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+EC
+GM
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+Bo
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+ox
+"}
+(43,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+WM
+GM
+Px
+ny
+nu
+nu
+nu
+nu
+nu
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+ox
+"}
+(44,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+GM
+GM
+GM
+nu
+nu
+nu
+nu
+nu
+nu
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ox
+"}
+(45,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+GM
+GM
+GM
+nu
+nu
+nu
+nu
+nu
+nu
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ox
+"}
+(46,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+Ti
+GM
+GM
+nu
+nu
+nu
+nu
+nu
+nu
+fA
+fA
+ak
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+wq
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+fA
+ib
+ox
+"}
+(47,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+Ti
+GM
+nu
+nu
+nu
+nu
+nu
+nu
+fA
+fA
+fA
+xD
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+fA
+fA
+ib
+ox
+"}
+(48,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+Ti
+GM
+nu
+nu
+nu
+nu
+nu
+nu
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+fA
+fA
+ib
+ox
+"}
+(49,1,1) = {"
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+Ti
+GM
+nu
+nu
+nu
+nu
+nu
+nu
+fA
+fA
+fA
+GM
+fA
+fA
+fA
+fA
+fA
+fA
+fA
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+Fq
+nu
+ib
+ib
+ib
+ib
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+fA
+ib
+ox
+"}
+(50,1,1) = {"
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+kg
+ib
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+rt
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ox
+"}
+(51,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ib
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+dQ
+dQ
+XO
+dQ
+dQ
+GM
+nu
+nu
+nu
+ib
+ox
+"}
+(52,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+Fq
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+dQ
+GH
+jN
+ZN
+zo
+GM
+nu
+nu
+nu
+ib
+ox
+"}
+(53,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+RC
+Zu
+QD
+bt
+qW
+CX
+nu
+nu
+nu
+ib
+ox
+"}
+(54,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+fA
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+dQ
+WS
+Tm
+Vc
+SI
+Lx
+nu
+nu
+nu
+ib
+ox
+"}
+(55,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ib
+nu
+nu
+nu
+nu
+fA
+fA
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+dQ
+dQ
+Pv
+dQ
+dQ
+Lx
+nu
+nu
+nu
+ib
+ox
+"}
+(56,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ib
+ib
+nu
+nu
+nu
+fA
+fA
+fA
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+GM
+GM
+GM
+GM
+dx
+gK
+nu
+nu
+nu
+ib
+ox
+"}
+(57,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ib
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+Io
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ox
+"}
+(58,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+ox
+"}
+(59,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+fA
+fA
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+ox
+"}
+(60,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+fA
+fA
+fA
+fA
+nu
+nu
+nu
+nu
+nu
+nu
+Xb
+nu
+nu
+nu
+ib
+ox
+"}
+(61,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+nu
+nu
+ib
+ox
+"}
+(62,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ox
+"}
+(63,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ib
+ib
+nu
+nu
+nu
+ib
+ib
+ib
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+nu
+nu
+nu
+nu
+ib
+ib
+ib
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+nu
+ib
+ib
+nu
+nu
+nu
+nu
+ib
+ib
+ox
+"}
+(64,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ib
+ox
+"}
+(65,1,1) = {"
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+cp
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+ox
+"}
diff --git a/_maps/virtual_domains/pipedream.dmm b/_maps/virtual_domains/pipedream.dmm
new file mode 100644
index 00000000000..44bd845477a
--- /dev/null
+++ b/_maps/virtual_domains/pipedream.dmm
@@ -0,0 +1,3713 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"af" = (
+/obj/structure/chair/plastic{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"aw" = (
+/obj/structure/disposalpipe/sorting/mail/flip{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"ax" = (
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/obj/structure/frame/computer{
+ anchored = 1;
+ dir = 4
+ },
+/obj/item/shard{
+ icon_state = "medium"
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"aK" = (
+/turf/open/space/basic,
+/area/space)
+"aL" = (
+/obj/effect/turf_decal/tile/yellow/half/contrasted,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"bq" = (
+/obj/machinery/light/small/red/dim{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"bs" = (
+/turf/open/floor/carpet/orange,
+/area/virtual_domain/powered)
+"bw" = (
+/obj/structure/disposalpipe/broken{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/crate/preopen,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"bx" = (
+/obj/structure/frame/computer,
+/obj/item/shard,
+/turf/open/floor/carpet/royalblue{
+ icon_state = "carpet_royalblue-12"
+ },
+/area/virtual_domain/powered)
+"bA" = (
+/obj/structure/chair/plastic,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"bG" = (
+/obj/structure/lattice/catwalk{
+ name = "industrial lift"
+ },
+/obj/structure/closet/crate/preopen,
+/obj/structure/railing,
+/turf/open/chasm,
+/area/virtual_domain/powered)
+"bS" = (
+/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{
+ dir = 1
+ },
+/obj/structure/table/reinforced,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/item/folder/yellow,
+/obj/item/folder/blue{
+ pixel_x = 2;
+ pixel_y = -2
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"cw" = (
+/obj/effect/turf_decal/trimline/yellow/warning{
+ dir = 9
+ },
+/obj/effect/turf_decal/trimline/yellow/corner{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"cB" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 10
+ },
+/obj/effect/turf_decal/trimline/yellow/corner{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"cF" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 9
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"dx" = (
+/obj/effect/turf_decal/trimline/yellow/line,
+/obj/item/shard,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"dz" = (
+/obj/machinery/light/broken,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/trimline/yellow/corner,
+/obj/effect/turf_decal/trimline/yellow/warning{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"dA" = (
+/obj/machinery/light/dim{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"dP" = (
+/obj/effect/turf_decal/tile/yellow/half/contrasted,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"eg" = (
+/turf/closed/wall,
+/area/virtual_domain/powered)
+"ei" = (
+/obj/machinery/conveyor/auto{
+ dir = 6;
+ icon_state = "conveyor_map_inverted";
+ inverted = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"ev" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"eJ" = (
+/obj/structure/disposalpipe/sorting{
+ dir = 2
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"eN" = (
+/obj/effect/turf_decal/trimline/yellow/arrow_cw{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/broken{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"eY" = (
+/turf/closed/wall/r_wall,
+/area/virtual_domain/powered)
+"fe" = (
+/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{
+ dir = 8
+ },
+/obj/structure/table/reinforced,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"fg" = (
+/turf/open/floor/iron/stairs/left{
+ dir = 8
+ },
+/area/virtual_domain/powered)
+"fj" = (
+/obj/structure/closet/crate/preopen,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"fl" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"fw" = (
+/obj/structure/door_assembly/door_assembly_eng,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"fK" = (
+/obj/structure/chair/stool/bar/directional/west,
+/turf/open/floor/iron/cafeteria,
+/area/virtual_domain/powered)
+"fR" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 5
+ },
+/obj/structure/sign/poster/official/random/directional/west,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"fZ" = (
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/obj/structure/chair/office{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"gc" = (
+/obj/structure/disposalpipe/broken,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"gj" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"gs" = (
+/obj/machinery/door/airlock/external/glass/ruin,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"gN" = (
+/obj/structure/disposalpipe/sorting{
+ dir = 8
+ },
+/turf/open/floor/catwalk_floor/iron,
+/area/virtual_domain/powered)
+"gV" = (
+/obj/effect/turf_decal/trimline/yellow/warning{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"hg" = (
+/obj/effect/turf_decal/caution{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"hi" = (
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"hk" = (
+/obj/effect/turf_decal/tile/yellow/anticorner/contrasted,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/broken{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"ho" = (
+/obj/effect/turf_decal/siding/white{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"iw" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"iz" = (
+/obj/structure/broken_flooring/corner,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"iI" = (
+/obj/effect/turf_decal/trimline/yellow/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/yellow/corner,
+/obj/effect/decal/cleanable/blood/drip,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"jv" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 8
+ },
+/obj/machinery/light/small/red/dim{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"jw" = (
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"jH" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/catwalk_floor/iron,
+/area/virtual_domain/powered)
+"jQ" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/light/small/red/dim{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"jS" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"jW" = (
+/obj/effect/decal/cleanable/generic,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"kh" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"ki" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/landmark/bitrunning/cache_spawn,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"kn" = (
+/obj/machinery/light/small/red/dim{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"kJ" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/door/poddoor/shutters/indestructible{
+ dir = 4;
+ id = "factorylockdown"
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"kU" = (
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"lp" = (
+/obj/machinery/door/airlock/maintenance,
+/obj/effect/mapping_helpers/airlock/locked,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"lt" = (
+/obj/structure/disposalpipe/sorting{
+ dir = 8
+ },
+/mob/living/basic/hivebot/range,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"lx" = (
+/obj/machinery/door/poddoor/shutters/indestructible{
+ dir = 4;
+ id = "factorylockdown"
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"lB" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 5
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"lC" = (
+/obj/machinery/door/airlock/glass,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"lI" = (
+/obj/effect/mapping_helpers/burnt_floor,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"lN" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"lW" = (
+/obj/structure/disposalpipe/sorting{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"mh" = (
+/obj/structure/broken_flooring/pile{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"mu" = (
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"mE" = (
+/obj/machinery/door/airlock/maintenance,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"mY" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 1
+ },
+/obj/machinery/light/small/red/dim{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"nc" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 1
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/sign/poster/official/safety_internals/directional/south,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"nz" = (
+/obj/structure/broken_flooring/side/directional/north,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"nD" = (
+/obj/structure/disposalpipe/trunk/multiz,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"nL" = (
+/obj/effect/turf_decal/tile/dark/half,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"nS" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"op" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/dim{
+ dir = 1
+ },
+/obj/structure/sign/warning/doors/directional/north,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"oN" = (
+/obj/machinery/conveyor/auto,
+/obj/structure/window/reinforced/spawner/directional/west,
+/obj/structure/window/reinforced/spawner/directional/east,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"oX" = (
+/obj/structure/broken_flooring/corner/directional/north,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"pa" = (
+/obj/machinery/light/small/red/dim{
+ dir = 1
+ },
+/turf/open/floor/carpet/orange,
+/area/virtual_domain/powered)
+"pb" = (
+/obj/structure/broken_flooring/corner{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"pf" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/effect/mapping_helpers/damaged_window,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"pi" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"po" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet/crate/maint,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"pv" = (
+/obj/structure/broken_flooring/side{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"pI" = (
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/obj/machinery/light/small/red/dim{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"pJ" = (
+/obj/structure/broken_flooring/pile{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"qc" = (
+/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{
+ dir = 8
+ },
+/obj/structure/table/reinforced,
+/obj/effect/spawner/random/bureaucracy/briefcase,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"qk" = (
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"qK" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/sign/warning/secure_area/directional/north,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"qN" = (
+/obj/effect/turf_decal/siding/white{
+ dir = 4
+ },
+/obj/effect/mob_spawn/corpse/human/factory,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"qT" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/light/small/red/dim{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"qV" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"qW" = (
+/obj/machinery/light/dim{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"rc" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/sign/poster/contraband/random/directional/north,
+/obj/effect/landmark/bitrunning/cache_spawn,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"rz" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 1
+ },
+/obj/machinery/light/small/red/dim,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"rG" = (
+/obj/machinery/light/dim,
+/obj/effect/turf_decal/trimline/yellow/line,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"rJ" = (
+/obj/structure/railing,
+/obj/effect/decal/cleanable/oil,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"rM" = (
+/obj/structure/disposalpipe/broken{
+ dir = 1
+ },
+/mob/living/basic/hivebot/strong,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"rO" = (
+/turf/closed/mineral,
+/area/space)
+"sn" = (
+/turf/open/floor/carpet/royalblue{
+ icon_state = "carpet_royalblue-38"
+ },
+/area/virtual_domain/powered)
+"sB" = (
+/obj/machinery/light/broken{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/stripes{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"sW" = (
+/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/turf_decal/trimline/yellow/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/yellow/corner{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/blood/drip,
+/obj/effect/decal/cleanable/blood/drip,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"tl" = (
+/obj/machinery/door/poddoor/shutters/indestructible{
+ id = "factorylockdown"
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"tr" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"tE" = (
+/obj/structure/disposalpipe/segment,
+/mob/living/basic/hivebot/range,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"ud" = (
+/obj/effect/decal/cleanable/blood/drip,
+/turf/open/floor/carpet/royalblue{
+ icon_state = "carpet_royalblue-110"
+ },
+/area/virtual_domain/powered)
+"uk" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/effect/decal/cleanable/blood/splatter/over_window,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"um" = (
+/obj/machinery/light/dim{
+ dir = 1
+ },
+/turf/open/floor/iron/cafeteria,
+/area/virtual_domain/powered)
+"uv" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/broken_flooring/pile{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"uz" = (
+/obj/effect/spawner/random/trash/mess,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"uC" = (
+/obj/structure/falsewall,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"uF" = (
+/obj/structure/disposalpipe/segment,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"uP" = (
+/turf/open/floor/carpet/royalblue{
+ icon_state = "carpet_royalblue-55"
+ },
+/area/virtual_domain/powered)
+"uU" = (
+/obj/structure/broken_flooring/side,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"vb" = (
+/obj/effect/turf_decal/trimline/yellow/line,
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 5
+ },
+/obj/machinery/light/broken,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"ve" = (
+/obj/machinery/mass_driver/trash{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"vA" = (
+/obj/structure/closet/crate/maint,
+/obj/effect/turf_decal/stripes{
+ dir = 9
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"vL" = (
+/obj/effect/decal/cleanable/glass,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"vQ" = (
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"vU" = (
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"wg" = (
+/obj/machinery/light/small/red/dim{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet/crate/preopen,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"wh" = (
+/obj/structure/table/wood,
+/turf/open/floor/carpet/royalblue{
+ icon_state = "carpet_royalblue-207"
+ },
+/area/virtual_domain/powered)
+"wl" = (
+/obj/item/shard,
+/turf/open/space/basic,
+/area/space)
+"wm" = (
+/obj/effect/turf_decal/tile/yellow/half/contrasted{
+ dir = 1
+ },
+/obj/structure/sign/clock/directional/north,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"wq" = (
+/obj/structure/table/wood,
+/obj/machinery/button/door{
+ name = "Cargo Bay Lockdown";
+ id = "factorylockdown"
+ },
+/turf/open/floor/carpet/royalblue{
+ icon_state = "carpet_royalblue-63"
+ },
+/area/virtual_domain/powered)
+"ws" = (
+/obj/effect/turf_decal/trimline/yellow/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/yellow/corner{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"ww" = (
+/obj/effect/turf_decal/stripes{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/mob/living/basic/hivebot,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"wU" = (
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"wW" = (
+/obj/effect/turf_decal/tile/yellow/fourcorners,
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"xa" = (
+/obj/machinery/door/poddoor/shutters/indestructible{
+ dir = 8;
+ id = "factorylockdown"
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"xj" = (
+/obj/structure/railing/corner/end{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"xk" = (
+/obj/machinery/light/dim{
+ dir = 4
+ },
+/obj/effect/landmark/bitrunning/cache_spawn,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"xl" = (
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"xA" = (
+/obj/effect/decal/cleanable/generic,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"xE" = (
+/obj/effect/turf_decal/trimline/yellow/line,
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 9
+ },
+/obj/machinery/light/broken,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"xF" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/closed/indestructible/binary,
+/area/virtual_domain/powered)
+"xM" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/bed/dogbed{
+ name = "cat bed"
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"xT" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"yB" = (
+/obj/machinery/door/airlock/maintenance,
+/obj/effect/mapping_helpers/airlock/welded,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"yM" = (
+/turf/closed/indestructible/fakedoor{
+ name = "Stairwell Access"
+ },
+/area/virtual_domain/powered)
+"yQ" = (
+/turf/template_noop,
+/area/template_noop)
+"yX" = (
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"zp" = (
+/obj/structure/chair/sofa/corp/right{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/light/broken,
+/turf/open/floor/carpet/orange,
+/area/virtual_domain/powered)
+"zB" = (
+/obj/structure/closet/crate/bin,
+/obj/item/trash/tray,
+/obj/effect/spawner/random/trash/garbage,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"zE" = (
+/obj/structure/disposalpipe/broken{
+ dir = 1
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"zO" = (
+/obj/effect/turf_decal/siding/white{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/light/broken,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Av" = (
+/obj/item/stack/rods/two,
+/turf/open/space/basic,
+/area/space)
+"Aw" = (
+/obj/structure/lattice/catwalk{
+ name = "industrial lift"
+ },
+/mob/living/basic/hivebot/rapid,
+/turf/open/chasm,
+/area/virtual_domain/powered)
+"AJ" = (
+/obj/effect/decal/cleanable/generic,
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"AP" = (
+/obj/structure/railing,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"AU" = (
+/turf/open/misc/asteroid/airless,
+/area/space)
+"Bd" = (
+/obj/structure/closet/secure_closet/tac{
+ req_access = null
+ },
+/obj/item/ammo_casing/shotgun/buckshot,
+/obj/item/ammo_casing/shotgun/buckshot,
+/obj/item/ammo_casing/shotgun/buckshot,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Bh" = (
+/obj/structure/broken_flooring/corner/directional/east,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Bx" = (
+/obj/structure/table/reinforced,
+/obj/machinery/microwave{
+ broken = 1;
+ desc = "No longer cooks and boils stuff."
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"BA" = (
+/obj/structure/broken_flooring/corner/directional/south,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"BI" = (
+/obj/machinery/door/airlock/command/glass{
+ name = "Quartermaster's Office"
+ },
+/obj/effect/mapping_helpers/airlock/access/any/away/command,
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"BN" = (
+/obj/structure/flora/rock/pile/style_random,
+/turf/open/misc/asteroid/airless,
+/area/space)
+"BW" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/trimline/yellow/warning{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"BX" = (
+/obj/effect/decal/cleanable/robot_debris/old,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Ci" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Ct" = (
+/obj/machinery/conveyor/auto{
+ dir = 6
+ },
+/obj/machinery/light/broken{
+ dir = 1
+ },
+/obj/structure/sign/warning/vacuum/directional/north,
+/obj/structure/window/reinforced/spawner/directional/east,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Cv" = (
+/obj/structure/chair/office{
+ dir = 8
+ },
+/turf/open/floor/carpet/royalblue{
+ icon_state = "carpet_royalblue-157"
+ },
+/area/virtual_domain/powered)
+"CA" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/broken_flooring/side{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"CQ" = (
+/obj/effect/spawner/random/trash/botanical_waste,
+/obj/item/trash/chips,
+/obj/structure/closet/secure_closet/freezer/empty/open,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"CR" = (
+/obj/structure/flora/rock/pile/style_random,
+/turf/open/misc/asteroid/airless,
+/area/virtual_domain/powered)
+"CX" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Dr" = (
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/obj/machinery/light/dim{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"DA" = (
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/catwalk_floor/iron,
+/area/virtual_domain/powered)
+"DE" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"DP" = (
+/obj/structure/table/reinforced,
+/obj/effect/spawner/random/food_or_drink/snack,
+/turf/open/floor/iron/cafeteria,
+/area/virtual_domain/powered)
+"Ex" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/carpet/royalblue{
+ icon_state = "carpet_royalblue-137"
+ },
+/area/virtual_domain/powered)
+"Ez" = (
+/obj/structure/flora/rock/style_random,
+/turf/open/misc/asteroid/airless,
+/area/space)
+"EI" = (
+/obj/effect/turf_decal/stripes{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/oil,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"EJ" = (
+/obj/machinery/recycler/deathtrap{
+ dir = 8
+ },
+/obj/machinery/conveyor/auto{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Fa" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/crate/maint,
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Ff" = (
+/obj/structure/disposalpipe/trunk/multiz{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Fo" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron/cafeteria,
+/area/virtual_domain/powered)
+"Fr" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/closet/crate/preopen,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Fw" = (
+/obj/structure/flora/bush/fullgrass/style_random,
+/obj/structure/flora/rock/pile/style_random,
+/obj/structure/flora/bush/flowers_yw/style_random,
+/obj/structure/window/reinforced/spawner/directional/north,
+/obj/structure/window/reinforced/spawner/directional/west,
+/turf/open/floor/grass,
+/area/virtual_domain/powered)
+"FK" = (
+/obj/effect/mapping_helpers/burnt_floor,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"FO" = (
+/turf/open/misc/asteroid/airless,
+/area/virtual_domain/powered)
+"FP" = (
+/turf/open/floor/carpet/royalblue{
+ icon_state = "carpet_royalblue-110"
+ },
+/area/virtual_domain/powered)
+"Gb" = (
+/obj/effect/turf_decal/stripes{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Ge" = (
+/turf/open/floor/carpet/royalblue{
+ icon_state = "carpet_royalblue-21"
+ },
+/area/virtual_domain/powered)
+"Gh" = (
+/obj/machinery/door/airlock/maintenance,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Gi" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 9
+ },
+/obj/effect/turf_decal/trimline/yellow/corner,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Gs" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 1
+ },
+/obj/machinery/light/broken{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Gy" = (
+/obj/machinery/conveyor/auto{
+ dir = 9;
+ inverted = 1;
+ icon_state = "conveyor_map_inverted"
+ },
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/window/reinforced/spawner/directional/west,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"GI" = (
+/obj/effect/turf_decal/trimline/yellow/arrow_ccw,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"GV" = (
+/obj/machinery/light/small/red/dim{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes{
+ dir = 9
+ },
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Hn" = (
+/turf/open/floor/iron/cafeteria,
+/area/virtual_domain/powered)
+"HI" = (
+/obj/structure/broken_flooring/pile/directional/north,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Ib" = (
+/obj/structure/chair/sofa/corp/left{
+ dir = 1
+ },
+/turf/open/floor/carpet/orange,
+/area/virtual_domain/powered)
+"Ip" = (
+/obj/machinery/door/airlock/engineering/glass,
+/obj/effect/mapping_helpers/airlock/access/any/away/supply,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Is" = (
+/obj/machinery/door/airlock/engineering/glass,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"IF" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"IK" = (
+/obj/effect/turf_decal/trimline/yellow/line,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"IZ" = (
+/obj/structure/lattice/catwalk{
+ name = "industrial lift"
+ },
+/obj/structure/closet/crate,
+/turf/open/chasm,
+/area/virtual_domain/powered)
+"Jl" = (
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Jm" = (
+/obj/structure/broken_flooring/pile/directional/north,
+/obj/machinery/light/dim,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Jn" = (
+/obj/effect/turf_decal/stripes{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment,
+/obj/structure/railing/corner/end/flip{
+ dir = 8
+ },
+/obj/structure/sign/warning/doors/directional/east,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Jq" = (
+/obj/structure/broken_flooring/pile{
+ dir = 1
+ },
+/obj/structure/sign/poster/contraband/random/directional/west,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"JE" = (
+/obj/machinery/light/small/red/dim{
+ dir = 1
+ },
+/obj/structure/sign/warning/chem_diamond/directional/west,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"JR" = (
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"JT" = (
+/obj/structure/lattice/catwalk{
+ name = "industrial lift"
+ },
+/obj/effect/spawner/random/trash/grime,
+/turf/open/chasm,
+/area/virtual_domain/powered)
+"Kb" = (
+/obj/effect/mob_spawn/corpse/human/factory/guard,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Kt" = (
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"KO" = (
+/obj/structure/broken_flooring/side/directional/north,
+/obj/machinery/light/small/red/dim,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"KX" = (
+/obj/structure/lattice/catwalk{
+ name = "industrial lift"
+ },
+/turf/open/chasm,
+/area/virtual_domain/powered)
+"Ln" = (
+/obj/structure/disposalpipe/broken{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Lp" = (
+/obj/effect/turf_decal/trimline/yellow/line,
+/obj/machinery/light/broken,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"LN" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 10
+ },
+/obj/machinery/light/dim{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"LU" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 6
+ },
+/obj/effect/turf_decal/trimline/yellow/corner{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Mc" = (
+/obj/effect/turf_decal/trimline/yellow/warning,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Mh" = (
+/obj/machinery/conveyor/auto{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Mi" = (
+/obj/effect/mob_spawn/corpse/human/factory,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Mj" = (
+/turf/closed/mineral,
+/area/virtual_domain/powered)
+"Mu" = (
+/obj/effect/turf_decal/trimline/yellow/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/yellow/corner{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Mx" = (
+/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{
+ dir = 1
+ },
+/obj/structure/filingcabinet,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"My" = (
+/obj/machinery/conveyor/auto{
+ dir = 1
+ },
+/obj/machinery/light/small/red/dim{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"MI" = (
+/turf/open/floor/carpet/royalblue{
+ icon_state = "carpet_royalblue-74"
+ },
+/area/virtual_domain/powered)
+"MN" = (
+/obj/effect/turf_decal/tile/dark,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Nc" = (
+/obj/structure/chair/plastic{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Nu" = (
+/obj/effect/turf_decal/trimline/yellow/line,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"NW" = (
+/obj/effect/decal/cleanable/dirt,
+/mob/living/basic/hivebot/strong,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Ok" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"On" = (
+/obj/structure/broken_flooring/side{
+ dir = 4
+ },
+/obj/machinery/light/broken{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"OJ" = (
+/obj/structure/disposalpipe/segment,
+/obj/effect/turf_decal/stripes{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"OL" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"OQ" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/sign/poster/ripped/directional/west,
+/turf/open/floor/carpet/orange,
+/area/virtual_domain/powered)
+"OR" = (
+/obj/machinery/light/broken,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Po" = (
+/obj/machinery/light/small/red/dim{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment,
+/obj/structure/broken_flooring/corner,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Pr" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 5
+ },
+/obj/effect/turf_decal/trimline/yellow/corner{
+ dir = 8
+ },
+/obj/structure/sign/poster/official/random/directional/east,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"PH" = (
+/obj/structure/railing/corner/end/flip{
+ dir = 8
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Qd" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 6
+ },
+/obj/machinery/light/dim{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Qh" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/light/broken{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Qj" = (
+/obj/machinery/light/dim{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Qo" = (
+/obj/effect/landmark/bitrunning/safehouse_spawn,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"Qr" = (
+/turf/closed/indestructible/fakedoor/maintenance{
+ name = "maintenance access"
+ },
+/area/virtual_domain/powered)
+"Qv" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 9
+ },
+/obj/machinery/light/small/red/dim{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Qy" = (
+/obj/structure/disposalpipe/trunk{
+ dir = 8
+ },
+/obj/structure/disposaloutlet{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"QI" = (
+/obj/structure/sign/calendar/directional/north,
+/obj/effect/spawner/random/trash/garbage,
+/turf/open/floor/iron/cafeteria,
+/area/virtual_domain/powered)
+"QK" = (
+/obj/structure/table,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"QN" = (
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"QP" = (
+/obj/structure/sign/poster/contraband/random/directional/east,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"QW" = (
+/obj/machinery/conveyor/auto{
+ dir = 5
+ },
+/obj/effect/decal/cleanable/cobweb,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Ru" = (
+/obj/machinery/door/airlock/external/glass/ruin,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Ry" = (
+/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{
+ dir = 4
+ },
+/obj/structure/disposalpipe/trunk{
+ dir = 8
+ },
+/obj/machinery/disposal/bin,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"RJ" = (
+/turf/closed/indestructible/binary,
+/area/virtual_domain/powered)
+"RK" = (
+/obj/effect/decal/cleanable/blood/drip,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"RZ" = (
+/obj/effect/turf_decal/tile/yellow/half/contrasted{
+ dir = 1
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Sg" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 1
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Sl" = (
+/obj/effect/turf_decal/trimline/yellow/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/yellow/warning{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"SC" = (
+/mob/living/basic/hivebot/strong,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"SR" = (
+/obj/effect/turf_decal/trimline/yellow/line,
+/obj/effect/decal/cleanable/glass,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"SS" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/closed/mineral,
+/area/virtual_domain/powered)
+"SU" = (
+/obj/effect/spawner/structure/window,
+/obj/item/stack/rods/two,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"SZ" = (
+/obj/structure/table/reinforced,
+/obj/effect/spawner/random/food_or_drink/booze,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Te" = (
+/obj/effect/decal/cleanable/blood/tracks{
+ dir = 5
+ },
+/obj/effect/mob_spawn/corpse/human/factory/qm,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Tn" = (
+/obj/structure/broken_flooring/corner{
+ dir = 4
+ },
+/mob/living/basic/hivebot,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Tp" = (
+/obj/machinery/door/poddoor/shutters/indestructible{
+ dir = 4;
+ id = "factorylockdown"
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Tt" = (
+/obj/machinery/conveyor/auto{
+ dir = 9
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"TH" = (
+/obj/structure/broken_flooring/corner/directional/south,
+/obj/item/ammo_casing/shotgun/buckshot/spent,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Ue" = (
+/obj/structure/table/reinforced,
+/obj/machinery/light/small/red/dim{
+ dir = 8
+ },
+/obj/structure/sign/poster/official/cleanliness/directional/west,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Uw" = (
+/obj/machinery/light/dim{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"UO" = (
+/obj/structure/broken_flooring/side/directional/north,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"UV" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 6
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"UX" = (
+/obj/effect/turf_decal/trimline/yellow/line,
+/obj/machinery/light/small/red/dim,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"UY" = (
+/obj/effect/decal/cleanable/blood/tracks{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Vb" = (
+/obj/effect/turf_decal/trimline/yellow/corner{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/light/broken,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Vg" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 1
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/obj/machinery/light/small/red/dim,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Vh" = (
+/obj/structure/table/reinforced,
+/turf/open/floor/iron/cafeteria,
+/area/virtual_domain/powered)
+"Vy" = (
+/obj/structure/broken_flooring/singular{
+ dir = 4
+ },
+/obj/effect/mob_spawn/corpse/human/factory/guard,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"VA" = (
+/obj/machinery/light/small/red/dim{
+ dir = 1
+ },
+/obj/structure/table,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"VJ" = (
+/obj/structure/broken_flooring/corner{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"VL" = (
+/obj/structure/sign/warning/secure_area/directional/south,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"VO" = (
+/obj/machinery/light/broken{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Wd" = (
+/obj/structure/lattice/catwalk{
+ name = "industrial lift"
+ },
+/obj/structure/railing,
+/turf/open/chasm,
+/area/virtual_domain/powered)
+"Wp" = (
+/obj/effect/turf_decal/trimline/yellow/warning{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"WT" = (
+/obj/effect/turf_decal/stripes{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"WV" = (
+/obj/machinery/conveyor/auto{
+ dir = 10;
+ inverted = 1;
+ icon_state = "conveyor_map_inverted"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Xb" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/closed/wall,
+/area/virtual_domain/powered)
+"Xc" = (
+/obj/effect/turf_decal/trimline/yellow/line,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Xm" = (
+/obj/item/gun/ballistic/shotgun/lethal,
+/obj/machinery/light/broken{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Xo" = (
+/obj/machinery/conveyor/auto{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Xw" = (
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/trimline/yellow/line{
+ dir = 10
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"XL" = (
+/obj/effect/turf_decal/trimline/yellow/warning{
+ dir = 5
+ },
+/obj/effect/turf_decal/trimline/yellow/corner{
+ dir = 4
+ },
+/obj/structure/sign/warning/vacuum/external/directional/south,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"XN" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"XO" = (
+/obj/effect/turf_decal/delivery,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"XP" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/railing/corner/end{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"XQ" = (
+/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{
+ dir = 4
+ },
+/obj/machinery/light/dim{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"XR" = (
+/obj/effect/turf_decal/trimline/yellow/warning{
+ dir = 1
+ },
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Yc" = (
+/obj/item/gun/ballistic/revolver,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Yl" = (
+/obj/structure/broken_flooring/corner/directional/west,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Ym" = (
+/mob/living/simple_animal/pet/cat/space,
+/obj/structure/bed/dogbed{
+ name = "cat bed"
+ },
+/obj/item/toy/plush/moth{
+ pixel_x = 3;
+ pixel_y = 4
+ },
+/obj/machinery/light/small/dim/directional/south,
+/obj/structure/sign/poster/official/moth_hardhat/directional/west,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Yt" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Yz" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/door/poddoor/shutters/indestructible{
+ id = "factorylockdown"
+ },
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"YF" = (
+/obj/machinery/light/small/red/dim,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"YL" = (
+/obj/effect/turf_decal/tile/yellow/anticorner/contrasted,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"YP" = (
+/obj/effect/turf_decal/trimline/yellow/corner{
+ dir = 1
+ },
+/obj/machinery/light/dim,
+/turf/open/floor/iron,
+/area/virtual_domain/powered)
+"Zb" = (
+/obj/effect/decal/cleanable/oil,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"Zg" = (
+/turf/open/floor/carpet/royalblue{
+ icon_state = "carpet_royalblue-157"
+ },
+/area/virtual_domain/powered)
+"Zy" = (
+/obj/structure/table,
+/obj/item/flashlight/lantern,
+/turf/open/floor/plating,
+/area/virtual_domain/powered)
+"ZI" = (
+/turf/open/floor/carpet/royalblue{
+ icon_state = "carpet_royalblue-203"
+ },
+/area/virtual_domain/powered)
+"ZP" = (
+/obj/structure/railing,
+/turf/open/floor/iron/stairs/right{
+ dir = 8
+ },
+/area/virtual_domain/powered)
+
+(1,1,1) = {"
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+"}
+(2,1,1) = {"
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+RJ
+Mj
+Mj
+eg
+eg
+SS
+eg
+eg
+eg
+Xb
+Mj
+Mj
+RJ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+"}
+(3,1,1) = {"
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+RJ
+Mj
+Bx
+SZ
+Ue
+CQ
+zB
+eg
+OQ
+bs
+Ib
+Mj
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+yQ
+yQ
+"}
+(4,1,1) = {"
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+eg
+ho
+ho
+qN
+ho
+zO
+eg
+pa
+bs
+zp
+eY
+RJ
+RJ
+Mj
+RJ
+RJ
+rO
+rO
+RJ
+RJ
+xF
+"}
+(5,1,1) = {"
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+RJ
+eg
+eg
+eg
+eg
+eg
+eg
+eg
+RJ
+eg
+um
+DP
+Vh
+Vh
+Hn
+tr
+fg
+ZP
+Fw
+eY
+Mj
+Mj
+Mj
+AU
+AU
+AU
+rO
+rO
+rO
+RJ
+"}
+(6,1,1) = {"
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+RJ
+eg
+vA
+Dr
+bw
+Jq
+gc
+eg
+RJ
+eg
+Hn
+fK
+fK
+fK
+Hn
+lC
+hi
+FK
+eY
+eY
+Mj
+Ez
+AU
+aK
+aK
+AU
+AU
+BN
+rO
+RJ
+"}
+(7,1,1) = {"
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+RJ
+eg
+jQ
+lt
+kU
+vU
+lN
+eg
+RJ
+eg
+QI
+Fo
+Hn
+Hn
+Hn
+tr
+hi
+Ln
+eY
+Mj
+Mj
+AU
+AU
+BN
+aK
+aK
+aK
+AU
+rO
+RJ
+"}
+(8,1,1) = {"
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+RJ
+eg
+uU
+gj
+kU
+Tn
+OR
+eg
+RJ
+eg
+eg
+uk
+pf
+pf
+eg
+eg
+qV
+Vb
+eY
+aK
+aK
+aK
+aK
+aK
+aK
+aK
+aK
+aK
+aK
+RJ
+"}
+(9,1,1) = {"
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+RJ
+eg
+ki
+gj
+kU
+kU
+kU
+eg
+RJ
+eg
+kU
+kU
+nD
+nS
+kU
+Qj
+FK
+nc
+eY
+aK
+aK
+aK
+aK
+aK
+aK
+AU
+aK
+aK
+aK
+RJ
+"}
+(10,1,1) = {"
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+eg
+eg
+kJ
+lx
+lx
+lp
+eg
+RJ
+eg
+mu
+AJ
+mu
+eJ
+MN
+BW
+hi
+Sg
+eY
+aK
+aK
+aK
+aK
+aK
+aK
+aK
+aK
+aK
+aK
+RJ
+"}
+(11,1,1) = {"
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+eg
+eg
+eg
+Qr
+eg
+eg
+JE
+gj
+pi
+kU
+VL
+eg
+eg
+eg
+VO
+kU
+Fr
+jw
+qk
+XR
+vQ
+Vg
+eY
+aK
+aK
+aK
+JR
+JR
+JR
+JR
+JR
+Qo
+aK
+RJ
+"}
+(12,1,1) = {"
+yQ
+yQ
+yQ
+yQ
+RJ
+RJ
+RJ
+eg
+eg
+eg
+eg
+eg
+eg
+yM
+eg
+GV
+WT
+xj
+qk
+Qh
+XP
+lW
+ww
+EI
+Kt
+Qh
+mu
+Yz
+xl
+HI
+kU
+Bh
+Kb
+kU
+hi
+CX
+eY
+eY
+aK
+aK
+JR
+JR
+JR
+JR
+JR
+JR
+aK
+RJ
+"}
+(13,1,1) = {"
+yQ
+yQ
+yQ
+yQ
+RJ
+RJ
+RJ
+eg
+VA
+bA
+eg
+kU
+sB
+WT
+mh
+kU
+pv
+AP
+IZ
+KX
+Wd
+uv
+DE
+Mi
+gj
+xT
+hi
+tl
+IF
+kU
+hi
+Yc
+kU
+kU
+vU
+lB
+XL
+eg
+tr
+eY
+JR
+JR
+JR
+JR
+JR
+JR
+aK
+RJ
+"}
+(14,1,1) = {"
+yQ
+yQ
+yQ
+yQ
+RJ
+RJ
+kU
+kU
+Zy
+kU
+Gh
+Kt
+mu
+mu
+mu
+uF
+xl
+AP
+KX
+JT
+bG
+qk
+DA
+DA
+zE
+gc
+mu
+Yz
+lW
+pi
+kU
+kU
+nL
+BW
+hi
+hg
+Wp
+Ru
+hi
+gs
+JR
+JR
+JR
+JR
+JR
+JR
+aK
+RJ
+"}
+(15,1,1) = {"
+yQ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+kU
+QP
+kU
+eg
+qT
+Gb
+Uw
+iz
+jS
+gj
+rJ
+KX
+Aw
+Wd
+Ff
+lN
+XO
+gj
+DE
+SC
+tl
+qk
+mu
+mu
+xl
+kU
+oX
+hi
+cF
+cw
+eY
+tr
+eY
+JR
+JR
+JR
+JR
+JR
+JR
+aK
+RJ
+"}
+(16,1,1) = {"
+yQ
+RJ
+Mj
+Mj
+Mj
+Mj
+RJ
+eg
+eg
+eg
+eg
+Xb
+yB
+eg
+eg
+kU
+qk
+PH
+dA
+Po
+Jn
+aw
+OJ
+CA
+QN
+kU
+Uw
+tl
+kU
+Mc
+kU
+kh
+fj
+kU
+FK
+CX
+eY
+eY
+aK
+aK
+JR
+JR
+JR
+JR
+JR
+JR
+aK
+RJ
+"}
+(17,1,1) = {"
+yQ
+RJ
+Mj
+BN
+AU
+Mj
+Mj
+Mj
+eg
+QW
+My
+Qy
+kU
+po
+eg
+tr
+Is
+tr
+eg
+eg
+eg
+kU
+pi
+kU
+lI
+YF
+eg
+eg
+op
+kU
+BA
+iw
+kU
+kU
+FK
+rz
+eY
+aK
+aK
+aK
+JR
+JR
+JR
+JR
+JR
+ev
+aK
+RJ
+"}
+(18,1,1) = {"
+yQ
+RJ
+aK
+AU
+AU
+AU
+aK
+aK
+eg
+Ct
+oN
+Gy
+jW
+xT
+eg
+Tp
+Tp
+Tp
+eg
+Ym
+eg
+eg
+xa
+xa
+xa
+eg
+eg
+eg
+kU
+Zb
+kU
+Yt
+kU
+UO
+hi
+CX
+eY
+aK
+aK
+aK
+aK
+aK
+aK
+aK
+aK
+aK
+aK
+RJ
+"}
+(19,1,1) = {"
+RJ
+RJ
+aK
+aK
+aK
+aK
+wl
+aK
+yX
+ve
+Tt
+Xo
+DE
+oX
+eg
+Sl
+gV
+dz
+eg
+uC
+eg
+qK
+mh
+kU
+kU
+Qj
+VJ
+eg
+kU
+kU
+kU
+gj
+kU
+kU
+hi
+Ok
+eY
+aK
+aK
+aK
+aK
+aK
+aK
+aK
+aK
+aK
+aK
+RJ
+"}
+(20,1,1) = {"
+RJ
+aK
+aK
+aK
+aK
+aK
+aK
+aK
+tr
+uz
+Mh
+EJ
+kU
+kU
+mE
+Mu
+Yl
+pJ
+eg
+kn
+pb
+kU
+kU
+kU
+Fa
+kU
+YF
+eg
+eg
+pf
+tr
+XN
+eg
+eg
+Ci
+YP
+eY
+eY
+aK
+aK
+aK
+aK
+aK
+aK
+aK
+aK
+aK
+RJ
+"}
+(21,1,1) = {"
+RJ
+aK
+aK
+aK
+aK
+aK
+Av
+CR
+tr
+kU
+ei
+WV
+pi
+Jm
+eg
+eN
+gN
+GI
+eg
+rc
+mu
+rM
+gc
+vQ
+tE
+mu
+mu
+eg
+Mx
+qc
+ax
+bS
+fe
+pf
+hi
+hi
+af
+eY
+aK
+aK
+aK
+aK
+aK
+aK
+aK
+aK
+aK
+RJ
+"}
+(22,1,1) = {"
+RJ
+aK
+aK
+aK
+aK
+aK
+aK
+FO
+eg
+eg
+wg
+uU
+lN
+uz
+eg
+mY
+jH
+rG
+eg
+xT
+Uw
+kU
+kU
+On
+pi
+kU
+Mj
+eg
+wm
+xA
+fZ
+OL
+aL
+Ip
+hi
+lN
+QK
+eY
+aK
+aK
+aK
+aK
+BN
+aK
+aK
+aK
+aK
+RJ
+"}
+(23,1,1) = {"
+RJ
+aK
+aK
+aK
+aK
+aK
+AU
+FO
+Mj
+eg
+eg
+Mj
+Mj
+eY
+eY
+UO
+jH
+Nu
+eg
+eg
+eg
+eg
+eg
+Mj
+Mj
+Mj
+Mj
+eg
+RZ
+vQ
+wW
+wU
+dP
+tr
+hi
+hi
+Nc
+eY
+aK
+BN
+AU
+aK
+aK
+aK
+aK
+aK
+aK
+RJ
+"}
+(24,1,1) = {"
+RJ
+RJ
+aK
+aK
+aK
+AU
+Ez
+Mj
+Mj
+RJ
+Mj
+Mj
+Vy
+hi
+eY
+CX
+jH
+Nu
+eg
+Gi
+Qd
+jv
+fR
+cB
+Mj
+RJ
+RJ
+eg
+Ry
+hk
+pI
+XQ
+YL
+eg
+bq
+hi
+Mj
+eY
+Mj
+Mj
+AU
+AU
+aK
+aK
+aK
+aK
+rO
+RJ
+"}
+(25,1,1) = {"
+yQ
+RJ
+aK
+AU
+BN
+AU
+Mj
+Mj
+RJ
+RJ
+eY
+Xm
+TH
+fw
+eY
+qW
+hi
+dx
+pf
+UV
+sn
+uP
+Ge
+vb
+eg
+RJ
+RJ
+eg
+Mj
+Mj
+eg
+eg
+eg
+eg
+eg
+Mj
+Mj
+RJ
+RJ
+Mj
+Mj
+Mj
+RJ
+RJ
+Mj
+Mj
+Mj
+RJ
+"}
+(26,1,1) = {"
+yQ
+RJ
+RJ
+RJ
+RJ
+rO
+Mj
+RJ
+RJ
+RJ
+eY
+Bd
+vL
+hi
+vU
+sW
+hi
+SR
+SU
+CX
+FP
+wh
+Zg
+Nu
+eg
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+"}
+(27,1,1) = {"
+yQ
+yQ
+yQ
+yQ
+RJ
+RJ
+RJ
+RJ
+yQ
+RJ
+eY
+Jl
+RK
+BX
+eY
+CX
+RK
+iI
+BI
+ws
+ud
+bx
+Cv
+Nu
+eg
+RJ
+RJ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+"}
+(28,1,1) = {"
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+RJ
+eY
+NW
+UY
+KO
+eY
+fl
+jH
+Nu
+uk
+CX
+FP
+wq
+Zg
+Nu
+eg
+RJ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+"}
+(29,1,1) = {"
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+RJ
+eY
+xk
+Te
+xT
+eY
+CX
+jH
+Nu
+pf
+Xw
+MI
+ZI
+Ex
+xE
+eg
+RJ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+"}
+(30,1,1) = {"
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+RJ
+eY
+eY
+eY
+eY
+eY
+CX
+jH
+Xc
+eg
+Pr
+LN
+xM
+Qv
+LU
+Mj
+RJ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+"}
+(31,1,1) = {"
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+RJ
+RJ
+RJ
+RJ
+RJ
+eg
+Gs
+jH
+UX
+eg
+eg
+eg
+eg
+Mj
+Mj
+Mj
+RJ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+"}
+(32,1,1) = {"
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+RJ
+eg
+Ok
+nz
+IK
+eg
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+RJ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+"}
+(33,1,1) = {"
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+RJ
+Mj
+CX
+hi
+Nu
+RJ
+RJ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+"}
+(34,1,1) = {"
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+RJ
+Mj
+CX
+RJ
+Lp
+eg
+RJ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+"}
+(35,1,1) = {"
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+RJ
+RJ
+fl
+RJ
+RJ
+RJ
+RJ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+"}
+(36,1,1) = {"
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+RJ
+RJ
+RJ
+RJ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+yQ
+"}
diff --git a/_maps/virtual_domains/pirates.dmm b/_maps/virtual_domains/pirates.dmm
new file mode 100644
index 00000000000..9c970f78c37
--- /dev/null
+++ b/_maps/virtual_domains/pirates.dmm
@@ -0,0 +1,2601 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"ag" = (
+/obj/effect/mapping_helpers/burnt_floor,
+/obj/effect/decal/cleanable/garbage,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"by" = (
+/obj/effect/turf_decal/weather/sand{
+ dir = 5
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"bz" = (
+/obj/structure/flora/bush/grassy{
+ pixel_y = 8
+ },
+/obj/structure/flora/bush/lavendergrass{
+ pixel_y = -10
+ },
+/turf/open/misc/grass,
+/area/virtual_domain/powered)
+"bP" = (
+/obj/structure/flora/bush/flowers_br/style_random,
+/turf/open/misc/grass,
+/area/virtual_domain/powered)
+"cl" = (
+/obj/structure/flora/rock/style_3,
+/turf/open/water/beach,
+/area/virtual_domain/powered)
+"ct" = (
+/obj/structure/closet/cabinet,
+/obj/item/clothing/head/costume/pirate/armored,
+/obj/item/clothing/suit/costume/pirate/captain/armored,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/parquet,
+/area/virtual_domain/powered)
+"cx" = (
+/turf/closed/indestructible/binary,
+/area/virtual_domain/powered)
+"cJ" = (
+/obj/item/stack/cannonball/shellball{
+ pixel_x = 13;
+ pixel_y = 11
+ },
+/obj/item/stack/cannonball{
+ pixel_x = 9;
+ pixel_y = 9
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"cQ" = (
+/obj/structure/flora/grass/jungle/b{
+ pixel_x = -15;
+ pixel_y = 9
+ },
+/obj/structure/flora/rock/pile/jungle/large/style_2{
+ pixel_x = -3;
+ pixel_y = -1
+ },
+/turf/open/misc/dirt/jungle,
+/area/virtual_domain/powered)
+"dp" = (
+/turf/closed/wall/mineral/wood/nonmetal,
+/area/virtual_domain/powered)
+"dA" = (
+/obj/structure/bonfire/prelit,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"dQ" = (
+/obj/structure/flora/rock/style_4,
+/turf/open/water/beach,
+/area/virtual_domain/powered)
+"eb" = (
+/obj/structure/flora/bush/sparsegrass,
+/turf/open/misc/grass,
+/area/virtual_domain/powered)
+"eD" = (
+/obj/structure/flora/coconuts{
+ pixel_x = 9;
+ pixel_y = -14
+ },
+/obj/structure/flora/tree/palm/style_2,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"eQ" = (
+/turf/open/floor/carpet/blue,
+/area/virtual_domain/powered)
+"eW" = (
+/obj/effect/turf_decal/weather/sand{
+ dir = 6
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"fx" = (
+/obj/structure/fluff/beach_umbrella{
+ pixel_x = -7;
+ pixel_y = -10
+ },
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"gk" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/landmark/bitrunning/cache_spawn,
+/turf/open/floor/carpet/blue,
+/area/virtual_domain/powered)
+"gw" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood{
+ icon_state = "wood_large"
+ },
+/area/virtual_domain/powered)
+"ht" = (
+/obj/structure/bookcase/random/fiction,
+/turf/open/floor/wood/parquet,
+/area/virtual_domain/powered)
+"hH" = (
+/obj/item/clothing/suit/armor/militia{
+ pixel_x = -5;
+ pixel_y = 12
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/item/clothing/suit/armor/militia{
+ pixel_x = -5;
+ pixel_y = 6
+ },
+/obj/item/clothing/suit/armor/militia{
+ pixel_x = -5;
+ pixel_y = -3
+ },
+/obj/item/clothing/head/costume/fancy{
+ pixel_x = 6;
+ pixel_y = 12
+ },
+/obj/item/clothing/head/costume/fancy{
+ pixel_x = 6;
+ pixel_y = 6
+ },
+/obj/item/clothing/head/hats/coordinator{
+ pixel_x = 8;
+ pixel_y = -5
+ },
+/obj/structure/closet/cabinet,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"hM" = (
+/obj/structure/closet/crate/goldcrate,
+/turf/open/misc/dirt/jungle,
+/area/virtual_domain/powered)
+"hW" = (
+/obj/structure/chair/comfy/carp{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/carpet/blue,
+/area/virtual_domain/powered)
+"iM" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/mob/living/simple_animal/hostile/pirate/ranged/space,
+/turf/open/floor/carpet/blue,
+/area/virtual_domain/powered)
+"iO" = (
+/obj/effect/turf_decal/weather/sand{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"jl" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/structure/table/wood,
+/obj/item/flashlight/flare/torch{
+ pixel_y = 10;
+ pixel_x = 7
+ },
+/obj/item/reagent_containers/cup/bucket/wooden{
+ pixel_y = -16;
+ pixel_x = 12
+ },
+/obj/machinery/recharger{
+ pixel_y = 6;
+ pixel_x = -5
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"jz" = (
+/obj/effect/mapping_helpers/burnt_floor,
+/turf/open/floor/wood{
+ icon_state = "wood_large"
+ },
+/area/virtual_domain/powered)
+"jB" = (
+/obj/effect/turf_decal/weather/sand{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/obj/machinery/jukebox,
+/turf/open/floor/wood{
+ icon_state = "wood_large"
+ },
+/area/virtual_domain/powered)
+"jC" = (
+/obj/structure/table/wood,
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/item/reagent_containers/cup/glass/bottle/rum{
+ desc = "Rum with ghostly properties that can help the drinker enter the spirit realm. It has fermented under the sea of space for ages.";
+ name = "Ghost Pirate Rum";
+ pixel_x = -4;
+ pixel_y = 12
+ },
+/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{
+ pixel_x = -7;
+ pixel_y = 5
+ },
+/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{
+ pixel_x = 3;
+ pixel_y = 7
+ },
+/turf/open/floor/carpet/blue,
+/area/virtual_domain/powered)
+"jQ" = (
+/obj/item/gun/energy/laser/hellgun{
+ pixel_y = 10
+ },
+/turf/open/misc/dirt/jungle,
+/area/virtual_domain/powered)
+"kg" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"kl" = (
+/obj/structure/cannon,
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/decal/cleanable/ash/large{
+ pixel_y = -5;
+ pixel_x = 8
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"lC" = (
+/obj/item/stack/cannonball{
+ pixel_x = 7;
+ pixel_y = 8
+ },
+/obj/item/stack/cannonball{
+ pixel_x = 11;
+ pixel_y = -4
+ },
+/obj/effect/turf_decal/weather/sand{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/oil/streak,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"me" = (
+/obj/effect/turf_decal/siding/wood,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"mw" = (
+/obj/structure/flora/grass/jungle/b/style_random{
+ pixel_x = -13;
+ pixel_y = 18
+ },
+/turf/open/misc/dirt/jungle,
+/area/virtual_domain/powered)
+"mP" = (
+/obj/structure/flora/bush/fullgrass,
+/turf/open/misc/grass,
+/area/virtual_domain/powered)
+"nz" = (
+/obj/effect/mob_spawn/corpse/human/pirate,
+/turf/open/misc/beach/coast{
+ dir = 8
+ },
+/area/virtual_domain/powered)
+"nQ" = (
+/obj/machinery/loot_locator,
+/turf/open/floor/carpet/blue,
+/area/virtual_domain/powered)
+"nS" = (
+/obj/structure/flora/rock/pile/jungle/large,
+/turf/open/misc/dirt/jungle,
+/area/virtual_domain/powered)
+"nX" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/mob/living/simple_animal/hostile/pirate/melee/space,
+/turf/open/floor/wood/parquet,
+/area/virtual_domain/powered)
+"oo" = (
+/obj/machinery/smartfridge/drying_rack,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"oU" = (
+/turf/open/misc/beach/coast{
+ dir = 10
+ },
+/area/virtual_domain/powered)
+"pq" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"px" = (
+/obj/structure/headpike/bone{
+ pixel_y = 24
+ },
+/turf/open/misc/beach/coast,
+/area/virtual_domain/powered)
+"pP" = (
+/turf/open/misc/beach/coast,
+/area/virtual_domain/powered)
+"pU" = (
+/obj/effect/mob_spawn/corpse/human/pirate,
+/turf/open/misc/dirt/jungle,
+/area/virtual_domain/powered)
+"qj" = (
+/obj/structure/barricade/wooden,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"qm" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/item/melee/sabre{
+ pixel_y = 12;
+ pixel_x = -10
+ },
+/obj/item/gun/energy/laser/retro,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"qx" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/burnt_floor,
+/obj/effect/decal/cleanable/dirt/dust,
+/mob/living/simple_animal/hostile/pirate/ranged,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"qN" = (
+/obj/structure/flora/bush/sunny/style_3{
+ pixel_y = 22
+ },
+/turf/open/misc/dirt/jungle,
+/area/virtual_domain/powered)
+"qX" = (
+/obj/effect/turf_decal/weather/sand{
+ dir = 9
+ },
+/obj/structure/fermenting_barrel{
+ pixel_x = 6;
+ pixel_y = 11
+ },
+/obj/effect/mob_spawn/ghost_role/human/pirate/skeleton,
+/turf/open/floor/wood{
+ icon_state = "wood_large"
+ },
+/area/virtual_domain/powered)
+"sn" = (
+/obj/structure/table/wood,
+/obj/item/book/manual/wiki/ordnance,
+/turf/open/floor/carpet/blue,
+/area/virtual_domain/powered)
+"so" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/carpet/blue,
+/area/virtual_domain/powered)
+"th" = (
+/obj/effect/turf_decal/weather/sand,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"tk" = (
+/obj/structure/flora/bush/flowers_pp,
+/turf/open/misc/grass,
+/area/virtual_domain/powered)
+"to" = (
+/mob/living/simple_animal/hostile/pirate/melee,
+/turf/open/misc/grass,
+/area/virtual_domain/powered)
+"ub" = (
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"uw" = (
+/obj/structure/barricade/sandbags,
+/obj/effect/turf_decal/weather/sand{
+ dir = 4
+ },
+/turf/open/floor/wood{
+ icon_state = "wood_large"
+ },
+/area/virtual_domain/powered)
+"uM" = (
+/obj/structure/flora/bush/stalky{
+ pixel_y = 13;
+ pixel_x = -8
+ },
+/turf/open/water/beach,
+/area/virtual_domain/powered)
+"uT" = (
+/obj/structure/closet/crate/grave,
+/obj/structure/flora/grass/jungle/b,
+/turf/open/misc/dirt/jungle,
+/area/virtual_domain/powered)
+"wb" = (
+/obj/structure/flora/rock,
+/turf/open/water/beach,
+/area/virtual_domain/powered)
+"we" = (
+/obj/effect/mine/explosive/light,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"xc" = (
+/turf/open/misc/beach/coast{
+ dir = 4
+ },
+/area/virtual_domain/powered)
+"xg" = (
+/turf/template_noop,
+/area/template_noop)
+"xm" = (
+/obj/structure/barricade/wooden/crude,
+/turf/closed/wall/mineral/wood/nonmetal,
+/area/virtual_domain/powered)
+"xB" = (
+/obj/structure/fermenting_barrel/gunpowder{
+ pixel_x = -4;
+ pixel_y = 17
+ },
+/obj/structure/fermenting_barrel/gunpowder{
+ pixel_x = 4
+ },
+/obj/item/stack/cannonball/four{
+ pixel_x = -9;
+ pixel_y = -10
+ },
+/obj/item/stack/cannonball{
+ pixel_x = 3;
+ pixel_y = 8
+ },
+/obj/item/reagent_containers/cup/bucket/wooden{
+ pixel_y = -10
+ },
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"xC" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/obj/effect/turf_decal/weather/dirt,
+/turf/open/water/beach,
+/area/virtual_domain/powered)
+"xI" = (
+/obj/structure/flora/rock/pile/style_2,
+/turf/open/water/beach,
+/area/virtual_domain/powered)
+"yc" = (
+/obj/effect/turf_decal/weather/dirt,
+/turf/open/water/beach,
+/area/virtual_domain/powered)
+"ye" = (
+/turf/open/misc/dirt/jungle,
+/area/virtual_domain/powered)
+"yi" = (
+/mob/living/simple_animal/hostile/pirate/melee,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"yq" = (
+/obj/structure/barricade/sandbags,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"yw" = (
+/obj/effect/mapping_helpers/burnt_floor,
+/mob/living/simple_animal/hostile/pirate/ranged,
+/obj/structure/chair/wood,
+/turf/open/floor/wood{
+ icon_state = "wood_large"
+ },
+/area/virtual_domain/powered)
+"yA" = (
+/obj/item/bedsheet/rainbow/double,
+/obj/structure/bed/double,
+/turf/open/floor/carpet/blue,
+/area/virtual_domain/powered)
+"zf" = (
+/obj/structure/flora/bush/flowers_br/style_random,
+/obj/structure/flora/bush/ferny,
+/turf/open/misc/grass,
+/area/virtual_domain/powered)
+"zg" = (
+/obj/structure/flora/rock/pile/style_3,
+/turf/open/misc/dirt/jungle,
+/area/virtual_domain/powered)
+"zR" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"Ax" = (
+/obj/effect/turf_decal/weather/dirt,
+/obj/effect/turf_decal/weather/dirt,
+/turf/open/water/beach,
+/area/virtual_domain/powered)
+"AU" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 1
+ },
+/turf/open/water/beach,
+/area/virtual_domain/powered)
+"BC" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"BO" = (
+/obj/structure/bookcase/random/adult,
+/obj/effect/decal/cleanable/cobweb,
+/turf/open/floor/wood/parquet,
+/area/virtual_domain/powered)
+"Cc" = (
+/obj/structure/flora/tree/palm,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"Ct" = (
+/turf/open/misc/beach/coast/corner,
+/area/virtual_domain/powered)
+"Dm" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/table/wood,
+/obj/item/flashlight/flare/torch{
+ pixel_y = 10
+ },
+/obj/item/flashlight/flare/torch{
+ pixel_x = 8;
+ pixel_y = 6
+ },
+/turf/open/floor/wood{
+ icon_state = "wood_large"
+ },
+/area/virtual_domain/powered)
+"DJ" = (
+/obj/effect/mapping_helpers/burnt_floor,
+/obj/structure/bed/maint{
+ pixel_x = -10;
+ pixel_y = 9
+ },
+/obj/effect/decal/cleanable/wrapping,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"DL" = (
+/obj/structure/flora/bush/sunny,
+/turf/open/misc/grass,
+/area/virtual_domain/powered)
+"ED" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/turf_decal/weather/sand{
+ dir = 10
+ },
+/obj/effect/turf_decal/weather/sand{
+ dir = 9
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"EZ" = (
+/obj/effect/turf_decal/weather/sand{
+ dir = 9
+ },
+/turf/open/floor/wood{
+ icon_state = "wood_large"
+ },
+/area/virtual_domain/powered)
+"FG" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/claymore/cutlass,
+/obj/item/clothing/head/costume/pirate/bandana/armored{
+ pixel_x = -9;
+ pixel_y = 7
+ },
+/obj/structure/table/wood,
+/obj/item/gun/energy/laser{
+ pixel_y = -3
+ },
+/turf/open/floor/wood{
+ icon_state = "wood_large"
+ },
+/area/virtual_domain/powered)
+"FT" = (
+/turf/closed/mineral/random/jungle,
+/area/virtual_domain/powered)
+"GF" = (
+/obj/effect/turf_decal/weather/dirt,
+/obj/structure/flora/rock/pile,
+/turf/open/water/beach,
+/area/virtual_domain/powered)
+"GG" = (
+/obj/structure/barricade/sandbags,
+/obj/effect/turf_decal/weather/sand{
+ dir = 6
+ },
+/obj/item/binoculars{
+ pixel_x = -1;
+ pixel_y = 1
+ },
+/turf/open/floor/wood{
+ icon_state = "wood_large"
+ },
+/area/virtual_domain/powered)
+"Hp" = (
+/obj/effect/turf_decal/siding/wood,
+/mob/living/simple_animal/hostile/pirate/ranged,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"HY" = (
+/turf/open/misc/beach/coast{
+ dir = 6
+ },
+/area/virtual_domain/powered)
+"It" = (
+/obj/structure/flora/bush/sparsegrass,
+/obj/structure/flora/bush/lavendergrass,
+/turf/open/misc/grass,
+/area/virtual_domain/powered)
+"Iz" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/bed/maint,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"IF" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 4
+ },
+/turf/open/water/beach,
+/area/virtual_domain/powered)
+"IG" = (
+/obj/effect/mob_spawn/corpse/human/pirate,
+/obj/effect/decal/cleanable/blood/gibs/old,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"IM" = (
+/obj/effect/turf_decal/weather/sand{
+ dir = 10
+ },
+/turf/open/floor/wood{
+ icon_state = "wood_large"
+ },
+/area/virtual_domain/powered)
+"Jo" = (
+/obj/effect/landmark/bitrunning/cache_spawn,
+/turf/open/misc/dirt/jungle,
+/area/virtual_domain/powered)
+"Jr" = (
+/obj/structure/headpike/bone,
+/turf/open/misc/beach/coast,
+/area/virtual_domain/powered)
+"Jv" = (
+/obj/effect/turf_decal/siding/wood,
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"JT" = (
+/obj/effect/decal/cleanable/ants,
+/turf/open/misc/grass,
+/area/virtual_domain/powered)
+"Kb" = (
+/obj/structure/railing{
+ color = "#4C3117";
+ name = "wooden railing"
+ },
+/obj/effect/decal/cleanable/vomit/old,
+/obj/effect/turf_decal/weather/sand{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Kl" = (
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"Kw" = (
+/obj/machinery/door/airlock/vault{
+ color = "#825427";
+ name = "Ye Olde Strong Door"
+ },
+/turf/open/floor/wood/parquet,
+/area/virtual_domain/powered)
+"KC" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 5
+ },
+/turf/open/water/beach,
+/area/virtual_domain/powered)
+"KG" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/obj/structure/table/wood,
+/obj/item/gun/energy/laser/musket{
+ pixel_y = 7
+ },
+/obj/item/gun/energy/laser/musket{
+ pixel_y = 2
+ },
+/obj/item/gun/energy/laser/musket{
+ pixel_y = -3
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"KQ" = (
+/obj/structure/flora/rock/style_2,
+/turf/open/water/beach,
+/area/virtual_domain/powered)
+"Ld" = (
+/obj/structure/flora/rock/pile,
+/turf/open/water/beach,
+/area/virtual_domain/powered)
+"Ma" = (
+/obj/structure/flora/bush/sparsegrass/style_random,
+/turf/open/misc/grass,
+/area/virtual_domain/powered)
+"Mi" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/decal/cleanable/oil,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"MW" = (
+/obj/effect/turf_decal/weather/sand{
+ dir = 5
+ },
+/obj/effect/decal/cleanable/glass,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Nh" = (
+/obj/structure/flora/rock/pile/jungle/style_3{
+ pixel_x = -15;
+ pixel_y = -4
+ },
+/turf/open/misc/dirt/jungle,
+/area/virtual_domain/powered)
+"Nk" = (
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Nz" = (
+/obj/structure/flora/bush/jungle,
+/turf/open/misc/grass,
+/area/virtual_domain/powered)
+"NI" = (
+/obj/structure/railing{
+ color = "#4C3117";
+ name = "wooden railing"
+ },
+/obj/effect/turf_decal/weather/sand{
+ dir = 9
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"ON" = (
+/obj/item/kirbyplants/organic/plant21{
+ pixel_x = -8
+ },
+/obj/structure/filingcabinet{
+ pixel_x = 11
+ },
+/turf/open/floor/wood/parquet,
+/area/virtual_domain/powered)
+"OP" = (
+/obj/structure/flora/bush/stalky,
+/turf/open/misc/beach/coast,
+/area/virtual_domain/powered)
+"Pq" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/effect/mapping_helpers/burnt_floor,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/bed/maint{
+ pixel_x = 2;
+ pixel_y = 13
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Pz" = (
+/obj/structure/table/wood,
+/mob/living/simple_animal/parrot{
+ name = "pepper"
+ },
+/turf/open/floor/carpet/blue,
+/area/virtual_domain/powered)
+"PQ" = (
+/obj/structure/flora/grass/jungle/b,
+/turf/open/misc/dirt/jungle,
+/area/virtual_domain/powered)
+"Qb" = (
+/obj/structure/flora/rock{
+ pixel_x = 7
+ },
+/turf/open/water/beach,
+/area/virtual_domain/powered)
+"Rr" = (
+/obj/structure/bed/maint{
+ pixel_x = -5;
+ pixel_y = 9
+ },
+/obj/effect/turf_decal/weather/sand{
+ dir = 6
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"RR" = (
+/obj/effect/mapping_helpers/broken_floor,
+/turf/open/floor/wood{
+ icon_state = "wood_large"
+ },
+/area/virtual_domain/powered)
+"Sm" = (
+/obj/structure/flora/tree/jungle,
+/obj/structure/flora/bush/fullgrass/style_random,
+/turf/open/misc/grass,
+/area/virtual_domain/powered)
+"St" = (
+/obj/structure/table/wood,
+/obj/item/melee/energy/sword/pirate{
+ pixel_y = 10
+ },
+/obj/item/clothing/mask/cigarette/cigar{
+ pixel_x = 4
+ },
+/obj/item/lighter{
+ pixel_x = 10;
+ pixel_y = -8
+ },
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/carpet/blue,
+/area/virtual_domain/powered)
+"Tp" = (
+/turf/open/misc/beach/coast/corner{
+ dir = 1
+ },
+/area/virtual_domain/powered)
+"Tt" = (
+/obj/structure/cannon{
+ dir = 1
+ },
+/obj/effect/turf_decal/siding/wood{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"TO" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 8
+ },
+/obj/machinery/light/small/directional/south,
+/obj/effect/landmark/bitrunning/cache_spawn,
+/turf/open/floor/carpet/blue,
+/area/virtual_domain/powered)
+"TP" = (
+/obj/effect/turf_decal/weather/dirt{
+ dir = 4
+ },
+/turf/open/misc/beach/coast{
+ dir = 6
+ },
+/area/virtual_domain/powered)
+"TQ" = (
+/obj/effect/mapping_helpers/broken_floor,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/structure/bed/maint{
+ pixel_x = 2;
+ pixel_y = 1
+ },
+/obj/effect/decal/cleanable/cobweb,
+/obj/item/toy/plush/beeplushie,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Uy" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/closed/indestructible/binary,
+/area/virtual_domain/powered)
+"UE" = (
+/obj/structure/barricade/sandbags,
+/obj/effect/turf_decal/weather/sand{
+ dir = 10
+ },
+/turf/open/floor/wood{
+ icon_state = "wood_large"
+ },
+/area/virtual_domain/powered)
+"Vg" = (
+/obj/effect/mob_spawn/corpse/human/pirate/melee,
+/turf/open/water/beach,
+/area/virtual_domain/powered)
+"Vk" = (
+/obj/structure/barricade/sandbags,
+/obj/effect/turf_decal/weather/sand,
+/turf/open/floor/wood{
+ icon_state = "wood_large"
+ },
+/area/virtual_domain/powered)
+"VC" = (
+/obj/effect/mob_spawn/corpse/human/damaged,
+/turf/open/water/beach,
+/area/virtual_domain/powered)
+"VF" = (
+/turf/open/water/beach,
+/area/virtual_domain/powered)
+"VX" = (
+/obj/effect/mapping_helpers/burnt_floor,
+/obj/structure/rack{
+ icon = 'icons/obj/fluff/general.dmi';
+ icon_state = "minibar";
+ name = "skeletal minibar"
+ },
+/obj/item/storage/bag/money/dutchmen{
+ pixel_y = 13
+ },
+/turf/open/floor/wood/parquet,
+/area/virtual_domain/powered)
+"WM" = (
+/obj/structure/flora/rock/pile/jungle/style_2,
+/turf/open/misc/dirt/jungle,
+/area/virtual_domain/powered)
+"WP" = (
+/turf/open/floor/wood/parquet,
+/area/virtual_domain/powered)
+"Xn" = (
+/obj/effect/landmark/bitrunning/safehouse_spawn,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"XG" = (
+/obj/structure/fermenting_barrel/gunpowder{
+ pixel_x = -4;
+ pixel_y = 17
+ },
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Yj" = (
+/obj/effect/landmark/bitrunning/cache_spawn,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"Yk" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/wood/parquet,
+/area/virtual_domain/powered)
+"Yq" = (
+/obj/effect/turf_decal/siding/wood{
+ dir = 10
+ },
+/turf/open/floor/wood,
+/area/virtual_domain/powered)
+"Zk" = (
+/obj/structure/flora/coconuts{
+ pixel_x = 12
+ },
+/obj/structure/flora/tree/palm,
+/turf/open/misc/beach/sand,
+/area/virtual_domain/powered)
+"ZZ" = (
+/obj/structure/flora/grass/jungle,
+/turf/open/misc/dirt/jungle,
+/area/virtual_domain/powered)
+
+(1,1,1) = {"
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+cx
+cx
+cx
+cx
+cx
+cx
+cx
+cx
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+"}
+(2,1,1) = {"
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+cx
+cx
+FT
+FT
+FT
+FT
+FT
+FT
+cx
+cx
+cx
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+"}
+(3,1,1) = {"
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+cx
+cx
+cx
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+cx
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+"}
+(4,1,1) = {"
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+cx
+cx
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+cx
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+"}
+(5,1,1) = {"
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+cx
+FT
+FT
+FT
+FT
+FT
+FT
+zf
+eb
+we
+FT
+FT
+FT
+cx
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+"}
+(6,1,1) = {"
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+cx
+cx
+cx
+FT
+FT
+FT
+Sm
+Ma
+bz
+JT
+Kl
+Kl
+Kl
+FT
+FT
+cx
+cx
+cx
+cx
+cx
+cx
+cx
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+"}
+(7,1,1) = {"
+xg
+xg
+xg
+xg
+xg
+cx
+cx
+cx
+cx
+FT
+FT
+FT
+FT
+It
+tk
+DL
+Kl
+Kl
+Kl
+Cc
+Kl
+IG
+FT
+cx
+cx
+FT
+FT
+FT
+FT
+cx
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+"}
+(8,1,1) = {"
+xg
+xg
+xg
+xg
+cx
+cx
+FT
+FT
+FT
+FT
+FT
+Nz
+bP
+mP
+to
+Kl
+Kl
+we
+Kl
+Kl
+Kl
+Kl
+we
+cx
+cx
+FT
+FT
+FT
+FT
+cx
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+"}
+(9,1,1) = {"
+xg
+xg
+xg
+cx
+cx
+FT
+dp
+dp
+dp
+dp
+xB
+yq
+yq
+Kl
+Kl
+Ct
+xc
+xc
+xc
+xc
+xc
+xc
+xc
+HY
+VF
+VF
+VF
+VF
+VF
+cx
+cx
+cx
+cx
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+"}
+(10,1,1) = {"
+xg
+xg
+xg
+cx
+FT
+dp
+dp
+Pq
+qx
+Mi
+th
+Kl
+yq
+Kl
+IG
+OP
+uM
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VC
+VF
+VF
+VF
+VF
+VF
+dp
+cx
+cx
+cx
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+"}
+(11,1,1) = {"
+xg
+xg
+cx
+cx
+FT
+dp
+TQ
+Iz
+DJ
+ag
+eW
+Kl
+Kl
+ED
+Kl
+Jr
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+KQ
+VF
+VF
+VF
+VF
+VF
+dp
+KG
+pq
+cx
+cx
+cx
+cx
+cx
+cx
+cx
+Uy
+"}
+(12,1,1) = {"
+xg
+xg
+cx
+FT
+FT
+dp
+Yj
+MW
+iO
+Rr
+qj
+Kl
+NI
+xm
+Ct
+HY
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+wb
+dp
+jl
+pq
+BC
+ub
+ub
+ub
+ub
+ub
+Xn
+cx
+"}
+(13,1,1) = {"
+cx
+cx
+cx
+FT
+FT
+FT
+qj
+Kl
+Kl
+Kl
+Kl
+Kl
+lC
+kl
+pP
+VF
+VF
+VF
+VF
+VF
+VF
+Vg
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+cl
+dp
+hH
+Nk
+qm
+ub
+ub
+ub
+ub
+ub
+ub
+cx
+"}
+(14,1,1) = {"
+cx
+dp
+dp
+dp
+dp
+dp
+dp
+oo
+Kl
+Kl
+Kl
+Kl
+Kb
+dp
+px
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+dp
+dp
+Nk
+Jv
+ub
+ub
+ub
+ub
+ub
+ub
+cx
+"}
+(15,1,1) = {"
+cx
+dp
+BO
+ht
+VX
+ct
+dp
+yi
+Kl
+dA
+Kl
+Kl
+by
+Hp
+pP
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+me
+ub
+ub
+ub
+ub
+ub
+ub
+cx
+"}
+(16,1,1) = {"
+cx
+dp
+ON
+WP
+nX
+Yk
+Kw
+Kl
+Kl
+Kl
+Kl
+Kl
+Kl
+dp
+px
+VF
+VF
+VF
+VF
+Qb
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+ub
+ub
+ub
+ub
+ub
+ub
+cx
+"}
+(17,1,1) = {"
+cx
+dp
+jC
+iM
+so
+TO
+dp
+Kl
+Kl
+EZ
+IM
+Kl
+Kl
+Kl
+pP
+VF
+VF
+VF
+VF
+cl
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+ub
+ub
+ub
+ub
+ub
+ub
+cx
+"}
+(18,1,1) = {"
+cx
+dp
+sn
+hW
+eQ
+gk
+dp
+dp
+qX
+gw
+jz
+UE
+Kl
+Zk
+pP
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+me
+VF
+ub
+ub
+ub
+ub
+ub
+zR
+cx
+"}
+(19,1,1) = {"
+cx
+dp
+St
+Pz
+nQ
+yA
+dp
+dp
+Dm
+jz
+jz
+Vk
+Kl
+Kl
+pP
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+dp
+BC
+VF
+VF
+VF
+VF
+VF
+VF
+cx
+cx
+"}
+(20,1,1) = {"
+cx
+dp
+dp
+dp
+dp
+dp
+dp
+xm
+FG
+RR
+yw
+Vk
+Kl
+Kl
+pP
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+Tt
+cJ
+Yq
+VF
+VF
+VF
+VF
+VF
+cx
+xg
+"}
+(21,1,1) = {"
+cx
+cx
+cx
+FT
+FT
+Kl
+Kl
+dp
+dp
+jB
+uw
+GG
+Kl
+Kl
+pP
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+xI
+dp
+XG
+BC
+VF
+VF
+VF
+VF
+VF
+cx
+xg
+"}
+(22,1,1) = {"
+xg
+xg
+cx
+FT
+FT
+fx
+Kl
+Kl
+dp
+dp
+Kl
+Kl
+Kl
+Kl
+pP
+VF
+VF
+VF
+VF
+VF
+VF
+dQ
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+kg
+pq
+Ld
+VF
+VF
+VF
+VF
+VF
+cx
+xg
+"}
+(23,1,1) = {"
+xg
+xg
+cx
+FT
+FT
+FT
+Kl
+Kl
+Kl
+Kl
+Kl
+Kl
+Kl
+Kl
+Tp
+oU
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+FT
+FT
+cx
+xg
+"}
+(24,1,1) = {"
+xg
+xg
+cx
+FT
+FT
+FT
+FT
+dp
+Kl
+eD
+Kl
+Kl
+Kl
+Kl
+Kl
+Tp
+nz
+oU
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+FT
+FT
+cx
+xg
+"}
+(25,1,1) = {"
+xg
+xg
+cx
+cx
+FT
+FT
+FT
+FT
+Kl
+Kl
+Kl
+Kl
+Kl
+Kl
+yi
+Kl
+Kl
+pP
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+FT
+FT
+FT
+cx
+xg
+"}
+(26,1,1) = {"
+xg
+xg
+xg
+cx
+cx
+cx
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+TP
+VF
+FT
+FT
+cx
+cx
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+cx
+FT
+FT
+FT
+FT
+cx
+xg
+"}
+(27,1,1) = {"
+xg
+xg
+xg
+xg
+xg
+cx
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+PQ
+AU
+FT
+FT
+FT
+cx
+cx
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+VF
+cx
+cx
+FT
+FT
+FT
+cx
+cx
+xg
+"}
+(28,1,1) = {"
+xg
+xg
+xg
+xg
+xg
+cx
+cx
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+Nh
+AU
+FT
+FT
+FT
+FT
+cx
+cx
+cx
+cx
+VF
+VF
+VF
+VF
+VF
+VF
+cx
+cx
+cx
+cx
+cx
+cx
+cx
+xg
+xg
+"}
+(29,1,1) = {"
+xg
+xg
+xg
+xg
+xg
+xg
+cx
+cx
+cx
+cx
+cx
+cx
+FT
+FT
+FT
+FT
+FT
+ye
+KC
+VF
+FT
+FT
+FT
+FT
+FT
+FT
+cx
+cx
+cx
+cx
+cx
+cx
+cx
+cx
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+"}
+(30,1,1) = {"
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+cx
+cx
+FT
+FT
+FT
+FT
+FT
+zg
+ye
+KC
+IF
+VF
+FT
+FT
+FT
+FT
+FT
+cx
+cx
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+"}
+(31,1,1) = {"
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+cx
+cx
+FT
+FT
+FT
+FT
+FT
+ye
+ye
+pU
+AU
+VF
+GF
+WM
+FT
+FT
+FT
+cx
+cx
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+"}
+(32,1,1) = {"
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+cx
+cx
+FT
+FT
+FT
+FT
+FT
+ye
+nS
+KC
+VF
+Ax
+ye
+hM
+FT
+FT
+FT
+cx
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+"}
+(33,1,1) = {"
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+cx
+cx
+FT
+FT
+FT
+FT
+ZZ
+ye
+cQ
+KC
+yc
+qN
+ye
+hM
+FT
+FT
+cx
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+"}
+(34,1,1) = {"
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+cx
+cx
+FT
+FT
+FT
+FT
+ye
+ye
+mw
+xC
+uT
+jQ
+Jo
+FT
+FT
+cx
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+"}
+(35,1,1) = {"
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+cx
+cx
+cx
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+cx
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+"}
+(36,1,1) = {"
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+cx
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+FT
+cx
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+"}
+(37,1,1) = {"
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+cx
+cx
+cx
+cx
+cx
+cx
+cx
+cx
+cx
+cx
+cx
+cx
+cx
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+xg
+"}
diff --git a/_maps/virtual_domains/stairs_and_cliffs.dmm b/_maps/virtual_domains/stairs_and_cliffs.dmm
new file mode 100644
index 00000000000..82e15fcc090
--- /dev/null
+++ b/_maps/virtual_domains/stairs_and_cliffs.dmm
@@ -0,0 +1,6056 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"be" = (
+/obj/structure/railing/corner{
+ dir = 1
+ },
+/turf/open/cliff/snowrock/virtual_domain,
+/area/icemoon/underground/explored/virtual_domain)
+"cu" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 4
+ },
+/obj/structure/railing,
+/obj/structure/railing{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/icemoon/underground/explored/virtual_domain)
+"cJ" = (
+/obj/structure/chair/sofa/bench,
+/turf/open/floor/plating/snowed/smoothed,
+/area/icemoon/underground/explored/virtual_domain)
+"dR" = (
+/turf/open/misc/asteroid/snow,
+/area/icemoon/underground/explored/virtual_domain)
+"en" = (
+/obj/item/clothing/under/color/grey,
+/turf/open/misc/asteroid/snow,
+/area/icemoon/underground/explored/virtual_domain)
+"eB" = (
+/obj/structure/flora/rock/icy/style_random,
+/turf/open/misc/asteroid/snow,
+/area/icemoon/underground/explored/virtual_domain)
+"gB" = (
+/obj/structure/railing/corner,
+/turf/open/cliff/snowrock/virtual_domain,
+/area/icemoon/underground/explored/virtual_domain)
+"hc" = (
+/obj/structure/railing/corner/end{
+ dir = 8
+ },
+/obj/structure/railing/corner/end/flip{
+ dir = 8
+ },
+/turf/open/misc/asteroid/snow,
+/area/icemoon/underground/explored/virtual_domain)
+"hE" = (
+/turf/open/floor/wood,
+/area/icemoon/underground/explored/virtual_domain)
+"jK" = (
+/obj/structure/railing/corner{
+ dir = 8
+ },
+/turf/open/cliff/snowrock/virtual_domain,
+/area/icemoon/underground/explored/virtual_domain)
+"kc" = (
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/misc/asteroid/snow,
+/area/icemoon/underground/explored/virtual_domain)
+"km" = (
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/decal/cleanable/ash/large,
+/turf/open/misc/asteroid/snow,
+/area/icemoon/underground/explored/virtual_domain)
+"kK" = (
+/obj/structure/flora/tree/pine/style_random,
+/turf/open/misc/asteroid/snow,
+/area/icemoon/underground/explored/virtual_domain)
+"mx" = (
+/obj/structure/railing,
+/obj/structure/railing{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/icemoon/underground/explored/virtual_domain)
+"nj" = (
+/obj/structure/chair/sofa/bench/left,
+/turf/open/floor/plating/snowed/smoothed,
+/area/icemoon/underground/explored/virtual_domain)
+"no" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 8
+ },
+/obj/structure/railing,
+/obj/structure/railing{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/icemoon/underground/explored/virtual_domain)
+"pl" = (
+/obj/structure/bonfire/prelit,
+/turf/open/misc/asteroid/snow,
+/area/icemoon/underground/explored/virtual_domain)
+"pL" = (
+/turf/open/lava/plasma/virtual_domain,
+/area/icemoon/underground/explored/virtual_domain)
+"qc" = (
+/turf/open/misc/ice,
+/area/icemoon/underground/explored/virtual_domain)
+"sa" = (
+/obj/structure/flora/grass/green/style_random,
+/turf/open/misc/asteroid/snow,
+/area/icemoon/underground/explored/virtual_domain)
+"sw" = (
+/obj/structure/flora/rock/pile/icy/style_random,
+/turf/open/misc/asteroid/snow,
+/area/icemoon/underground/explored/virtual_domain)
+"sM" = (
+/turf/open/cliff/snowrock/virtual_domain,
+/area/icemoon/underground/explored/virtual_domain)
+"uJ" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"vz" = (
+/obj/effect/landmark/bitrunning/safehouse_spawn,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"xB" = (
+/obj/structure/railing/corner{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/icemoon/underground/explored/virtual_domain)
+"yo" = (
+/turf/open/floor/plating/snowed/smoothed,
+/area/icemoon/underground/explored/virtual_domain)
+"yJ" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 8
+ },
+/obj/structure/railing,
+/obj/structure/railing/corner{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/icemoon/underground/explored/virtual_domain)
+"yL" = (
+/obj/structure/chair/sofa/bench/right,
+/turf/open/floor/plating/snowed/smoothed,
+/area/icemoon/underground/explored/virtual_domain)
+"zn" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/icemoon/underground/explored/virtual_domain)
+"Am" = (
+/turf/closed/indestructible/binary,
+/area/icemoon/underground/explored/virtual_domain)
+"AI" = (
+/obj/structure/flora/grass/green/style_random,
+/turf/open/floor/plating/snowed/smoothed,
+/area/icemoon/underground/explored/virtual_domain)
+"BV" = (
+/obj/effect/decal/remains/plasma,
+/turf/open/misc/asteroid/snow,
+/area/icemoon/underground/explored/virtual_domain)
+"Dz" = (
+/obj/structure/railing/corner/end{
+ dir = 4
+ },
+/obj/structure/railing/corner/end/flip{
+ dir = 4
+ },
+/turf/open/misc/asteroid/snow,
+/area/icemoon/underground/explored/virtual_domain)
+"DB" = (
+/obj/structure/flora/rock/icy/style_random,
+/obj/structure/flora/rock/pile/icy/style_random,
+/turf/open/misc/asteroid/snow,
+/area/icemoon/underground/explored/virtual_domain)
+"DY" = (
+/obj/structure/flora/rock/icy/style_random,
+/obj/structure/flora/grass/green/style_random,
+/turf/open/misc/asteroid/snow,
+/area/icemoon/underground/explored/virtual_domain)
+"Eh" = (
+/obj/structure/railing/corner{
+ dir = 4
+ },
+/turf/open/cliff/snowrock/virtual_domain,
+/area/icemoon/underground/explored/virtual_domain)
+"Gn" = (
+/obj/structure/flora/rock/pile/icy/style_random,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/misc/asteroid/snow,
+/area/icemoon/underground/explored/virtual_domain)
+"GX" = (
+/obj/effect/decal/cleanable/ash/large,
+/turf/open/misc/asteroid/snow,
+/area/icemoon/underground/explored/virtual_domain)
+"HU" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/icemoon/underground/explored/virtual_domain)
+"Kl" = (
+/obj/effect/decal/remains/plasma,
+/obj/effect/decal/cleanable/ash/large,
+/turf/open/misc/asteroid/snow,
+/area/icemoon/underground/explored/virtual_domain)
+"KA" = (
+/obj/structure/statue/snow/snowman{
+ name = "Norm";
+ desc = "Norm has seen many a man roll down these cliffs, some more stubborn than others. Its usually the stubborn ones who stop getting back up."
+ },
+/obj/item/pickaxe/mini,
+/turf/open/misc/asteroid/snow,
+/area/icemoon/underground/explored/virtual_domain)
+"Lw" = (
+/obj/structure/flora/rock/pile/icy/style_random,
+/obj/structure/flora/grass/green/style_random,
+/turf/open/misc/asteroid/snow,
+/area/icemoon/underground/explored/virtual_domain)
+"MP" = (
+/obj/structure/railing/corner/end/flip{
+ dir = 4
+ },
+/obj/structure/railing/corner/end{
+ dir = 4
+ },
+/turf/open/misc/asteroid/snow,
+/area/icemoon/underground/explored/virtual_domain)
+"MT" = (
+/obj/structure/railing/corner{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/icemoon/underground/explored/virtual_domain)
+"Nv" = (
+/turf/open/floor/iron/stairs,
+/area/icemoon/underground/explored/virtual_domain)
+"NM" = (
+/obj/structure/railing/corner/end/flip{
+ dir = 8
+ },
+/obj/structure/railing/corner/end{
+ dir = 8
+ },
+/turf/open/misc/asteroid/snow,
+/area/icemoon/underground/explored/virtual_domain)
+"Pl" = (
+/obj/effect/turf_decal/weather/snow/corner{
+ dir = 4
+ },
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/structure/railing/corner,
+/turf/open/floor/wood,
+/area/icemoon/underground/explored/virtual_domain)
+"Qv" = (
+/turf/closed/indestructible/rock/snow/ice,
+/area/icemoon/underground/explored/virtual_domain)
+"RD" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/closed/indestructible/binary,
+/area/icemoon/underground/explored/virtual_domain)
+"Tz" = (
+/obj/item/pickaxe/mini,
+/turf/open/misc/asteroid/snow,
+/area/icemoon/underground/explored/virtual_domain)
+"Ug" = (
+/obj/structure/flora/rock/icy/style_random,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/misc/asteroid/snow,
+/area/icemoon/underground/explored/virtual_domain)
+"VW" = (
+/obj/structure/closet/crate/secure/bitrunning/encrypted,
+/turf/open/floor/plating/snowed/smoothed,
+/area/icemoon/underground/explored/virtual_domain)
+"YR" = (
+/obj/structure/flora/tree/pine/style_random,
+/obj/structure/flora/grass/green/style_random,
+/turf/open/misc/asteroid/snow,
+/area/icemoon/underground/explored/virtual_domain)
+"YT" = (
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+
+(1,1,1) = {"
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+RD
+"}
+(2,1,1) = {"
+Am
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(3,1,1) = {"
+Am
+Qv
+Qv
+Qv
+Qv
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(4,1,1) = {"
+Am
+Qv
+Qv
+Qv
+dR
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(5,1,1) = {"
+Am
+Qv
+Qv
+dR
+dR
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(6,1,1) = {"
+Am
+Qv
+Qv
+kK
+sw
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(7,1,1) = {"
+Am
+Qv
+Qv
+dR
+dR
+sa
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(8,1,1) = {"
+Am
+Qv
+Qv
+eB
+sw
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+Qv
+Qv
+Qv
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(9,1,1) = {"
+Am
+Qv
+Qv
+dR
+eB
+dR
+sw
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(10,1,1) = {"
+Am
+Qv
+dR
+sw
+eB
+eB
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(11,1,1) = {"
+Am
+Qv
+dR
+eB
+sw
+sa
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pl
+dR
+sw
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(12,1,1) = {"
+Am
+Qv
+dR
+dR
+sw
+sa
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sw
+dR
+Nv
+Nv
+Nv
+sM
+sM
+Nv
+Nv
+Nv
+Nv
+Nv
+Nv
+sM
+sM
+sM
+sM
+Nv
+Nv
+Nv
+Nv
+dR
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(13,1,1) = {"
+Am
+Qv
+dR
+sa
+sw
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sw
+dR
+dR
+sM
+Nv
+Nv
+Nv
+Nv
+sM
+sM
+sM
+sM
+Nv
+Nv
+Nv
+Nv
+Nv
+Nv
+Nv
+Nv
+Nv
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(14,1,1) = {"
+Am
+Qv
+dR
+dR
+dR
+dR
+kK
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sw
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sa
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(15,1,1) = {"
+Am
+Qv
+sw
+sa
+dR
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(16,1,1) = {"
+Am
+Qv
+dR
+sa
+sa
+sa
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+pl
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+GX
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(17,1,1) = {"
+Am
+Qv
+dR
+sa
+sa
+dR
+yo
+Nv
+Nv
+Nv
+Nv
+sM
+sM
+Nv
+Nv
+Nv
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+dR
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+sw
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+dR
+dR
+pL
+pL
+pL
+Qv
+Qv
+Qv
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(18,1,1) = {"
+Am
+Qv
+Qv
+dR
+dR
+yo
+yo
+sM
+sM
+sM
+Nv
+Nv
+Nv
+Nv
+sM
+sM
+sa
+qc
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+dR
+sa
+pL
+pL
+sM
+sM
+sM
+sM
+sM
+sM
+sw
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+dR
+en
+dR
+dR
+pL
+pL
+Qv
+Qv
+Qv
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(19,1,1) = {"
+Am
+Qv
+Qv
+kK
+sa
+yo
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sw
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+sw
+BV
+pL
+sM
+sM
+sM
+sM
+sM
+sM
+eB
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+GX
+sw
+dR
+dR
+pL
+pL
+pL
+pL
+Qv
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(20,1,1) = {"
+Am
+Qv
+Qv
+dR
+dR
+yo
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+qc
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+kK
+GX
+pL
+pL
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+qc
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+dR
+dR
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(21,1,1) = {"
+Am
+Qv
+Qv
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+pL
+pL
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+dR
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(22,1,1) = {"
+Am
+Qv
+Qv
+dR
+sa
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sw
+dR
+dR
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(23,1,1) = {"
+Am
+Qv
+Qv
+Qv
+sa
+qc
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+DB
+kc
+dR
+dR
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(24,1,1) = {"
+Am
+Qv
+Qv
+sw
+eB
+qc
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+qc
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sa
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+Ug
+eB
+dR
+dR
+dR
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(25,1,1) = {"
+Am
+Qv
+Qv
+dR
+dR
+sa
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+dR
+Nv
+Nv
+Nv
+Nv
+Nv
+Nv
+Nv
+Nv
+Nv
+Nv
+Nv
+Nv
+sM
+Nv
+Nv
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+Ug
+sw
+dR
+dR
+dR
+dR
+dR
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(26,1,1) = {"
+Am
+Qv
+Qv
+dR
+yo
+dR
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+qc
+dR
+sM
+sM
+sM
+sM
+sM
+dR
+Nv
+Nv
+Nv
+Nv
+Nv
+sM
+sM
+sM
+sM
+Nv
+Nv
+Nv
+Nv
+Nv
+Nv
+qc
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+Ug
+sw
+dR
+dR
+dR
+sa
+dR
+dR
+dR
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Am
+"}
+(27,1,1) = {"
+Am
+Qv
+Qv
+dR
+yo
+sa
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sa
+dR
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+eB
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+dR
+dR
+kK
+dR
+dR
+dR
+sw
+dR
+dR
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Am
+"}
+(28,1,1) = {"
+Am
+Qv
+Qv
+sa
+yo
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sa
+dR
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+dR
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+kK
+sa
+dR
+qc
+qc
+sa
+sa
+dR
+kK
+dR
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Am
+"}
+(29,1,1) = {"
+Am
+Qv
+Qv
+sa
+yo
+yo
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+MP
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+dR
+qc
+qc
+qc
+sa
+sa
+dR
+dR
+dR
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Am
+"}
+(30,1,1) = {"
+Am
+Qv
+Qv
+qc
+dR
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+no
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+yL
+dR
+dR
+dR
+kK
+dR
+dR
+dR
+dR
+dR
+dR
+dR
+dR
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Am
+"}
+(31,1,1) = {"
+Am
+Qv
+pl
+qc
+dR
+yo
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+Nv
+Nv
+Nv
+Nv
+qc
+sM
+sM
+sM
+sM
+dR
+dR
+sM
+sM
+sM
+mx
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+cJ
+yo
+dR
+dR
+dR
+dR
+dR
+kK
+sa
+sa
+dR
+dR
+dR
+dR
+dR
+dR
+dR
+dR
+Qv
+Am
+"}
+(32,1,1) = {"
+Am
+Qv
+sM
+sM
+zn
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sw
+dR
+sM
+sM
+sM
+cu
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+nj
+yo
+dR
+kK
+dR
+dR
+dR
+kK
+sa
+sa
+dR
+dR
+dR
+dR
+kK
+dR
+dR
+Qv
+Qv
+Am
+"}
+(33,1,1) = {"
+Am
+Qv
+sM
+sM
+hE
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+NM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+qc
+dR
+Nv
+Nv
+Nv
+Nv
+Nv
+dR
+dR
+sw
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+yo
+yo
+dR
+dR
+sa
+dR
+sw
+dR
+dR
+dR
+dR
+sa
+sa
+dR
+dR
+dR
+dR
+Qv
+Qv
+Am
+"}
+(34,1,1) = {"
+Am
+Qv
+sM
+sM
+hE
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sa
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+qc
+sM
+sM
+sM
+dR
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+qc
+yo
+Nv
+Nv
+Nv
+Nv
+Nv
+yo
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+yo
+dR
+dR
+sa
+dR
+dR
+dR
+dR
+kK
+qc
+dR
+dR
+dR
+dR
+dR
+dR
+dR
+Qv
+Am
+"}
+(35,1,1) = {"
+Am
+Qv
+sM
+sM
+hE
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+qc
+sM
+sM
+sM
+qc
+sa
+sM
+sM
+sM
+sM
+sM
+sM
+qc
+dR
+sM
+sM
+sM
+sM
+sM
+eB
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+yo
+yo
+dR
+dR
+dR
+qc
+qc
+qc
+qc
+qc
+dR
+YT
+YT
+YT
+YT
+YT
+vz
+Qv
+Am
+"}
+(36,1,1) = {"
+Am
+Qv
+dR
+sM
+HU
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+qc
+sM
+sM
+sw
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+qc
+dR
+sM
+sM
+sM
+sM
+sM
+kK
+dR
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pl
+dR
+yo
+dR
+dR
+dR
+dR
+dR
+qc
+qc
+qc
+dR
+YT
+YT
+YT
+YT
+YT
+YT
+Qv
+Am
+"}
+(37,1,1) = {"
+Am
+Qv
+Qv
+dR
+dR
+dR
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+dR
+dR
+sM
+sM
+sM
+sM
+eB
+dR
+sa
+sM
+sM
+sM
+sM
+sM
+sM
+sa
+yo
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+yo
+dR
+yo
+dR
+dR
+dR
+dR
+sw
+qc
+qc
+dR
+dR
+YT
+YT
+YT
+YT
+YT
+YT
+Qv
+Am
+"}
+(38,1,1) = {"
+Am
+Qv
+Qv
+dR
+yo
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+dR
+dR
+sM
+sM
+sM
+sM
+dR
+dR
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+yo
+AI
+Nv
+Nv
+Nv
+Nv
+Nv
+Nv
+Nv
+yo
+yo
+yo
+yo
+yo
+yo
+dR
+dR
+yo
+dR
+yo
+yo
+YT
+YT
+YT
+YT
+YT
+YT
+Qv
+Am
+"}
+(39,1,1) = {"
+Am
+Qv
+Qv
+dR
+dR
+dR
+kK
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+qc
+sM
+sM
+sM
+pl
+dR
+dR
+sM
+sM
+sM
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+yo
+AI
+Nv
+Nv
+Nv
+Nv
+Nv
+Nv
+Nv
+yo
+yo
+yo
+yo
+dR
+yo
+yo
+yo
+yo
+yo
+yo
+yo
+YT
+YT
+YT
+YT
+YT
+YT
+Qv
+Am
+"}
+(40,1,1) = {"
+Am
+Qv
+Qv
+dR
+yo
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+sM
+sM
+sM
+sM
+dR
+dR
+Nv
+Nv
+Nv
+dR
+kK
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sw
+dR
+Nv
+Nv
+Nv
+Nv
+Nv
+Nv
+Nv
+yo
+yo
+dR
+dR
+dR
+yo
+dR
+yo
+yo
+yo
+dR
+yo
+YT
+YT
+YT
+YT
+YT
+YT
+Qv
+Am
+"}
+(41,1,1) = {"
+Am
+Qv
+dR
+sa
+yo
+dR
+sa
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+qc
+sM
+sM
+sM
+qc
+Tz
+Nv
+Nv
+Nv
+qc
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+dR
+sw
+dR
+dR
+dR
+dR
+dR
+dR
+dR
+dR
+YT
+YT
+YT
+YT
+YT
+uJ
+Qv
+Am
+"}
+(42,1,1) = {"
+Am
+Qv
+dR
+AI
+yo
+yo
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pl
+KA
+dR
+dR
+dR
+sa
+sa
+dR
+qc
+qc
+qc
+dR
+dR
+dR
+dR
+dR
+dR
+dR
+Qv
+Am
+"}
+(43,1,1) = {"
+Am
+Qv
+yo
+yo
+VW
+yo
+yo
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sa
+dR
+dR
+kK
+sa
+sa
+dR
+dR
+qc
+qc
+qc
+dR
+sa
+sa
+dR
+dR
+dR
+Qv
+Am
+"}
+(44,1,1) = {"
+Am
+Qv
+dR
+yo
+yo
+yo
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sa
+dR
+sa
+dR
+dR
+dR
+dR
+kK
+qc
+qc
+qc
+dR
+sa
+sa
+dR
+dR
+dR
+Qv
+Am
+"}
+(45,1,1) = {"
+Am
+Qv
+dR
+dR
+yo
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+dR
+dR
+dR
+dR
+kK
+dR
+dR
+dR
+dR
+Qv
+dR
+Qv
+dR
+kK
+dR
+Qv
+Qv
+Am
+"}
+(46,1,1) = {"
+Am
+Qv
+Qv
+sa
+dR
+dR
+sa
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+qc
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+kK
+dR
+dR
+dR
+dR
+dR
+dR
+dR
+dR
+dR
+dR
+Qv
+Qv
+Qv
+dR
+dR
+dR
+Qv
+Qv
+Am
+"}
+(47,1,1) = {"
+Am
+Qv
+Qv
+dR
+dR
+YR
+sa
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+qc
+Nv
+Nv
+Nv
+sM
+sM
+sM
+sM
+Nv
+Nv
+Nv
+Nv
+sM
+sM
+sM
+Nv
+Nv
+Nv
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+dR
+pL
+dR
+dR
+dR
+dR
+dR
+dR
+Qv
+Qv
+Qv
+Qv
+Qv
+dR
+dR
+dR
+Qv
+Qv
+Am
+"}
+(48,1,1) = {"
+Am
+Qv
+Qv
+dR
+kK
+sa
+YR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+dR
+sw
+sM
+Nv
+Nv
+Nv
+Nv
+Nv
+Nv
+sM
+sM
+Nv
+Nv
+Nv
+Nv
+Nv
+sM
+Nv
+Nv
+Nv
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+pL
+pL
+dR
+dR
+dR
+dR
+Qv
+Qv
+Qv
+Qv
+dR
+sw
+dR
+dR
+dR
+Qv
+Am
+"}
+(49,1,1) = {"
+Am
+Qv
+Qv
+dR
+dR
+YR
+sa
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+qc
+sM
+sM
+sM
+sM
+sM
+eB
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+dR
+dR
+dR
+dR
+dR
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+dR
+sw
+dR
+dR
+Qv
+Am
+"}
+(50,1,1) = {"
+Am
+Qv
+Qv
+sa
+dR
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sa
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+pl
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+pL
+pL
+dR
+dR
+sa
+dR
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+sw
+eB
+dR
+dR
+Qv
+Am
+"}
+(51,1,1) = {"
+Am
+Qv
+Qv
+Qv
+dR
+sa
+kK
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sa
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sa
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+pL
+dR
+dR
+kK
+dR
+dR
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+dR
+dR
+sa
+Qv
+Am
+"}
+(52,1,1) = {"
+Am
+Qv
+Qv
+Qv
+dR
+sa
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+pL
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sa
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+pL
+dR
+dR
+dR
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+dR
+dR
+dR
+Qv
+Am
+"}
+(53,1,1) = {"
+Am
+Qv
+Qv
+Qv
+dR
+YR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sw
+Dz
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+dR
+sa
+dR
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+dR
+dR
+Qv
+Am
+"}
+(54,1,1) = {"
+Am
+Qv
+Qv
+Qv
+dR
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+jK
+yJ
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+pL
+sM
+sM
+GX
+dR
+dR
+pL
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+sa
+dR
+sw
+sa
+dR
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+dR
+Qv
+Qv
+Am
+"}
+(55,1,1) = {"
+Am
+Qv
+Qv
+dR
+dR
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+MT
+be
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+dR
+kK
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+qc
+sM
+sM
+sM
+sM
+sM
+dR
+sw
+eB
+dR
+dR
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+dR
+dR
+dR
+Qv
+Am
+"}
+(56,1,1) = {"
+Am
+Qv
+Qv
+dR
+eB
+sw
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+gB
+xB
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+pL
+pL
+pL
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+qc
+sM
+sM
+sM
+sM
+sM
+km
+sw
+eB
+eB
+sw
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+dR
+dR
+dR
+Qv
+Am
+"}
+(57,1,1) = {"
+Am
+Qv
+Qv
+dR
+Lw
+sa
+sa
+kK
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+Pl
+Eh
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+dR
+sw
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sa
+eB
+sM
+sM
+sM
+sM
+sM
+pL
+dR
+eB
+eB
+dR
+dR
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+dR
+dR
+dR
+Qv
+Am
+"}
+(58,1,1) = {"
+Am
+Qv
+Qv
+dR
+sa
+sa
+YR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+hc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+Gn
+eB
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sw
+sM
+sM
+sM
+sM
+sM
+pL
+GX
+dR
+pL
+dR
+dR
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+dR
+sa
+dR
+dR
+Qv
+Am
+"}
+(59,1,1) = {"
+Am
+Qv
+Qv
+sa
+YR
+sa
+sa
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+qc
+sM
+sM
+sM
+dR
+sM
+sM
+Nv
+Nv
+Nv
+dR
+sM
+sM
+sM
+sM
+sM
+kK
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+pL
+dR
+dR
+pL
+dR
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+dR
+dR
+dR
+Qv
+Qv
+Qv
+Am
+"}
+(60,1,1) = {"
+Am
+Qv
+Qv
+dR
+dR
+sw
+kK
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+sM
+sM
+sM
+dR
+dR
+Nv
+Nv
+Nv
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+kK
+dR
+qc
+sM
+sM
+sM
+sM
+sM
+pL
+GX
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+dR
+dR
+dR
+Qv
+Qv
+Qv
+Am
+"}
+(61,1,1) = {"
+Am
+Qv
+dR
+kK
+sw
+eB
+eB
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+dR
+sa
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+dR
+dR
+dR
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(62,1,1) = {"
+Am
+Qv
+dR
+sa
+DY
+eB
+eB
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+sM
+sM
+sM
+sM
+sa
+dR
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sa
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+dR
+dR
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(63,1,1) = {"
+Am
+Qv
+dR
+Lw
+Lw
+dR
+sa
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+eB
+dR
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sa
+dR
+sM
+sM
+sM
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+dR
+Qv
+Qv
+dR
+dR
+dR
+dR
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(64,1,1) = {"
+Am
+Qv
+dR
+sa
+sa
+sw
+kK
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sw
+dR
+sM
+sM
+sM
+sM
+sM
+qc
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+eB
+dR
+dR
+dR
+sa
+dR
+sw
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(65,1,1) = {"
+Am
+Qv
+dR
+dR
+kK
+dR
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+qc
+sM
+sM
+sM
+sM
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+Nv
+Nv
+Nv
+Nv
+Nv
+Nv
+dR
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+sw
+sa
+sa
+dR
+sw
+sw
+eB
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(66,1,1) = {"
+Am
+Qv
+dR
+kK
+sa
+sa
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+sa
+dR
+sM
+sM
+sM
+sM
+qc
+sM
+sM
+sM
+sM
+sa
+dR
+sM
+sM
+sM
+sM
+sM
+sw
+dR
+Nv
+Nv
+Nv
+Nv
+Nv
+sM
+sM
+sM
+Nv
+Nv
+dR
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+dR
+sa
+sa
+dR
+dR
+dR
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(67,1,1) = {"
+Am
+Qv
+dR
+dR
+YR
+DY
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sa
+dR
+sM
+sM
+sM
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+dR
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+sa
+dR
+dR
+dR
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(68,1,1) = {"
+Am
+Qv
+dR
+dR
+Lw
+sa
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+sM
+sM
+sM
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+sa
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+dR
+dR
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(69,1,1) = {"
+Am
+Qv
+Qv
+dR
+eB
+sw
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+dR
+Nv
+Nv
+Nv
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+dR
+sM
+sM
+sM
+sM
+sM
+dR
+qc
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(70,1,1) = {"
+Am
+Qv
+Qv
+Qv
+dR
+eB
+sw
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+kK
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+Nv
+dR
+dR
+dR
+dR
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(71,1,1) = {"
+Am
+Qv
+Qv
+dR
+sa
+sa
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+dR
+qc
+dR
+pl
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+Kl
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(72,1,1) = {"
+Am
+Qv
+Qv
+sa
+sa
+Lw
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(73,1,1) = {"
+Am
+Qv
+Qv
+Qv
+dR
+sw
+dR
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+sM
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+pL
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(74,1,1) = {"
+Am
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Qv
+Am
+"}
+(75,1,1) = {"
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+Am
+"}
diff --git a/_maps/virtual_domains/syndicate_assault.dmm b/_maps/virtual_domains/syndicate_assault.dmm
new file mode 100644
index 00000000000..770f0967404
--- /dev/null
+++ b/_maps/virtual_domains/syndicate_assault.dmm
@@ -0,0 +1,4265 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aq" = (
+/obj/item/storage/backpack/duffelbag/syndie/surgery,
+/obj/structure/table/reinforced,
+/turf/open/floor/plastic,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"aw" = (
+/obj/structure/table/reinforced,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"aN" = (
+/obj/structure/closet/crate/secure/gear{
+ req_access = list("syndicate")
+ },
+/obj/item/stack/sheet/iron/fifty,
+/obj/item/stack/sheet/iron/fifty,
+/obj/item/stack/sheet/iron/fifty,
+/obj/item/stack/sheet/plasteel/twenty,
+/obj/item/stack/sheet/mineral/plastitanium{
+ amount = 50
+ },
+/obj/item/stack/sheet/glass/fifty,
+/obj/item/stack/rods/fifty,
+/turf/open/floor/pod/dark,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"aO" = (
+/obj/machinery/recharge_station,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"aZ" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{
+ dir = 4
+ },
+/mob/living/basic/syndicate/ranged/shotgun/space/stormtrooper,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"bh" = (
+/turf/open/floor/carpet/royalblack,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"bo" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"bD" = (
+/obj/structure/table/reinforced,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"bG" = (
+/turf/open/floor/pod/dark,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"cc" = (
+/obj/structure/closet/crate/secure/gear{
+ req_access = list("syndicate")
+ },
+/obj/effect/spawner/random/clothing/costume,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"cj" = (
+/obj/structure/transit_tube/crossing,
+/turf/closed/wall/r_wall/syndicate,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"ct" = (
+/obj/structure/closet/syndicate{
+ anchored = 1;
+ desc = "A basic closet for all your villainous needs.";
+ locked = 1;
+ name = "Closet";
+ req_access = list("syndicate");
+ secure = 1
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"cw" = (
+/obj/structure/closet/syndicate{
+ anchored = 1;
+ desc = "A basic closet for all your villainous needs.";
+ locked = 1;
+ name = "Closet";
+ req_access = list("syndicate");
+ secure = 1
+ },
+/obj/item/clothing/under/syndicate/combat,
+/obj/item/clothing/gloves/combat,
+/obj/item/clothing/shoes/combat,
+/obj/item/clothing/mask/gas/syndicate,
+/obj/item/clothing/under/syndicate/skirt,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"cy" = (
+/obj/machinery/door/airlock/grunge{
+ name = "Syndicate Ship Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"cB" = (
+/obj/machinery/camera/xray{
+ c_tag = "Medbay";
+ dir = 6;
+ network = list("fsci");
+ screen_loc = ""
+ },
+/turf/open/floor/plastic,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"cR" = (
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/carpet/royalblack,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"cZ" = (
+/obj/structure/table/reinforced,
+/obj/item/gun/ballistic/automatic/l6_saw/unrestricted,
+/obj/item/ammo_box/magazine/m7mm,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"da" = (
+/obj/machinery/stasis,
+/turf/open/floor/plastic,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"dd" = (
+/obj/structure/sign/warning/vacuum/external,
+/turf/closed/wall/r_wall/syndicate,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"di" = (
+/obj/machinery/power/terminal{
+ dir = 1
+ },
+/obj/structure/cable,
+/obj/item/paper/fluff/ruins/forgottenship/powerissues,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"dw" = (
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"dz" = (
+/obj/effect/landmark/bitrunning/cache_spawn,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"dU" = (
+/obj/structure/cable,
+/obj/structure/fans/tiny,
+/obj/machinery/door/airlock/external/ruin{
+ name = "Syndicate Ship Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"eB" = (
+/obj/machinery/camera/xray{
+ c_tag = "Cargo pod";
+ dir = 9;
+ network = list("fsci");
+ screen_loc = ""
+ },
+/obj/structure/closet,
+/obj/item/clothing/under/syndicate/tacticool,
+/obj/item/clothing/under/syndicate/tacticool,
+/obj/item/clothing/under/syndicate/tacticool,
+/obj/item/card/id/advanced/black/syndicate_command/crew_id,
+/obj/item/card/id/advanced/black/syndicate_command/crew_id,
+/obj/item/card/id/advanced/black/syndicate_command/crew_id,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"fd" = (
+/obj/structure/transit_tube/crossing,
+/turf/open/space/basic,
+/area/space)
+"fG" = (
+/obj/structure/toilet{
+ dir = 1
+ },
+/obj/machinery/light/directional/south,
+/turf/open/floor/iron,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"fJ" = (
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"fM" = (
+/obj/machinery/computer/crew/syndie{
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"fV" = (
+/obj/machinery/atmospherics/components/unary/vent_pump,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"gD" = (
+/obj/effect/mob_spawn/ghost_role/human/syndicatespace,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"hg" = (
+/obj/structure/window/reinforced/plasma/plastitanium,
+/obj/machinery/door/poddoor{
+ id = "fslockdown";
+ name = "Ship Blast Door";
+ state_open = 1
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"hy" = (
+/obj/structure/table/reinforced,
+/obj/item/paper/fluff/ruins/forgottenship/missionobj,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"hA" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/closed/wall/r_wall/syndicate,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"hD" = (
+/obj/structure/table/reinforced,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"ip" = (
+/mob/living/basic/syndicate/melee/sword/space/stormtrooper,
+/turf/open/floor/plastic,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"iB" = (
+/obj/machinery/light/directional/north,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"iL" = (
+/obj/structure/sign/departments/cargo,
+/turf/closed/wall/r_wall/syndicate,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"iU" = (
+/obj/structure/closet/crate/secure/gear{
+ req_access = list("syndicate")
+ },
+/obj/item/melee/energy/sword/saber/red,
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/pod/dark,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"iW" = (
+/obj/structure/table/reinforced,
+/obj/machinery/button/door{
+ id = "fslockdown";
+ name = "Window shutters";
+ req_access = list("syndicate")
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"iX" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{
+ dir = 4
+ },
+/mob/living/basic/syndicate/ranged/smg/space/stormtrooper,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"ja" = (
+/obj/machinery/door/window{
+ dir = 1;
+ name = "Spare Equipment";
+ req_access = list("syndicate")
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"jl" = (
+/obj/structure/bodycontainer/crematorium{
+ id = "fscremate"
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"jA" = (
+/obj/structure/cable,
+/mob/living/basic/syndicate/melee/space/stormtrooper,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"jJ" = (
+/obj/machinery/door/airlock/grunge{
+ name = "Syndicate Ship Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/turf/open/floor/iron/dark/side{
+ dir = 1
+ },
+/area/ruin/space/has_grav/powered/virtual_domain)
+"kh" = (
+/obj/machinery/door/airlock/grunge{
+ name = "Syndicate Ship Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"ki" = (
+/obj/structure/table/reinforced,
+/obj/machinery/computer/security/telescreen/interrogation{
+ name = "Cameras monitor";
+ network = list("fsci");
+ req_access = list("syndicate");
+ screen_loc = ""
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"kI" = (
+/obj/machinery/computer/atmos_alert{
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"kJ" = (
+/obj/effect/landmark/bitrunning/safehouse_spawn,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"li" = (
+/obj/structure/transit_tube/station/dispenser/reverse{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"ln" = (
+/obj/machinery/turretid{
+ control_area = "/area/ruin/space/has_grav/syndicate_forgotten_ship";
+ enabled = 0;
+ icon_state = "control_kill";
+ lethal = 1;
+ name = "Ship turret control panel";
+ pixel_y = 32;
+ req_access = list("syndicate")
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"lo" = (
+/obj/structure/fans/tiny,
+/obj/machinery/door/airlock/external/ruin{
+ name = "Syndicate Ship Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"lN" = (
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"mo" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"mD" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{
+ dir = 10
+ },
+/obj/item/wrench,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"nk" = (
+/obj/machinery/power/apc/auto_name/directional/north,
+/obj/effect/mapping_helpers/apc/syndicate_access,
+/obj/structure/cable,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"nB" = (
+/turf/closed/mineral/random,
+/area/space)
+"nG" = (
+/obj/machinery/light/directional/south,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"nO" = (
+/obj/machinery/mineral/ore_redemption{
+ name = "Syndicate ore redemption machine";
+ ore_multiplier = 4;
+ req_access = list("syndicate")
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"nU" = (
+/obj/structure/sign/poster/contraband/syndicate_pistol,
+/turf/closed/wall/r_wall/syndicate,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"oM" = (
+/obj/structure/cable,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"oZ" = (
+/mob/living/basic/syndicate/melee/sword/space/stormtrooper,
+/turf/open/floor/carpet/royalblack,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"pl" = (
+/obj/machinery/atmospherics/components/tank/air{
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"pz" = (
+/obj/machinery/computer/security{
+ desc = "Used to access interrogation room camera.";
+ dir = 8;
+ name = "Ship cameras console";
+ network = list("fsc","fsci");
+ screen_loc = ""
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"pH" = (
+/obj/structure/table/reinforced,
+/obj/item/toy/plush/nukeplushie,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"pM" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"pS" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{
+ dir = 6
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"pU" = (
+/obj/machinery/shower/directional/north,
+/obj/machinery/light/directional/south,
+/turf/open/floor/iron,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"qf" = (
+/obj/structure/table/optable,
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/plastic,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"qx" = (
+/turf/open/space/basic,
+/area/space)
+"qU" = (
+/obj/structure/sign/poster/contraband/c20r,
+/turf/closed/wall/r_wall/syndicate,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"qY" = (
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/iron/dark,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"rm" = (
+/obj/machinery/button/crematorium{
+ id = "fscremate";
+ pixel_x = -32
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"ru" = (
+/turf/closed/wall/r_wall/syndicate,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"rH" = (
+/obj/machinery/airalarm/directional/north,
+/obj/effect/mapping_helpers/airalarm/syndicate_access,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"rM" = (
+/obj/structure/closet/syndicate{
+ anchored = 1;
+ desc = "A basic closet for all your villainous needs.";
+ locked = 1;
+ name = "Closet";
+ req_access = list("syndicate");
+ secure = 1
+ },
+/obj/effect/spawner/random/contraband/armory,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"rP" = (
+/obj/effect/mob_spawn/ghost_role/human/syndicatespace,
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"sg" = (
+/obj/machinery/ore_silo,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"sq" = (
+/obj/machinery/door/window{
+ name = "Control Room";
+ req_access = list("syndicate")
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"sz" = (
+/obj/machinery/atmospherics/components/unary/vent_pump{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"sH" = (
+/obj/structure/displaycase{
+ req_access = list("syndicate");
+ start_showpiece_type = /obj/item/gun/ballistic/automatic/pistol/deagle/camo
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"sK" = (
+/obj/structure/closet/crate/secure/gear{
+ req_access = list("syndicate")
+ },
+/obj/item/stack/sheet/mineral/titanium{
+ amount = 40
+ },
+/obj/item/stack/sheet/mineral/uranium{
+ amount = 15
+ },
+/turf/open/floor/pod/dark,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"sL" = (
+/obj/structure/chair/comfy,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"sM" = (
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"tv" = (
+/obj/structure/table/reinforced,
+/obj/machinery/button/door{
+ id = "fscaproom";
+ name = "Room shutters control";
+ req_access = list("syndicate")
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"tI" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"uP" = (
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"vp" = (
+/obj/structure/table/reinforced,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"vD" = (
+/obj/machinery/portable_atmospherics/canister/oxygen,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"vK" = (
+/obj/machinery/door/airlock/grunge{
+ name = "Syndicate Ship Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"vU" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"wb" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2,
+/obj/machinery/portable_atmospherics/scrubber{
+ anchored = 1
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"we" = (
+/turf/closed/mineral/random/high_chance,
+/area/space)
+"wK" = (
+/obj/machinery/door/airlock/grunge{
+ name = "Syndicate Ship Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/turf/open/floor/iron/dark,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"wL" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/medkit/regular,
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"xJ" = (
+/obj/structure/closet/syndicate{
+ anchored = 1;
+ desc = "A basic closet for all your villainous needs.";
+ locked = 1;
+ name = "Closet";
+ req_access = list("syndicate");
+ secure = 1
+ },
+/obj/item/ammo_box/c9mm,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"xZ" = (
+/obj/machinery/computer/camera_advanced/syndie{
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"yl" = (
+/obj/machinery/door/airlock/grunge{
+ name = "Captain's Room"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/obj/machinery/door/poddoor{
+ id = "fscaproom";
+ name = "Captain's Blast Door";
+ state_open = 1
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"yD" = (
+/mob/living/basic/syndicate/ranged/smg/space/stormtrooper,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"yJ" = (
+/obj/structure/table/reinforced,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"yR" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"yT" = (
+/obj/item/ai_module/core/full/cybersun,
+/obj/structure/table/reinforced,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"yV" = (
+/obj/structure/table/reinforced,
+/obj/item/assembly/prox_sensor,
+/obj/item/assembly/prox_sensor,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"yZ" = (
+/turf/closed/mineral,
+/area/space)
+"zi" = (
+/obj/machinery/vending/cigarette/syndicate,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"zt" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Aa" = (
+/obj/structure/chair/comfy/shuttle,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"AN" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/mob/living/basic/syndicate/ranged/smg/space/stormtrooper,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Bm" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/closed/indestructible/syndicate,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"BK" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/cable,
+/turf/open/space/basic,
+/area/space)
+"BN" = (
+/obj/structure/transit_tube/crossing,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"Cf" = (
+/obj/machinery/light/directional/south,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Ci" = (
+/obj/structure/closet/syndicate{
+ anchored = 1;
+ desc = "A basic closet for all your villainous needs.";
+ locked = 1;
+ name = "Closet";
+ req_access = list("syndicate");
+ secure = 1
+ },
+/obj/item/crowbar/red,
+/obj/item/ammo_box/magazine/m9mm_aps,
+/obj/item/ammo_box/magazine/m9mm_aps,
+/turf/open/floor/carpet/royalblack,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Cn" = (
+/obj/machinery/camera/xray/directional/east{
+ c_tag = "Conference room";
+ network = list("fsc");
+ screen_loc = ""
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"CK" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/mob/living/basic/syndicate/ranged/smg/pilot,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"CR" = (
+/obj/structure/closet/syndicate{
+ anchored = 1;
+ desc = "A basic closet for all your villainous needs.";
+ locked = 1;
+ name = "Closet";
+ req_access = list("syndicate");
+ secure = 1
+ },
+/obj/item/coin/antagtoken,
+/obj/item/dnainjector/thermal,
+/obj/item/storage/box/firingpins/syndicate,
+/obj/item/storage/box/firingpins/syndicate,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"De" = (
+/obj/machinery/door/airlock/grunge{
+ name = "Syndicate Ship Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Dj" = (
+/obj/structure/table/reinforced,
+/obj/item/ammo_box/magazine/smgm45,
+/obj/item/ammo_box/magazine/smgm45,
+/obj/item/ammo_box/magazine/smgm45,
+/obj/item/gun/ballistic/automatic/c20r/unrestricted,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"DA" = (
+/obj/structure/closet/crate/secure/gear{
+ req_access = list("syndicate")
+ },
+/obj/effect/spawner/random/maintenance,
+/obj/effect/spawner/random/maintenance,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"EB" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"EX" = (
+/mob/living/basic/syndicate/ranged/shotgun/space/stormtrooper,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Fp" = (
+/obj/structure/tank_dispenser/oxygen,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"FN" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Gn" = (
+/obj/structure/chair/comfy{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Gs" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"GB" = (
+/obj/structure/cable,
+/obj/machinery/door/airlock/external/ruin{
+ name = "Syndicate Ship Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"GZ" = (
+/obj/machinery/door/airlock/external/ruin{
+ name = "Syndicate Ship Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Hq" = (
+/turf/closed/indestructible/binary,
+/area/space)
+"HU" = (
+/obj/machinery/door/airlock/grunge{
+ name = "Bridge"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Ia" = (
+/obj/effect/mob_spawn/ghost_role/human/syndicatespace/captain,
+/turf/open/floor/carpet/royalblack,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Id" = (
+/obj/machinery/power/shuttle_engine/huge{
+ dir = 8
+ },
+/turf/open/space/basic,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"If" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{
+ dir = 9
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Ig" = (
+/obj/machinery/porta_turret/syndicate/energy{
+ dir = 4;
+ name = "Syndicate Ship Turret";
+ on = 0;
+ shot_delay = 10
+ },
+/turf/closed/wall/r_wall/syndicate/nodiagonal,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Im" = (
+/obj/structure/table/reinforced,
+/obj/item/ammo_box/c9mm,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Io" = (
+/obj/effect/landmark/bitrunning/cache_spawn,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"IC" = (
+/obj/structure/table/reinforced,
+/obj/item/paper,
+/obj/item/pen,
+/turf/open/floor/carpet/royalblack,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"IH" = (
+/obj/machinery/door/airlock/external/ruin{
+ name = "Syndicate Ship Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/obj/structure/cable,
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"IV" = (
+/obj/machinery/door/airlock/grunge{
+ name = "Syndicate Ship Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/turf/open/floor/plating,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Jg" = (
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Jz" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{
+ dir = 5
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"JA" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"JN" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{
+ dir = 5
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"JP" = (
+/obj/structure/sink/directional/south,
+/turf/open/floor/iron/dark,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Kz" = (
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Lk" = (
+/obj/structure/transit_tube/crossing,
+/turf/closed/mineral/random,
+/area/space)
+"Lo" = (
+/obj/structure/filingcabinet,
+/obj/machinery/door/window{
+ dir = 8;
+ name = "Syndicate Interior Door";
+ req_access = list("syndicate")
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Mc" = (
+/obj/structure/closet/syndicate{
+ anchored = 1;
+ desc = "A basic closet for all your villainous needs.";
+ locked = 1;
+ name = "Closet";
+ req_access = list("syndicate");
+ secure = 1
+ },
+/obj/item/crowbar/red,
+/obj/item/ammo_box/magazine/m9mm,
+/obj/item/ammo_box/magazine/m9mm,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Mm" = (
+/obj/structure/closet/syndicate{
+ anchored = 1;
+ desc = "A basic closet for all your villainous needs.";
+ locked = 1;
+ name = "Closet";
+ req_access = list("syndicate");
+ secure = 1
+ },
+/obj/item/clothing/head/hats/hos/beret/syndicate,
+/obj/item/clothing/suit/armor/vest/capcarapace/syndicate,
+/obj/item/clothing/mask/gas/syndicate,
+/obj/item/clothing/under/syndicate,
+/obj/item/clothing/under/syndicate/skirt,
+/obj/item/clothing/gloves/combat,
+/obj/item/clothing/shoes/combat,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"MR" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Nm" = (
+/obj/structure/closet/crate/secure/gear{
+ req_access = list("syndicate")
+ },
+/turf/open/floor/pod/dark,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Nr" = (
+/obj/structure/closet/crate/secure/gear{
+ req_access = list("syndicate")
+ },
+/obj/item/stack/sheet/mineral/gold{
+ amount = 30
+ },
+/obj/item/stack/sheet/mineral/silver{
+ amount = 30
+ },
+/obj/machinery/light/small/directional/south,
+/turf/open/floor/pod/dark,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Nt" = (
+/obj/structure/table/reinforced,
+/obj/machinery/atmospherics/components/unary/vent_pump,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Of" = (
+/obj/structure/closet/crate/secure/gear{
+ req_access = list("syndicate")
+ },
+/obj/item/disk/surgery/forgottenship,
+/turf/open/floor/pod/dark,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Ox" = (
+/obj/machinery/atmospherics/components/unary/vent_pump,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"OH" = (
+/obj/structure/cable,
+/obj/structure/table/reinforced,
+/obj/item/storage/toolbox/syndicate,
+/obj/item/storage/toolbox/syndicate,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"OI" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/obj/structure/cable,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"PR" = (
+/obj/machinery/door/password/voice/sfc{
+ password = null
+ },
+/obj/structure/fans/tiny,
+/obj/machinery/door/airlock/grunge{
+ desc = "Vault airlock preventing air from going out.";
+ name = "Syndicate Vault Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/turf/open/floor/pod/dark,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Qg" = (
+/obj/machinery/suit_storage_unit/syndicate{
+ helmet_type = /obj/item/clothing/head/helmet/space/syndicate/black;
+ suit_type = /obj/item/clothing/suit/space/syndicate/black
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Qi" = (
+/obj/item/stack/sheet/mineral/uranium{
+ amount = 15
+ },
+/obj/structure/cable,
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"QF" = (
+/obj/structure/table/reinforced,
+/obj/item/dualsaber/green,
+/obj/machinery/light/small/directional/east,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"QG" = (
+/obj/structure/tank_dispenser/oxygen,
+/turf/closed/mineral/random,
+/area/space)
+"QX" = (
+/mob/living/basic/syndicate/ranged/space/stormtrooper,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Ra" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2,
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"RQ" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"RU" = (
+/obj/machinery/suit_storage_unit/syndicate,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Sc" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Sd" = (
+/obj/structure/closet/syndicate{
+ anchored = 1;
+ desc = "A basic closet for all your villainous needs.";
+ locked = 1;
+ name = "Closet";
+ req_access = list("syndicate");
+ secure = 1
+ },
+/obj/item/crowbar/red,
+/obj/item/ammo_box/magazine/m9mm,
+/obj/item/ammo_box/magazine/m9mm,
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Sq" = (
+/obj/machinery/power/smes,
+/obj/structure/cable,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Sv" = (
+/obj/structure/closet/crate/secure/gear{
+ req_access = list("syndicate")
+ },
+/obj/effect/spawner/random/food_or_drink/donkpockets,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Sz" = (
+/turf/open/floor/iron/dark,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"SX" = (
+/obj/machinery/vending/medical/syndicate_access/cybersun,
+/turf/open/floor/plastic,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"TB" = (
+/turf/closed/indestructible/syndicate,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"UQ" = (
+/obj/structure/sign/poster/contraband/syndicate_recruitment,
+/turf/closed/wall/r_wall/syndicate,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Vk" = (
+/obj/machinery/porta_turret/syndicate/energy{
+ dir = 4;
+ name = "Syndicate Ship Turret";
+ on = 0;
+ shot_delay = 10
+ },
+/turf/closed/wall/r_wall/syndicate,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Vq" = (
+/obj/structure/transit_tube/station/dispenser/reverse{
+ dir = 8
+ },
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"Wd" = (
+/obj/structure/sign/poster/contraband/tools,
+/turf/closed/wall/r_wall/syndicate,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Wy" = (
+/obj/structure/closet/crate/secure/gear{
+ req_access = list("syndicate")
+ },
+/obj/item/stack/ore/plasma{
+ amount = 19
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"WR" = (
+/obj/machinery/power/port_gen/pacman/super{
+ anchored = 1
+ },
+/obj/structure/cable,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Xp" = (
+/turf/open/space/basic,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"XS" = (
+/obj/machinery/light/directional/north,
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Yb" = (
+/obj/structure/closet/crate/secure/gear{
+ req_access = list("syndicate")
+ },
+/obj/item/clothing/head/helmet/space/syndicate/black/engie,
+/obj/item/clothing/suit/space/syndicate/black/engie,
+/turf/open/floor/pod/dark,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Yi" = (
+/obj/effect/landmark/bitrunning/cache_spawn,
+/turf/open/floor/plastic,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Yj" = (
+/obj/structure/closet/crate/secure/gear{
+ req_access = list("syndicate")
+ },
+/obj/item/stack/ore/diamond{
+ amount = 3
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Yk" = (
+/obj/machinery/door/airlock/grunge{
+ name = "Captain's Room"
+ },
+/obj/effect/mapping_helpers/airlock/access/all/syndicate/general,
+/obj/machinery/door/poddoor{
+ id = "fscaproom";
+ name = "Captain's Blast Door";
+ state_open = 1
+ },
+/turf/open/floor/carpet/royalblack,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Yr" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"Yu" = (
+/obj/structure/chair/comfy/black,
+/turf/open/floor/carpet/royalblack,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"YV" = (
+/obj/structure/sink/directional/south,
+/obj/structure/mirror/directional/west,
+/turf/open/floor/iron/dark,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Za" = (
+/obj/machinery/computer/operating,
+/turf/open/floor/plastic,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Zb" = (
+/turf/open/floor/plastic,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"ZA" = (
+/obj/machinery/power/shuttle_engine/propulsion{
+ dir = 8
+ },
+/turf/open/space/basic,
+/area/ruin/space/has_grav/powered/virtual_domain)
+
+(1,1,1) = {"
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+"}
+(2,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(3,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(4,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(5,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(6,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(7,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+we
+we
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(8,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+we
+we
+we
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(9,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+we
+we
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(10,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Xp
+Xp
+Id
+qx
+qx
+Xp
+Xp
+Id
+qx
+qx
+Xp
+Xp
+Id
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(11,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Xp
+Xp
+Xp
+qx
+qx
+Xp
+Xp
+Xp
+qx
+qx
+Xp
+Xp
+Xp
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(12,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+ZA
+Xp
+Xp
+Xp
+ZA
+ZA
+Xp
+Xp
+Xp
+ZA
+ZA
+Xp
+Xp
+Xp
+ZA
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+we
+we
+we
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(13,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+ru
+ru
+ru
+ru
+ru
+ru
+ru
+ru
+ru
+ru
+ru
+ru
+ru
+ru
+ru
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+we
+we
+we
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(14,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Vk
+ru
+Sv
+vD
+uP
+uP
+Yj
+vD
+uP
+Wy
+DA
+uP
+QX
+vD
+cc
+ru
+Vk
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(15,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+ru
+Io
+uP
+uP
+QX
+lN
+uP
+uP
+uP
+uP
+uP
+lN
+uP
+uP
+uP
+uP
+hA
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(16,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+ru
+ru
+ru
+ru
+ru
+ru
+ru
+ru
+IV
+ru
+ru
+ru
+IV
+ru
+ru
+ru
+ru
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(17,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+ru
+ru
+vp
+ru
+Ia
+Ci
+ru
+Sq
+di
+WR
+ru
+yV
+Gn
+uP
+Mc
+uP
+ru
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+nB
+we
+nB
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(18,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+ru
+vp
+Jg
+ru
+bh
+cR
+ru
+Qi
+sz
+Kz
+ru
+Mc
+gD
+yD
+uP
+rP
+ru
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+nB
+nB
+nB
+nB
+nB
+nB
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(19,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+ru
+sH
+Kz
+yl
+oZ
+bh
+Yk
+pS
+RQ
+Jz
+vK
+uP
+uP
+uP
+sL
+hy
+ru
+qx
+qx
+qx
+qx
+qx
+qx
+nB
+nB
+TB
+TB
+TB
+TB
+nB
+nB
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(20,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+ru
+CR
+Kz
+ru
+bh
+bh
+Yk
+pM
+zt
+pM
+vK
+uP
+uP
+EX
+sL
+Im
+ru
+qx
+qx
+qx
+qx
+qx
+nB
+nB
+TB
+TB
+Yb
+Yb
+TB
+Bm
+nB
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(21,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+ru
+yT
+Kz
+ru
+Yu
+IC
+ru
+mD
+JN
+MR
+ru
+Sd
+gD
+uP
+uP
+gD
+ru
+qx
+qx
+qx
+qx
+nB
+QG
+nB
+TB
+aN
+bG
+bG
+sK
+TB
+nB
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(22,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Ig
+ru
+Lo
+ru
+tv
+ki
+nU
+wb
+EB
+pl
+ru
+hD
+Gn
+uP
+Mc
+ru
+Ig
+qx
+qx
+qx
+qx
+nB
+we
+nB
+TB
+iU
+bG
+bG
+Nr
+TB
+nB
+we
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(23,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+ru
+ru
+ru
+ru
+ru
+ru
+ru
+cy
+ru
+ru
+ru
+ru
+ru
+ru
+ru
+qx
+qx
+qx
+qx
+qx
+qx
+nB
+nB
+TB
+Nm
+bG
+bG
+Of
+TB
+nB
+nB
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+sM
+sM
+sM
+sM
+sM
+kJ
+qx
+Hq
+"}
+(24,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+ru
+Za
+Yi
+Zb
+SX
+ru
+uP
+yR
+uP
+ru
+YV
+Sz
+jJ
+fG
+ru
+qx
+qx
+qx
+qx
+qx
+nB
+nB
+nB
+TB
+TB
+PR
+TB
+TB
+TB
+nB
+nB
+nB
+qx
+qx
+qx
+qx
+qx
+qx
+sM
+sM
+sM
+sM
+sM
+sM
+qx
+Hq
+"}
+(25,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+ru
+qf
+Zb
+ip
+da
+ru
+Ra
+Sc
+uP
+ru
+JP
+qY
+ru
+ru
+ru
+qx
+qx
+qx
+qx
+qx
+nB
+nB
+we
+ru
+ru
+uP
+sg
+ru
+ru
+nB
+nB
+nB
+nB
+qx
+qx
+qx
+qx
+qx
+sM
+sM
+sM
+sM
+sM
+sM
+qx
+Hq
+"}
+(26,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+ru
+aq
+cB
+Zb
+Zb
+De
+Ox
+Gs
+uP
+wK
+Sz
+Sz
+jJ
+pU
+ru
+qx
+qx
+qx
+qx
+qx
+qx
+nB
+nB
+qU
+Fp
+uP
+uP
+li
+cj
+Lk
+Lk
+fd
+fd
+fd
+fd
+fd
+fd
+fd
+BN
+Vq
+sM
+sM
+sM
+sM
+qx
+Hq
+"}
+(27,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Vk
+ru
+ru
+ru
+ru
+ru
+ru
+ru
+kh
+ru
+ru
+ru
+ru
+ru
+ru
+ru
+Vk
+qx
+qx
+qx
+qx
+qx
+nB
+nB
+ru
+eB
+uP
+nO
+uP
+ru
+nB
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+sM
+sM
+sM
+sM
+sM
+sM
+qx
+Hq
+"}
+(28,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+ru
+jl
+rm
+ru
+nk
+oM
+oM
+oM
+yR
+oM
+oM
+oM
+uP
+ru
+uP
+Qg
+ru
+qx
+qx
+qx
+qx
+qx
+qx
+nB
+ru
+wL
+oM
+uP
+dw
+ru
+yZ
+nB
+nB
+nB
+qx
+qx
+qx
+qx
+qx
+sM
+sM
+sM
+sM
+sM
+sM
+qx
+Hq
+"}
+(29,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+ru
+uP
+dw
+ru
+rH
+uP
+AN
+JA
+iX
+JA
+JA
+oM
+uP
+ru
+fJ
+Qg
+ru
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Wd
+OH
+oM
+uP
+RU
+ru
+we
+nB
+nB
+qx
+qx
+qx
+qx
+qx
+qx
+sM
+sM
+sM
+sM
+sM
+Yr
+qx
+Hq
+"}
+(30,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+lo
+uP
+uP
+GZ
+uP
+Aa
+hD
+yJ
+bD
+hD
+hD
+OI
+oM
+GB
+jA
+oM
+dU
+BK
+BK
+BK
+BK
+BK
+BK
+BK
+IH
+oM
+oM
+uP
+RU
+ru
+nB
+nB
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(31,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+ru
+uP
+uP
+dd
+uP
+Aa
+hD
+Nt
+aw
+hD
+hD
+bo
+uP
+dd
+uP
+Qg
+ru
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+iL
+cZ
+uP
+uP
+RU
+ru
+nB
+nB
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(32,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+ru
+aO
+uP
+ru
+XS
+uP
+uP
+hD
+aZ
+hD
+uP
+uP
+Cf
+ru
+uP
+Fp
+ru
+qx
+qx
+qx
+qx
+qx
+qx
+nB
+ru
+ru
+Dj
+QF
+ru
+ru
+nB
+nB
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(33,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Ig
+ru
+hD
+ru
+zi
+uP
+uP
+uP
+FN
+Cn
+uP
+uP
+uP
+ru
+hD
+ru
+Ig
+qx
+qx
+qx
+qx
+qx
+nB
+nB
+nB
+ru
+ru
+ru
+ru
+nB
+nB
+we
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(34,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+ru
+ru
+ru
+ru
+ru
+ru
+ru
+HU
+ru
+ru
+ru
+ru
+ru
+ru
+ru
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+nB
+nB
+nB
+nB
+we
+nB
+nB
+nB
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(35,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+UQ
+rM
+xJ
+Kz
+Kz
+tI
+Kz
+Kz
+ct
+xJ
+ru
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+we
+nB
+nB
+nB
+nB
+nB
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(36,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+ru
+ru
+ru
+ru
+Kz
+Kz
+Kz
+Kz
+tI
+Kz
+Kz
+Kz
+Kz
+ru
+ru
+ru
+ru
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(37,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+ru
+ln
+Kz
+ru
+iB
+Kz
+Kz
+fV
+If
+Kz
+Kz
+Kz
+nG
+ru
+cw
+cw
+ru
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(38,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+ru
+Kz
+dz
+sq
+Kz
+CK
+Kz
+vU
+mo
+vU
+Kz
+CK
+Kz
+ja
+Kz
+Jg
+ru
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(39,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Ig
+ru
+Kz
+ru
+Kz
+pz
+Kz
+xZ
+Kz
+fM
+Kz
+kI
+Kz
+ru
+Mm
+ru
+Ig
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(40,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+ru
+ru
+ru
+Kz
+Kz
+Kz
+Kz
+Kz
+Kz
+Kz
+Kz
+Kz
+ru
+ru
+ru
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(41,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+ru
+ru
+vp
+vp
+pH
+vp
+iW
+vp
+vp
+vp
+vp
+ru
+ru
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+we
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(42,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Ig
+hg
+hg
+hg
+hg
+hg
+hg
+hg
+hg
+hg
+Ig
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+we
+we
+we
+we
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(43,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+we
+we
+we
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(44,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+we
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(45,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+we
+we
+we
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(46,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+we
+we
+we
+we
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(47,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+we
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(48,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(49,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(50,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(51,1,1) = {"
+Hq
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+qx
+Hq
+"}
+(52,1,1) = {"
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+Hq
+"}
diff --git a/_maps/virtual_domains/test_only.dmm b/_maps/virtual_domains/test_only.dmm
new file mode 100644
index 00000000000..22b647188b6
--- /dev/null
+++ b/_maps/virtual_domains/test_only.dmm
@@ -0,0 +1,52 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/open/floor,
+/area/virtual_domain/powered)
+"D" = (
+/obj/effect/mob_spawn/corpse/human/miner,
+/turf/open/floor,
+/area/virtual_domain/powered)
+"I" = (
+/mob/living/basic/pet/dog/corgi,
+/turf/open/floor,
+/area/virtual_domain/powered)
+"U" = (
+/obj/effect/landmark/bitrunning/safehouse_spawn,
+/turf/open/floor,
+/area/virtual_domain/safehouse)
+
+(1,1,1) = {"
+I
+a
+a
+a
+U
+"}
+(2,1,1) = {"
+D
+a
+a
+a
+a
+"}
+(3,1,1) = {"
+a
+a
+a
+a
+a
+"}
+(4,1,1) = {"
+a
+a
+a
+a
+a
+"}
+(5,1,1) = {"
+a
+a
+a
+a
+a
+"}
diff --git a/_maps/virtual_domains/vaporwave.dmm b/_maps/virtual_domains/vaporwave.dmm
new file mode 100644
index 00000000000..984bbbe2914
--- /dev/null
+++ b/_maps/virtual_domains/vaporwave.dmm
@@ -0,0 +1,1017 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aA" = (
+/obj/machinery/light/small/directional/north,
+/obj/effect/turf_decal/sand/plating,
+/turf/open/floor/plating{
+ initial_gas_mix = "TEMP=2.7"
+ },
+/area/ruin/space/has_grav/powered/virtual_domain)
+"bs" = (
+/obj/effect/turf_decal/sand,
+/turf/open/floor/iron/airless,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"bF" = (
+/obj/effect/turf_decal/sand/plating,
+/turf/open/floor/plating{
+ initial_gas_mix = "TEMP=2.7"
+ },
+/area/ruin/space/has_grav/powered/virtual_domain)
+"cz" = (
+/turf/open/misc/asteroid/airless,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"cL" = (
+/obj/structure/table/reinforced,
+/obj/item/reagent_containers/cup/glass/drinkingglass{
+ pixel_x = 6;
+ pixel_y = 4
+ },
+/obj/item/reagent_containers/cup/glass/drinkingglass,
+/obj/item/reagent_containers/cup/glass/drinkingglass{
+ pixel_x = -6;
+ pixel_y = 8
+ },
+/turf/open/floor/iron/vaporwave,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"df" = (
+/obj/effect/turf_decal/sand,
+/turf/open/floor/iron/airless{
+ icon_state = "stairs-l"
+ },
+/area/ruin/space/has_grav/powered/virtual_domain)
+"eF" = (
+/turf/closed/indestructible/binary,
+/area/space)
+"fx" = (
+/obj/item/statuebust,
+/turf/open/floor/iron/vaporwave,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"fQ" = (
+/obj/structure/flora/tree/palm,
+/turf/open/floor/holofloor/beach,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"gM" = (
+/obj/structure/table/reinforced,
+/obj/item/clothing/glasses/sunglasses/big{
+ name = "aesthetic sunglasses"
+ },
+/turf/open/floor/iron/vaporwave,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"hN" = (
+/turf/open/floor/holofloor/beach,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"il" = (
+/obj/effect/turf_decal/sand,
+/obj/effect/turf_decal/sand,
+/turf/open/floor/iron/airless,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"iP" = (
+/obj/machinery/suit_storage_unit/standard_unit,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"kj" = (
+/obj/structure/window/spawner/directional/east,
+/obj/structure/closet/crate/secure/bitrunning/encrypted,
+/turf/open/floor/iron/vaporwave,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"ku" = (
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"kF" = (
+/obj/effect/turf_decal/sand,
+/turf/open/floor/iron/airless{
+ icon_state = "stairs-r"
+ },
+/area/ruin/space/has_grav/powered/virtual_domain)
+"ll" = (
+/obj/structure/sign/poster/contraband/clown/directional/north,
+/turf/open/floor/iron/vaporwave,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"lu" = (
+/turf/closed/wall/rust,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"lB" = (
+/obj/item/tank/internals/emergency_oxygen,
+/obj/item/tank/internals/emergency_oxygen,
+/obj/item/tank/internals/emergency_oxygen,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"lI" = (
+/obj/structure/table/reinforced,
+/obj/machinery/chem_dispenser/drinks/beer/fullupgrade,
+/turf/open/floor/iron/vaporwave,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"qm" = (
+/obj/structure/flora/tree/palm,
+/obj/machinery/light/directional/west,
+/turf/open/floor/holofloor/beach,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"qu" = (
+/turf/open/floor/holofloor/beach/water,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"rn" = (
+/obj/structure/statue/sandstone/venus{
+ anchored = 1;
+ dir = 4
+ },
+/obj/effect/turf_decal/sand/plating,
+/turf/open/floor/plating{
+ initial_gas_mix = "TEMP=2.7"
+ },
+/area/ruin/space/has_grav/powered/virtual_domain)
+"xb" = (
+/obj/structure/chair/stool/directional/west,
+/turf/open/floor/iron/vaporwave,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"xp" = (
+/obj/structure/table/reinforced,
+/turf/open/floor/iron/vaporwave,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"xK" = (
+/turf/closed/wall,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"ym" = (
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space)
+"AX" = (
+/obj/effect/turf_decal/stripes/asteroid/line,
+/obj/effect/turf_decal/sand/plating,
+/turf/open/floor/plating{
+ initial_gas_mix = "TEMP=2.7"
+ },
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Cq" = (
+/obj/item/instrument/eguitar,
+/turf/open/floor/holofloor/beach,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"CR" = (
+/turf/open/floor/iron/vaporwave,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Dk" = (
+/obj/structure/window/spawner/directional/east,
+/turf/open/floor/iron/vaporwave,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Es" = (
+/obj/structure/chair/comfy/black{
+ dir = 4
+ },
+/turf/open/floor/iron/vaporwave,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Fd" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/closed/wall/rust,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Hf" = (
+/obj/effect/turf_decal/sand,
+/turf/open/floor/iron/airless{
+ icon_state = "recharge_floor_asteroid"
+ },
+/area/ruin/space/has_grav/powered/virtual_domain)
+"HA" = (
+/turf/open/floor/holofloor/beach/coast,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"HV" = (
+/obj/structure/chair/comfy/black{
+ dir = 4
+ },
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/iron/vaporwave,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Jr" = (
+/obj/structure/window/spawner/directional/west,
+/turf/open/floor/iron/vaporwave,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"KO" = (
+/obj/structure/chair/comfy/black{
+ dir = 8
+ },
+/turf/open/floor/iron/vaporwave,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"KY" = (
+/obj/effect/turf_decal/sand,
+/turf/open/floor/iron/airless{
+ icon_state = "stairs-m"
+ },
+/area/ruin/space/has_grav/powered/virtual_domain)
+"LG" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"LJ" = (
+/obj/structure/lattice,
+/turf/open/misc/asteroid/airless,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"LP" = (
+/obj/structure/flora/tree/palm,
+/obj/machinery/light/directional/east,
+/turf/open/floor/holofloor/beach,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Nz" = (
+/obj/structure/window/spawner/directional/east,
+/obj/structure/table/reinforced,
+/obj/item/storage/fancy/cigarettes/cigars/havana,
+/obj/effect/spawner/random/entertainment/lighter,
+/turf/open/floor/iron/vaporwave,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"NT" = (
+/turf/open/space/basic,
+/area/space)
+"Qh" = (
+/obj/structure/closet/crate/bin,
+/turf/open/misc/asteroid/airless,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Uy" = (
+/obj/effect/landmark/bitrunning/safehouse_spawn,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"UE" = (
+/obj/effect/turf_decal/sand,
+/obj/effect/turf_decal/sand/plating,
+/turf/open/floor/plating{
+ initial_gas_mix = "TEMP=2.7"
+ },
+/area/ruin/space/has_grav/powered/virtual_domain)
+"UV" = (
+/obj/structure/lattice,
+/turf/open/floor/plating/airless,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Vc" = (
+/obj/structure/flora/tree/palm,
+/turf/open/misc/asteroid/airless,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"XJ" = (
+/obj/structure/fans/tiny,
+/obj/machinery/door/airlock/hatch,
+/turf/open/floor/pod/dark,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Yo" = (
+/obj/structure/statue/sandstone/venus{
+ anchored = 1;
+ desc = "Ugh, this is merely an ugly amateurish replica of the other statue! The letters RIPGOAT are scribbled onto the base.";
+ dir = 8
+ },
+/obj/effect/turf_decal/sand/plating,
+/turf/open/floor/plating{
+ initial_gas_mix = "TEMP=2.7"
+ },
+/area/ruin/space/has_grav/powered/virtual_domain)
+"YE" = (
+/mob/living/basic/butterfly,
+/turf/open/floor/iron/vaporwave,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"ZI" = (
+/obj/effect/spawner/random/structure/musician/piano/random_piano,
+/obj/structure/window/spawner/directional/west,
+/turf/open/floor/iron/vaporwave,
+/area/ruin/space/has_grav/powered/virtual_domain)
+
+(1,1,1) = {"
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+"}
+(2,1,1) = {"
+eF
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+eF
+"}
+(3,1,1) = {"
+eF
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+eF
+"}
+(4,1,1) = {"
+eF
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+eF
+"}
+(5,1,1) = {"
+eF
+NT
+NT
+NT
+NT
+NT
+NT
+cz
+LJ
+cz
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+eF
+"}
+(6,1,1) = {"
+eF
+NT
+NT
+NT
+NT
+NT
+cz
+cz
+LJ
+cz
+cz
+LJ
+cz
+cz
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+eF
+"}
+(7,1,1) = {"
+eF
+NT
+NT
+NT
+NT
+cz
+cz
+cz
+UV
+LJ
+cz
+UV
+cz
+cz
+cz
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+eF
+"}
+(8,1,1) = {"
+eF
+NT
+NT
+NT
+NT
+cz
+xK
+xK
+lu
+lu
+lu
+xK
+lu
+UE
+cz
+cz
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+eF
+"}
+(9,1,1) = {"
+eF
+NT
+NT
+NT
+LJ
+Qh
+xK
+fQ
+hN
+qm
+HA
+qu
+xK
+aA
+cz
+cz
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+eF
+"}
+(10,1,1) = {"
+eF
+NT
+NT
+NT
+LJ
+UV
+lu
+ZI
+Jr
+Jr
+Jr
+Jr
+xK
+bF
+Vc
+cz
+cz
+NT
+NT
+NT
+ku
+ku
+ku
+ku
+ku
+Uy
+NT
+eF
+"}
+(11,1,1) = {"
+eF
+NT
+NT
+NT
+cz
+cz
+xK
+xb
+CR
+CR
+fx
+CR
+xK
+Yo
+il
+UE
+cz
+NT
+NT
+NT
+ku
+iP
+iP
+iP
+ku
+ku
+NT
+eF
+"}
+(12,1,1) = {"
+eF
+NT
+NT
+NT
+cz
+cz
+xK
+ll
+CR
+CR
+CR
+CR
+xK
+Hf
+df
+il
+cz
+NT
+NT
+NT
+ku
+ku
+ku
+ku
+ku
+ku
+NT
+eF
+"}
+(13,1,1) = {"
+eF
+NT
+NT
+NT
+cz
+LJ
+xK
+HV
+Es
+CR
+CR
+CR
+XJ
+bs
+KY
+bs
+il
+NT
+NT
+NT
+ku
+ku
+ku
+ku
+ku
+ku
+NT
+eF
+"}
+(14,1,1) = {"
+eF
+NT
+NT
+NT
+cz
+LJ
+lu
+xp
+gM
+CR
+CR
+cL
+xK
+Hf
+kF
+bs
+il
+NT
+NT
+NT
+ku
+ku
+ku
+ku
+ku
+ku
+NT
+eF
+"}
+(15,1,1) = {"
+eF
+NT
+NT
+NT
+cz
+LJ
+lu
+KO
+KO
+CR
+YE
+lI
+lu
+rn
+il
+UE
+UE
+NT
+NT
+NT
+ku
+ku
+ku
+ku
+lB
+ku
+NT
+eF
+"}
+(16,1,1) = {"
+eF
+NT
+NT
+NT
+LJ
+UV
+xK
+kj
+Dk
+Dk
+Dk
+Nz
+xK
+AX
+Vc
+cz
+cz
+NT
+NT
+NT
+ku
+ku
+ku
+ku
+ku
+LG
+NT
+eF
+"}
+(17,1,1) = {"
+eF
+NT
+NT
+NT
+cz
+cz
+lu
+fQ
+Cq
+LP
+HA
+qu
+lu
+aA
+cz
+cz
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+eF
+"}
+(18,1,1) = {"
+eF
+NT
+NT
+NT
+cz
+cz
+xK
+xK
+lu
+xK
+lu
+lu
+Fd
+UE
+cz
+cz
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+eF
+"}
+(19,1,1) = {"
+eF
+NT
+NT
+NT
+NT
+cz
+cz
+cz
+UV
+LJ
+Qh
+UV
+cz
+cz
+cz
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+eF
+"}
+(20,1,1) = {"
+eF
+NT
+NT
+NT
+NT
+NT
+NT
+cz
+LJ
+cz
+cz
+LJ
+cz
+cz
+cz
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+eF
+"}
+(21,1,1) = {"
+eF
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+ym
+cz
+cz
+cz
+cz
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+eF
+"}
+(22,1,1) = {"
+eF
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+eF
+"}
+(23,1,1) = {"
+eF
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+eF
+"}
+(24,1,1) = {"
+eF
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+NT
+eF
+"}
+(25,1,1) = {"
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+eF
+"}
diff --git a/_maps/virtual_domains/wendigo.dmm b/_maps/virtual_domains/wendigo.dmm
new file mode 100644
index 00000000000..17bcb48d688
--- /dev/null
+++ b/_maps/virtual_domains/wendigo.dmm
@@ -0,0 +1,1373 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/open/indestructible/necropolis{
+ initial_gas_mix = "ICEMOON_ATMOS"
+ },
+/area/icemoon/underground/explored/virtual_domain)
+"b" = (
+/turf/closed/indestructible/rock/snow/ice/ore,
+/area/icemoon/underground/explored/virtual_domain)
+"e" = (
+/turf/open/misc/asteroid/snow/ice/icemoon,
+/area/icemoon/underground/explored/virtual_domain)
+"f" = (
+/obj/structure/marker_beacon/olive,
+/turf/open/indestructible/necropolis{
+ initial_gas_mix = "ICEMOON_ATMOS"
+ },
+/area/icemoon/underground/explored/virtual_domain)
+"i" = (
+/turf/closed/indestructible/binary,
+/area/icemoon/underground/explored/virtual_domain)
+"o" = (
+/obj/structure/marker_beacon/indigo,
+/turf/open/indestructible/necropolis{
+ initial_gas_mix = "ICEMOON_ATMOS"
+ },
+/area/icemoon/underground/explored/virtual_domain)
+"p" = (
+/obj/structure/marker_beacon/bronze,
+/turf/open/indestructible/necropolis{
+ initial_gas_mix = "ICEMOON_ATMOS"
+ },
+/area/icemoon/underground/explored/virtual_domain)
+"q" = (
+/obj/structure/marker_beacon/yellow,
+/turf/open/indestructible/necropolis{
+ initial_gas_mix = "ICEMOON_ATMOS"
+ },
+/area/icemoon/underground/explored/virtual_domain)
+"t" = (
+/obj/structure/marker_beacon/teal,
+/turf/open/indestructible/necropolis{
+ initial_gas_mix = "ICEMOON_ATMOS"
+ },
+/area/icemoon/underground/explored/virtual_domain)
+"x" = (
+/obj/structure/marker_beacon/burgundy,
+/turf/open/indestructible/necropolis{
+ initial_gas_mix = "ICEMOON_ATMOS"
+ },
+/area/icemoon/underground/explored/virtual_domain)
+"A" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"E" = (
+/obj/effect/mob_spawn/corpse/human/miner,
+/turf/open/misc/asteroid/snow/ice/icemoon,
+/area/icemoon/underground/explored/virtual_domain)
+"H" = (
+/mob/living/simple_animal/hostile/megafauna/wendigo/virtual_domain,
+/turf/open/indestructible/necropolis{
+ initial_gas_mix = "ICEMOON_ATMOS"
+ },
+/area/icemoon/underground/explored/virtual_domain)
+"L" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/closed/indestructible/binary,
+/area/icemoon/underground/explored/virtual_domain)
+"R" = (
+/obj/item/paper/crumpled/bloody{
+ default_raw_text = "for your own sake, do not enter"
+ },
+/turf/open/misc/asteroid/snow/ice/icemoon,
+/area/icemoon/underground/explored/virtual_domain)
+"S" = (
+/turf/template_noop,
+/area/template_noop)
+"V" = (
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"Z" = (
+/obj/effect/landmark/bitrunning/safehouse_spawn,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+
+(1,1,1) = {"
+S
+S
+S
+S
+S
+S
+i
+i
+i
+i
+i
+i
+i
+i
+i
+i
+i
+i
+i
+i
+i
+i
+i
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+"}
+(2,1,1) = {"
+S
+S
+S
+S
+S
+i
+i
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+i
+i
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+"}
+(3,1,1) = {"
+S
+S
+S
+S
+i
+i
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+i
+i
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+"}
+(4,1,1) = {"
+S
+S
+S
+i
+i
+e
+e
+e
+b
+b
+b
+b
+b
+e
+e
+e
+b
+b
+b
+b
+b
+e
+e
+e
+i
+i
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+"}
+(5,1,1) = {"
+S
+S
+i
+i
+e
+e
+e
+b
+b
+b
+b
+b
+b
+b
+e
+b
+b
+b
+b
+b
+b
+b
+e
+e
+e
+i
+i
+i
+i
+i
+i
+i
+i
+i
+i
+i
+L
+"}
+(6,1,1) = {"
+S
+i
+i
+e
+e
+e
+b
+b
+b
+b
+b
+b
+b
+b
+e
+b
+b
+b
+b
+b
+b
+b
+b
+e
+e
+e
+i
+i
+e
+e
+e
+e
+e
+e
+e
+e
+i
+"}
+(7,1,1) = {"
+i
+i
+e
+e
+e
+b
+b
+b
+b
+b
+b
+b
+b
+b
+e
+b
+b
+b
+b
+b
+b
+b
+b
+b
+e
+e
+e
+i
+e
+e
+e
+e
+e
+e
+e
+e
+i
+"}
+(8,1,1) = {"
+i
+e
+e
+e
+b
+b
+b
+b
+b
+b
+a
+a
+a
+a
+a
+a
+a
+a
+a
+b
+b
+b
+b
+b
+b
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+i
+"}
+(9,1,1) = {"
+i
+e
+e
+b
+b
+b
+b
+b
+b
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+b
+b
+b
+b
+b
+b
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+i
+"}
+(10,1,1) = {"
+i
+e
+e
+b
+b
+b
+b
+b
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+b
+b
+b
+b
+b
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+i
+"}
+(11,1,1) = {"
+i
+e
+E
+b
+b
+b
+b
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+o
+a
+a
+b
+b
+b
+b
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+i
+"}
+(12,1,1) = {"
+i
+e
+e
+b
+b
+b
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+b
+b
+b
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+i
+"}
+(13,1,1) = {"
+i
+e
+e
+b
+b
+b
+a
+a
+a
+a
+q
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+b
+b
+b
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+i
+"}
+(14,1,1) = {"
+i
+e
+e
+b
+b
+b
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+b
+b
+b
+e
+e
+e
+V
+V
+V
+V
+V
+Z
+e
+i
+"}
+(15,1,1) = {"
+i
+e
+e
+b
+b
+b
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+b
+b
+b
+E
+e
+e
+V
+V
+V
+V
+V
+V
+e
+i
+"}
+(16,1,1) = {"
+i
+e
+e
+e
+b
+b
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+b
+b
+e
+e
+e
+e
+V
+V
+V
+V
+V
+V
+e
+i
+"}
+(17,1,1) = {"
+i
+e
+e
+e
+e
+e
+a
+a
+a
+a
+a
+a
+a
+a
+H
+a
+a
+a
+a
+x
+a
+a
+a
+e
+e
+e
+e
+R
+e
+V
+V
+V
+V
+V
+V
+e
+i
+"}
+(18,1,1) = {"
+i
+e
+e
+e
+b
+b
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+b
+b
+e
+e
+e
+e
+V
+V
+V
+V
+V
+V
+e
+i
+"}
+(19,1,1) = {"
+i
+e
+e
+b
+b
+b
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+b
+b
+b
+e
+e
+e
+V
+V
+V
+V
+V
+V
+e
+i
+"}
+(20,1,1) = {"
+i
+e
+e
+b
+b
+b
+a
+a
+a
+a
+a
+a
+a
+a
+p
+a
+a
+a
+a
+a
+a
+a
+a
+b
+b
+b
+e
+e
+e
+V
+V
+V
+V
+V
+A
+e
+i
+"}
+(21,1,1) = {"
+i
+e
+e
+b
+b
+b
+a
+a
+a
+a
+f
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+b
+b
+b
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+i
+"}
+(22,1,1) = {"
+i
+e
+e
+b
+b
+b
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+b
+b
+b
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+i
+"}
+(23,1,1) = {"
+i
+e
+e
+b
+b
+b
+b
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+t
+a
+b
+b
+b
+b
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+i
+"}
+(24,1,1) = {"
+i
+e
+e
+b
+b
+b
+b
+b
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+b
+b
+b
+b
+b
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+i
+"}
+(25,1,1) = {"
+i
+e
+e
+b
+b
+b
+b
+b
+b
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+b
+b
+b
+b
+b
+b
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+i
+"}
+(26,1,1) = {"
+i
+e
+e
+e
+b
+b
+b
+b
+b
+b
+a
+a
+a
+a
+a
+a
+a
+a
+a
+b
+b
+b
+b
+b
+b
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+i
+"}
+(27,1,1) = {"
+i
+i
+e
+e
+e
+b
+b
+b
+b
+b
+b
+b
+b
+b
+e
+b
+b
+b
+b
+b
+b
+b
+b
+b
+e
+e
+e
+i
+e
+e
+e
+e
+e
+e
+e
+e
+i
+"}
+(28,1,1) = {"
+S
+i
+i
+e
+e
+e
+b
+b
+b
+b
+b
+b
+b
+b
+e
+b
+b
+b
+b
+b
+b
+b
+b
+e
+e
+e
+i
+i
+e
+e
+e
+e
+e
+e
+e
+e
+i
+"}
+(29,1,1) = {"
+S
+S
+i
+i
+e
+e
+e
+b
+b
+b
+b
+b
+b
+b
+e
+b
+b
+b
+b
+b
+b
+b
+e
+e
+e
+i
+i
+i
+i
+i
+i
+i
+i
+i
+i
+i
+i
+"}
+(30,1,1) = {"
+S
+S
+S
+i
+i
+e
+e
+e
+b
+b
+b
+b
+b
+e
+e
+e
+b
+b
+b
+b
+b
+e
+e
+e
+i
+i
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+"}
+(31,1,1) = {"
+S
+S
+S
+S
+i
+i
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+i
+i
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+"}
+(32,1,1) = {"
+S
+S
+S
+S
+S
+i
+i
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+i
+i
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+"}
+(33,1,1) = {"
+S
+S
+S
+S
+S
+S
+i
+i
+i
+i
+i
+i
+i
+i
+i
+i
+i
+i
+i
+i
+i
+i
+i
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+S
+"}
diff --git a/_maps/virtual_domains/xeno_nest.dmm b/_maps/virtual_domains/xeno_nest.dmm
new file mode 100644
index 00000000000..fcbd7cc116c
--- /dev/null
+++ b/_maps/virtual_domains/xeno_nest.dmm
@@ -0,0 +1,2071 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"c" = (
+/obj/structure/alien/weeds,
+/obj/structure/alien/resin/wall,
+/obj/structure/alien/resin/wall,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"d" = (
+/obj/structure/alien/resin/wall,
+/turf/closed/indestructible/binary,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"e" = (
+/obj/structure/alien/weeds,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"f" = (
+/obj/structure/alien/weeds,
+/obj/structure/alien/egg/burst,
+/obj/effect/decal/cleanable/blood,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"h" = (
+/obj/structure/alien/weeds,
+/mob/living/simple_animal/hostile/alien/sentinel,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"i" = (
+/obj/structure/alien/weeds,
+/obj/structure/bed/nest,
+/obj/effect/decal/cleanable/blood/gibs,
+/obj/effect/decal/cleanable/blood,
+/obj/item/clothing/under/syndicate,
+/obj/item/clothing/glasses/night,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"j" = (
+/obj/machinery/suit_storage_unit/spaceruin,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"k" = (
+/obj/structure/alien/weeds/node,
+/obj/structure/alien/resin/wall,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"l" = (
+/obj/structure/alien/weeds,
+/obj/structure/alien/resin/wall,
+/turf/closed/indestructible/binary,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"m" = (
+/obj/structure/alien/weeds,
+/obj/structure/bed/nest,
+/obj/structure/alien/resin/wall,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"n" = (
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"o" = (
+/obj/structure/alien/weeds,
+/obj/effect/decal/cleanable/blood/gibs,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"p" = (
+/obj/structure/alien/weeds,
+/mob/living/simple_animal/hostile/alien/drone{
+ plants_off = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"q" = (
+/obj/structure/alien/resin/wall,
+/turf/open/space/basic,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"r" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"s" = (
+/obj/structure/alien/weeds/node,
+/mob/living/simple_animal/hostile/alien/drone{
+ plants_off = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"t" = (
+/obj/structure/alien/weeds,
+/obj/structure/alien/weeds,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"u" = (
+/obj/structure/alien/weeds/node,
+/obj/effect/decal/cleanable/blood,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"v" = (
+/obj/effect/landmark/bitrunning/safehouse_spawn,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"x" = (
+/obj/structure/alien/weeds,
+/obj/structure/bed/nest,
+/obj/effect/landmark/bitrunning/cache_spawn,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"z" = (
+/obj/structure/alien/weeds,
+/obj/structure/alien/resin/wall,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"A" = (
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"B" = (
+/obj/structure/alien/weeds,
+/obj/effect/decal/cleanable/blood,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"C" = (
+/obj/structure/alien/weeds,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"D" = (
+/obj/structure/alien/weeds,
+/obj/structure/alien/weeds,
+/turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"E" = (
+/turf/closed/indestructible/binary,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"F" = (
+/obj/structure/table/greyscale,
+/obj/item/gun/energy/beam_rifle,
+/obj/item/gun/energy/laser{
+ pixel_x = 4;
+ pixel_y = -6
+ },
+/obj/item/gun/energy/laser{
+ pixel_x = -8;
+ pixel_y = 6
+ },
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"G" = (
+/obj/structure/alien/resin/wall,
+/obj/structure/alien/weeds,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"H" = (
+/obj/structure/table/greyscale,
+/obj/machinery/recharger{
+ pixel_x = 8;
+ pixel_y = 4
+ },
+/obj/machinery/recharger{
+ pixel_x = -8;
+ pixel_y = 4
+ },
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"I" = (
+/obj/structure/alien/weeds,
+/obj/structure/bed/nest,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"J" = (
+/obj/structure/alien/weeds,
+/mob/living/simple_animal/hostile/alien/queen/large{
+ desc = "A gigantic alien who is in charge of the hive and all of its loyal servants.";
+ name = "alien queen";
+ pixel_x = -16;
+ plants_off = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"K" = (
+/obj/structure/alien/weeds,
+/obj/effect/landmark/bitrunning/cache_spawn,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"L" = (
+/obj/item/storage/medkit/regular,
+/obj/item/storage/medkit/regular,
+/turf/template_noop,
+/area/virtual_domain/safehouse)
+"M" = (
+/obj/structure/alien/weeds,
+/obj/structure/alien/resin/wall{
+ move_force = 1000;
+ move_resist = 3000;
+ pull_force = 1000
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"N" = (
+/obj/structure/alien/weeds,
+/obj/structure/bed/nest,
+/obj/effect/decal/cleanable/blood/gibs,
+/obj/item/clothing/under/rank/security/officer,
+/obj/item/clothing/suit/armor/vest,
+/obj/item/melee/baton/security/loaded,
+/obj/item/clothing/head/helmet,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"O" = (
+/obj/effect/baseturf_helper/virtual_domain,
+/turf/closed/indestructible/binary,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"P" = (
+/obj/structure/alien/weeds/node,
+/mob/living/simple_animal/hostile/alien,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Q" = (
+/obj/structure/alien/resin/wall,
+/obj/structure/alien/resin/wall,
+/turf/closed/indestructible/binary,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"S" = (
+/obj/structure/alien/weeds,
+/mob/living/simple_animal/hostile/alien,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"T" = (
+/obj/structure/alien/weeds,
+/obj/structure/alien/egg/burst,
+/obj/effect/decal/cleanable/blood/gibs,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"U" = (
+/obj/structure/alien/weeds,
+/obj/structure/bed/nest,
+/obj/effect/decal/cleanable/blood/gibs,
+/obj/item/gun/ballistic/automatic/pistol,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"V" = (
+/obj/structure/alien/weeds/node,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"W" = (
+/obj/structure/alien/weeds,
+/obj/structure/alien/egg/burst,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Y" = (
+/obj/structure/alien/weeds,
+/obj/effect/decal/cleanable/blood,
+/mob/living/simple_animal/hostile/alien/drone{
+ plants_off = 1
+ },
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+"Z" = (
+/obj/structure/alien/weeds,
+/obj/structure/bed/nest,
+/obj/effect/decal/cleanable/blood/gibs,
+/obj/item/tank/internals/oxygen,
+/obj/item/clothing/suit/space/syndicate/orange,
+/obj/item/clothing/mask/gas,
+/obj/item/clothing/head/helmet/space/syndicate/orange,
+/turf/open/misc/asteroid/basalt/lava_land_surface,
+/area/ruin/space/has_grav/powered/virtual_domain)
+
+(1,1,1) = {"
+a
+a
+a
+E
+E
+E
+E
+E
+E
+E
+E
+E
+E
+E
+E
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(2,1,1) = {"
+a
+a
+a
+E
+E
+z
+z
+z
+z
+z
+z
+z
+z
+E
+E
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(3,1,1) = {"
+a
+a
+a
+E
+E
+z
+e
+W
+W
+z
+e
+e
+z
+M
+E
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(4,1,1) = {"
+a
+a
+a
+E
+z
+z
+e
+e
+e
+e
+p
+e
+W
+z
+E
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(5,1,1) = {"
+a
+a
+a
+E
+z
+e
+e
+k
+z
+z
+z
+k
+z
+z
+E
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(6,1,1) = {"
+a
+a
+a
+E
+z
+e
+e
+m
+K
+J
+o
+i
+z
+z
+E
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(7,1,1) = {"
+a
+a
+a
+E
+z
+W
+h
+e
+e
+e
+B
+o
+e
+z
+E
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(8,1,1) = {"
+a
+a
+a
+E
+z
+I
+o
+z
+e
+V
+e
+h
+W
+z
+E
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(9,1,1) = {"
+a
+a
+a
+E
+z
+U
+u
+e
+z
+e
+e
+W
+z
+z
+E
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(10,1,1) = {"
+a
+a
+a
+E
+z
+e
+o
+z
+e
+e
+e
+k
+W
+z
+E
+a
+a
+a
+a
+a
+a
+a
+E
+E
+E
+E
+E
+E
+E
+E
+E
+E
+a
+a
+a
+a
+a
+a
+a
+"}
+(11,1,1) = {"
+a
+a
+a
+E
+z
+z
+e
+h
+e
+e
+h
+e
+e
+z
+E
+a
+a
+a
+a
+a
+a
+a
+E
+E
+E
+E
+z
+z
+z
+z
+E
+E
+a
+a
+a
+a
+a
+a
+a
+"}
+(12,1,1) = {"
+a
+a
+a
+E
+E
+z
+W
+e
+e
+e
+e
+e
+e
+z
+E
+a
+a
+a
+a
+a
+a
+a
+E
+E
+E
+z
+z
+Z
+I
+z
+z
+E
+a
+a
+a
+a
+a
+a
+a
+"}
+(13,1,1) = {"
+a
+a
+a
+E
+E
+z
+z
+e
+e
+V
+e
+e
+z
+z
+E
+a
+a
+a
+a
+a
+a
+a
+E
+E
+z
+z
+W
+o
+Y
+e
+z
+E
+a
+a
+a
+a
+a
+a
+a
+"}
+(14,1,1) = {"
+a
+a
+a
+E
+E
+E
+z
+z
+e
+e
+e
+z
+z
+E
+E
+a
+a
+a
+a
+E
+E
+E
+E
+E
+z
+I
+e
+V
+e
+W
+z
+E
+a
+a
+a
+a
+a
+a
+a
+"}
+(15,1,1) = {"
+a
+a
+a
+a
+a
+E
+E
+z
+z
+z
+z
+z
+E
+E
+E
+E
+E
+E
+E
+E
+E
+E
+z
+z
+z
+e
+e
+e
+I
+z
+z
+E
+a
+a
+a
+a
+a
+a
+a
+"}
+(16,1,1) = {"
+a
+a
+a
+a
+a
+a
+E
+z
+V
+V
+z
+E
+E
+E
+E
+E
+E
+E
+E
+E
+E
+z
+z
+e
+S
+e
+W
+z
+z
+z
+E
+E
+a
+a
+a
+a
+a
+a
+a
+"}
+(17,1,1) = {"
+a
+a
+a
+a
+a
+a
+E
+z
+p
+e
+z
+z
+E
+z
+z
+z
+z
+z
+z
+z
+z
+z
+e
+e
+z
+z
+z
+z
+E
+E
+E
+E
+a
+a
+a
+a
+a
+a
+a
+"}
+(18,1,1) = {"
+a
+a
+a
+a
+a
+a
+E
+z
+e
+e
+p
+z
+z
+z
+e
+e
+e
+e
+e
+e
+z
+z
+e
+z
+z
+E
+E
+E
+E
+E
+E
+E
+E
+E
+E
+E
+E
+E
+O
+"}
+(19,1,1) = {"
+E
+E
+E
+E
+E
+E
+E
+z
+z
+e
+e
+e
+z
+e
+e
+e
+e
+e
+e
+V
+e
+e
+e
+z
+E
+E
+E
+E
+E
+E
+Q
+d
+q
+q
+q
+q
+q
+q
+E
+"}
+(20,1,1) = {"
+E
+z
+z
+z
+z
+E
+E
+E
+z
+z
+e
+V
+e
+e
+e
+z
+z
+z
+z
+e
+e
+t
+z
+z
+E
+E
+a
+a
+a
+E
+q
+A
+A
+A
+A
+A
+A
+A
+E
+"}
+(21,1,1) = {"
+E
+z
+W
+I
+z
+z
+z
+z
+z
+z
+e
+e
+e
+e
+z
+z
+E
+E
+z
+z
+e
+e
+z
+E
+E
+E
+a
+a
+a
+E
+q
+A
+A
+A
+A
+A
+A
+A
+E
+"}
+(22,1,1) = {"
+E
+G
+t
+S
+e
+z
+z
+e
+e
+e
+e
+e
+e
+z
+z
+E
+E
+E
+z
+e
+e
+e
+z
+E
+E
+E
+a
+a
+a
+E
+q
+A
+C
+A
+A
+A
+A
+A
+E
+"}
+(23,1,1) = {"
+E
+G
+K
+W
+V
+e
+e
+e
+z
+z
+e
+z
+z
+z
+E
+E
+E
+E
+z
+e
+e
+z
+z
+E
+E
+a
+a
+a
+a
+E
+q
+C
+C
+C
+A
+A
+A
+A
+E
+"}
+(24,1,1) = {"
+E
+z
+z
+I
+I
+z
+z
+z
+z
+z
+e
+z
+E
+E
+E
+E
+E
+E
+z
+e
+e
+z
+E
+E
+E
+E
+E
+E
+E
+E
+d
+C
+C
+A
+A
+C
+A
+A
+E
+"}
+(25,1,1) = {"
+E
+E
+z
+z
+z
+z
+E
+E
+E
+z
+p
+z
+z
+E
+E
+E
+E
+E
+z
+e
+s
+z
+z
+z
+E
+E
+E
+E
+E
+E
+z
+C
+C
+C
+A
+C
+C
+A
+E
+"}
+(26,1,1) = {"
+a
+E
+E
+E
+E
+E
+E
+E
+E
+z
+e
+e
+z
+E
+E
+E
+E
+E
+z
+e
+e
+e
+e
+z
+z
+z
+E
+E
+E
+z
+z
+n
+n
+n
+n
+n
+v
+A
+E
+"}
+(27,1,1) = {"
+a
+a
+a
+a
+a
+E
+E
+z
+z
+z
+e
+e
+z
+z
+E
+E
+E
+E
+z
+z
+e
+e
+e
+e
+e
+z
+z
+z
+z
+k
+e
+n
+j
+j
+j
+n
+n
+A
+E
+"}
+(28,1,1) = {"
+a
+a
+a
+a
+a
+E
+z
+z
+T
+e
+e
+V
+W
+z
+E
+E
+E
+z
+z
+e
+e
+z
+z
+e
+e
+e
+z
+V
+e
+e
+e
+n
+n
+n
+n
+n
+n
+A
+E
+"}
+(29,1,1) = {"
+a
+a
+a
+a
+a
+E
+z
+N
+f
+S
+e
+W
+I
+z
+E
+E
+E
+z
+e
+e
+z
+z
+z
+z
+e
+V
+z
+V
+t
+e
+e
+n
+n
+F
+H
+n
+n
+A
+E
+"}
+(30,1,1) = {"
+a
+a
+a
+a
+a
+E
+z
+x
+o
+e
+I
+I
+z
+z
+E
+E
+E
+z
+e
+z
+z
+E
+E
+z
+z
+z
+z
+z
+k
+e
+e
+n
+n
+n
+n
+n
+n
+A
+E
+"}
+(31,1,1) = {"
+a
+a
+a
+a
+a
+E
+z
+z
+z
+e
+z
+z
+z
+E
+E
+E
+E
+z
+e
+z
+z
+E
+E
+E
+E
+E
+E
+E
+z
+e
+e
+n
+L
+n
+n
+n
+n
+A
+E
+"}
+(32,1,1) = {"
+a
+a
+a
+a
+a
+E
+E
+E
+z
+e
+z
+E
+E
+E
+E
+E
+E
+z
+e
+e
+z
+E
+a
+a
+a
+a
+E
+E
+z
+e
+e
+n
+n
+n
+n
+n
+r
+A
+E
+"}
+(33,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+E
+z
+e
+z
+E
+E
+a
+a
+a
+E
+l
+z
+V
+z
+E
+a
+a
+a
+a
+E
+z
+z
+z
+q
+C
+A
+A
+C
+A
+A
+A
+E
+"}
+(34,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+E
+z
+V
+z
+E
+E
+a
+a
+a
+E
+E
+z
+e
+z
+E
+a
+a
+a
+a
+E
+z
+E
+d
+q
+C
+C
+C
+A
+A
+A
+A
+E
+"}
+(35,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+E
+z
+e
+z
+E
+E
+a
+a
+a
+E
+E
+z
+e
+z
+E
+a
+a
+a
+a
+E
+E
+E
+d
+q
+A
+A
+A
+A
+A
+A
+A
+E
+"}
+(36,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+E
+z
+e
+z
+E
+E
+E
+E
+E
+E
+z
+z
+e
+z
+E
+a
+a
+a
+a
+a
+a
+E
+d
+q
+A
+C
+D
+A
+A
+A
+A
+E
+"}
+(37,1,1) = {"
+a
+a
+a
+a
+E
+E
+E
+E
+z
+e
+z
+E
+E
+E
+E
+E
+z
+z
+e
+e
+z
+E
+a
+a
+a
+a
+a
+a
+E
+d
+q
+A
+A
+A
+A
+A
+A
+A
+E
+"}
+(38,1,1) = {"
+a
+a
+a
+a
+E
+E
+E
+z
+z
+e
+z
+z
+z
+z
+z
+z
+z
+e
+e
+z
+z
+E
+a
+a
+a
+a
+a
+a
+E
+d
+q
+A
+A
+A
+A
+A
+A
+A
+E
+"}
+(39,1,1) = {"
+a
+a
+a
+a
+E
+E
+z
+z
+e
+e
+W
+z
+z
+e
+e
+P
+e
+e
+z
+z
+E
+E
+a
+a
+a
+a
+a
+a
+E
+Q
+q
+q
+q
+q
+q
+q
+q
+q
+E
+"}
+(40,1,1) = {"
+a
+a
+a
+a
+E
+E
+z
+I
+p
+e
+e
+e
+e
+e
+z
+z
+z
+z
+z
+E
+E
+a
+a
+a
+a
+a
+a
+a
+E
+E
+E
+E
+E
+E
+E
+E
+E
+E
+E
+"}
+(41,1,1) = {"
+a
+a
+a
+a
+E
+z
+z
+W
+e
+V
+e
+W
+z
+z
+z
+E
+E
+E
+E
+E
+E
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(42,1,1) = {"
+a
+a
+a
+a
+E
+z
+W
+K
+e
+I
+I
+z
+z
+E
+E
+E
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(43,1,1) = {"
+a
+a
+a
+a
+E
+c
+z
+z
+z
+z
+z
+z
+E
+E
+E
+E
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(44,1,1) = {"
+a
+a
+a
+a
+E
+E
+E
+E
+E
+E
+E
+E
+E
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
diff --git a/code/__DEFINES/bitrunning.dm b/code/__DEFINES/bitrunning.dm
new file mode 100644
index 00000000000..343801c477e
--- /dev/null
+++ b/code/__DEFINES/bitrunning.dm
@@ -0,0 +1,20 @@
+#define BITRUNNER_COST_NONE 0
+#define BITRUNNER_COST_LOW 1
+#define BITRUNNER_COST_MEDIUM 2
+#define BITRUNNER_COST_HIGH 3
+#define BITRUNNER_COST_EXTREME 20
+
+#define BITRUNNER_REWARD_MIN 1
+#define BITRUNNER_REWARD_LOW 3
+#define BITRUNNER_REWARD_MEDIUM 4
+#define BITRUNNER_REWARD_HIGH 5
+#define BITRUNNER_REWARD_EXTREME 6
+
+/// Blue in ui
+#define BITRUNNER_DIFFICULTY_NONE 0
+/// Yellow
+#define BITRUNNER_DIFFICULTY_LOW 1
+/// Orange
+#define BITRUNNER_DIFFICULTY_MEDIUM 2
+/// Red with skull
+#define BITRUNNER_DIFFICULTY_HIGH 3
diff --git a/code/__DEFINES/dcs/signals/signals_bitrunning.dm b/code/__DEFINES/dcs/signals/signals_bitrunning.dm
new file mode 100644
index 00000000000..3d008449ee7
--- /dev/null
+++ b/code/__DEFINES/dcs/signals/signals_bitrunning.dm
@@ -0,0 +1,31 @@
+/// from /obj/machinery/netpod/default_pry_open() : (mob/living/intruder)
+#define COMSIG_BITRUNNER_CROWBAR_ALERT "bitrunner_crowbar"
+
+/// from /obj/effect/bitrunning/loot_signal: (points)
+#define COMSIG_BITRUNNER_GOAL_POINT "bitrunner_goal_point"
+
+/// from /obj/machinery/quantum_server/on_goal_turf_entered(): (atom/entered, reward_points)
+#define COMSIG_BITRUNNER_DOMAIN_COMPLETE "bitrunner_complete"
+
+/// from /obj/machinery/netpod/on_take_damage()
+#define COMSIG_BITRUNNER_NETPOD_INTEGRITY "bitrunner_netpod_damage"
+
+/// from /obj/structure/hololadder and complete alert
+#define COMSIG_BITRUNNER_SAFE_DISCONNECT "bitrunner_disconnect"
+
+/// from /obj/machinery/netpod/open_machine(), /obj/machinery/quantum_server, etc (obj/machinery/netpod)
+#define COMSIG_BITRUNNER_SEVER_AVATAR "bitrunner_sever"
+
+/// from /obj/machinery/quantum_server/shutdown() : (mob/living)
+#define COMSIG_BITRUNNER_SHUTDOWN_ALERT "bitrunner_shutdown"
+
+// Notifies the bitrunners
+/// from /datum/antagonist/cyber_police/proc/notify() :
+#define COMSIG_BITRUNNER_THREAT_CREATED "bitrunner_threat"
+
+// Informs the server to up the threat count
+/// from event spawns: (mob/living)
+#define COMSIG_BITRUNNER_SPAWN_GLITCH "bitrunner_spawn_glitch"
+
+/// from /obj/machinery/quantum_server/refreshParts(): (servo rating)
+#define COMSIG_BITRUNNER_SERVER_UPGRADED "bitrunner_server_upgraded"
diff --git a/code/__DEFINES/dcs/signals/signals_blob.dm b/code/__DEFINES/dcs/signals/signals_blob.dm
new file mode 100644
index 00000000000..afd4737bdd9
--- /dev/null
+++ b/code/__DEFINES/dcs/signals/signals_blob.dm
@@ -0,0 +1,4 @@
+/// Signal sent when a blob overmind picked a new strain (/mob/camera/blob/overmind, /datum/blobstrain/new_strain)
+#define COMSIG_BLOB_SELECTED_STRAIN "blob_selected_strain"
+/// Signal sent by a blob spore when it creates a zombie (/mob/living/basic/blob_minion/spore/spore, //mob/living/basic/blob_minion/zombie/zombie)
+#define COMSIG_BLOB_ZOMBIFIED "blob_zombified"
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_lazy_templates.dm b/code/__DEFINES/dcs/signals/signals_lazy_templates.dm
new file mode 100644
index 00000000000..1c6ce7926ea
--- /dev/null
+++ b/code/__DEFINES/dcs/signals/signals_lazy_templates.dm
@@ -0,0 +1,2 @@
+/// Fired on the lazy template datum when the template is finished loading. (list/loaded_atom_movables, list/loaded_turfs, list/loaded_areas)
+#define COMSIG_LAZY_TEMPLATE_LOADED "lazy_template_loaded"
diff --git a/code/__DEFINES/dcs/signals/signals_saboteur.dm b/code/__DEFINES/dcs/signals/signals_saboteur.dm
new file mode 100644
index 00000000000..5b0fef52aee
--- /dev/null
+++ b/code/__DEFINES/dcs/signals/signals_saboteur.dm
@@ -0,0 +1,5 @@
+// Light disruptor. Not to be confused with the light eater, which permanently disables lights.
+
+/// from /obj/projectile/energy/fisher/on_hit() or /obj/item/gun/energy/recharge/fisher when striking a target
+#define COMSIG_HIT_BY_SABOTEUR "HIT_BY_SABOTEUR"
+ #define COMSIG_SABOTEUR_SUCCESS (1<<0)
diff --git a/code/__DEFINES/fish.dm b/code/__DEFINES/fish.dm
new file mode 100644
index 00000000000..89b7963d91d
--- /dev/null
+++ b/code/__DEFINES/fish.dm
@@ -0,0 +1,136 @@
+/// Use in fish tables to denote miss chance.
+#define FISHING_DUD "dud"
+
+// Baseline fishing difficulty levels
+#define FISHING_DEFAULT_DIFFICULTY 15
+
+/// Difficulty modifier when bait is fish's favorite
+#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
+
+// These define how the fish will behave in the minigame
+#define FISH_AI_DUMB "dumb"
+#define FISH_AI_ZIPPY "zippy"
+#define FISH_AI_SLOW "slow"
+
+#define ADDITIVE_FISHING_MOD "additive"
+#define MULTIPLICATIVE_FISHING_MOD "multiplicative"
+
+// These defines are intended for use to interact with fishing hooks when going
+// through the fishing rod, and not the hook itself. They could probably be
+// handled differently, but for now that's how they work. It's grounds for
+// a future refactor, however.
+/// Fishing hook trait that signifies that it's shiny. Useful for fishes
+/// that care about shiner hooks more.
+#define FISHING_HOOK_SHINY (1 << 0)
+/// Fishing hook trait that lessens the bounce from hitting the edges of the minigame bar.
+#define FISHING_HOOK_WEIGHTED (1 << 1)
+///See FISHING_MINIGAME_RULE_BIDIRECTIONAL
+#define FISHING_HOOK_BIDIRECTIONAL (1 << 2)
+///Prevents the user from losing the game by letting the fish get away.
+#define FISHING_HOOK_NO_ESCAPE (1 << 3)
+///Limits the completion loss of the minigame when the fsh is not on the bait area.
+#define FISHING_HOOK_ENSNARE (1 << 4)
+///Automatically kills the fish after a while, at the cost of killing it.
+#define FISHING_HOOK_KILL (1 << 5)
+
+///Reduces the difficulty of the minigame
+#define FISHING_LINE_CLOAKED (1 << 0)
+///Required to cast a line on lava.
+#define FISHING_LINE_REINFORCED (1 << 1)
+/// Much like FISHING_HOOK_ENSNARE but for the fishing line.
+#define FISHING_LINE_BOUNCY (1 << 2)
+
+///Keeps the bait from falling from gravity, instead allowing the player to move the bait down with right click.
+#define FISHING_MINIGAME_RULE_BIDIRECTIONAL (1 << 2)
+///Prevents the player from losing the minigame when the completion reaches 0
+#define FISHING_MINIGAME_RULE_NO_ESCAPE (1 << 3)
+///Automatically kills the fish after a while, at the cost of killing it
+#define FISHING_MINIGAME_RULE_KILL (1 << 4)
+///Prevents the fishing skill from having an effect on the minigame and experience from being awarded
+#define FISHING_MINIGAME_RULE_NO_EXP (1 << 5)
+///If enabled, the minigame will occasionally screw around and invert the velocity of the bait
+#define FISHING_MINIGAME_RULE_ANTIGRAV (1 << 6)
+///Will filp the minigame hud for the duration of the effect
+#define FISHING_MINIGAME_RULE_FLIP (1 << 7)
+
+///all the effects that are active and will last for a few seconds before triggering a cooldown
+#define FISHING_MINIGAME_ACTIVE_EFFECTS (FISHING_MINIGAME_RULE_ANTIGRAV|FISHING_MINIGAME_RULE_FLIP)
+
+/// The default additive value for fishing hook catch weight modifiers.
+#define FISHING_DEFAULT_HOOK_BONUS_ADDITIVE 0
+/// The default multiplicative value for fishing hook catch weight modifiers.
+#define FISHING_DEFAULT_HOOK_BONUS_MULTIPLICATIVE 1
+
+//Fish icon defines, used by fishing minigame
+#define FISH_ICON_DEF "fish"
+#define FISH_ICON_HOSTILE "hostile"
+#define FISH_ICON_STAR "star"
+#define FISH_ICON_CHUNKY "chunky"
+#define FISH_ICON_SLIME "slime"
+#define FISH_ICON_COIN "coin"
+#define FISH_ICON_GEM "gem"
+#define FISH_ICON_CRAB "crab"
+#define FISH_ICON_JELLYFISH "jellyfish"
+#define FISH_ICON_BONE "bone"
+
+#define AQUARIUM_ANIMATION_FISH_SWIM "fish"
+#define AQUARIUM_ANIMATION_FISH_DEAD "dead"
+
+#define AQUARIUM_PROPERTIES_PX_MIN "px_min"
+#define AQUARIUM_PROPERTIES_PX_MAX "px_max"
+#define AQUARIUM_PROPERTIES_PY_MIN "py_min"
+#define AQUARIUM_PROPERTIES_PY_MAX "py_max"
+
+#define AQUARIUM_LAYER_MODE_BOTTOM "bottom"
+#define AQUARIUM_LAYER_MODE_TOP "top"
+#define AQUARIUM_LAYER_MODE_AUTO "auto"
+
+#define FISH_ALIVE "alive"
+#define FISH_DEAD "dead"
+
+///Fish size thresholds for w_class.
+#define FISH_SIZE_TINY_MAX 30
+#define FISH_SIZE_SMALL_MAX 50
+#define FISH_SIZE_NORMAL_MAX 90
+#define FISH_SIZE_BULKY_MAX 130
+
+///The coefficient for maximum weight/size divergence relative to the averages.
+#define MAX_FISH_DEVIATION_COEFF 2.5
+
+///The volume of the grind results is multiplied by the fish' weight and divided by this.
+#define FISH_GRIND_RESULTS_WEIGHT_DIVISOR 500
+///The number of fillets is multiplied by the fish' size and divided by this.
+#define FISH_FILLET_NUMBER_SIZE_DIVISOR 30
+
+///The breeding timeout for newly instantiated fish is multiplied by this.
+#define NEW_FISH_BREEDING_TIMEOUT_MULT 2
+///The last feeding timestamp of newly instantiated fish is multiplied by this: ergo, they spawn 50% hungry.
+#define NEW_FISH_LAST_FEEDING_MULT 0.5
+
+#define MIN_AQUARIUM_TEMP T0C
+#define MAX_AQUARIUM_TEMP (T0C + 100)
+#define DEFAULT_AQUARIUM_TEMP (T0C + 24)
+
+///How likely one's to find a given fish from random fish cases.
+#define FISH_RARITY_BASIC 1000
+#define FISH_RARITY_RARE 400
+#define FISH_RARITY_VERY_RARE 200
+#define FISH_RARITY_GOOD_LUCK_FINDING_THIS 5
+#define FISH_RARITY_NOPE 0
+
+///Aquarium fluid variables. The fish' required fluid has to match this, or it'll slowly die.
+#define AQUARIUM_FLUID_FRESHWATER "Freshwater"
+#define AQUARIUM_FLUID_SALTWATER "Saltwater"
+#define AQUARIUM_FLUID_SULPHWATEVER "Sulfuric Water"
+#define AQUARIUM_FLUID_AIR "Air"
+#define AQUARIUM_FLUID_ANADROMOUS "Adaptive to both Freshwater and Saltwater"
+#define AQUARIUM_FLUID_ANY_WATER "Adaptive to all kind of water"
+
+///Fluff. The name of the aquarium company shown in the fish catalog
+#define AQUARIUM_COMPANY "Aquatech Ltd."
diff --git a/code/__DEFINES/holiday.dm b/code/__DEFINES/holiday.dm
new file mode 100644
index 00000000000..1c35940e718
--- /dev/null
+++ b/code/__DEFINES/holiday.dm
@@ -0,0 +1 @@
+#define HOLIDAY_HAT_CHANCE 20
diff --git a/code/__DEFINES/mood.dm b/code/__DEFINES/mood.dm
new file mode 100644
index 00000000000..161f253b04c
--- /dev/null
+++ b/code/__DEFINES/mood.dm
@@ -0,0 +1 @@
+#define MOOD_CATEGORY_LEGION_CORE "regenerative core"
diff --git a/code/__DEFINES/radioactive_nebula.dm b/code/__DEFINES/radioactive_nebula.dm
new file mode 100644
index 00000000000..68849ca1bc2
--- /dev/null
+++ b/code/__DEFINES/radioactive_nebula.dm
@@ -0,0 +1,2 @@
+/// Name of the glow we use for the radioation effect outside
+#define GLOW_NEBULA "glow_nebula"
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/~ff_defines/signals.dm b/code/__DEFINES/~ff_defines/signals.dm
new file mode 100644
index 00000000000..f62d312701d
--- /dev/null
+++ b/code/__DEFINES/~ff_defines/signals.dm
@@ -0,0 +1,4 @@
+/// Из /obj/item/clothing/head/mob_holde/human/proc/Deposit() : (mob/living/carbon/human, obj/item/storage/backpack)
+#define COMSIG_HUMAN_ENTER_STORAGE "human_enter_storage"
+/// Из /obj/item/clothing/head/mob_holde/human/proc/Release() : (mob/living/carbon/human, obj/item/storage/backpack)
+#define COMSIG_HUMAN_EXIT_STORAGE "human_exit_storage"
diff --git a/code/__DEFINES/~ff_defines/traits.dm b/code/__DEFINES/~ff_defines/traits.dm
new file mode 100644
index 00000000000..f99cec031ef
--- /dev/null
+++ b/code/__DEFINES/~ff_defines/traits.dm
@@ -0,0 +1,10 @@
+// Могут ли моба взять в руки с помощью двойного граба.
+#define TRAIT_CAN_BUCKLED_TO_HAND "can_buckled_to_hand"
+// Обладает ли бом слабым телом. Квирк присутствует у таких специй как тешари. Блокирует возможность брать мобов на плечо, или спину. А так же бросать тела.
+#define TRAIT_WEAK_BODY "weak_body"
+//Защита от опрокидываний.
+#define TRAIT_KNOCKDOWN_IMMUNE "knock_immune"
+//Позволяет забираться в сумки и будет положенным в них.
+#define TRAIT_CAN_ENTER_BAG "can_enter_bag"
+// Идеальный слух. Позволяет слышать шепот в приделах экрана и речь на любом расстоянии.
+#define TRAIT_PERFECT_HEARING "perfect_hearing"
diff --git a/code/__DEFINES/~skyrat_defines/wounds.dm b/code/__DEFINES/~skyrat_defines/wounds.dm
new file mode 100644
index 00000000000..f6a9275db8e
--- /dev/null
+++ b/code/__DEFINES/~skyrat_defines/wounds.dm
@@ -0,0 +1,2 @@
+/// If this wound, when bandaged, will cause a splint overlay to generate rather than a bandage overlay.
+#define SPLINT_OVERLAY (1<<200) // we use a big number since tg realistically wouldnt go to it
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/_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/controllers/subsystem/processing/fishing.dm b/code/controllers/subsystem/processing/fishing.dm
new file mode 100644
index 00000000000..da10d3d631a
--- /dev/null
+++ b/code/controllers/subsystem/processing/fishing.dm
@@ -0,0 +1,7 @@
+/**
+ * So far, only used by the fishing minigame. Feel free to rename it to something like veryfastprocess
+ * if you need one that fires 10 times a second
+ */
+PROCESSING_SUBSYSTEM_DEF(fishing)
+ name = "Fishing"
+ wait = 0.1 SECONDS
diff --git a/code/controllers/subsystem/radioactive_nebula.dm b/code/controllers/subsystem/radioactive_nebula.dm
new file mode 100644
index 00000000000..3b11a7870af
--- /dev/null
+++ b/code/controllers/subsystem/radioactive_nebula.dm
@@ -0,0 +1,64 @@
+/// Trait for tracking if something already has the fake irradiation effect, so we don't waste time on effect operations if otherwise unnecessary
+#define TRAIT_RADIOACTIVE_NEBULA_FAKE_IRRADIATED "radioactive_nebula_fake_irradiated"
+
+/// Controls making objects irradiated when Radioactive Nebula is in effect.
+SUBSYSTEM_DEF(radioactive_nebula)
+ name = "Radioactive Nebula"
+ flags = SS_BACKGROUND
+ wait = 30 SECONDS
+
+ VAR_PRIVATE
+ datum/station_trait/nebula/hostile/radiation/radioactive_nebula
+
+/datum/controller/subsystem/radioactive_nebula/Initialize()
+ radioactive_nebula = locate() in SSstation.station_traits
+ if (!radioactive_nebula)
+ can_fire = FALSE
+ return SS_INIT_NO_NEED
+
+ // We don't *really* care that this happens by the time the server is ready to play.
+ ASYNC
+ irradiate_everything()
+
+ // Don't leak that the station trait has been picked
+ return SS_INIT_NO_MESSAGE
+
+/// Makes something appear irradiated for the purposes of the Radioactive Nebula
+/datum/controller/subsystem/radioactive_nebula/proc/fake_irradiate(atom/movable/target)
+ if (HAS_TRAIT(target, TRAIT_RADIOACTIVE_NEBULA_FAKE_IRRADIATED))
+ return
+
+ ADD_TRAIT(target, TRAIT_RADIOACTIVE_NEBULA_FAKE_IRRADIATED, REF(src))
+
+ if(iscarbon(target))//Don't actually make EVERY. SINGLE. THING. RADIOACTIVE. Just irradiate people
+ target.AddComponent( \
+ /datum/component/radioactive_exposure, \
+ minimum_exposure_time = NEBULA_RADIATION_MINIMUM_EXPOSURE_TIME, \
+ irradiation_chance_base = RADIATION_EXPOSURE_NEBULA_BASE_CHANCE, \
+ irradiation_chance_increment = RADIATION_EXPOSURE_NEBULA_CHANCE_INCREMENT, \
+ irradiation_interval = RADIATION_EXPOSURE_NEBULA_CHECK_INTERVAL, \
+ source = src, \
+ radioactive_areas = radioactive_nebula.radioactive_areas, \
+ )
+ else if(isobj(target)) //and fake the rest
+ //outline clashes too much with other outlines and creates pretty ugly lines
+ target.add_filter(GLOW_NEBULA, 2, list("type" = "drop_shadow", "color" = radioactive_nebula.nebula_radglow, "size" = 2))
+
+/datum/controller/subsystem/radioactive_nebula/fire()
+ irradiate_everything()
+
+/// Loop through radioactive space (with lag checks) and make it all radioactive!
+/datum/controller/subsystem/radioactive_nebula/proc/irradiate_everything()
+ for (var/area/area as anything in get_areas(radioactive_nebula.radioactive_areas))
+ for (var/turf/turf as anything in area.get_contained_turfs())
+ for (var/atom/movable/target as anything in turf)
+ fake_irradiate(target)
+
+ CHECK_TICK
+
+/// Remove the fake radiation. The compontent we add to mobs handles its own removal
+/datum/controller/subsystem/radioactive_nebula/proc/fake_unirradiate(atom/movable/leaver)
+ REMOVE_TRAIT(leaver, TRAIT_RADIOACTIVE_NEBULA_FAKE_IRRADIATED, REF(src))
+ leaver.remove_filter(GLOW_NEBULA)
+
+#undef TRAIT_RADIOACTIVE_NEBULA_FAKE_IRRADIATED
diff --git a/code/controllers/subsystem/stock_market.dm b/code/controllers/subsystem/stock_market.dm
new file mode 100644
index 00000000000..7c2cb71dc49
--- /dev/null
+++ b/code/controllers/subsystem/stock_market.dm
@@ -0,0 +1,154 @@
+
+SUBSYSTEM_DEF(stock_market)
+ name = "Stock Market"
+ wait = 20 SECONDS
+ init_order = INIT_ORDER_DEFAULT
+ runlevels = RUNLEVEL_GAME
+
+ /// Associated list of materials and their prices at the given time.
+ var/list/materials_prices = list()
+ /// Associated list of materials alongside their market trends. 1 is up, 0 is stable, -1 is down.
+ var/list/materials_trends = list()
+ /// Associated list of materials alongside the life of it's current trend. After it's life is up, it will change to a new trend.
+ var/list/materials_trend_life = list()
+ /// Associated list of materials alongside their available quantity. This is used to determine how much of a material is available to buy, and how much buying and selling affects the price.
+ var/list/materials_quantity = list()
+ /// HTML string that is used to display the market events to the player.
+ var/news_string = ""
+
+/datum/controller/subsystem/stock_market/Initialize()
+ for(var/datum/material/possible_market as anything in subtypesof(/datum/material)) // I need to make this work like this, but lets hardcode it for now
+ if(initial(possible_market.tradable))
+ materials_prices += possible_market
+ materials_prices[possible_market] = initial(possible_market.value_per_unit) * SHEET_MATERIAL_AMOUNT
+
+ materials_trends += possible_market
+ materials_trends[possible_market] = rand(MARKET_TREND_DOWNWARD,MARKET_TREND_UPWARD) //aka -1 to 1
+
+ materials_trend_life += possible_market
+ materials_trend_life[possible_market] = rand(1,10)
+
+ materials_quantity += possible_market
+ materials_quantity[possible_market] = initial(possible_market.tradable_base_quantity) + (rand(-initial(possible_market.tradable_base_quantity) * 0.5, initial(possible_market.tradable_base_quantity) * 0.5))
+ return SS_INIT_SUCCESS
+/datum/controller/subsystem/stock_market/fire(resumed)
+ for(var/datum/material/market as anything in materials_prices)
+ handle_trends_and_price(market)
+
+/**
+ * Handles shifts in the cost of materials, and in what direction the material is most likely to move.
+ */
+/datum/controller/subsystem/stock_market/proc/handle_trends_and_price(datum/material/mat)
+ if(prob(MARKET_EVENT_PROBABILITY))
+ handle_market_event(mat)
+ return
+ var/trend = materials_trends[mat]
+ var/trend_life = materials_trend_life[mat]
+
+ var/price_units = materials_prices[mat]
+ var/price_minimum = round(initial(mat.value_per_unit) * SHEET_MATERIAL_AMOUNT * 0.5)
+ if(!isnull(initial(mat.minimum_value_override)))
+ price_minimum = round(initial(mat.minimum_value_override) * SHEET_MATERIAL_AMOUNT)
+ var/price_maximum = round(initial(mat.value_per_unit) * SHEET_MATERIAL_AMOUNT * 3)
+ var/price_baseline = initial(mat.value_per_unit) * SHEET_MATERIAL_AMOUNT
+
+ var/stock_quantity = materials_quantity[mat]
+
+ if(HAS_TRAIT(SSeconomy, TRAIT_MARKET_CRASHING)) //We hardset to the worst possible price and lowest possible impact if sold
+ materials_prices[mat] = price_minimum
+ materials_quantity[mat] = stock_quantity * 2
+ materials_trends[mat] = MARKET_TREND_DOWNWARD
+ trend_life = materials_trend_life[mat] = 1
+ return
+
+ if(trend_life == 0)
+ ///We want to scale our trend so that if we're closer to our minimum or maximum price, we're more likely to trend the other way.
+ if((price_units < price_baseline))
+ var/chance_swap = 100 - ((clamp((price_units - price_minimum), 1, 1000) / (price_baseline - price_minimum))*100)
+ if(prob(chance_swap))
+ materials_trends[mat] = MARKET_TREND_UPWARD
+ else
+ materials_trends[mat] = MARKET_TREND_STABLE
+ else if((price_units > price_baseline))
+ var/chance_swap = 100 - ((clamp((price_units - price_maximum), 1, 1000) / (price_maximum - price_baseline))*100)
+ if(prob(chance_swap))
+ materials_trends[mat] = MARKET_TREND_DOWNWARD
+ else
+ materials_trends[mat] = MARKET_TREND_STABLE
+ materials_trend_life[mat] = rand(3,10) // Change our trend life for x number of cycles
+ else
+ materials_trend_life[mat] -= 1
+
+ var/price_change = 0
+ var/quantity_change = 0
+ switch(trend)
+ if(MARKET_TREND_UPWARD)
+ price_change = ROUND_UP(gaussian(price_units * 0.1, price_baseline * 0.05)) //If we don't ceil, small numbers will get trapped at low values
+ quantity_change = -round(gaussian(stock_quantity * 0.1, stock_quantity * 0.05))
+ if(MARKET_TREND_STABLE)
+ price_change = round(gaussian(0, price_baseline * 0.01))
+ quantity_change = round(gaussian(0, stock_quantity * 0.01))
+ if(MARKET_TREND_DOWNWARD)
+ price_change = -ROUND_UP(gaussian(price_units * 0.1, price_baseline * 0.05))
+ quantity_change = round(gaussian(stock_quantity * 0.1, stock_quantity * 0.05))
+ materials_prices[mat] = round(clamp(price_units + price_change, price_minimum, price_maximum))
+ materials_quantity[mat] = round(clamp(stock_quantity + quantity_change, 0, initial(mat.tradable_base_quantity) * 2))
+
+/**
+ * Market events are a way to spice up the market and make it more interesting.
+ * Randomly one will occur to a random material, and it will change the price of that material more drastically, or reset it to a stable price.
+ * Events are also broadcast to the newscaster as a fun little fluff piece. Good way to tell some lore as well, or just make a joke.
+ */
+/datum/controller/subsystem/stock_market/proc/handle_market_event(datum/material/mat)
+
+ var/company_name = list( // Pick a random company name from the list, I let copilot make a few up for me which is why some suck
+ "Nakamura Engineering",
+ "Robust Industries, LLC",
+ "MODular Solutions",
+ "SolGov",
+ "Australicus Industrial Mining",
+ "Vey-Medical",
+ "Aussec Armory",
+ "Dreamland Robotics"
+ )
+ var/circumstance
+ var/event = rand(1,3)
+
+ var/price_units = materials_prices[mat]
+ var/price_minimum = round(initial(mat.value_per_unit) * SHEET_MATERIAL_AMOUNT * 0.5)
+ if(!isnull(initial(mat.minimum_value_override)))
+ price_minimum = round(initial(mat.minimum_value_override) * SHEET_MATERIAL_AMOUNT)
+ var/price_maximum = round(initial(mat.value_per_unit) * SHEET_MATERIAL_AMOUNT * 3)
+ var/price_baseline = initial(mat.value_per_unit) * SHEET_MATERIAL_AMOUNT
+
+ switch(event)
+ if(1) //Reset to stable
+ materials_prices[mat] = price_baseline
+ materials_trends[mat] = MARKET_TREND_STABLE
+ materials_trend_life[mat] = 1
+ circumstance = pick(list(
+ "[pick(company_name)] has been bought out by a private investment firm. As a result, [initial(mat.name)] is now stable at [materials_prices[mat]] cr.",
+ "Due to a corporate restructuring, the largest supplier of [initial(mat.name)] has had the price changed to [materials_prices[mat]] cr.",
+ "[initial(mat.name)] is now under a monopoly by [pick(company_name)]. The price has been changed to [materials_prices[mat]] cr accordingly."
+ ))
+ if(2) //Big boost
+ materials_prices[mat] += round(gaussian(price_units * 0.5, price_units * 0.1))
+ materials_prices[mat] = clamp(materials_prices[mat], price_minimum, price_maximum)
+ materials_trends[mat] = MARKET_TREND_UPWARD
+ materials_trend_life[mat] = rand(1,5)
+ circumstance = pick(list(
+ "[pick(company_name)] has just released a new product that uses [initial(mat.name)]! As a result, the price has been raised to [materials_prices[mat]] cr.",
+ "Due to [pick(company_name)] finding a new property of [initial(mat.name)], its price has been raised to [materials_prices[mat]] cr.",
+ "A study has found that [initial(mat.name)] may run out within the next 100 years. The price has raised to [materials_prices[mat]] cr due to panic."
+ ))
+ if(3) //Big drop
+ materials_prices[mat] -= round(gaussian(price_units * 1.5, price_units * 0.1))
+ materials_prices[mat] = clamp(materials_prices[mat], price_minimum, price_maximum)
+ materials_trends[mat] = MARKET_TREND_DOWNWARD
+ materials_trend_life[mat] = rand(1,5)
+ circumstance = pick(list(
+ "[pick(company_name)]'s latest product has seen major controversy, and as a result, the price of [initial(mat.name)] has dropped to [materials_prices[mat]] cr.",
+ "Due to a new competitor, the price of [initial(mat.name)] has dropped to [materials_prices[mat]] cr.",
+ "[initial(mat.name)] has been found to be a carcinogen. The price has dropped to [materials_prices[mat]] cr due to panic."
+ ))
+ news_string += circumstance + "
" // Add the event to the news_string, formatted for newscasters.
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/conjure_foamwall.dm b/code/datums/actions/mobs/conjure_foamwall.dm
new file mode 100644
index 00000000000..8814225f8a2
--- /dev/null
+++ b/code/datums/actions/mobs/conjure_foamwall.dm
@@ -0,0 +1,21 @@
+/datum/action/cooldown/spell/conjure/foam_wall
+ name = "Foam wall"
+ desc = "Create a wall of foam."
+
+ button_icon = 'icons/effects/effects.dmi'
+ button_icon_state = "metalfoam"
+
+ cooldown_time = 2 MINUTES
+ spell_requirements = NONE
+
+ summon_radius = 0
+ summon_type = list(/obj/structure/foamedmetal)
+
+/datum/action/cooldown/spell/conjure/foam_wall/can_cast_spell(feedback = TRUE)
+ . = ..()
+ if(!.)
+ return FALSE
+ var/turf/owner_turf = get_turf(owner)
+ if(owner_turf.is_blocked_turf(exclude_mobs = TRUE))
+ return FALSE
+ return TRUE
diff --git a/code/datums/actions/mobs/defensive_mode.dm b/code/datums/actions/mobs/defensive_mode.dm
new file mode 100644
index 00000000000..30cb9a5980a
--- /dev/null
+++ b/code/datums/actions/mobs/defensive_mode.dm
@@ -0,0 +1,49 @@
+/// An ability that allows the viper spider to get in an defensive mode at the cost of speed.
+/datum/action/cooldown/mob_cooldown/defensive_mode
+ name = "Change Mode"
+ button_icon = 'icons/mob/actions/actions_animal.dmi'
+ button_icon_state = "defensive_mode"
+ desc = "Activates a defensive mode to reduce damage but will make you slower."
+ cooldown_time = 5 SECONDS
+ click_to_activate = FALSE
+ /// If the defensive mode is activated or not.
+ var/defense_active = FALSE
+ /// Movement speed modifier used.
+ var/datum/movespeed_modifier/modifier_type = /datum/movespeed_modifier/viper_defensive
+
+/datum/action/cooldown/mob_cooldown/defensive_mode/Remove(mob/living/remove_from)
+ var/mob/living/basic/owner_mob = owner
+ if(defense_active && istype(owner_mob))
+ offence(owner_mob)
+
+ return ..()
+
+/datum/action/cooldown/mob_cooldown/defensive_mode/Activate(atom/target_atom)
+ StartCooldown(360 SECONDS, 360 SECONDS)
+ activate_defence(owner)
+ StartCooldown()
+ return TRUE
+
+/datum/action/cooldown/mob_cooldown/defensive_mode/proc/activate_defence(mob/living/basic/owner_mob)
+ if(!istype(owner_mob))
+ return
+ if(defense_active)
+ offence(owner_mob)
+ return
+ defence(owner_mob)
+
+/datum/action/cooldown/mob_cooldown/defensive_mode/proc/offence(mob/living/basic/owner_mob)
+ owner_mob.damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1)
+ owner_mob.icon_state = initial(owner_mob.icon_state)
+ owner_mob.icon_living = initial(owner_mob.icon_living)
+ owner_mob.icon_dead = initial(owner_mob.icon_dead)
+ owner_mob.remove_movespeed_modifier(modifier_type)
+ defense_active = FALSE
+
+/datum/action/cooldown/mob_cooldown/defensive_mode/proc/defence(mob/living/basic/owner_mob)
+ owner_mob.damage_coeff = list(BRUTE = 0.4, BURN = 0.5, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1)
+ owner_mob.icon_dead = "[owner_mob.icon_state]_d_dead"
+ owner_mob.icon_state = "[owner_mob.icon_state]_d"
+ owner_mob.icon_living = "[owner_mob.icon_living]_d"
+ owner_mob.add_movespeed_modifier(modifier_type)
+ defense_active = TRUE
diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/find_mineable_wall.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/find_mineable_wall.dm
new file mode 100644
index 00000000000..ad5749c9161
--- /dev/null
+++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/find_mineable_wall.dm
@@ -0,0 +1,33 @@
+//behavior to find mineable mineral walls
+/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(controller, 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(datum/ai_controller/controller, turf/target_wall)
+ var/mob/living/source = controller.pawn
+ 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
diff --git a/code/datums/ai/basic_mobs/basic_subtrees/attack_adjacent_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/attack_adjacent_target.dm
new file mode 100644
index 00000000000..c3d334165d9
--- /dev/null
+++ b/code/datums/ai/basic_mobs/basic_subtrees/attack_adjacent_target.dm
@@ -0,0 +1,33 @@
+/// Attack something which is already adjacent to us, without ending planning
+/datum/ai_planning_subtree/basic_melee_attack_subtree/opportunistic
+ melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/opportunistic
+ end_planning = FALSE
+
+/datum/ai_planning_subtree/basic_melee_attack_subtree/opportunistic/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
+ . = ..()
+ var/atom/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET]
+ if(QDELETED(target) || !controller.pawn.Adjacent(target))
+ return
+ if (isliving(controller.pawn))
+ var/mob/living/pawn = controller.pawn
+ if (LAZYLEN(pawn.do_afters))
+ return
+ controller.queue_behavior(melee_attack_behavior, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION)
+
+/// Attack something which is already adjacent to us without moving
+/datum/ai_behavior/basic_melee_attack/opportunistic
+ action_cooldown = 0.2 SECONDS // We gotta check unfortunately often because we're in a race condition with nextmove
+ behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
+
+/datum/ai_behavior/basic_melee_attack/opportunistic/setup(datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key)
+ if (!controller.blackboard_key_exists(targetting_datum_key))
+ CRASH("No target datum was supplied in the blackboard for [controller.pawn]")
+ return controller.blackboard_key_exists(target_key)
+
+/datum/ai_behavior/basic_melee_attack/opportunistic/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key)
+ var/atom/movable/atom_pawn = controller.pawn
+ if(!atom_pawn.CanReach(controller.blackboard[target_key]))
+ finish_action(controller, TRUE, target_key) // Don't clear target
+ return FALSE
+ . = ..()
+ finish_action(controller, TRUE, target_key) // Try doing something else
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..c09e7cdbf75
--- /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 = 4
+ /// 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/move_to_cardinal.dm b/code/datums/ai/basic_mobs/basic_subtrees/move_to_cardinal.dm
new file mode 100644
index 00000000000..c98878e0fd7
--- /dev/null
+++ b/code/datums/ai/basic_mobs/basic_subtrees/move_to_cardinal.dm
@@ -0,0 +1,71 @@
+/// Try to line up with a cardinal direction of your target
+/datum/ai_planning_subtree/move_to_cardinal
+ /// Behaviour to execute to line ourselves up
+ var/move_behaviour = /datum/ai_behavior/move_to_cardinal
+ /// Blackboard key in which to store selected target
+ var/target_key = BB_BASIC_MOB_CURRENT_TARGET
+
+/datum/ai_planning_subtree/move_to_cardinal/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
+ . = ..()
+ if(!controller.blackboard_key_exists(target_key))
+ return
+ controller.queue_behavior(move_behaviour, target_key)
+
+/// Try to line up with a cardinal direction of your target
+/datum/ai_behavior/move_to_cardinal
+ required_distance = 0
+ behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
+ /// How close to our target is too close?
+ var/minimum_distance = 1
+ /// How far away is too far?
+ var/maximum_distance = 9
+
+/datum/ai_behavior/move_to_cardinal/setup(datum/ai_controller/controller, target_key)
+ var/atom/target = controller.blackboard[target_key]
+ if(QDELETED(target))
+ return FALSE
+ target_nearest_cardinal(controller, target)
+ return TRUE
+
+/// Set our movement target to the closest cardinal space to our target
+/datum/ai_behavior/move_to_cardinal/proc/target_nearest_cardinal(datum/ai_controller/controller, atom/target)
+ var/atom/move_target
+ var/closest = INFINITY
+
+ for (var/dir in GLOB.cardinals)
+ var/turf/cardinal_turf = get_ranged_target_turf(target, dir, minimum_distance)
+ if (cardinal_turf.is_blocked_turf())
+ continue
+ var/distance_to = get_dist(controller.pawn, cardinal_turf)
+ if (distance_to >= closest)
+ continue
+ closest = distance_to
+ move_target = cardinal_turf
+
+ if (isnull(move_target))
+ move_target = target
+ if (controller.current_movement_target == move_target)
+ return
+ set_movement_target(controller, move_target)
+
+/datum/ai_behavior/move_to_cardinal/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
+ var/atom/target = controller.blackboard[target_key]
+ if (QDELETED(target))
+ finish_action(controller = controller, succeeded = FALSE, target_key = target_key)
+ return
+ if (!(get_dir(controller.pawn, target) in GLOB.cardinals))
+ target_nearest_cardinal(controller, target)
+ return
+ var/distance_to_target = get_dist(controller.pawn, target)
+ if (distance_to_target < minimum_distance)
+ target_nearest_cardinal(controller, target)
+ return
+ if (distance_to_target > maximum_distance)
+ return
+ finish_action(controller = controller, succeeded = TRUE, target_key = target_key)
+ return
+
+/datum/ai_behavior/move_to_cardinal/finish_action(datum/ai_controller/controller, succeeded, target_key)
+ if (!succeeded)
+ controller.clear_blackboard_key(target_key)
+ return ..()
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..1ff752d925f
--- /dev/null
+++ b/code/datums/ai/basic_mobs/basic_subtrees/ranged_skirmish.dm
@@ -0,0 +1,52 @@
+/// 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)
+ . = ..()
+ if(!controller.blackboard_key_exists(target_key))
+ 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/travel_to_point.dm b/code/datums/ai/basic_mobs/basic_subtrees/travel_to_point.dm
new file mode 100644
index 00000000000..9ce7cc95c07
--- /dev/null
+++ b/code/datums/ai/basic_mobs/basic_subtrees/travel_to_point.dm
@@ -0,0 +1,18 @@
+/// Simply walk to a location
+/datum/ai_planning_subtree/travel_to_point
+ /// Blackboard key where we travel a place we walk to
+ var/location_key = BB_TRAVEL_DESTINATION
+ /// What do we do in order to travel
+ var/travel_behaviour = /datum/ai_behavior/travel_towards
+
+/datum/ai_planning_subtree/travel_to_point/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
+ . = ..()
+ var/atom/target = controller.blackboard[location_key]
+ if (QDELETED(target))
+ return
+ controller.queue_behavior(travel_behaviour, location_key)
+ return SUBTREE_RETURN_FINISH_PLANNING
+
+
+/datum/ai_planning_subtree/travel_to_point/and_clear_target
+ travel_behaviour = /datum/ai_behavior/travel_towards/stop_on_arrival
diff --git a/code/datums/ai/basic_mobs/generic_controllers.dm b/code/datums/ai/basic_mobs/generic_controllers.dm
new file mode 100644
index 00000000000..208c1833add
--- /dev/null
+++ b/code/datums/ai/basic_mobs/generic_controllers.dm
@@ -0,0 +1,26 @@
+/// The most basic AI tree which just finds a guy and then runs at them to click them
+/datum/ai_controller/basic_controller/simple_hostile
+ 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/basic_melee_attack_subtree,
+ )
+
+/// Find a target, walk at target, attack intervening obstacles
+/datum/ai_controller/basic_controller/simple_hostile_obstacles
+ 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/attack_obstacle_in_path,
+ /datum/ai_planning_subtree/basic_melee_attack_subtree,
+ )
diff --git a/code/datums/ai/hunting_behavior/hunting_corpses.dm b/code/datums/ai/hunting_behavior/hunting_corpses.dm
new file mode 100644
index 00000000000..e720e4da947
--- /dev/null
+++ b/code/datums/ai/hunting_behavior/hunting_corpses.dm
@@ -0,0 +1,17 @@
+/// Find and attack corpses
+/datum/ai_planning_subtree/find_and_hunt_target/corpses
+ finding_behavior = /datum/ai_behavior/find_hunt_target/corpses
+ hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target
+ hunt_targets = list(/mob/living)
+
+/// Find nearby dead mobs
+/datum/ai_behavior/find_hunt_target/corpses
+
+/datum/ai_behavior/find_hunt_target/corpses/valid_dinner(mob/living/source, mob/living/dinner, radius)
+ if (!isliving(dinner) || dinner.stat != DEAD)
+ return FALSE
+ return can_see(source, dinner, radius)
+
+/// Find and attack specifically human corpses
+/datum/ai_planning_subtree/find_and_hunt_target/corpses/human
+ hunt_targets = list(/mob/living/carbon/human)
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/appearance_on_aggro.dm b/code/datums/components/appearance_on_aggro.dm
new file mode 100644
index 00000000000..33a3d7c2e90
--- /dev/null
+++ b/code/datums/components/appearance_on_aggro.dm
@@ -0,0 +1,82 @@
+
+/**
+ * Changes visuals of the attached mob while it has a target
+ */
+/datum/component/appearance_on_aggro
+ /// Blackboardey to search for a target
+ var/target_key = BB_BASIC_MOB_CURRENT_TARGET
+ /// Icon state to use when we have a target
+ var/aggro_state
+ /// path of the overlay to apply
+ var/mutable_appearance/aggro_overlay
+ /// visibility of our icon when aggroed
+ var/alpha_on_aggro
+ /// visibility of our icon when deaggroed
+ var/alpha_on_deaggro
+ /// do we currently have a target
+ var/atom/current_target
+
+/datum/component/appearance_on_aggro/Initialize(aggro_state, overlay_icon, overlay_state, alpha_on_aggro, alpha_on_deaggro)
+ if (!isliving(parent))
+ return COMPONENT_INCOMPATIBLE
+ src.aggro_state = aggro_state
+ src.alpha_on_aggro = alpha_on_aggro
+ src.alpha_on_deaggro = alpha_on_deaggro
+ if (!isnull(overlay_icon) && !isnull(overlay_state))
+ aggro_overlay = mutable_appearance(overlay_icon, overlay_state)
+
+/datum/component/appearance_on_aggro/RegisterWithParent()
+ RegisterSignal(parent, COMSIG_AI_BLACKBOARD_KEY_SET(target_key), PROC_REF(on_set_target))
+ RegisterSignal(parent, COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_key), PROC_REF(on_clear_target))
+ if (!isnull(aggro_state))
+ RegisterSignal(parent, COMSIG_ATOM_UPDATE_ICON_STATE, PROC_REF(on_icon_state_updated))
+ if (!isnull(aggro_overlay))
+ RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_overlays_updated))
+
+/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/on_set_target(mob/living/source)
+ SIGNAL_HANDLER
+
+ var/atom/target = source.ai_controller.blackboard[target_key]
+ if (QDELETED(target))
+ return
+
+ current_target = target
+ RegisterSignal(target, COMSIG_QDELETING, PROC_REF(on_clear_target))
+ if (!isnull(aggro_overlay) || !isnull(aggro_state))
+ source.update_appearance(UPDATE_ICON)
+ if (!isnull(alpha_on_aggro))
+ animate(source, alpha = alpha_on_aggro, time = 2 SECONDS)
+
+/datum/component/appearance_on_aggro/Destroy()
+ if (!isnull(current_target))
+ revert_appearance(parent)
+ return ..()
+
+/datum/component/appearance_on_aggro/proc/on_clear_target(atom/source)
+ SIGNAL_HANDLER
+ revert_appearance(parent)
+
+/datum/component/appearance_on_aggro/proc/revert_appearance(mob/living/source)
+ UnregisterSignal(current_target, COMSIG_QDELETING)
+ current_target = null
+ if (!isnull(aggro_overlay) || !isnull(aggro_state))
+ source.update_appearance(UPDATE_ICON)
+ if (!isnull(alpha_on_deaggro))
+ animate(source, alpha = alpha_on_deaggro, time = 2 SECONDS)
+
+/datum/component/appearance_on_aggro/proc/on_icon_state_updated(mob/living/source)
+ SIGNAL_HANDLER
+ if (source.stat == DEAD)
+ return
+ source.icon_state = isnull(current_target) ? initial(source.icon_state) : aggro_state
+
+/datum/component/appearance_on_aggro/proc/on_overlays_updated(atom/source, list/overlays)
+ SIGNAL_HANDLER
+
+ if (isnull(current_target))
+ return
+ overlays += aggro_overlay
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/blob_minion.dm b/code/datums/components/blob_minion.dm
new file mode 100644
index 00000000000..41f58231e2d
--- /dev/null
+++ b/code/datums/components/blob_minion.dm
@@ -0,0 +1,154 @@
+/**
+ * Common behaviour shared by things which are minions to a blob
+ */
+/datum/component/blob_minion
+ dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
+ /// Overmind who is our boss
+ var/mob/camera/blob/overmind
+ /// Callback to run if overmind strain changes
+ var/datum/callback/on_strain_changed
+
+/datum/component/blob_minion/Initialize(mob/camera/blob/overmind, datum/callback/on_strain_changed)
+ . = ..()
+ if (!isliving(parent))
+ return COMPONENT_INCOMPATIBLE
+ src.on_strain_changed = on_strain_changed
+ register_overlord(overmind)
+
+/datum/component/blob_minion/InheritComponent(datum/component/new_comp, i_am_original, mob/camera/blob/overmind, datum/callback/on_strain_changed)
+ if (!isnull(on_strain_changed))
+ src.on_strain_changed = on_strain_changed
+ register_overlord(overmind)
+
+/datum/component/blob_minion/proc/register_overlord(mob/camera/blob/overmind)
+ if (isnull(overmind))
+ return
+ src.overmind = overmind
+ overmind.register_new_minion(parent)
+ RegisterSignal(overmind, COMSIG_QDELETING, PROC_REF(overmind_deleted))
+ RegisterSignal(overmind, COMSIG_BLOB_SELECTED_STRAIN, PROC_REF(overmind_properties_changed))
+ overmind_properties_changed(overmind, overmind.blobstrain)
+
+/// Our overmind is gone, uh oh!
+/datum/component/blob_minion/proc/overmind_deleted()
+ SIGNAL_HANDLER
+ overmind = null
+ overmind_properties_changed()
+
+/// Our overmind has changed colour and properties
+/datum/component/blob_minion/proc/overmind_properties_changed(mob/camera/blob/overmind, datum/blobstrain/new_strain)
+ SIGNAL_HANDLER
+ var/mob/living/living_parent = parent
+ living_parent.update_appearance(UPDATE_ICON)
+ on_strain_changed?.Invoke(overmind, new_strain)
+
+/datum/component/blob_minion/RegisterWithParent()
+ var/mob/living/living_parent = parent
+ living_parent.pass_flags |= PASSBLOB
+ living_parent.faction |= ROLE_BLOB
+ ADD_TRAIT(parent, TRAIT_BLOB_ALLY, REF(src))
+ remove_verb(parent, /mob/living/verb/pulled) // No dragging people into the blob
+ RegisterSignal(parent, COMSIG_MOB_MIND_INITIALIZED, PROC_REF(on_mind_init))
+ RegisterSignal(parent, COMSIG_ATOM_UPDATE_ICON, PROC_REF(on_update_appearance))
+ RegisterSignal(parent, COMSIG_MOB_GET_STATUS_TAB_ITEMS, PROC_REF(on_update_status_tab))
+ RegisterSignal(parent, COMSIG_ATOM_BLOB_ACT, PROC_REF(on_blob_touched))
+ RegisterSignal(parent, COMSIG_ATOM_FIRE_ACT, PROC_REF(on_burned))
+ RegisterSignal(parent, COMSIG_ATOM_TRIED_PASS, PROC_REF(on_attempted_pass))
+ RegisterSignal(parent, COMSIG_MOVABLE_SPACEMOVE, PROC_REF(on_space_move))
+ RegisterSignal(parent, COMSIG_LIVING_TRY_SPEECH, PROC_REF(on_try_speech))
+ RegisterSignal(parent, COMSIG_MOB_CHANGED_TYPE, PROC_REF(on_transformed))
+ living_parent.update_appearance(UPDATE_ICON)
+ GLOB.blob_telepathy_mobs |= parent
+
+/datum/component/blob_minion/UnregisterFromParent()
+ if (!isnull(overmind))
+ overmind.blob_mobs -= parent
+ var/mob/living/living_parent = parent
+ living_parent.pass_flags &= ~PASSBLOB
+ living_parent.faction -= ROLE_BLOB
+ REMOVE_TRAIT(parent, TRAIT_BLOB_ALLY, REF(src))
+ add_verb(parent, /mob/living/verb/pulled)
+ UnregisterSignal(parent, list(
+ COMSIG_ATOM_BLOB_ACT,
+ COMSIG_ATOM_FIRE_ACT,
+ COMSIG_ATOM_TRIED_PASS,
+ COMSIG_ATOM_UPDATE_ICON,
+ COMSIG_LIVING_TRY_SPEECH,
+ COMSIG_MOB_CHANGED_TYPE,
+ COMSIG_MOB_GET_STATUS_TAB_ITEMS,
+ COMSIG_MOB_MIND_INITIALIZED,
+ COMSIG_MOVABLE_SPACEMOVE,
+ ))
+ GLOB.blob_telepathy_mobs -= parent
+
+/// Become blobpilled when we gain a mind
+/datum/component/blob_minion/proc/on_mind_init(mob/living/minion, datum/mind/new_mind)
+ SIGNAL_HANDLER
+ if (isnull(overmind))
+ return
+ var/datum/antagonist/blob_minion/minion_motive = new(overmind)
+ new_mind.add_antag_datum(minion_motive)
+
+/// When our icon is updated, update our colour too
+/datum/component/blob_minion/proc/on_update_appearance(mob/living/minion)
+ SIGNAL_HANDLER
+ if(isnull(overmind))
+ minion.remove_atom_colour(FIXED_COLOUR_PRIORITY)
+ return
+ minion.add_atom_colour(overmind.blobstrain.color, FIXED_COLOUR_PRIORITY)
+
+/// When our icon is updated, update our colour too
+/datum/component/blob_minion/proc/on_update_status_tab(mob/living/minion, list/status_items)
+ SIGNAL_HANDLER
+ if (isnull(overmind))
+ return
+ status_items += "Blobs to Win: [length(overmind.blobs_legit)]/[overmind.blobwincount]"
+
+/// If we feel the gentle caress of a blob, we feel better
+/datum/component/blob_minion/proc/on_blob_touched(mob/living/minion)
+ SIGNAL_HANDLER
+ if(minion.stat == DEAD || minion.health >= minion.maxHealth)
+ return COMPONENT_CANCEL_BLOB_ACT // Don't hurt us in order to heal us
+ for(var/i in 1 to 2)
+ var/obj/effect/temp_visual/heal/heal_effect = new /obj/effect/temp_visual/heal(get_turf(parent)) // hello yes you are being healed
+ heal_effect.color = isnull(overmind) ? COLOR_BLACK : overmind.blobstrain.complementary_color
+ minion.heal_overall_damage(minion.maxHealth * BLOBMOB_HEALING_MULTIPLIER)
+ return COMPONENT_CANCEL_BLOB_ACT
+
+/// If we feel the fearsome bite of open flame, we feel worse
+/datum/component/blob_minion/proc/on_burned(mob/living/minion, exposed_temperature, exposed_volume)
+ SIGNAL_HANDLER
+ if(isnull(exposed_temperature))
+ minion.adjustFireLoss(5)
+ return
+ minion.adjustFireLoss(clamp(0.01 * exposed_temperature, 1, 5))
+
+/// Someone is attempting to move through us, allow it if it is a blob tile
+/datum/component/blob_minion/proc/on_attempted_pass(mob/living/minion, atom/movable/incoming)
+ SIGNAL_HANDLER
+ if(istype(incoming, /obj/structure/blob))
+ return COMSIG_COMPONENT_PERMIT_PASSAGE
+
+/// If we're near a blob, stop drifting
+/datum/component/blob_minion/proc/on_space_move(mob/living/minion)
+ SIGNAL_HANDLER
+ var/obj/structure/blob/blob_handhold = locate() in range(1, parent)
+ if (!isnull(blob_handhold))
+ return COMSIG_MOVABLE_STOP_SPACEMOVE
+
+/// We only speak telepathically to blobs
+/datum/component/blob_minion/proc/on_try_speech(mob/living/minion, message, ignore_spam, forced)
+ SIGNAL_HANDLER
+ var/spanned_message = minion.say_quote(message)
+ var/rendered = span_blob("\[Blob Telepathy\] [minion.real_name] [spanned_message]")
+ blob_telepathy(rendered, minion)
+ return COMPONENT_CANNOT_SPEAK
+
+/// Called when a blob minion is transformed into something else, hopefully a spore into a zombie
+/datum/component/blob_minion/proc/on_transformed(mob/living/minion, mob/living/replacement)
+ SIGNAL_HANDLER
+ overmind?.assume_direct_control(replacement)
+
+/datum/component/blob_minion/PostTransfer()
+ if(!isliving(parent))
+ return COMPONENT_INCOMPATIBLE
diff --git a/code/datums/components/crafting/slapcrafting.dm b/code/datums/components/crafting/slapcrafting.dm
new file mode 100644
index 00000000000..32a901dc73e
--- /dev/null
+++ b/code/datums/components/crafting/slapcrafting.dm
@@ -0,0 +1,202 @@
+/// Slapcrafting component!
+/datum/component/slapcrafting
+ dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
+ var/list/slapcraft_recipes = list()
+
+/**
+ * Slapcraft component
+ *
+ * Slap it onto a item to be able to slapcraft with it
+ *
+ * args:
+ * * slapcraft_recipes (required) = The recipe to attempt crafting.
+ * Hit it with an ingredient of the recipe to attempt crafting.
+ * It will check the area near the user for the rest of the ingredients and tools.
+ * *
+**/
+/datum/component/slapcrafting/Initialize(
+ slapcraft_recipes = null,
+ )
+
+ if(!isitem(parent))
+ return COMPONENT_INCOMPATIBLE
+
+ var/obj/item/parent_item = parent
+
+ if((parent_item.item_flags & ABSTRACT) || (parent_item.item_flags & DROPDEL))
+ return COMPONENT_NOTRANSFER
+
+ RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(attempt_slapcraft))
+ RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(get_examine_info))
+ RegisterSignal(parent, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(get_examine_more_info))
+ RegisterSignal(parent, COMSIG_TOPIC, PROC_REF(topic_handler))
+
+ src.slapcraft_recipes += slapcraft_recipes
+
+/datum/component/slapcrafting/InheritComponent(datum/component/slapcrafting/new_comp, original, slapcraft_recipes)
+ if(!original)
+ return
+ src.slapcraft_recipes += slapcraft_recipes
+
+/datum/component/slapcrafting/Destroy(force, silent)
+ UnregisterSignal(parent, list(COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_EXAMINE, COMSIG_ATOM_EXAMINE_MORE))
+ return ..()
+
+/datum/component/slapcrafting/proc/attempt_slapcraft(obj/item/parent_item, obj/item/slapper, mob/user)
+
+ if(isnull(slapcraft_recipes))
+ CRASH("NULL SLAPCRAFT RECIPES?")
+
+ var/datum/component/personal_crafting/craft_sheet = user.GetComponent(/datum/component/personal_crafting)
+ if(!craft_sheet)
+ CRASH("No craft sheet on user ??")
+
+ var/list/valid_recipes
+ for(var/datum/crafting_recipe/recipe as anything in slapcraft_recipes)
+ // Gotta instance it to copy the list over.
+ recipe = new recipe()
+ var/list/type_ingredient_list = recipe.reqs
+ qdel(recipe)
+ if(length(type_ingredient_list) == 1) // No ingredients besides itself? We use one of the tools then
+ type_ingredient_list = recipe.tool_paths
+ // Check the tool behaviours differently as they aren't types
+ for(var/behaviour in initial(recipe.tool_behaviors))
+ if(slapper.tool_behaviour == behaviour)
+ LAZYADD(valid_recipes, recipe)
+ break
+ if(is_type_in_list(slapper, type_ingredient_list))
+ LAZYADD(valid_recipes, recipe)
+
+ if(!valid_recipes)
+ return
+
+ // We might use radials so we need to split the proc chain
+ INVOKE_ASYNC(src, PROC_REF(slapcraft_async), valid_recipes, user, craft_sheet)
+
+/datum/component/slapcrafting/proc/slapcraft_async(list/valid_recipes, mob/user, datum/component/personal_crafting/craft_sheet)
+
+ var/list/recipe_choices = list()
+
+ var/list/result_to_recipe = list()
+
+ var/final_recipe = valid_recipes[1]
+ var/string_chosen_recipe
+ if(length(valid_recipes) > 1)
+ for(var/datum/crafting_recipe/recipe as anything in valid_recipes)
+ var/atom/recipe_result = initial(recipe.result)
+ result_to_recipe[initial(recipe_result.name)] = recipe
+ recipe_choices += list("[initial(recipe_result.name)]" = image(icon = initial(recipe_result.icon), icon_state = initial(recipe_result.icon_state)))
+
+ if(!recipe_choices)
+ CRASH("No recipe choices despite validating in earlier proc")
+
+ string_chosen_recipe = show_radial_menu(user, parent, recipe_choices, require_near = TRUE)
+ if(isnull(string_chosen_recipe))
+ return // they closed the thing
+
+ if(string_chosen_recipe)
+ final_recipe = result_to_recipe[string_chosen_recipe]
+
+
+ var/datum/crafting_recipe/actual_recipe = final_recipe
+
+ if(istype(actual_recipe, /datum/crafting_recipe/food))
+ actual_recipe = locate(final_recipe) in GLOB.cooking_recipes
+ else
+ actual_recipe = locate(final_recipe) in GLOB.crafting_recipes
+
+ if(!actual_recipe)
+ CRASH("Recipe not located in cooking or crafting recipes: [final_recipe]")
+
+ var/atom/final_result = initial(actual_recipe.result)
+
+ to_chat(user, span_notice("You start crafting \a [initial(final_result.name)]..."))
+
+ var/error_string = craft_sheet.construct_item(user, actual_recipe)
+
+ if(!isatom(error_string))
+ to_chat(user, span_warning("crafting failed" + error_string))
+
+/// Alerts any examiners to the recipe, if they wish to know more.
+/datum/component/slapcrafting/proc/get_examine_info(atom/source, mob/user, list/examine_list)
+ SIGNAL_HANDLER
+
+ var/list/string_results = list()
+ // This list saves the recipe result names we've already used to cross-check other recipes so we don't have ', a spear, or a spear!' in the desc.
+ var/list/already_used_names
+ for(var/datum/crafting_recipe/recipe as anything in slapcraft_recipes)
+ // Identical name to a previous recipe's result? Skip in description.
+ var/atom/result = initial(recipe.result)
+ if(locate(initial(result.name)) in already_used_names)
+ continue
+ already_used_names += initial(result.name)
+ string_results += list("\a [initial(result.name)]")
+
+ examine_list += span_notice("You think [parent] could be used to make [english_list(string_results)]! Examine again to look at the details...")
+
+/// Alerts any examiners to the details of the recipe.
+/datum/component/slapcrafting/proc/get_examine_more_info(atom/source, mob/user, list/examine_list)
+ SIGNAL_HANDLER
+
+ for(var/datum/crafting_recipe/recipe as anything in slapcraft_recipes)
+ var/atom/result = initial(recipe.result)
+ examine_list += "See Recipe For [initial(result.name)]"
+
+/datum/component/slapcrafting/proc/topic_handler(atom/source, user, href_list)
+ SIGNAL_HANDLER
+
+ if(!href_list["check_recipe"])
+ return
+
+ var/datum/crafting_recipe/cur_recipe = locate(href_list["check_recipe"]) in slapcraft_recipes
+
+ if(isnull(cur_recipe))
+ CRASH("null recipe!")
+
+ var/atom/result = initial(cur_recipe.result)
+
+ to_chat(user, span_notice("You could craft \a [initial(result.name)] by applying one of these items to it!"))
+
+ // Gotta instance it to copy the lists over.
+ cur_recipe = new cur_recipe()
+ var/list/type_ingredient_list = cur_recipe.reqs
+
+ // Final return string.
+ var/string_ingredient_list = ""
+
+ // Check the ingredients of the crafting recipe.
+ for(var/valid_type in type_ingredient_list)
+ // Check if they're datums, specifically reagents.
+ var/datum/reagent/reagent_ingredient = valid_type
+ if(istype(reagent_ingredient))
+ var/amount = initial(cur_recipe.reqs[reagent_ingredient])
+ string_ingredient_list += "[amount] unit[amount > 1 ? "s" : ""] of [initial(reagent_ingredient.name)]\n"
+
+ // Redundant!
+ if(parent.type == valid_type)
+ continue
+ var/atom/ingredient = valid_type
+ var/amount = initial(cur_recipe.reqs[ingredient])
+ string_ingredient_list += "[amount > 1 ? ("[amount]" + " of") : "a"] [initial(ingredient.name)]\n"
+
+ // If we did find ingredients then add them onto the list.
+ if(length(string_ingredient_list))
+ to_chat(user, span_boldnotice("Ingredients:"))
+ to_chat(user, examine_block(span_notice(string_ingredient_list)))
+
+ var/list/tool_list = ""
+
+ // Paste the required tools.
+ for(var/valid_type in cur_recipe.tool_paths)
+ var/atom/tool = valid_type
+ tool_list += "\a [initial(tool.name)]\n"
+
+ for(var/string in cur_recipe.tool_behaviors)
+ tool_list += "\a [string]\n"
+
+ if(length(tool_list))
+ to_chat(user, span_boldnotice("Required Tools:"))
+ to_chat(user, examine_block(span_notice(tool_list)))
+
+ qdel(cur_recipe)
+
diff --git a/code/datums/components/death_linked.dm b/code/datums/components/death_linked.dm
new file mode 100644
index 00000000000..59d2ce5e855
--- /dev/null
+++ b/code/datums/components/death_linked.dm
@@ -0,0 +1,30 @@
+/**
+ * ## Death link component
+ *
+ * When the owner of this component dies it also gibs a linked mob
+ */
+/datum/component/death_linked
+ ///The mob that also dies when the user dies
+ var/datum/weakref/linked_mob
+
+/datum/component/death_linked/Initialize(mob/living/target_mob)
+ . = ..()
+ if(!isliving(parent))
+ return COMPONENT_INCOMPATIBLE
+ if(isnull(target_mob))
+ stack_trace("[type] added to [parent] with no linked mob.")
+ src.linked_mob = WEAKREF(target_mob)
+
+/datum/component/death_linked/RegisterWithParent()
+ . = ..()
+ RegisterSignal(parent, COMSIG_LIVING_DEATH, PROC_REF(on_death))
+
+/datum/component/death_linked/UnregisterFromParent()
+ . = ..()
+ UnregisterSignal(parent, COMSIG_LIVING_DEATH)
+
+///signal called by the stat of the target changing
+/datum/component/death_linked/proc/on_death(mob/living/target, gibbed)
+ SIGNAL_HANDLER
+ var/mob/living/linked_mob_resolved = linked_mob?.resolve()
+ linked_mob_resolved?.gib()
diff --git a/code/datums/components/food/ghost_edible.dm b/code/datums/components/food/ghost_edible.dm
new file mode 100644
index 00000000000..25207800a74
--- /dev/null
+++ b/code/datums/components/food/ghost_edible.dm
@@ -0,0 +1,59 @@
+/**
+ * Allows ghosts to eat this by orbiting it
+ * They do this by consuming the reagents in the object, so if it doesn't have any then it won't work
+ */
+/datum/component/ghost_edible
+ /// Amount of reagents which will be consumed by each bite
+ var/bite_consumption
+ /// Chance per ghost that a bite will be taken
+ var/bite_chance
+ /// Minimum size the food will display as before being deleted
+ var/minimum_scale
+ /// How many reagents this had on initialisation, used to figure out how eaten we are
+ var/initial_reagent_volume = 0
+
+/datum/component/ghost_edible/Initialize(bite_consumption = 3, bite_chance = 20, minimum_scale = 0.6)
+ . = ..()
+ if (!isatom(parent))
+ return COMPONENT_INCOMPATIBLE
+ var/atom/atom_parent = parent
+ if (isnull(atom_parent.reagents) || atom_parent.reagents.total_volume == 0)
+ return COMPONENT_INCOMPATIBLE
+ src.bite_consumption = bite_consumption
+ src.bite_chance = bite_chance
+ src.minimum_scale = minimum_scale
+ initial_reagent_volume = atom_parent.reagents.total_volume
+ notify_ghosts("[parent] is edible by ghosts!", source = parent, action = NOTIFY_ORBIT, header="Something Tasty!")
+
+/datum/component/ghost_edible/RegisterWithParent()
+ START_PROCESSING(SSdcs, src)
+
+/datum/component/ghost_edible/UnregisterFromParent()
+ STOP_PROCESSING(SSdcs, src)
+
+/datum/component/ghost_edible/Destroy(force, silent)
+ STOP_PROCESSING(SSdcs, src)
+ return ..()
+
+/datum/component/ghost_edible/process(seconds_per_tick)
+ var/atom/atom_parent = parent
+ // Ghosts can eat this burger
+ var/munch_chance = 0
+ for(var/mob/dead/observer/ghost in atom_parent.orbiters?.orbiter_list)
+ munch_chance += bite_chance
+ if (munch_chance >= 100)
+ break
+ if (!prob(munch_chance))
+ return
+ playsound(atom_parent.loc,'sound/items/eatfood.ogg', vol = rand(10,50), vary = TRUE)
+ atom_parent.reagents.remove_any(bite_consumption)
+ if (atom_parent.reagents.total_volume <= 0)
+ atom_parent.visible_message(span_notice("[atom_parent] disappears completely!"))
+ new /obj/item/ectoplasm(atom_parent.loc)
+ qdel(parent)
+ return
+
+ var/final_transform = matrix().Scale(LERP(minimum_scale, 1, atom_parent.reagents.total_volume / initial_reagent_volume))
+ var/animate_transform = matrix(final_transform).Scale(0.8)
+ animate(parent, transform = animate_transform, time = 0.1 SECONDS)
+ animate(transform = final_transform, time = 0.1 SECONDS)
diff --git a/code/datums/components/ling_decoy_brain.dm b/code/datums/components/ling_decoy_brain.dm
new file mode 100644
index 00000000000..7bcb4e38c8f
--- /dev/null
+++ b/code/datums/components/ling_decoy_brain.dm
@@ -0,0 +1,68 @@
+/// Component applied to ling brains to make them into decoy brains, as ling brains are vestigial and don't do anything
+/datum/component/ling_decoy_brain
+ /// The ling this brain is linked to
+ VAR_FINAL/datum/antagonist/changeling/parent_ling
+ /// A talk action that is granted to the ling when this decoy enters an MMI
+ VAR_FINAL/datum/action/changeling/mmi_talk/talk_action
+
+/datum/component/ling_decoy_brain/Initialize(datum/antagonist/changeling/ling)
+ if(!istype(parent, /obj/item/organ/internal/brain))
+ return COMPONENT_INCOMPATIBLE
+ if(isnull(ling))
+ stack_trace("[type] instantiated without a changeling to link to.")
+ return COMPONENT_INCOMPATIBLE
+
+ parent_ling = ling
+ RegisterSignal(parent_ling, COMSIG_QDELETING, PROC_REF(clear_decoy))
+
+/datum/component/ling_decoy_brain/Destroy()
+ UnregisterSignal(parent_ling, COMSIG_QDELETING)
+ parent_ling = null
+ QDEL_NULL(talk_action)
+ return ..()
+
+/datum/component/ling_decoy_brain/RegisterWithParent()
+ var/obj/item/organ/internal/brain/ling_brain = parent
+ ling_brain.organ_flags &= ~ORGAN_VITAL
+ ling_brain.decoy_override = TRUE
+ RegisterSignal(ling_brain, COMSIG_ATOM_ENTERING, PROC_REF(entered_mmi))
+
+/datum/component/ling_decoy_brain/UnregisterFromParent()
+ var/obj/item/organ/internal/brain/ling_brain = parent
+ ling_brain.organ_flags |= ORGAN_VITAL
+ ling_brain.decoy_override = FALSE
+ UnregisterSignal(ling_brain, COMSIG_ATOM_ENTERING, PROC_REF(entered_mmi))
+
+/**
+ * Signal proc for [COMSIG_ATOM_ENTERING], when the brain enters an MMI grant the MMI talk action to the ling
+ *
+ * Unfortunately this is hooked on Entering rather than its own dedicated MMI signal becuase MMI code is a fuck
+ */
+/datum/component/ling_decoy_brain/proc/entered_mmi(obj/item/organ/internal/brain/source, atom/entering, atom/old_loc, ...)
+ SIGNAL_HANDLER
+
+ var/mob/living/the_real_ling = parent_ling.owner.current
+ if(!istype(the_real_ling))
+ return
+
+ if(istype(source.loc, /obj/item/mmi) && talk_action?.owner != the_real_ling)
+ if(isnull(talk_action))
+ talk_action = new() // Not linked to anything, we manage the reference (and don't want it disappearing on us)
+ talk_action.brain_ref = source
+
+ if(the_real_ling.key)
+ to_chat(the_real_ling, span_ghostalert("We detect our decoy brain has been placed within a Man-Machine Interface. \
+ We can use the \"MMI Talk\" action to command it to speak."))
+ else
+ the_real_ling.notify_ghost_cloning("Your decoy brain has been placed in an MMI, re-enter your body to talk via it!", source = the_real_ling, flashwindow = TRUE)
+ talk_action.Grant(the_real_ling)
+
+ else if(talk_action?.owner == the_real_ling)
+ to_chat(the_real_ling, span_ghostalert("We can no longer detect our decoy brain."))
+ talk_action.Remove(the_real_ling)
+
+/// Clear up the decoy if the ling is de-linged
+/datum/component/ling_decoy_brain/proc/clear_decoy(datum/source)
+ SIGNAL_HANDLER
+
+ qdel(src)
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/ranged_attacks.dm b/code/datums/components/ranged_attacks.dm
new file mode 100644
index 00000000000..f75d29a10f4
--- /dev/null
+++ b/code/datums/components/ranged_attacks.dm
@@ -0,0 +1,88 @@
+/**
+ * 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
+ /// how many shots we will fire
+ var/burst_shots
+ /// intervals between shots
+ var/burst_intervals
+ /// 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',
+ burst_shots,
+ burst_intervals = 0.2 SECONDS,
+ 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?")
+ if(burst_shots <= 1)
+ return
+ src.burst_shots = burst_shots
+ src.burst_intervals = burst_intervals
+
+/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)
+ if(isnull(burst_shots))
+ return
+ for(var/i in 1 to (burst_shots - 1))
+ addtimer(CALLBACK(src, PROC_REF(async_fire_ranged_attack), firer, target, modifiers), i * burst_intervals)
+
+/// Actually fire the damn thing
+/datum/component/ranged_attacks/proc/async_fire_ranged_attack(mob/living/basic/firer, atom/target, modifiers)
+ firer.face_atom(target)
+ if(projectile_type)
+ firer.fire_projectile(projectile_type, target, projectile_sound)
+ SEND_SIGNAL(parent, COMSIG_BASICMOB_POST_ATTACK_RANGED, target, modifiers)
+ 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)
+ SEND_SIGNAL(parent, COMSIG_BASICMOB_POST_ATTACK_RANGED, target, modifiers)
+ 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/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/wall_mounted.dm b/code/datums/components/wall_mounted.dm
new file mode 100644
index 00000000000..8d1722f89fe
--- /dev/null
+++ b/code/datums/components/wall_mounted.dm
@@ -0,0 +1,86 @@
+// This element should be applied to wall-mounted machines/structures, so that if the wall it's "hanging" from is broken or deconstructed, the wall-hung structure will deconstruct.
+/datum/component/wall_mounted
+ dupe_mode = COMPONENT_DUPE_ALLOWED
+ /// The wall our object is currently linked to.
+ var/turf/hanging_wall_turf
+ /// Callback to the parent's proc to call on the linked object when the wall disappear's or changes.
+ var/datum/callback/on_drop
+
+/datum/component/wall_mounted/Initialize(target_wall, on_drop_callback)
+ . = ..()
+ if(!isobj(parent))
+ return COMPONENT_INCOMPATIBLE
+ if(!isturf(target_wall))
+ return COMPONENT_INCOMPATIBLE
+ hanging_wall_turf = target_wall
+ on_drop = on_drop_callback
+
+/datum/component/wall_mounted/RegisterWithParent()
+ RegisterSignal(hanging_wall_turf, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
+ RegisterSignal(hanging_wall_turf, COMSIG_TURF_CHANGE, PROC_REF(on_turf_changing))
+ RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(drop_wallmount))
+ RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(on_linked_destroyed))
+
+/datum/component/wall_mounted/UnregisterFromParent()
+ UnregisterSignal(hanging_wall_turf, list(COMSIG_ATOM_EXAMINE, COMSIG_TURF_CHANGE))
+ UnregisterSignal(parent, list(COMSIG_QDELETING, COMSIG_MOVABLE_MOVED))
+ hanging_wall_turf = null
+
+/**
+ * Basic reference handling if the hanging/linked object is destroyed first.
+ */
+/datum/component/wall_mounted/proc/on_linked_destroyed()
+ SIGNAL_HANDLER
+ if(!QDELING(src))
+ qdel(src)
+
+/**
+ * When the wall is examined, explains that it's supporting the linked object.
+ */
+/datum/component/wall_mounted/proc/on_examine(datum/source, mob/user, list/examine_list)
+ SIGNAL_HANDLER
+ examine_list += span_notice("\The [hanging_wall_turf] is currently supporting [span_bold("[parent]")]. Deconstruction or excessive damage would cause it to [span_bold("fall to the ground")].")
+
+/**
+ * When the type of turf changes, if it is changing into a floor we should drop our contents
+ */
+/datum/component/wall_mounted/proc/on_turf_changing(datum/source, path, new_baseturfs, flags, post_change_callbacks)
+ SIGNAL_HANDLER
+ if (ispath(path, /turf/open))
+ drop_wallmount()
+
+/**
+ * Handles the dropping of the linked object. This is done via deconstruction, as that should be the most sane way to handle it for most objects.
+ * Except for intercoms, which are handled by creating a new wallframe intercom, as they're apparently items.
+ */
+/datum/component/wall_mounted/proc/drop_wallmount()
+ SIGNAL_HANDLER
+ var/obj/hanging_parent = parent
+
+ if(on_drop)
+ hanging_parent.visible_message(message = span_warning("\The [hanging_parent] falls off the wall!"), vision_distance = 5)
+ on_drop.Invoke(hanging_parent)
+ else
+ hanging_parent.visible_message(message = span_warning("\The [hanging_parent] falls apart!"), vision_distance = 5)
+ hanging_parent.deconstruct()
+
+ if(!QDELING(src))
+ qdel(src) //Well, we fell off the wall, so we're done here.
+/**
+ * Checks object direction and then verifies if there's a wall in that direction. Finally, applies a wall_mounted component to the object.
+ *
+ * @param directional If TRUE, will use the direction of the object to determine the wall to attach to. If FALSE, will use the object's loc.
+ * @param custom_drop_callback If set, will use this callback instead of the default deconstruct callback.
+ */
+/obj/proc/find_and_hang_on_wall(directional = TRUE, custom_drop_callback)
+ if(istype(get_area(src), /area/shuttle))
+ return FALSE //For now, we're going to keep the component off of shuttles to avoid the turf changing issue. We'll hit that later really;
+ var/turf/attachable_wall
+ if(directional)
+ attachable_wall = get_step(src, dir)
+ else
+ attachable_wall = loc ///Pull from the curent object loc
+ if(!iswallturf(attachable_wall))
+ return FALSE//Nothing to latch onto, or not the right thing.
+ src.AddComponent(/datum/component/wall_mounted, attachable_wall, custom_drop_callback)
+ return TRUE
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/elements/bombable_turf.dm b/code/datums/elements/bombable_turf.dm
new file mode 100644
index 00000000000..11a83c79340
--- /dev/null
+++ b/code/datums/elements/bombable_turf.dm
@@ -0,0 +1,45 @@
+/**
+ * Apply this to a turf (usually a wall) and it will be destroyed instantly by any explosion.
+ * Most walls can already be destroyed by explosions so this is largely for usually indestructible ones.
+ * For applying it in a map editor, use /obj/effect/mapping_helpers/bombable_wall
+ */
+/datum/element/bombable_turf
+
+/datum/element/bombable_turf/Attach(turf/target)
+ . = ..()
+ if(!isturf(target))
+ return ELEMENT_INCOMPATIBLE
+ target.explosive_resistance = 1
+
+ RegisterSignal(target, COMSIG_ATOM_EX_ACT, PROC_REF(detonate))
+ RegisterSignal(target, COMSIG_TURF_CHANGE, PROC_REF(turf_changed))
+ RegisterSignal(target, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_update_overlays))
+ RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examined))
+
+ target.update_appearance(UPDATE_OVERLAYS)
+
+/datum/element/bombable_turf/Detach(turf/source)
+ UnregisterSignal(source, list(COMSIG_ATOM_EX_ACT, COMSIG_TURF_CHANGE, COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_ATOM_EXAMINE))
+ source.explosive_resistance = initial(source.explosive_resistance)
+ source.update_appearance(UPDATE_OVERLAYS)
+ return ..()
+
+/// If we get blowed up, move to the next turf
+/datum/element/bombable_turf/proc/detonate(turf/source)
+ SIGNAL_HANDLER
+ source.ScrapeAway()
+
+/// If this turf becomes something else we either just went off or regardless don't want this any more
+/datum/element/bombable_turf/proc/turf_changed(turf/source)
+ SIGNAL_HANDLER
+ Detach(source)
+
+/// Show a little crack on here
+/datum/element/bombable_turf/proc/on_update_overlays(turf/source, list/overlays)
+ SIGNAL_HANDLER
+ overlays += mutable_appearance('icons/turf/overlays.dmi', "explodable", source.layer + 0.1)
+
+/// Show a little extra on examine
+/datum/element/bombable_turf/proc/on_examined(turf/source, mob/user, list/examine_list)
+ SIGNAL_HANDLER
+ examine_list += span_notice("It seems to be slightly cracked...")
diff --git a/code/datums/elements/bonus_damage.dm b/code/datums/elements/bonus_damage.dm
new file mode 100644
index 00000000000..1fce0672c51
--- /dev/null
+++ b/code/datums/elements/bonus_damage.dm
@@ -0,0 +1,35 @@
+/**
+ * Attached to a mob that will then deal bonus damage to a victim with low, or potentially in the future, high health.
+ */
+/datum/element/bonus_damage
+ /// At which percentage our target has to be for us to deal bonus damage
+ var/damage_percentage
+ /// The amount of brute damage we will deal
+ var/brute_damage_amount
+
+/datum/element/bonus_damage/Attach(datum/target, damage_percentage = 20, brute_damage_amount = 15)
+ . = ..()
+ if(!isliving(target))
+ return ELEMENT_INCOMPATIBLE
+
+ src.damage_percentage = damage_percentage
+ src.brute_damage_amount = brute_damage_amount
+ RegisterSignal(target, COMSIG_HOSTILE_POST_ATTACKINGTARGET, PROC_REF(attack_target))
+
+/datum/element/bonus_damage/Detach(datum/source)
+ UnregisterSignal(source, COMSIG_HOSTILE_POST_ATTACKINGTARGET)
+ return ..()
+
+/// Add potential bonus damage to the person we attacked
+/datum/element/bonus_damage/proc/attack_target(mob/living/attacker, atom/target, success)
+ SIGNAL_HANDLER
+
+ if(!success)
+ return
+ if(!isliving(target))
+ return
+ var/mob/living/living_target = target
+ var/health_percentage = (living_target.health / living_target.maxHealth) * 100
+ if(living_target.stat == DEAD || health_percentage > damage_percentage)
+ return
+ living_target.adjustBruteLoss(brute_damage_amount)
diff --git a/code/datums/elements/gags_recolorable.dm b/code/datums/elements/gags_recolorable.dm
new file mode 100644
index 00000000000..bf37a4ba973
--- /dev/null
+++ b/code/datums/elements/gags_recolorable.dm
@@ -0,0 +1,62 @@
+///An element that lets players recolor the item through the greyscale menu with the help of a spraycan.
+/datum/element/gags_recolorable
+
+/datum/element/gags_recolorable/Attach(datum/target)
+ . = ..()
+ if(!isatom(target))
+ return ELEMENT_INCOMPATIBLE
+ RegisterSignal(target, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attackby))
+ RegisterSignal(target, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(on_examine))
+
+/datum/element/gags_recolorable/proc/on_examine(atom/source, mob/user, list/examine_text)
+ SIGNAL_HANDLER
+ examine_text += span_notice("You could recolor [source.p_them()] with a spraycan...")
+
+/datum/element/gags_recolorable/proc/on_attackby(datum/source, obj/item/attacking_item, mob/user)
+ SIGNAL_HANDLER
+
+ if(!istype(attacking_item, /obj/item/toy/crayon/spraycan))
+ return
+ var/obj/item/toy/crayon/spraycan/can = attacking_item
+
+ if(can.is_capped || can.check_empty())
+ return
+
+ INVOKE_ASYNC(src, PROC_REF(open_ui), user, can, source)
+ return COMPONENT_NO_AFTERATTACK
+
+/datum/element/gags_recolorable/proc/open_ui(mob/user, obj/item/toy/crayon/spraycan/can, atom/target)
+ var/list/allowed_configs = list()
+ var/config = initial(target.greyscale_config)
+ if(!config)
+ return
+ allowed_configs += "[config]"
+ if(isitem(target))
+ var/obj/item/item = target
+ if(initial(item.greyscale_config_worn))
+ allowed_configs += "[initial(item.greyscale_config_worn)]"
+ if(initial(item.greyscale_config_inhand_left))
+ allowed_configs += "[initial(item.greyscale_config_inhand_left)]"
+ if(initial(item.greyscale_config_inhand_right))
+ allowed_configs += "[initial(item.greyscale_config_inhand_right)]"
+
+ var/datum/greyscale_modify_menu/spray_paint/menu = new(
+ target, user, allowed_configs, CALLBACK(src, PROC_REF(recolor), user, can, target),
+ starting_icon_state = initial(target.icon_state),
+ starting_config = initial(target.greyscale_config),
+ starting_colors = target.greyscale_colors,
+ used_spraycan = can,
+ )
+ menu.ui_interact(user)
+
+/datum/element/gags_recolorable/proc/recolor(mob/user, obj/item/toy/crayon/spraycan/can, atom/target, datum/greyscale_modify_menu/menu)
+ if(can.is_capped || can.check_empty(user))
+ menu.ui_close()
+ return
+
+ can.use_charges()
+ if(can.pre_noise)
+ target.audible_message(span_hear("You hear spraying."))
+ playsound(target.loc, 'sound/effects/spray.ogg', 5, TRUE, 5)
+
+ target.set_greyscale(menu.split_colors)
diff --git a/code/datums/elements/mob_grabber.dm b/code/datums/elements/mob_grabber.dm
new file mode 100644
index 00000000000..a85c5dc48b2
--- /dev/null
+++ b/code/datums/elements/mob_grabber.dm
@@ -0,0 +1,30 @@
+/// Grab onto mobs we attack
+/datum/element/mob_grabber
+ element_flags = ELEMENT_BESPOKE
+ argument_hash_start_idx = 2
+ /// What state must the mob be in to be grabbed?
+ var/minimum_stat
+ /// If someone else is already grabbing this, will we take it?
+ var/steal_from_others
+
+/datum/element/mob_grabber/Attach(datum/target, minimum_stat = SOFT_CRIT, steal_from_others = TRUE)
+ . = ..()
+ if (!isliving(target))
+ return ELEMENT_INCOMPATIBLE
+ src.minimum_stat = minimum_stat
+ src.steal_from_others = steal_from_others
+ RegisterSignals(target, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_HOSTILE_PRE_ATTACKINGTARGET), PROC_REF(grab_mob))
+
+/datum/element/mob_grabber/Detach(datum/source)
+ UnregisterSignal(source, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_HOSTILE_PRE_ATTACKINGTARGET))
+ . = ..()
+
+/// Try and grab something we attacked
+/datum/element/mob_grabber/proc/grab_mob(mob/living/source, mob/living/target)
+ SIGNAL_HANDLER
+ if (!isliving(target) || !source.Adjacent(target) || target.stat < minimum_stat)
+ return
+ var/atom/currently_pulled = target.pulledby
+ if (!isnull(currently_pulled) && (!steal_from_others || currently_pulled == source))
+ return
+ INVOKE_ASYNC(target, TYPE_PROC_REF(/mob/living, grabbedby), source)
diff --git a/code/datums/elements/tear_wall.dm b/code/datums/elements/tear_wall.dm
new file mode 100644
index 00000000000..0d24bbda289
--- /dev/null
+++ b/code/datums/elements/tear_wall.dm
@@ -0,0 +1,48 @@
+/**
+ * Attached to a basic mob that will then be able to tear down a wall after some time.
+ */
+/datum/element/tear_wall
+ element_flags = ELEMENT_BESPOKE
+ argument_hash_start_idx = 3
+ /// The rate at which we can break regular walls
+ var/regular_tear_time
+ /// The rate at which we can break reinforced walls
+ var/reinforced_tear_time
+
+/datum/element/tear_wall/Attach(datum/target, regular_tear_time = 2 SECONDS, reinforced_tear_time = 4 SECONDS)
+ . = ..()
+ if(!isbasicmob(target))
+ return ELEMENT_INCOMPATIBLE
+
+ src.regular_tear_time = regular_tear_time
+ src.reinforced_tear_time = reinforced_tear_time
+ RegisterSignal(target, COMSIG_HOSTILE_POST_ATTACKINGTARGET, PROC_REF(attack_wall))
+
+/datum/element/bonus_damage/Detach(datum/source)
+ UnregisterSignal(source, COMSIG_HOSTILE_POST_ATTACKINGTARGET)
+ return ..()
+
+/// Checks if we are attacking a wall
+/datum/element/tear_wall/proc/attack_wall(mob/living/basic/attacker, atom/target, success)
+ SIGNAL_HANDLER
+
+ if(!iswallturf(target))
+ return
+ var/turf/closed/wall/thewall = target
+ var/prying_time = regular_tear_time
+ if(istype(thewall, /turf/closed/wall/r_wall))
+ prying_time = reinforced_tear_time
+ INVOKE_ASYNC(src, PROC_REF(async_attack_wall), attacker, thewall, prying_time)
+
+/// Performs taking down the wall
+/datum/element/tear_wall/proc/async_attack_wall(mob/living/basic/attacker, turf/closed/wall/thewall, prying_time)
+ if(DOING_INTERACTION_WITH_TARGET(attacker, thewall))
+ attacker.balloon_alert(attacker, "busy!")
+ return
+ to_chat(attacker, span_warning("You begin tearing through the wall..."))
+ playsound(attacker, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE)
+ if(do_after(attacker, prying_time, target = thewall))
+ if(isopenturf(thewall))
+ return
+ thewall.dismantle_wall(1)
+ playsound(attacker, 'sound/effects/meteorimpact.ogg', 100, TRUE)
diff --git a/code/datums/greyscale/json_configs/buttondown_skirt.json b/code/datums/greyscale/json_configs/buttondown_skirt.json
new file mode 100644
index 00000000000..60d3d500f28
--- /dev/null
+++ b/code/datums/greyscale/json_configs/buttondown_skirt.json
@@ -0,0 +1,28 @@
+{
+ "buttondown_skirt": [
+ {
+ "type": "icon_state",
+ "icon_state": "buttondown",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "buttondown_obj_buckle",
+ "blend_mode": "overlay",
+ "color_ids": [ 2 ]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "buttondown_obj_belt",
+ "blend_mode": "overlay",
+ "color_ids": [ 3 ]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "buttondown_obj_skirt",
+ "blend_mode": "overlay",
+ "color_ids": [ 4 ]
+ }
+ ]
+}
diff --git a/code/datums/greyscale/json_configs/buttondown_skirt_worn.json b/code/datums/greyscale/json_configs/buttondown_skirt_worn.json
new file mode 100644
index 00000000000..e34a900caf4
--- /dev/null
+++ b/code/datums/greyscale/json_configs/buttondown_skirt_worn.json
@@ -0,0 +1,54 @@
+{
+ "buttondown_skirt": [
+ {
+ "type": "icon_state",
+ "icon_state": "buttondown",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "buckle",
+ "blend_mode": "overlay",
+ "color_ids": [ 2 ]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "belt",
+ "blend_mode": "overlay",
+ "color_ids": [ 3 ]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "skirt",
+ "blend_mode": "overlay",
+ "color_ids": [ 4 ]
+ }
+ ],
+ "buttondown_skirt_d": [
+ {
+ "type": "icon_state",
+ "icon_state": "buttondown_d",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "buckle",
+ "blend_mode": "overlay",
+ "color_ids": [ 2 ]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "belt",
+ "blend_mode": "overlay",
+ "color_ids": [ 3 ]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "skirt",
+ "blend_mode": "overlay",
+ "color_ids": [ 4 ]
+ }
+ ]
+}
diff --git a/code/datums/greyscale/json_configs/glow_shoes.json b/code/datums/greyscale/json_configs/glow_shoes.json
new file mode 100644
index 00000000000..d78fe5b7de0
--- /dev/null
+++ b/code/datums/greyscale/json_configs/glow_shoes.json
@@ -0,0 +1,16 @@
+{
+ "glow_shoes": [
+ {
+ "type": "icon_state",
+ "icon_state": "glow_shoes_back",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "glow_shoes_front",
+ "blend_mode": "overlay",
+ "color_ids": [ 2 ]
+ }
+ ]
+}
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/code/datums/greyscale/json_configs/messyworn_shirt_graphic.json b/code/datums/greyscale/json_configs/messyworn_shirt_graphic.json
new file mode 100644
index 00000000000..85950d388e2
--- /dev/null
+++ b/code/datums/greyscale/json_configs/messyworn_shirt_graphic.json
@@ -0,0 +1,40 @@
+{
+ "messyworn_shirt_gamer": [
+ {
+ "type": "icon_state",
+ "icon_state": "worn_messy",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "nerd_overlay",
+ "blend_mode": "overlay",
+ "color_ids": [ 2 ]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "nerd_base",
+ "blend_mode": "overlay"
+ }
+ ],
+ "messyworn_shirt_ian": [
+ {
+ "type": "icon_state",
+ "icon_state": "worn_messy",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "ian_overlay",
+ "blend_mode": "overlay",
+ "color_ids": [ 2 ]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "ian_base",
+ "blend_mode": "overlay"
+ }
+ ]
+}
diff --git a/code/datums/greyscale/json_configs/overalls.json b/code/datums/greyscale/json_configs/overalls.json
new file mode 100644
index 00000000000..c77da142d70
--- /dev/null
+++ b/code/datums/greyscale/json_configs/overalls.json
@@ -0,0 +1,10 @@
+{
+ "overalls": [
+ {
+ "type": "icon_state",
+ "icon_state": "overalls",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ }
+ ]
+}
diff --git a/code/datums/greyscale/json_configs/wellworn_shirt.json b/code/datums/greyscale/json_configs/wellworn_shirt.json
new file mode 100644
index 00000000000..d58335abc4c
--- /dev/null
+++ b/code/datums/greyscale/json_configs/wellworn_shirt.json
@@ -0,0 +1,26 @@
+{
+ "wellworn_shirt": [
+ {
+ "type": "icon_state",
+ "icon_state": "worn_clean",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ }
+ ],
+ "wornout_shirt": [
+ {
+ "type": "icon_state",
+ "icon_state": "worn_out",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ }
+ ],
+ "messyworn_shirt": [
+ {
+ "type": "icon_state",
+ "icon_state": "worn_messy",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ }
+ ]
+}
diff --git a/code/datums/greyscale/json_configs/wellworn_shirt_graphic.json b/code/datums/greyscale/json_configs/wellworn_shirt_graphic.json
new file mode 100644
index 00000000000..a9226607f29
--- /dev/null
+++ b/code/datums/greyscale/json_configs/wellworn_shirt_graphic.json
@@ -0,0 +1,41 @@
+{
+ "wellworn_shirt_gamer": [
+ {
+ "type": "icon_state",
+ "icon_state": "worn_clean",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "nerd_overlay",
+ "blend_mode": "overlay",
+ "color_ids": [ 2 ]
+
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "nerd_base",
+ "blend_mode": "overlay"
+ }
+ ],
+ "wellworn_shirt_ian": [
+ {
+ "type": "icon_state",
+ "icon_state": "worn_clean",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "ian_overlay",
+ "blend_mode": "overlay",
+ "color_ids": [ 2 ]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "ian_base",
+ "blend_mode": "overlay"
+ }
+ ]
+}
diff --git a/code/datums/greyscale/json_configs/wornout_shirt_graphic.json b/code/datums/greyscale/json_configs/wornout_shirt_graphic.json
new file mode 100644
index 00000000000..6ca12b5db68
--- /dev/null
+++ b/code/datums/greyscale/json_configs/wornout_shirt_graphic.json
@@ -0,0 +1,40 @@
+{
+ "wornout_shirt_gamer": [
+ {
+ "type": "icon_state",
+ "icon_state": "worn_out",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "nerd_overlay",
+ "blend_mode": "overlay",
+ "color_ids": [ 2 ]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "nerd_base",
+ "blend_mode": "overlay"
+ }
+ ],
+ "wornout_shirt_ian": [
+ {
+ "type": "icon_state",
+ "icon_state": "worn_out",
+ "blend_mode": "overlay",
+ "color_ids": [ 1 ]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "ian_overlay",
+ "blend_mode": "overlay",
+ "color_ids": [ 2 ]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "ian_base",
+ "blend_mode": "overlay"
+ }
+ ]
+}
diff --git a/code/datums/mood_events/food_events.dm b/code/datums/mood_events/food_events.dm
new file mode 100644
index 00000000000..7d2dcc439de
--- /dev/null
+++ b/code/datums/mood_events/food_events.dm
@@ -0,0 +1,46 @@
+/datum/mood_event/favorite_food
+ description = "I really enjoyed eating that."
+ mood_change = 5
+ timeout = 4 MINUTES
+
+/datum/mood_event/gross_food
+ description = "I really didn't like that food."
+ mood_change = -2
+ timeout = 4 MINUTES
+
+/datum/mood_event/disgusting_food
+ description = "That food was disgusting!"
+ mood_change = -6
+ timeout = 4 MINUTES
+
+/datum/mood_event/breakfast
+ description = "Nothing like a hearty breakfast to start the shift."
+ mood_change = 2
+ timeout = 10 MINUTES
+
+/datum/mood_event/food
+ timeout = 5 MINUTES
+ var/quality = FOOD_QUALITY_NORMAL
+
+/datum/mood_event/food/New(mob/M, ...)
+ . = ..()
+ mood_change = 2 + 2 * quality
+ description = "That food was [GLOB.food_quality_description[quality]]."
+
+/datum/mood_event/food/nice
+ quality = FOOD_QUALITY_NICE
+
+/datum/mood_event/food/good
+ quality = FOOD_QUALITY_GOOD
+
+/datum/mood_event/food/verygood
+ quality = FOOD_QUALITY_VERYGOOD
+
+/datum/mood_event/food/fantastic
+ quality = FOOD_QUALITY_FANTASTIC
+
+/datum/mood_event/food/amazing
+ quality = FOOD_QUALITY_AMAZING
+
+/datum/mood_event/food/top
+ quality = FOOD_QUALITY_TOP
diff --git a/code/datums/quirks/negative_quirks/allergic.dm b/code/datums/quirks/negative_quirks/allergic.dm
new file mode 100644
index 00000000000..d6a510f62b6
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/allergic.dm
@@ -0,0 +1,71 @@
+/datum/quirk/item_quirk/allergic
+ name = "Extreme Medicine Allergy"
+ desc = "Ever since you were a kid, you've been allergic to certain chemicals..."
+ icon = FA_ICON_PRESCRIPTION_BOTTLE
+ value = -6
+ gain_text = span_danger("You feel your immune system shift.")
+ lose_text = span_notice("You feel your immune system phase back into perfect shape.")
+ medical_record_text = "Patient's immune system responds violently to certain chemicals."
+ hardcore_value = 3
+ quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES
+ mail_goodies = list(/obj/item/reagent_containers/hypospray/medipen) // epinephrine medipen stops allergic reactions
+ var/list/allergies = list()
+ var/list/blacklist = list(
+ /datum/reagent/medicine/c2,
+ /datum/reagent/medicine/epinephrine,
+ /datum/reagent/medicine/adminordrazine,
+ /datum/reagent/medicine/adminordrazine/quantum_heal,
+ /datum/reagent/medicine/omnizine/godblood,
+ /datum/reagent/medicine/cordiolis_hepatico,
+ /datum/reagent/medicine/synaphydramine,
+ /datum/reagent/medicine/diphenhydramine,
+ /datum/reagent/medicine/sansufentanyl
+ )
+ var/allergy_string
+
+/datum/quirk/item_quirk/allergic/add_unique(client/client_source)
+ var/list/chem_list = subtypesof(/datum/reagent/medicine) - blacklist
+ var/list/allergy_chem_names = list()
+ for(var/i in 0 to 5)
+ var/datum/reagent/medicine/chem_type = pick_n_take(chem_list)
+ allergies += chem_type
+ allergy_chem_names += initial(chem_type.name)
+
+ allergy_string = allergy_chem_names.Join(", ")
+ name = "Extreme [allergy_string] Allergies"
+ medical_record_text = "Patient's immune system responds violently to [allergy_string]"
+
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ var/obj/item/clothing/accessory/dogtag/allergy/dogtag = new(get_turf(human_holder), allergy_string)
+
+ give_item_to_holder(dogtag, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS), flavour_text = "Make sure medical staff can see this...")
+
+/datum/quirk/item_quirk/allergic/post_add()
+ quirk_holder.add_mob_memory(/datum/memory/key/quirk_allergy, allergy_string = allergy_string)
+ to_chat(quirk_holder, span_boldnotice("You are allergic to [allergy_string], make sure not to consume any of these!"))
+
+/datum/quirk/item_quirk/allergic/process(seconds_per_tick)
+ if(!iscarbon(quirk_holder))
+ return
+
+ if(IS_IN_STASIS(quirk_holder))
+ return
+
+ if(quirk_holder.stat == DEAD)
+ return
+
+ var/mob/living/carbon/carbon_quirk_holder = quirk_holder
+ for(var/allergy in allergies)
+ var/datum/reagent/instantiated_med = carbon_quirk_holder.reagents.has_reagent(allergy)
+ if(!instantiated_med)
+ continue
+ //Just halts the progression, I'd suggest you run to medbay asap to get it fixed
+ if(carbon_quirk_holder.reagents.has_reagent(/datum/reagent/medicine/epinephrine))
+ instantiated_med.reagent_removal_skip_list |= ALLERGIC_REMOVAL_SKIP
+ return //intentionally stops the entire proc so we avoid the organ damage after the loop
+ instantiated_med.reagent_removal_skip_list -= ALLERGIC_REMOVAL_SKIP
+ carbon_quirk_holder.adjustToxLoss(3 * seconds_per_tick)
+ carbon_quirk_holder.reagents.add_reagent(/datum/reagent/toxin/histamine, 3 * seconds_per_tick)
+ if(SPT_PROB(10, seconds_per_tick))
+ carbon_quirk_holder.vomit(VOMIT_CATEGORY_DEFAULT)
+ carbon_quirk_holder.adjustOrganLoss(pick(ORGAN_SLOT_BRAIN,ORGAN_SLOT_APPENDIX,ORGAN_SLOT_LUNGS,ORGAN_SLOT_HEART,ORGAN_SLOT_LIVER,ORGAN_SLOT_STOMACH),10)
diff --git a/code/datums/quirks/negative_quirks/bad_back.dm b/code/datums/quirks/negative_quirks/bad_back.dm
new file mode 100644
index 00000000000..b7c40636159
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/bad_back.dm
@@ -0,0 +1,50 @@
+/datum/quirk/badback
+ name = "Bad Back"
+ desc = "Thanks to your poor posture, backpacks and other bags never sit right on your back. More evenly weighted objects are fine, though."
+ icon = FA_ICON_HIKING
+ value = -8
+ quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED
+ gain_text = span_danger("Your back REALLY hurts!")
+ lose_text = span_notice("Your back feels better.")
+ medical_record_text = "Patient scans indicate severe and chronic back pain."
+ hardcore_value = 4
+ mail_goodies = list(/obj/item/cane)
+ var/datum/weakref/backpack
+
+/datum/quirk/badback/add(client/client_source)
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ var/obj/item/storage/backpack/equipped_backpack = human_holder.back
+ if(istype(equipped_backpack))
+ quirk_holder.add_mood_event("back_pain", /datum/mood_event/back_pain)
+ RegisterSignal(human_holder.back, COMSIG_ITEM_POST_UNEQUIP, PROC_REF(on_unequipped_backpack))
+ else
+ RegisterSignal(quirk_holder, COMSIG_MOB_EQUIPPED_ITEM, PROC_REF(on_equipped_item))
+
+/datum/quirk/badback/remove()
+ UnregisterSignal(quirk_holder, COMSIG_MOB_EQUIPPED_ITEM)
+
+ var/obj/item/storage/equipped_backpack = backpack?.resolve()
+ if(equipped_backpack)
+ UnregisterSignal(equipped_backpack, COMSIG_ITEM_POST_UNEQUIP)
+ quirk_holder.clear_mood_event("back_pain")
+
+/// Signal handler for when the quirk_holder equips an item. If it's a backpack, adds the back_pain mood event.
+/datum/quirk/badback/proc/on_equipped_item(mob/living/source, obj/item/equipped_item, slot)
+ SIGNAL_HANDLER
+
+ if(!(slot & ITEM_SLOT_BACK) || !istype(equipped_item, /obj/item/storage/backpack))
+ return
+
+ quirk_holder.add_mood_event("back_pain", /datum/mood_event/back_pain)
+ RegisterSignal(equipped_item, COMSIG_ITEM_POST_UNEQUIP, PROC_REF(on_unequipped_backpack))
+ UnregisterSignal(quirk_holder, COMSIG_MOB_EQUIPPED_ITEM)
+ backpack = WEAKREF(equipped_item)
+
+/// Signal handler for when the quirk_holder unequips an equipped backpack. Removes the back_pain mood event.
+/datum/quirk/badback/proc/on_unequipped_backpack(obj/item/source, force, atom/newloc, no_move, invdrop, silent)
+ SIGNAL_HANDLER
+
+ UnregisterSignal(source, COMSIG_ITEM_POST_UNEQUIP)
+ quirk_holder.clear_mood_event("back_pain")
+ backpack = null
+ RegisterSignal(quirk_holder, COMSIG_MOB_EQUIPPED_ITEM, PROC_REF(on_equipped_item))
diff --git a/code/datums/quirks/negative_quirks/bad_touch.dm b/code/datums/quirks/negative_quirks/bad_touch.dm
new file mode 100644
index 00000000000..f3a5d967a01
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/bad_touch.dm
@@ -0,0 +1,31 @@
+/datum/quirk/bad_touch
+ name = "Bad Touch"
+ desc = "You don't like hugs. You'd really prefer if people just left you alone."
+ icon = "tg-bad-touch"
+ mob_trait = TRAIT_BADTOUCH
+ value = -1
+ gain_text = span_danger("You just want people to leave you alone.")
+ lose_text = span_notice("You could use a big hug.")
+ medical_record_text = "Patient has disdain for being touched. Potentially has undiagnosed haphephobia."
+ quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED
+ hardcore_value = 1
+ mail_goodies = list(/obj/item/reagent_containers/spray/pepper) // show me on the doll where the bad man touched you
+
+/datum/quirk/bad_touch/add(client/client_source)
+ RegisterSignals(quirk_holder, list(COMSIG_LIVING_GET_PULLED, COMSIG_CARBON_HELP_ACT), PROC_REF(uncomfortable_touch))
+
+/datum/quirk/bad_touch/remove()
+ UnregisterSignal(quirk_holder, list(COMSIG_LIVING_GET_PULLED, COMSIG_CARBON_HELP_ACT))
+
+/// Causes a negative moodlet to our quirk holder on signal
+/datum/quirk/bad_touch/proc/uncomfortable_touch(datum/source)
+ SIGNAL_HANDLER
+
+ if(quirk_holder.stat == DEAD)
+ return
+
+ new /obj/effect/temp_visual/annoyed(quirk_holder.loc)
+ if(quirk_holder.mob_mood.sanity <= SANITY_NEUTRAL)
+ quirk_holder.add_mood_event("bad_touch", /datum/mood_event/very_bad_touch)
+ else
+ quirk_holder.add_mood_event("bad_touch", /datum/mood_event/bad_touch)
diff --git a/code/datums/quirks/negative_quirks/big_hands.dm b/code/datums/quirks/negative_quirks/big_hands.dm
new file mode 100644
index 00000000000..778ea6af8c3
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/big_hands.dm
@@ -0,0 +1,10 @@
+/datum/quirk/bighands
+ name = "Big Hands"
+ desc = "You have big hands, it sure does make it hard to use a lot of things."
+ icon = FA_ICON_HAND_DOTS
+ value = -6
+ mob_trait = TRAIT_CHUNKYFINGERS
+ gain_text = span_danger("Your hands are huge! You can't use small things anymore!")
+ lose_text = span_notice("Your hands are back to normal.")
+ medical_record_text = "Patient has unusually large hands. Made me question my masculinity..."
+ hardcore_value = 5
diff --git a/code/datums/quirks/negative_quirks/blindness.dm b/code/datums/quirks/negative_quirks/blindness.dm
new file mode 100644
index 00000000000..ce57e946fe9
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/blindness.dm
@@ -0,0 +1,20 @@
+/datum/quirk/item_quirk/blindness
+ name = "Blind"
+ desc = "You are completely blind, nothing can counteract this."
+ icon = FA_ICON_EYE_SLASH
+ value = -16
+ gain_text = span_danger("You can't see anything.")
+ lose_text = span_notice("You miraculously gain back your vision.")
+ medical_record_text = "Patient has permanent blindness."
+ hardcore_value = 15
+ quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE
+ mail_goodies = list(/obj/item/clothing/glasses/sunglasses, /obj/item/cane/white)
+
+/datum/quirk/item_quirk/blindness/add_unique(client/client_source)
+ give_item_to_holder(/obj/item/clothing/glasses/blindfold/white, list(LOCATION_EYES = ITEM_SLOT_EYES, LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS))
+
+/datum/quirk/item_quirk/blindness/add(client/client_source)
+ quirk_holder.become_blind(QUIRK_TRAIT)
+
+/datum/quirk/item_quirk/blindness/remove()
+ quirk_holder.cure_blind(QUIRK_TRAIT)
diff --git a/code/datums/quirks/negative_quirks/blood_deficiency.dm b/code/datums/quirks/negative_quirks/blood_deficiency.dm
new file mode 100644
index 00000000000..c75007bacc2
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/blood_deficiency.dm
@@ -0,0 +1,39 @@
+/datum/quirk/blooddeficiency
+ name = "Blood Deficiency"
+ desc = "Your body can't produce enough blood to sustain itself."
+ icon = FA_ICON_TINT
+ value = -8
+ mob_trait = TRAIT_BLOOD_DEFICIENCY
+ gain_text = span_danger("You feel your vigor slowly fading away.")
+ lose_text = span_notice("You feel vigorous again.")
+ medical_record_text = "Patient requires regular treatment for blood loss due to low production of blood."
+ hardcore_value = 8
+ mail_goodies = list(/obj/item/reagent_containers/blood/o_minus) // universal blood type that is safe for all
+ var/min_blood = BLOOD_VOLUME_SAFE - 25 // just barely survivable without treatment
+
+/datum/quirk/blooddeficiency/post_add()
+ if(!ishuman(quirk_holder))
+ return
+
+ // for making sure the roundstart species has the right blood pack sent to them
+ var/mob/living/carbon/human/carbon_target = quirk_holder
+ carbon_target.dna.species.update_quirk_mail_goodies(carbon_target, src)
+
+/**
+ * Makes the mob lose blood from having the blood deficiency quirk, if possible
+ *
+ * Arguments:
+ * * seconds_per_tick
+ */
+/datum/quirk/blooddeficiency/proc/lose_blood(seconds_per_tick)
+ if(quirk_holder.stat == DEAD)
+ return
+
+ var/mob/living/carbon/human/carbon_target = quirk_holder
+ if(HAS_TRAIT(carbon_target, TRAIT_NOBLOOD) && isnull(carbon_target.dna.species.exotic_blood)) //can't lose blood if your species doesn't have any
+ return
+
+ if (carbon_target.blood_volume <= min_blood)
+ return
+ // Ensures that we don't reduce total blood volume below min_blood.
+ carbon_target.blood_volume = max(min_blood, carbon_target.blood_volume - carbon_target.dna.species.blood_deficiency_drain_rate * seconds_per_tick)
diff --git a/code/datums/quirks/negative_quirks/body_purist.dm b/code/datums/quirks/negative_quirks/body_purist.dm
new file mode 100644
index 00000000000..6350a710882
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/body_purist.dm
@@ -0,0 +1,69 @@
+/datum/quirk/body_purist
+ name = "Body Purist"
+ desc = "You believe your body is a temple and its natural form is an embodiment of perfection. Accordingly, you despise the idea of ever augmenting it with unnatural parts, cybernetic, prosthetic, or anything like it."
+ icon = FA_ICON_PERSON_RAYS
+ value = -2
+ quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED
+ gain_text = span_danger("You now begin to hate the idea of having cybernetic implants.")
+ lose_text = span_notice("Maybe cybernetics aren't so bad. You now feel okay with augmentations and prosthetics.")
+ medical_record_text = "This patient has disclosed an extreme hatred for unnatural bodyparts and augmentations."
+ hardcore_value = 3
+ mail_goodies = list(/obj/item/paper/pamphlet/cybernetics)
+ var/cybernetics_level = 0
+
+/datum/quirk/body_purist/add(client/client_source)
+ check_cybernetics()
+ RegisterSignal(quirk_holder, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(on_organ_gain))
+ RegisterSignal(quirk_holder, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(on_organ_lose))
+ RegisterSignal(quirk_holder, COMSIG_CARBON_ATTACH_LIMB, PROC_REF(on_limb_gain))
+ RegisterSignal(quirk_holder, COMSIG_CARBON_REMOVE_LIMB, PROC_REF(on_limb_lose))
+
+/datum/quirk/body_purist/remove()
+ UnregisterSignal(quirk_holder, list(
+ COMSIG_CARBON_GAIN_ORGAN,
+ COMSIG_CARBON_LOSE_ORGAN,
+ COMSIG_CARBON_ATTACH_LIMB,
+ COMSIG_CARBON_REMOVE_LIMB,
+ ))
+ quirk_holder.clear_mood_event("body_purist")
+
+/datum/quirk/body_purist/proc/check_cybernetics()
+ var/mob/living/carbon/owner = quirk_holder
+ if(!istype(owner))
+ return
+ for(var/obj/item/bodypart/limb as anything in owner.bodyparts)
+ if(IS_ROBOTIC_LIMB(limb))
+ cybernetics_level++
+ for(var/obj/item/organ/organ as anything in owner.organs)
+ if(IS_ROBOTIC_ORGAN(organ) && !(organ.organ_flags & ORGAN_HIDDEN))
+ cybernetics_level++
+ update_mood()
+
+/datum/quirk/body_purist/proc/update_mood()
+ quirk_holder.clear_mood_event("body_purist")
+ if(cybernetics_level)
+ quirk_holder.add_mood_event("body_purist", /datum/mood_event/body_purist, -cybernetics_level * 10)
+
+/datum/quirk/body_purist/proc/on_organ_gain(datum/source, obj/item/organ/new_organ, special)
+ SIGNAL_HANDLER
+ if(IS_ROBOTIC_ORGAN(new_organ) && !(new_organ.organ_flags & ORGAN_HIDDEN)) //why the fuck are there 2 of them
+ cybernetics_level++
+ update_mood()
+
+/datum/quirk/body_purist/proc/on_organ_lose(datum/source, obj/item/organ/old_organ, special)
+ SIGNAL_HANDLER
+ if(IS_ROBOTIC_ORGAN(old_organ) && !(old_organ.organ_flags & ORGAN_HIDDEN))
+ cybernetics_level--
+ update_mood()
+
+/datum/quirk/body_purist/proc/on_limb_gain(datum/source, obj/item/bodypart/new_limb, special)
+ SIGNAL_HANDLER
+ if(IS_ROBOTIC_LIMB(new_limb))
+ cybernetics_level++
+ update_mood()
+
+/datum/quirk/body_purist/proc/on_limb_lose(datum/source, obj/item/bodypart/old_limb, special)
+ SIGNAL_HANDLER
+ if(IS_ROBOTIC_LIMB(old_limb))
+ cybernetics_level--
+ update_mood()
diff --git a/code/datums/quirks/negative_quirks/brain_problems.dm b/code/datums/quirks/negative_quirks/brain_problems.dm
new file mode 100644
index 00000000000..15cc0128020
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/brain_problems.dm
@@ -0,0 +1,37 @@
+ /* A couple of brain tumor stats for anyone curious / looking at this quirk for balancing:
+ * - It takes less 16 minute 40 seconds to die from brain death due to a brain tumor.
+ * - It takes 1 minutes 40 seconds to take 10% (20 organ damage) brain damage.
+ * - 5u mannitol will heal 12.5% (25 organ damage) brain damage
+ */
+/datum/quirk/item_quirk/brainproblems
+ name = "Brain Tumor"
+ desc = "You have a little friend in your brain that is slowly destroying it. Better bring some mannitol!"
+ icon = FA_ICON_BRAIN
+ value = -12
+ gain_text = span_danger("You feel smooth.")
+ lose_text = span_notice("You feel wrinkled again.")
+ medical_record_text = "Patient has a tumor in their brain that is slowly driving them to brain death."
+ hardcore_value = 12
+ quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES
+ mail_goodies = list(/obj/item/storage/pill_bottle/mannitol/braintumor)
+
+/datum/quirk/item_quirk/brainproblems/add_unique(client/client_source)
+ give_item_to_holder(
+ /obj/item/storage/pill_bottle/mannitol/braintumor,
+ list(
+ LOCATION_LPOCKET = ITEM_SLOT_LPOCKET,
+ LOCATION_RPOCKET = ITEM_SLOT_RPOCKET,
+ LOCATION_BACKPACK = ITEM_SLOT_BACKPACK,
+ LOCATION_HANDS = ITEM_SLOT_HANDS,
+ ),
+ flavour_text = "These will keep you alive until you can secure a supply of medication. Don't rely on them too much!",
+ )
+
+/datum/quirk/item_quirk/brainproblems/process(seconds_per_tick)
+ if(quirk_holder.stat == DEAD)
+ return
+
+ if(HAS_TRAIT(quirk_holder, TRAIT_TUMOR_SUPPRESSED))
+ return
+
+ quirk_holder.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.2 * seconds_per_tick)
diff --git a/code/datums/quirks/negative_quirks/chronic_illness.dm b/code/datums/quirks/negative_quirks/chronic_illness.dm
new file mode 100644
index 00000000000..663d4138198
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/chronic_illness.dm
@@ -0,0 +1,16 @@
+/datum/quirk/item_quirk/chronic_illness
+ name = "Chronic Illness"
+ desc = "You have a chronic illness that requires constant medication to keep under control."
+ icon = FA_ICON_DISEASE
+ value = -12
+ gain_text = span_danger("You feel a bit off today.")
+ lose_text = span_notice("You feel a bit better today.")
+ medical_record_text = "Patient has a chronic illness that requires constant medication to keep under control."
+ hardcore_value = 12
+ mail_goodies = list(/obj/item/storage/pill_bottle/sansufentanyl)
+
+/datum/quirk/item_quirk/chronic_illness/add_unique(client/client_source)
+ var/datum/disease/chronic_illness/hms = new /datum/disease/chronic_illness()
+ quirk_holder.ForceContractDisease(hms)
+ give_item_to_holder(/obj/item/storage/pill_bottle/sansufentanyl, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK),flavour_text = "You've been provided with medication to help manage your condition. Take it regularly to avoid complications.")
+ give_item_to_holder(/obj/item/healthanalyzer/simple/disease, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK))
diff --git a/code/datums/quirks/negative_quirks/claustrophobia.dm b/code/datums/quirks/negative_quirks/claustrophobia.dm
new file mode 100644
index 00000000000..e0207d227dd
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/claustrophobia.dm
@@ -0,0 +1,54 @@
+/datum/quirk/claustrophobia
+ name = "Claustrophobia"
+ desc = "You are terrified of small spaces and certain jolly figures. If you are placed inside any container, locker, or machinery, a panic attack sets in and you struggle to breathe."
+ icon = FA_ICON_BOX_OPEN
+ value = -4
+ medical_record_text = "Patient demonstrates a fear of tight spaces."
+ hardcore_value = 5
+ quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES
+ mail_goodies = list(/obj/item/reagent_containers/syringe/convermol) // to help breathing
+
+/datum/quirk/claustrophobia/remove()
+ quirk_holder.clear_mood_event("claustrophobia")
+
+/datum/quirk/claustrophobia/process(seconds_per_tick)
+ if(quirk_holder.stat != CONSCIOUS || quirk_holder.IsSleeping() || quirk_holder.IsUnconscious())
+ return
+
+ if(HAS_TRAIT(quirk_holder, TRAIT_FEARLESS))
+ return
+
+ var/nick_spotted = FALSE
+
+ for(var/mob/living/carbon/human/possible_claus in view(5, quirk_holder))
+ if(evaluate_jolly_levels(possible_claus))
+ nick_spotted = TRUE
+ break
+
+ if(!nick_spotted && isturf(quirk_holder.loc))
+ quirk_holder.clear_mood_event("claustrophobia")
+ return
+
+ quirk_holder.add_mood_event("claustrophobia", /datum/mood_event/claustrophobia)
+ quirk_holder.losebreath += 0.25 // miss a breath one in four times
+ if(SPT_PROB(25, seconds_per_tick))
+ if(nick_spotted)
+ to_chat(quirk_holder, span_warning("Santa Claus is here! I gotta get out of here!"))
+ else
+ to_chat(quirk_holder, span_warning("You feel trapped! Must escape... can't breathe..."))
+
+///investigates whether possible_saint_nick possesses a high level of christmas cheer
+/datum/quirk/claustrophobia/proc/evaluate_jolly_levels(mob/living/carbon/human/possible_saint_nick)
+ if(!istype(possible_saint_nick))
+ return FALSE
+
+ if(istype(possible_saint_nick.back, /obj/item/storage/backpack/santabag))
+ return TRUE
+
+ if(istype(possible_saint_nick.head, /obj/item/clothing/head/costume/santa) || istype(possible_saint_nick.head, /obj/item/clothing/head/helmet/space/santahat))
+ return TRUE
+
+ if(istype(possible_saint_nick.wear_suit, /obj/item/clothing/suit/space/santa))
+ return TRUE
+
+ return FALSE
diff --git a/code/datums/quirks/negative_quirks/clumsy.dm b/code/datums/quirks/negative_quirks/clumsy.dm
new file mode 100644
index 00000000000..8cf363753d4
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/clumsy.dm
@@ -0,0 +1,9 @@
+/datum/quirk/clumsy
+ name = "Clumsy"
+ desc = "You're clumsy, a goofball, a silly dude. You big loveable himbo/bimbo you! Hope you weren't planning on using your hands for anything that takes even a LICK of dexterity."
+ icon = FA_ICON_FACE_DIZZY
+ value = -8
+ mob_trait = TRAIT_CLUMSY
+ gain_text = span_danger("You feel your IQ sink like your brain is liquid.")
+ lose_text = span_notice("You feel like your IQ went up to at least average.")
+ medical_record_text = "Patient has demonstrated an extreme difficulty with high motor skill paired with an inability to demonstrate critical thinking."
diff --git a/code/datums/quirks/negative_quirks/cursed.dm b/code/datums/quirks/negative_quirks/cursed.dm
new file mode 100644
index 00000000000..4b99ff850b8
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/cursed.dm
@@ -0,0 +1,17 @@
+/*
+// SKYRAT EDIT REMOVAL
+/datum/quirk/cursed
+ name = "Cursed"
+ desc = "You are cursed with bad luck. You are much more likely to suffer from accidents and mishaps. When it rains, it pours."
+ icon = FA_ICON_CLOUD_SHOWERS_HEAVY
+ value = -8
+ mob_trait = TRAIT_CURSED
+ gain_text = span_danger("You feel like you're going to have a bad day.")
+ lose_text = span_notice("You feel like you're going to have a good day.")
+ medical_record_text = "Patient is cursed with bad luck."
+ hardcore_value = 8
+
+/datum/quirk/cursed/add(client/client_source)
+ quirk_holder.AddComponent(/datum/component/omen/quirk)
+*/
+// SKYRAT EDIT REMOVAL END
diff --git a/code/datums/quirks/negative_quirks/deafness.dm b/code/datums/quirks/negative_quirks/deafness.dm
new file mode 100644
index 00000000000..077bbe72aa5
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/deafness.dm
@@ -0,0 +1,14 @@
+/datum/quirk/item_quirk/deafness
+ name = "Deaf"
+ desc = "You are incurably deaf."
+ icon = FA_ICON_DEAF
+ value = -8
+ mob_trait = TRAIT_DEAF
+ gain_text = span_danger("You can't hear anything.")
+ lose_text = span_notice("You're able to hear again!")
+ medical_record_text = "Patient's cochlear nerve is incurably damaged."
+ hardcore_value = 12
+ mail_goodies = list(/obj/item/clothing/mask/whistle)
+
+/datum/quirk/item_quirk/deafness/add_unique(client/client_source)
+ give_item_to_holder(/obj/item/clothing/accessory/deaf_pin, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS))
diff --git a/code/datums/quirks/negative_quirks/depression.dm b/code/datums/quirks/negative_quirks/depression.dm
new file mode 100644
index 00000000000..0bf15516105
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/depression.dm
@@ -0,0 +1,12 @@
+/datum/quirk/depression
+ name = "Depression"
+ desc = "You sometimes just hate life."
+ icon = FA_ICON_FROWN
+ mob_trait = TRAIT_DEPRESSION
+ value = -3
+ gain_text = span_danger("You start feeling depressed.")
+ lose_text = span_notice("You no longer feel depressed.") //if only it were that easy!
+ medical_record_text = "Patient has a mild mood disorder causing them to experience acute episodes of depression."
+ quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED
+ hardcore_value = 2
+ mail_goodies = list(/obj/item/storage/pill_bottle/happinesspsych)
diff --git a/code/datums/quirks/negative_quirks/family_heirloom.dm b/code/datums/quirks/negative_quirks/family_heirloom.dm
new file mode 100644
index 00000000000..0fd08c68f21
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/family_heirloom.dm
@@ -0,0 +1,72 @@
+/datum/quirk/item_quirk/family_heirloom
+ name = "Family Heirloom"
+ desc = "You are the current owner of an heirloom, passed down for generations. You have to keep it safe!"
+ icon = FA_ICON_TOOLBOX
+ value = -2
+ medical_record_text = "Patient demonstrates an unnatural attachment to a family heirloom."
+ hardcore_value = 1
+ quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES|QUIRK_MOODLET_BASED
+ /// A weak reference to our heirloom.
+ var/datum/weakref/heirloom
+ mail_goodies = list(/obj/item/storage/secure/briefcase)
+
+/datum/quirk/item_quirk/family_heirloom/add_unique(client/client_source)
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ var/obj/item/heirloom_type
+
+ // The quirk holder's species - we have a 50% chance, if we have a species with a set heirloom, to choose a species heirloom.
+ var/datum/species/holder_species = human_holder.dna?.species
+ if(holder_species && LAZYLEN(holder_species.family_heirlooms) && prob(50))
+ heirloom_type = pick(holder_species.family_heirlooms)
+ else
+ // Our quirk holder's job
+ var/datum/job/holder_job = human_holder.last_mind?.assigned_role
+ if(holder_job && LAZYLEN(holder_job.family_heirlooms))
+ heirloom_type = pick(holder_job.family_heirlooms)
+
+ // If we didn't find an heirloom somehow, throw them a generic one
+ if(!heirloom_type)
+ heirloom_type = pick(/obj/item/toy/cards/deck, /obj/item/lighter, /obj/item/dice/d20)
+
+ var/obj/new_heirloom = new heirloom_type(get_turf(human_holder))
+ heirloom = WEAKREF(new_heirloom)
+
+ give_item_to_holder(
+ new_heirloom,
+ list(
+ LOCATION_LPOCKET = ITEM_SLOT_LPOCKET,
+ LOCATION_RPOCKET = ITEM_SLOT_RPOCKET,
+ LOCATION_BACKPACK = ITEM_SLOT_BACKPACK,
+ LOCATION_HANDS = ITEM_SLOT_HANDS,
+ ),
+ flavour_text = "This is a precious family heirloom, passed down from generation to generation. Keep it safe!",
+ )
+
+/datum/quirk/item_quirk/family_heirloom/post_add()
+ var/list/names = splittext(quirk_holder.real_name, " ")
+ var/family_name = names[names.len]
+
+ var/obj/family_heirloom = heirloom?.resolve()
+ if(!family_heirloom)
+ to_chat(quirk_holder, span_boldnotice("A wave of existential dread runs over you as you realize your precious family heirloom is missing. Perhaps the Gods will show mercy on your cursed soul?"))
+ return
+ family_heirloom.AddComponent(/datum/component/heirloom, quirk_holder.mind, family_name)
+
+ return ..()
+
+/datum/quirk/item_quirk/family_heirloom/process()
+ if(quirk_holder.stat == DEAD)
+ return
+
+ var/obj/family_heirloom = heirloom?.resolve()
+
+ if(family_heirloom && (family_heirloom in quirk_holder.get_all_contents()))
+ quirk_holder.clear_mood_event("family_heirloom_missing")
+ quirk_holder.add_mood_event("family_heirloom", /datum/mood_event/family_heirloom)
+ else
+ quirk_holder.clear_mood_event("family_heirloom")
+ quirk_holder.add_mood_event("family_heirloom_missing", /datum/mood_event/family_heirloom_missing)
+
+/datum/quirk/item_quirk/family_heirloom/remove()
+ quirk_holder.clear_mood_event("family_heirloom_missing")
+ quirk_holder.clear_mood_event("family_heirloom")
diff --git a/code/datums/quirks/negative_quirks/frail.dm b/code/datums/quirks/negative_quirks/frail.dm
new file mode 100644
index 00000000000..6b806875ea2
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/frail.dm
@@ -0,0 +1,11 @@
+/datum/quirk/frail
+ name = "Frail"
+ desc = "You have skin of paper and bones of glass! You suffer wounds much more easily than most."
+ icon = FA_ICON_SKULL
+ value = -6
+ mob_trait = TRAIT_EASILY_WOUNDED
+ gain_text = span_danger("You feel frail.")
+ lose_text = span_notice("You feel sturdy again.")
+ medical_record_text = "Patient is absurdly easy to injure. Please take all due diligence to avoid possible malpractice suits."
+ hardcore_value = 4
+ mail_goodies = list(/obj/effect/spawner/random/medical/minor_healing)
diff --git a/code/datums/quirks/negative_quirks/glass_jaw.dm b/code/datums/quirks/negative_quirks/glass_jaw.dm
new file mode 100644
index 00000000000..33ad19add6d
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/glass_jaw.dm
@@ -0,0 +1,52 @@
+/datum/quirk/glass_jaw
+ name = "Glass Jaw"
+ desc = "You have a very fragile jaw. Any sufficiently hard blow to your head might knock you out."
+ icon = FA_ICON_HAND_FIST
+ value = -4
+ gain_text = span_danger("Your jaw feels loose.")
+ lose_text = span_notice("Your jaw feels fitting again.")
+ medical_record_text = "Patient is absurdly easy to knock out. Do not allow them near a boxing ring."
+ hardcore_value = 4
+ mail_goodies = list(
+ /obj/item/clothing/gloves/boxing,
+ /obj/item/clothing/mask/luchador/rudos,
+ )
+
+/datum/quirk/glass_jaw/New()
+ . = ..()
+ //randomly picks between blue or red equipment for goodies
+ if(prob(50))
+ mail_goodies = list(
+ /obj/item/clothing/gloves/boxing,
+ /obj/item/clothing/mask/luchador/rudos,
+ )
+ else
+ mail_goodies = list(
+ /obj/item/clothing/gloves/boxing/blue,
+ /obj/item/clothing/mask/luchador/tecnicos,
+ )
+
+/datum/quirk/glass_jaw/add(client/client_source)
+ RegisterSignal(quirk_holder, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(punch_out))
+
+/datum/quirk/glass_jaw/remove()
+ UnregisterSignal(quirk_holder, COMSIG_MOB_APPLY_DAMAGE)
+
+/datum/quirk/glass_jaw/proc/punch_out(mob/living/carbon/source, damage, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, attacking_item)
+ SIGNAL_HANDLER
+ if((damagetype != BRUTE) || (def_zone != BODY_ZONE_HEAD))
+ return
+ var/actual_damage = damage - (damage * blocked/100)
+ //only roll for knockouts at 5 damage or more
+ if(actual_damage < 5)
+ return
+ //blunt items are more likely to knock out, but sharp ones are still capable of doing it
+ if(prob(CEILING(actual_damage * (sharpness & (SHARP_EDGED|SHARP_POINTY) ? 0.65 : 1), 1)))
+ //don't display the message if little mac is already KO'd
+ if(!source.IsUnconscious())
+ source.visible_message(
+ span_warning("[source] gets knocked out!"),
+ span_userdanger("You get knocked out!"),
+ vision_distance = COMBAT_MESSAGE_RANGE,
+ )
+ source.Unconscious(3 SECONDS)
diff --git a/code/datums/quirks/negative_quirks/heavy_sleeper.dm b/code/datums/quirks/negative_quirks/heavy_sleeper.dm
new file mode 100644
index 00000000000..dea79683915
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/heavy_sleeper.dm
@@ -0,0 +1,19 @@
+/datum/quirk/heavy_sleeper
+ name = "Heavy Sleeper"
+ desc = "You sleep like a rock! Whenever you're put to sleep or knocked unconscious, you take a little bit longer to wake up."
+ icon = FA_ICON_BED
+ value = -2
+ mob_trait = TRAIT_HEAVY_SLEEPER
+ gain_text = span_danger("You feel sleepy.")
+ lose_text = span_notice("You feel awake again.")
+ medical_record_text = "Patient has abnormal sleep study results and is difficult to wake up."
+ hardcore_value = 2
+ mail_goodies = list(
+ /obj/item/clothing/glasses/blindfold,
+ /obj/item/bedsheet/random,
+ /obj/item/clothing/under/misc/pj/red,
+ /obj/item/clothing/head/costume/nightcap/red,
+ /obj/item/clothing/under/misc/pj/blue,
+ /obj/item/clothing/head/costume/nightcap/blue,
+ /obj/item/pillow/random,
+ )
diff --git a/code/datums/quirks/negative_quirks/hemiplegic.dm b/code/datums/quirks/negative_quirks/hemiplegic.dm
new file mode 100644
index 00000000000..459b880fad2
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/hemiplegic.dm
@@ -0,0 +1,22 @@
+/datum/quirk/hemiplegic
+ name = "Hemiplegic"
+ desc = "Half of your body doesn't work. Nothing will ever fix this."
+ icon = FA_ICON_CIRCLE_HALF_STROKE
+ value = -10 // slightly more bearable than paraplegic but not by much
+ gain_text = null // Handled by trauma.
+ lose_text = null
+ medical_record_text = "Patient has an untreatable impairment in motor function on half of their body."
+ hardcore_value = 10
+ mail_goodies = list(
+ /obj/item/stack/sheet/mineral/uranium/half, //half a stack of a material that has a half life
+ /obj/item/reagent_containers/cup/glass/drinkingglass/filled/half_full,
+ )
+
+/datum/quirk/hemiplegic/add(client/client_source)
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ var/trauma_type = pick(/datum/brain_trauma/severe/paralysis/hemiplegic/left, /datum/brain_trauma/severe/paralysis/hemiplegic/right)
+ human_holder.gain_trauma(trauma_type, TRAUMA_RESILIENCE_ABSOLUTE)
+
+/datum/quirk/hemiplegic/remove()
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ human_holder.cure_trauma_type(/datum/brain_trauma/severe/paralysis/hemiplegic, TRAUMA_RESILIENCE_ABSOLUTE)
diff --git a/code/datums/quirks/negative_quirks/hypersensitive.dm b/code/datums/quirks/negative_quirks/hypersensitive.dm
new file mode 100644
index 00000000000..f51e72fc256
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/hypersensitive.dm
@@ -0,0 +1,18 @@
+/datum/quirk/hypersensitive
+ name = "Hypersensitive"
+ desc = "For better or worse, everything seems to affect your mood more than it should."
+ icon = FA_ICON_FLUSHED
+ value = -2
+ gain_text = span_danger("You seem to make a big deal out of everything.")
+ lose_text = span_notice("You don't seem to make a big deal out of everything anymore.")
+ medical_record_text = "Patient demonstrates a high level of emotional volatility."
+ hardcore_value = 3
+ mail_goodies = list(/obj/effect/spawner/random/entertainment/plushie_delux)
+
+/datum/quirk/hypersensitive/add(client/client_source)
+ if (quirk_holder.mob_mood)
+ quirk_holder.mob_mood.mood_modifier += 0.5
+
+/datum/quirk/hypersensitive/remove()
+ if (quirk_holder.mob_mood)
+ quirk_holder.mob_mood.mood_modifier -= 0.5
diff --git a/code/datums/quirks/negative_quirks/illiterate.dm b/code/datums/quirks/negative_quirks/illiterate.dm
new file mode 100644
index 00000000000..8101985f8f7
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/illiterate.dm
@@ -0,0 +1,9 @@
+/datum/quirk/illiterate
+ name = "Illiterate"
+ desc = "You dropped out of school and are unable to read or write. This affects reading, writing, using computers and other electronics."
+ icon = FA_ICON_GRADUATION_CAP
+ value = -8
+ mob_trait = TRAIT_ILLITERATE
+ medical_record_text = "Patient is not literate."
+ hardcore_value = 8
+ mail_goodies = list(/obj/item/pai_card) // can read things for you
diff --git a/code/datums/quirks/negative_quirks/indebted.dm b/code/datums/quirks/negative_quirks/indebted.dm
new file mode 100644
index 00000000000..1e30e7800d6
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/indebted.dm
@@ -0,0 +1,40 @@
+/datum/quirk/indebted
+ name = "Indebted"
+ desc = "Bad life decisions, medical bills, student loans, whatever it may be, you've incurred quite the debt. A portion of all you receive will go towards extinguishing it."
+ icon = FA_ICON_DOLLAR
+ quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_HIDE_FROM_SCAN
+ value = -2
+ medical_record_text = "Alas, the patient struggled to scrape together enough money to pay the checkup bill."
+ hardcore_value = 2
+
+/datum/quirk/indebted/add_unique(client/client_source)
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ if(!human_holder.account_id)
+ return
+ var/datum/bank_account/account = SSeconomy.bank_accounts_by_id["[human_holder.account_id]"]
+ var/debt = PAYCHECK_CREW * rand(275, 325)
+ account.account_debt += debt
+ RegisterSignal(account, COMSIG_BANK_ACCOUNT_DEBT_PAID, PROC_REF(on_debt_paid))
+ to_chat(client_source.mob, span_warning("You remember, you've a hefty, [debt] credits debt to pay..."))
+
+///Once the debt is extinguished, award an achievement and a pin for actually taking care of it.
+/datum/quirk/indebted/proc/on_debt_paid(datum/bank_account/source)
+ SIGNAL_HANDLER
+ if(source.account_debt)
+ return
+ UnregisterSignal(source, COMSIG_BANK_ACCOUNT_DEBT_PAID)
+ ///The debt was extinguished while the quirk holder was logged out, so let's kindly award it once they come back.
+ if(!quirk_holder.client)
+ RegisterSignal(quirk_holder, COMSIG_MOB_LOGIN, PROC_REF(award_on_login))
+ else
+ quirk_holder.client.give_award(/datum/award/achievement/misc/debt_extinguished, quirk_holder)
+ podspawn(list(
+ "target" = get_turf(quirk_holder),
+ "style" = STYLE_BLUESPACE,
+ "spawn" = /obj/item/clothing/accessory/debt_payer_pin,
+ ))
+
+/datum/quirk/indebted/proc/award_on_login(mob/source)
+ SIGNAL_HANDLER
+ quirk_holder.client.give_award(/datum/award/achievement/misc/debt_extinguished, quirk_holder)
+ UnregisterSignal(source, COMSIG_MOB_LOGIN)
diff --git a/code/datums/quirks/negative_quirks/insanity.dm b/code/datums/quirks/negative_quirks/insanity.dm
new file mode 100644
index 00000000000..56b56a53812
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/insanity.dm
@@ -0,0 +1,41 @@
+/datum/quirk/insanity
+ name = "Reality Dissociation Syndrome"
+ desc = "You suffer from a severe disorder that causes very vivid hallucinations. \
+ Mindbreaker toxin can suppress its effects, and you are immune to mindbreaker's hallucinogenic properties. \
+ THIS IS NOT A LICENSE TO GRIEF."
+ icon = FA_ICON_GRIN_TONGUE_WINK
+ value = -8
+ gain_text = span_userdanger("...")
+ lose_text = span_notice("You feel in tune with the world again.")
+ medical_record_text = "Patient suffers from acute Reality Dissociation Syndrome and experiences vivid hallucinations."
+ hardcore_value = 6
+ mail_goodies = list(/obj/item/storage/pill_bottle/lsdpsych)
+ /// Weakref to the trauma we give out
+ var/datum/weakref/added_trama_ref
+
+/datum/quirk/insanity/add(client/client_source)
+ if(!iscarbon(quirk_holder))
+ return
+ var/mob/living/carbon/carbon_quirk_holder = quirk_holder
+
+ // Setup our special RDS mild hallucination.
+ // Not a unique subtype so not to plague subtypesof,
+ // also as we inherit the names and values from our quirk.
+ var/datum/brain_trauma/mild/hallucinations/added_trauma = new()
+ added_trauma.resilience = TRAUMA_RESILIENCE_ABSOLUTE
+ added_trauma.name = name
+ added_trauma.desc = medical_record_text
+ added_trauma.scan_desc = lowertext(name)
+ added_trauma.gain_text = null
+ added_trauma.lose_text = null
+
+ carbon_quirk_holder.gain_trauma(added_trauma)
+ added_trama_ref = WEAKREF(added_trauma)
+
+/datum/quirk/insanity/post_add()
+ var/rds_policy = get_policy("[type]") || "Please note that your [lowertext(name)] does NOT give you any additional right to attack people or cause chaos."
+ // I don't /think/ we'll need this, but for newbies who think "roleplay as insane" = "license to kill", it's probably a good thing to have.
+ to_chat(quirk_holder, span_big(span_info(rds_policy)))
+
+/datum/quirk/insanity/remove()
+ QDEL_NULL(added_trama_ref)
diff --git a/code/datums/quirks/negative_quirks/junkie.dm b/code/datums/quirks/negative_quirks/junkie.dm
new file mode 100644
index 00000000000..269f6d2d96e
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/junkie.dm
@@ -0,0 +1,216 @@
+/datum/quirk/item_quirk/junkie
+ name = "Junkie"
+ desc = "You can't get enough of hard drugs."
+ icon = FA_ICON_PILLS
+ value = -6
+ gain_text = span_danger("You suddenly feel the craving for drugs.")
+ medical_record_text = "Patient has a history of hard drugs."
+ hardcore_value = 4
+ quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES
+ mail_goodies = list(/obj/effect/spawner/random/contraband/narcotics)
+ var/drug_list = list(/datum/reagent/drug/blastoff, /datum/reagent/drug/krokodil, /datum/reagent/medicine/morphine, /datum/reagent/drug/happiness, /datum/reagent/drug/methamphetamine) //List of possible IDs
+ var/datum/reagent/reagent_type //!If this is defined, reagent_id will be unused and the defined reagent type will be instead.
+ var/datum/reagent/reagent_instance //! actual instanced version of the reagent
+ var/where_drug //! Where the drug spawned
+ var/obj/item/drug_container_type //! If this is defined before pill generation, pill generation will be skipped. This is the type of the pill bottle.
+ var/where_accessory //! where the accessory spawned
+ var/obj/item/accessory_type //! If this is null, an accessory won't be spawned.
+ var/process_interval = 30 SECONDS //! how frequently the quirk processes
+ var/next_process = 0 //! ticker for processing
+ var/drug_flavour_text = "Better hope you don't run out..."
+
+/datum/quirk/item_quirk/junkie/add_unique(client/client_source)
+ var/mob/living/carbon/human/human_holder = quirk_holder
+
+ if(!reagent_type)
+ reagent_type = pick(drug_list)
+
+ reagent_instance = new reagent_type()
+
+ for(var/addiction in reagent_instance.addiction_types)
+ human_holder.last_mind?.add_addiction_points(addiction, 1000)
+
+ var/current_turf = get_turf(quirk_holder)
+
+ if(!drug_container_type)
+ drug_container_type = /obj/item/storage/pill_bottle
+
+ var/obj/item/drug_instance = new drug_container_type(current_turf)
+ if(istype(drug_instance, /obj/item/storage/pill_bottle))
+ var/pill_state = "pill[rand(1,20)]"
+ for(var/i in 1 to 7)
+ var/obj/item/reagent_containers/pill/pill = new(drug_instance)
+ pill.icon_state = pill_state
+ pill.reagents.add_reagent(reagent_type, 3)
+
+ give_item_to_holder(
+ drug_instance,
+ list(
+ LOCATION_LPOCKET = ITEM_SLOT_LPOCKET,
+ LOCATION_RPOCKET = ITEM_SLOT_RPOCKET,
+ LOCATION_BACKPACK = ITEM_SLOT_BACKPACK,
+ LOCATION_HANDS = ITEM_SLOT_HANDS,
+ ),
+ flavour_text = drug_flavour_text,
+ )
+
+ if(accessory_type)
+ give_item_to_holder(
+ accessory_type,
+ list(
+ LOCATION_LPOCKET = ITEM_SLOT_LPOCKET,
+ LOCATION_RPOCKET = ITEM_SLOT_RPOCKET,
+ LOCATION_BACKPACK = ITEM_SLOT_BACKPACK,
+ LOCATION_HANDS = ITEM_SLOT_HANDS,
+ )
+ )
+
+/datum/quirk/item_quirk/junkie/remove()
+ if(quirk_holder && reagent_instance)
+ for(var/addiction_type in subtypesof(/datum/addiction))
+ quirk_holder.mind.remove_addiction_points(addiction_type, MAX_ADDICTION_POINTS)
+
+/datum/quirk/item_quirk/junkie/process(seconds_per_tick)
+ if(HAS_TRAIT(quirk_holder, TRAIT_LIVERLESS_METABOLISM))
+ return
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ if(world.time > next_process)
+ next_process = world.time + process_interval
+ var/deleted = QDELETED(reagent_instance)
+ var/missing_addiction = FALSE
+ for(var/addiction_type in reagent_instance.addiction_types)
+ if(!LAZYACCESS(human_holder.last_mind?.active_addictions, addiction_type))
+ missing_addiction = TRUE
+ if(deleted || missing_addiction)
+ if(deleted)
+ reagent_instance = new reagent_type()
+ to_chat(quirk_holder, span_danger("You thought you kicked it, but you feel like you're falling back onto bad habits.."))
+ for(var/addiction in reagent_instance.addiction_types)
+ human_holder.last_mind?.add_addiction_points(addiction, 1000) ///Max that shit out
+
+/datum/quirk/item_quirk/junkie/smoker
+ name = "Smoker"
+ desc = "Sometimes you just really want a smoke. Probably not great for your lungs."
+ icon = FA_ICON_SMOKING
+ value = -4
+ gain_text = span_danger("You could really go for a smoke right about now.")
+ lose_text = span_notice("You don't feel nearly as hooked to nicotine anymore.")
+ medical_record_text = "Patient is a current smoker."
+ reagent_type = /datum/reagent/drug/nicotine
+ accessory_type = /obj/item/lighter/greyscale
+ mob_trait = TRAIT_SMOKER
+ hardcore_value = 1
+ drug_flavour_text = "Make sure you get your favorite brand when you run out."
+ mail_goodies = list(
+ /obj/effect/spawner/random/entertainment/cigarette_pack,
+ /obj/effect/spawner/random/entertainment/cigar,
+ /obj/effect/spawner/random/entertainment/lighter,
+ /obj/item/clothing/mask/cigarette/pipe,
+ )
+
+/datum/quirk/item_quirk/junkie/smoker/New()
+ drug_container_type = pick(/obj/item/storage/fancy/cigarettes,
+ /obj/item/storage/fancy/cigarettes/cigpack_midori,
+ /obj/item/storage/fancy/cigarettes/cigpack_uplift,
+ /obj/item/storage/fancy/cigarettes/cigpack_robust,
+ /obj/item/storage/fancy/cigarettes/cigpack_robustgold,
+ /obj/item/storage/fancy/cigarettes/cigpack_carp)
+
+ return ..()
+
+/datum/quirk/item_quirk/junkie/smoker/post_add()
+ . = ..()
+ quirk_holder.add_mob_memory(/datum/memory/key/quirk_smoker, protagonist = quirk_holder, preferred_brand = initial(drug_container_type.name))
+ // smoker lungs have 25% less health and healing
+ var/mob/living/carbon/carbon_holder = quirk_holder
+ var/obj/item/organ/internal/lungs/smoker_lungs = null
+ var/obj/item/organ/internal/lungs/old_lungs = carbon_holder.get_organ_slot(ORGAN_SLOT_LUNGS)
+ if(old_lungs && IS_ORGANIC_ORGAN(old_lungs))
+ if(isplasmaman(carbon_holder))
+ smoker_lungs = /obj/item/organ/internal/lungs/plasmaman/plasmaman_smoker
+ else if(isethereal(carbon_holder))
+ smoker_lungs = /obj/item/organ/internal/lungs/ethereal/ethereal_smoker
+ else
+ smoker_lungs = /obj/item/organ/internal/lungs/smoker_lungs
+ if(!isnull(smoker_lungs))
+ smoker_lungs = new smoker_lungs
+ smoker_lungs.Insert(carbon_holder, special = TRUE, drop_if_replaced = FALSE)
+
+/datum/quirk/item_quirk/junkie/smoker/process(seconds_per_tick)
+ . = ..()
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ var/obj/item/mask_item = human_holder.get_item_by_slot(ITEM_SLOT_MASK)
+ if(istype(mask_item, /obj/item/clothing/mask/cigarette))
+ var/obj/item/storage/fancy/cigarettes/cigarettes = drug_container_type
+ if(istype(mask_item, initial(cigarettes.spawn_type)))
+ quirk_holder.clear_mood_event("wrong_cigs")
+ else
+ quirk_holder.add_mood_event("wrong_cigs", /datum/mood_event/wrong_brand)
+
+/datum/quirk/item_quirk/junkie/alcoholic
+ name = "Alcoholic"
+ desc = "You just can't live without alcohol. Your liver is a machine that turns ethanol into acetaldehyde."
+ icon = FA_ICON_WINE_GLASS
+ value = -4
+ gain_text = span_danger("You really need a drink.")
+ lose_text = span_notice("Alcohol doesn't seem nearly as enticing anymore.")
+ medical_record_text = "Patient is an alcoholic."
+ reagent_type = /datum/reagent/consumable/ethanol
+ drug_container_type = /obj/item/reagent_containers/cup/glass/bottle/whiskey
+ mob_trait = TRAIT_HEAVY_DRINKER
+ hardcore_value = 1
+ drug_flavour_text = "Make sure you get your favorite type of drink when you run out."
+ mail_goodies = list(
+ /obj/effect/spawner/random/food_or_drink/booze,
+ /obj/item/book/bible/booze,
+ )
+ /// Cached typepath of the owner's favorite alcohol reagent
+ var/datum/reagent/consumable/ethanol/favorite_alcohol
+
+/datum/quirk/item_quirk/junkie/alcoholic/New()
+ drug_container_type = pick(
+ /obj/item/reagent_containers/cup/glass/bottle/whiskey,
+ /obj/item/reagent_containers/cup/glass/bottle/vodka,
+ /obj/item/reagent_containers/cup/glass/bottle/ale,
+ /obj/item/reagent_containers/cup/glass/bottle/beer,
+ /obj/item/reagent_containers/cup/glass/bottle/hcider,
+ /obj/item/reagent_containers/cup/glass/bottle/wine,
+ /obj/item/reagent_containers/cup/glass/bottle/sake,
+ )
+
+ return ..()
+
+/datum/quirk/item_quirk/junkie/alcoholic/post_add()
+ . = ..()
+ RegisterSignal(quirk_holder, COMSIG_MOB_REAGENT_CHECK, PROC_REF(check_brandy))
+
+ var/obj/item/reagent_containers/brandy_container = GLOB.alcohol_containers[drug_container_type]
+ if(isnull(brandy_container))
+ stack_trace("Alcoholic quirk added while the GLOB.alcohol_containers is (somehow) not initialized!")
+ brandy_container = new drug_container_type
+ favorite_alcohol = brandy_container.list_reagents[1]
+ qdel(brandy_container)
+ else
+ favorite_alcohol = brandy_container.list_reagents[1]
+
+ quirk_holder.add_mob_memory(/datum/memory/key/quirk_alcoholic, protagonist = quirk_holder, preferred_brandy = initial(favorite_alcohol.name))
+ // alcoholic livers have 25% less health and healing
+ var/obj/item/organ/internal/liver/alcohol_liver = quirk_holder.get_organ_slot(ORGAN_SLOT_LIVER)
+ if(alcohol_liver && IS_ORGANIC_ORGAN(alcohol_liver)) // robotic livers aren't affected
+ alcohol_liver.maxHealth = alcohol_liver.maxHealth * 0.75
+ alcohol_liver.healing_factor = alcohol_liver.healing_factor * 0.75
+
+/datum/quirk/item_quirk/junkie/alcoholic/remove()
+ UnregisterSignal(quirk_holder, COMSIG_MOB_REAGENT_CHECK)
+
+/datum/quirk/item_quirk/junkie/alcoholic/proc/check_brandy(mob/source, datum/reagent/booze)
+ SIGNAL_HANDLER
+
+ //we don't care if it is not alcohol
+ if(!istype(booze, /datum/reagent/consumable/ethanol))
+ return
+
+ if(istype(booze, favorite_alcohol))
+ quirk_holder.clear_mood_event("wrong_alcohol")
+ else
+ quirk_holder.add_mood_event("wrong_alcohol", /datum/mood_event/wrong_brandy)
diff --git a/code/datums/quirks/negative_quirks/light_drinker.dm b/code/datums/quirks/negative_quirks/light_drinker.dm
new file mode 100644
index 00000000000..5f82e2b9cd7
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/light_drinker.dm
@@ -0,0 +1,11 @@
+/datum/quirk/light_drinker
+ name = "Light Drinker"
+ desc = "You just can't handle your drinks and get drunk very quickly."
+ icon = FA_ICON_COCKTAIL
+ value = -2
+ mob_trait = TRAIT_LIGHT_DRINKER
+ gain_text = span_notice("Just the thought of drinking alcohol makes your head spin.")
+ lose_text = span_danger("You're no longer severely affected by alcohol.")
+ medical_record_text = "Patient demonstrates a low tolerance for alcohol. (Wimp)"
+ hardcore_value = 3
+ mail_goodies = list(/obj/item/reagent_containers/cup/glass/waterbottle)
diff --git a/code/datums/quirks/negative_quirks/mute.dm b/code/datums/quirks/negative_quirks/mute.dm
new file mode 100644
index 00000000000..44706c4d434
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/mute.dm
@@ -0,0 +1,10 @@
+/datum/quirk/mute
+ name = "Mute"
+ desc = "For some reason you are completely unable to speak."
+ icon = FA_ICON_VOLUME_XMARK
+ value = -4
+ mob_trait = TRAIT_MUTE
+ gain_text = span_danger("You find yourself unable to speak!")
+ lose_text = span_notice("You feel a growing strength in your vocal chords.")
+ medical_record_text = "The patient is unable to use their voice in any capacity."
+ hardcore_value = 4
diff --git a/code/datums/quirks/negative_quirks/nearsighted.dm b/code/datums/quirks/negative_quirks/nearsighted.dm
new file mode 100644
index 00000000000..6a5397b6504
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/nearsighted.dm
@@ -0,0 +1,30 @@
+/datum/quirk/item_quirk/nearsighted
+ name = "Nearsighted"
+ desc = "You are nearsighted without prescription glasses, but spawn with a pair."
+ icon = FA_ICON_GLASSES
+ value = -4
+ gain_text = span_danger("Things far away from you start looking blurry.")
+ lose_text = span_notice("You start seeing faraway things normally again.")
+ medical_record_text = "Patient requires prescription glasses in order to counteract nearsightedness."
+ hardcore_value = 5
+ quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE
+ mail_goodies = list(/obj/item/clothing/glasses/regular) // extra pair if orginal one gets broken by somebody mean
+
+/datum/quirk/item_quirk/nearsighted/add_unique(client/client_source)
+ var/glasses_name = client_source?.prefs.read_preference(/datum/preference/choiced/glasses) || "Regular"
+ var/obj/item/clothing/glasses/glasses_type
+
+ glasses_name = glasses_name == "Random" ? pick(GLOB.nearsighted_glasses) : glasses_name
+ glasses_type = GLOB.nearsighted_glasses[glasses_name]
+
+ give_item_to_holder(glasses_type, list(
+ LOCATION_EYES = ITEM_SLOT_EYES,
+ LOCATION_BACKPACK = ITEM_SLOT_BACKPACK,
+ LOCATION_HANDS = ITEM_SLOT_HANDS,
+ ))
+
+/datum/quirk/item_quirk/nearsighted/add(client/client_source)
+ quirk_holder.become_nearsighted(QUIRK_TRAIT)
+
+/datum/quirk/item_quirk/nearsighted/remove()
+ quirk_holder.cure_nearsighted(QUIRK_TRAIT)
diff --git a/code/datums/quirks/negative_quirks/non_violent.dm b/code/datums/quirks/negative_quirks/non_violent.dm
new file mode 100644
index 00000000000..e1dbb0e6480
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/non_violent.dm
@@ -0,0 +1,11 @@
+/datum/quirk/nonviolent
+ name = "Pacifist"
+ desc = "The thought of violence makes you sick. So much so, in fact, that you can't hurt anyone."
+ icon = FA_ICON_PEACE
+ value = -8
+ mob_trait = TRAIT_PACIFISM
+ gain_text = span_danger("You feel repulsed by the thought of violence!")
+ lose_text = span_notice("You think you can defend yourself again.")
+ medical_record_text = "Patient is unusually pacifistic and cannot bring themselves to cause physical harm."
+ hardcore_value = 6
+ mail_goodies = list(/obj/effect/spawner/random/decoration/flower, /obj/effect/spawner/random/contraband/cannabis) // flower power
diff --git a/code/datums/quirks/negative_quirks/numb.dm b/code/datums/quirks/negative_quirks/numb.dm
new file mode 100644
index 00000000000..cd4f28cb302
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/numb.dm
@@ -0,0 +1,15 @@
+/datum/quirk/numb
+ name = "Numb"
+ desc = "You can't feel pain at all."
+ icon = FA_ICON_STAR_OF_LIFE
+ value = -4
+ gain_text = "You feel your body becoming numb."
+ lose_text = "The numbness subsides."
+ medical_record_text = "The patient exhibits congenital hypoesthesia, making them insensitive to pain stimuli."
+ hardcore_value = 4
+
+/datum/quirk/numb/add(client/client_source)
+ quirk_holder.apply_status_effect(/datum/status_effect/grouped/screwy_hud/fake_healthy, type)
+
+/datum/quirk/numb/remove(client/client_source)
+ quirk_holder.remove_status_effect(/datum/status_effect/grouped/screwy_hud/fake_healthy, type)
diff --git a/code/datums/quirks/negative_quirks/nyctophobia.dm b/code/datums/quirks/negative_quirks/nyctophobia.dm
new file mode 100644
index 00000000000..af891a2058a
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/nyctophobia.dm
@@ -0,0 +1,46 @@
+/datum/quirk/nyctophobia
+ name = "Nyctophobia"
+ desc = "As far as you can remember, you've always been afraid of the dark. While in the dark without a light source, you instinctively act careful, and constantly feel a sense of dread."
+ icon = FA_ICON_LIGHTBULB
+ value = -3
+ medical_record_text = "Patient demonstrates a fear of the dark. (Seriously?)"
+ hardcore_value = 5
+ mail_goodies = list(/obj/effect/spawner/random/engineering/flashlight)
+
+/datum/quirk/nyctophobia/add(client/client_source)
+ RegisterSignal(quirk_holder, COMSIG_MOVABLE_MOVED, PROC_REF(on_holder_moved))
+
+/datum/quirk/nyctophobia/remove()
+ UnregisterSignal(quirk_holder, COMSIG_MOVABLE_MOVED)
+ quirk_holder.clear_mood_event("nyctophobia")
+
+/// Called when the quirk holder moves. Updates the quirk holder's mood.
+/datum/quirk/nyctophobia/proc/on_holder_moved(mob/living/source, atom/old_loc, dir, forced)
+ SIGNAL_HANDLER
+
+ if(quirk_holder.stat != CONSCIOUS || quirk_holder.IsSleeping() || quirk_holder.IsUnconscious())
+ return
+
+ if(HAS_TRAIT(quirk_holder, TRAIT_FEARLESS))
+ return
+
+ var/mob/living/carbon/human/human_holder = quirk_holder
+
+ if(human_holder.dna?.species.id in list(SPECIES_SHADOW, SPECIES_NIGHTMARE))
+ return
+
+ if((human_holder.sight & SEE_TURFS) == SEE_TURFS)
+ return
+
+ var/turf/holder_turf = get_turf(quirk_holder)
+
+ var/lums = holder_turf.get_lumcount()
+
+ if(lums > LIGHTING_TILE_IS_DARK)
+ quirk_holder.clear_mood_event("nyctophobia")
+ return
+
+ 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/negative_quirks/paraplegic.dm b/code/datums/quirks/negative_quirks/paraplegic.dm
new file mode 100644
index 00000000000..58e1c4ba31e
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/paraplegic.dm
@@ -0,0 +1,41 @@
+/datum/quirk/paraplegic
+ name = "Paraplegic"
+ desc = "Your legs do not function. Nothing will ever fix this. But hey, free wheelchair!"
+ icon = FA_ICON_WHEELCHAIR
+ value = -12
+ gain_text = null // Handled by trauma.
+ lose_text = null
+ medical_record_text = "Patient has an untreatable impairment in motor function in the lower extremities."
+ hardcore_value = 15
+ mail_goodies = list(/obj/vehicle/ridden/wheelchair/motorized) //yes a fullsized unfolded motorized wheelchair does fit
+
+/datum/quirk/paraplegic/add_unique(client/client_source)
+ if(quirk_holder.buckled) // Handle late joins being buckled to arrival shuttle chairs.
+ quirk_holder.buckled.unbuckle_mob(quirk_holder)
+
+ var/turf/holder_turf = get_turf(quirk_holder)
+ var/obj/structure/chair/spawn_chair = locate() in holder_turf
+
+ var/obj/vehicle/ridden/wheelchair/wheels
+ if(client_source?.get_award_status(/datum/award/score/hardcore_random) >= 5000) //More than 5k score? you unlock the gamer wheelchair.
+ wheels = new /obj/vehicle/ridden/wheelchair/gold(holder_turf)
+ else
+ wheels = new(holder_turf)
+ if(spawn_chair) // Makes spawning on the arrivals shuttle more consistent looking
+ wheels.setDir(spawn_chair.dir)
+
+ wheels.buckle_mob(quirk_holder)
+
+ // During the spawning process, they may have dropped what they were holding, due to the paralysis
+ // So put the things back in their hands.
+ for(var/obj/item/dropped_item in holder_turf)
+ if(dropped_item.fingerprintslast == quirk_holder.ckey)
+ quirk_holder.put_in_hands(dropped_item)
+
+/datum/quirk/paraplegic/add(client/client_source)
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ human_holder.gain_trauma(/datum/brain_trauma/severe/paralysis/paraplegic, TRAUMA_RESILIENCE_ABSOLUTE)
+
+/datum/quirk/paraplegic/remove()
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ human_holder.cure_trauma_type(/datum/brain_trauma/severe/paralysis/paraplegic, TRAUMA_RESILIENCE_ABSOLUTE)
diff --git a/code/datums/quirks/negative_quirks/photophobia.dm b/code/datums/quirks/negative_quirks/photophobia.dm
new file mode 100644
index 00000000000..b543aeda076
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/photophobia.dm
@@ -0,0 +1,75 @@
+#define MOOD_CATEGORY_PHOTOPHOBIA "photophobia"
+
+/datum/quirk/photophobia
+ name = "Photophobia"
+ desc = "Bright lights seem to bother you more than others. Maybe it's a medical condition."
+ icon = FA_ICON_ARROWS_TO_EYE
+ value = -4
+ gain_text = span_danger("The safety of light feels off...")
+ lose_text = span_notice("Enlightening.")
+ medical_record_text = "Patient has acute phobia of light, and insists it is physically harmful."
+ hardcore_value = 4
+ mail_goodies = list(
+ /obj/item/flashlight/flashdark,
+ /obj/item/food/grown/mushroom/glowshroom/shadowshroom,
+ /obj/item/skillchip/light_remover,
+ )
+
+/datum/quirk/photophobia/add(client/client_source)
+ RegisterSignal(quirk_holder, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(check_eyes))
+ RegisterSignal(quirk_holder, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(restore_eyes))
+ RegisterSignal(quirk_holder, COMSIG_MOVABLE_MOVED, PROC_REF(on_holder_moved))
+ update_eyes(quirk_holder.get_organ_slot(ORGAN_SLOT_EYES))
+
+/datum/quirk/photophobia/remove()
+ UnregisterSignal(quirk_holder, list(
+ COMSIG_CARBON_GAIN_ORGAN,
+ COMSIG_CARBON_LOSE_ORGAN,
+ COMSIG_MOVABLE_MOVED,))
+ quirk_holder.clear_mood_event(MOOD_CATEGORY_PHOTOPHOBIA)
+ var/obj/item/organ/internal/eyes/normal_eyes = quirk_holder.get_organ_slot(ORGAN_SLOT_EYES)
+ if(istype(normal_eyes))
+ normal_eyes.flash_protect = initial(normal_eyes.flash_protect)
+
+/datum/quirk/photophobia/proc/check_eyes(obj/item/organ/internal/eyes/sensitive_eyes)
+ SIGNAL_HANDLER
+ if(!istype(sensitive_eyes))
+ return
+ update_eyes(sensitive_eyes)
+
+/datum/quirk/photophobia/proc/update_eyes(obj/item/organ/internal/eyes/target_eyes)
+ if(!istype(target_eyes))
+ return
+ target_eyes.flash_protect = max(target_eyes.flash_protect - 1, FLASH_PROTECTION_HYPER_SENSITIVE)
+
+/datum/quirk/photophobia/proc/restore_eyes(obj/item/organ/internal/eyes/normal_eyes)
+ SIGNAL_HANDLER
+ if(!istype(normal_eyes))
+ return
+ normal_eyes.flash_protect = initial(normal_eyes.flash_protect)
+
+/datum/quirk/photophobia/proc/on_holder_moved(mob/living/source, atom/old_loc, dir, forced)
+ SIGNAL_HANDLER
+
+ if(quirk_holder.stat != CONSCIOUS || quirk_holder.IsSleeping() || quirk_holder.IsUnconscious())
+ return
+
+ if(HAS_TRAIT(quirk_holder, TRAIT_FEARLESS))
+ return
+
+ var/mob/living/carbon/human/human_holder = quirk_holder
+
+ if(human_holder.sight & SEE_TURFS)
+ return
+
+ var/turf/holder_turf = get_turf(quirk_holder)
+
+ var/lums = holder_turf.get_lumcount()
+
+ var/eye_protection = quirk_holder.get_eye_protection()
+ if(lums < LIGHTING_TILE_IS_DARK || eye_protection >= FLASH_PROTECTION_NONE)
+ quirk_holder.clear_mood_event(MOOD_CATEGORY_PHOTOPHOBIA)
+ return
+ quirk_holder.add_mood_event(MOOD_CATEGORY_PHOTOPHOBIA, /datum/mood_event/photophobia)
+
+ #undef MOOD_CATEGORY_PHOTOPHOBIA
diff --git a/code/datums/quirks/negative_quirks/poor_aim.dm b/code/datums/quirks/negative_quirks/poor_aim.dm
new file mode 100644
index 00000000000..d86feb809b0
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/poor_aim.dm
@@ -0,0 +1,19 @@
+/datum/quirk/poor_aim
+ name = "Stormtrooper Aim"
+ desc = "You've never hit anything you were aiming for in your life."
+ icon = FA_ICON_BULLSEYE
+ value = -4
+ medical_record_text = "Patient possesses a strong tremor in both hands."
+ hardcore_value = 3
+ mail_goodies = list(/obj/item/cardboard_cutout) // for target practice
+
+/datum/quirk/poor_aim/add(client/client_source)
+ RegisterSignal(quirk_holder, COMSIG_MOB_FIRED_GUN, PROC_REF(on_mob_fired_gun))
+
+/datum/quirk/poor_aim/remove(client/client_source)
+ UnregisterSignal(quirk_holder, COMSIG_MOB_FIRED_GUN)
+
+/datum/quirk/poor_aim/proc/on_mob_fired_gun(mob/user, obj/item/gun/gun_fired, target, params, zone_override, list/bonus_spread_values)
+ SIGNAL_HANDLER
+ bonus_spread_values[MIN_BONUS_SPREAD_INDEX] += 10
+ bonus_spread_values[MAX_BONUS_SPREAD_INDEX] += 35
diff --git a/code/datums/quirks/negative_quirks/prosopagnosia.dm b/code/datums/quirks/negative_quirks/prosopagnosia.dm
new file mode 100644
index 00000000000..8634e13bf63
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/prosopagnosia.dm
@@ -0,0 +1,9 @@
+/datum/quirk/prosopagnosia
+ name = "Prosopagnosia"
+ desc = "You have a mental disorder that prevents you from being able to recognize faces at all."
+ icon = FA_ICON_USER_SECRET
+ value = -4
+ mob_trait = TRAIT_PROSOPAGNOSIA
+ medical_record_text = "Patient suffers from prosopagnosia and cannot recognize faces."
+ hardcore_value = 5
+ mail_goodies = list(/obj/item/skillchip/appraiser) // bad at recognizing faces but good at recognizing IDs
diff --git a/code/datums/quirks/negative_quirks/prosthetic_limb.dm b/code/datums/quirks/negative_quirks/prosthetic_limb.dm
new file mode 100644
index 00000000000..e7ea4d75788
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/prosthetic_limb.dm
@@ -0,0 +1,33 @@
+/datum/quirk/prosthetic_limb
+ name = "Prosthetic Limb"
+ desc = "An accident caused you to lose one of your limbs. Because of this, you now have a surplus prosthetic!"
+ icon = "tg-prosthetic-leg"
+ value = -3
+ hardcore_value = 3
+ quirk_flags = QUIRK_HUMAN_ONLY | QUIRK_CHANGES_APPEARANCE
+ mail_goodies = list(/obj/item/weldingtool/mini, /obj/item/stack/cable_coil/five)
+ /// The slot to replace, in string form
+ var/slot_string = "limb"
+ /// the original limb from before the prosthetic was applied
+ var/obj/item/bodypart/old_limb
+
+/datum/quirk/prosthetic_limb/add_unique(client/client_source)
+ var/limb_type = GLOB.limb_choice[client_source?.prefs?.read_preference(/datum/preference/choiced/prosthetic)]
+ if(isnull(limb_type)) //Client gone or they chose a random prosthetic
+ limb_type = GLOB.limb_choice[pick(GLOB.limb_choice)]
+
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ var/obj/item/bodypart/surplus = new limb_type()
+ slot_string = "[surplus.plaintext_zone]"
+
+ medical_record_text = "Patient uses a low-budget prosthetic on the [slot_string]."
+ old_limb = human_holder.return_and_replace_bodypart(surplus, special = TRUE)
+
+/datum/quirk/prosthetic_limb/post_add()
+ to_chat(quirk_holder, span_boldannounce("Your [slot_string] has been replaced with a surplus prosthetic. It is fragile and will easily come apart under duress. Additionally, \
+ you need to use a welding tool and cables to repair it, instead of sutures and regenerative meshes."))
+
+/datum/quirk/prosthetic_limb/remove()
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ human_holder.del_and_replace_bodypart(old_limb, special = TRUE)
+ old_limb = null
diff --git a/code/datums/quirks/negative_quirks/prosthetic_organ.dm b/code/datums/quirks/negative_quirks/prosthetic_organ.dm
new file mode 100644
index 00000000000..6330035b5a7
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/prosthetic_organ.dm
@@ -0,0 +1,63 @@
+/datum/quirk/prosthetic_organ
+ name = "Prosthetic Organ"
+ desc = "An accident caused you to lose one of your organs. Because of this, you now have a surplus prosthetic!"
+ icon = FA_ICON_LUNGS
+ value = -3
+ medical_record_text = "During physical examination, patient was found to have a low-budget prosthetic organ. \
+ Removal of these organs is known to be dangerous to the patient as well as the practitioner."
+ hardcore_value = 3
+ mail_goodies = list(/obj/item/storage/organbox)
+ /// The slot to replace, in string form
+ var/slot_string = "organ"
+ /// The original organ from before the prosthetic was applied
+ var/obj/item/organ/old_organ
+
+/datum/quirk/prosthetic_organ/add_unique(client/client_source)
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ var/static/list/organ_slots = list(
+ ORGAN_SLOT_HEART,
+ ORGAN_SLOT_LUNGS,
+ ORGAN_SLOT_LIVER,
+ ORGAN_SLOT_STOMACH,
+ )
+ var/list/possible_organ_slots = organ_slots.Copy()
+ if(HAS_TRAIT(human_holder, TRAIT_NOBLOOD))
+ possible_organ_slots -= ORGAN_SLOT_HEART
+ if(HAS_TRAIT(human_holder, TRAIT_NOBREATH))
+ possible_organ_slots -= ORGAN_SLOT_LUNGS
+ if(HAS_TRAIT(human_holder, TRAIT_LIVERLESS_METABOLISM))
+ possible_organ_slots -= ORGAN_SLOT_LIVER
+ if(HAS_TRAIT(human_holder, TRAIT_NOHUNGER))
+ possible_organ_slots -= ORGAN_SLOT_STOMACH
+ if(!length(organ_slots)) //what the hell
+ return
+ var/organ_slot = pick(possible_organ_slots)
+ var/obj/item/organ/prosthetic
+ switch(organ_slot)
+ if(ORGAN_SLOT_HEART)
+ prosthetic = new /obj/item/organ/internal/heart/cybernetic/surplus
+ slot_string = "heart"
+ if(ORGAN_SLOT_LUNGS)
+ prosthetic = new /obj/item/organ/internal/lungs/cybernetic/surplus
+ slot_string = "lungs"
+ if(ORGAN_SLOT_LIVER)
+ prosthetic = new /obj/item/organ/internal/liver/cybernetic/surplus
+ slot_string = "liver"
+ if(ORGAN_SLOT_STOMACH)
+ prosthetic = new /obj/item/organ/internal/stomach/cybernetic/surplus
+ slot_string = "stomach"
+ medical_record_text = "During physical examination, patient was found to have a low-budget prosthetic [slot_string]. \
+ Removal of these organs is known to be dangerous to the patient as well as the practitioner."
+ old_organ = human_holder.get_organ_slot(organ_slot)
+ if(prosthetic.Insert(human_holder, special = TRUE, drop_if_replaced = TRUE))
+ old_organ.moveToNullspace()
+ STOP_PROCESSING(SSobj, old_organ)
+
+/datum/quirk/prosthetic_organ/post_add()
+ to_chat(quirk_holder, span_boldannounce("Your [slot_string] has been replaced with a surplus organ. It is fragile and will easily come apart under duress. \
+ Additionally, any EMP will make it stop working entirely."))
+
+/datum/quirk/prosthetic_organ/remove()
+ if(old_organ)
+ old_organ.Insert(quirk_holder, special = TRUE)
+ old_organ = null
diff --git a/code/datums/quirks/negative_quirks/pushover.dm b/code/datums/quirks/negative_quirks/pushover.dm
new file mode 100644
index 00000000000..663d8173759
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/pushover.dm
@@ -0,0 +1,11 @@
+/datum/quirk/pushover
+ name = "Pushover"
+ desc = "Your first instinct is always to let people push you around. Resisting out of grabs will take conscious effort."
+ icon = FA_ICON_HANDSHAKE
+ value = -8
+ mob_trait = TRAIT_GRABWEAKNESS
+ gain_text = span_danger("You feel like a pushover.")
+ lose_text = span_notice("You feel like standing up for yourself.")
+ medical_record_text = "Patient presents a notably unassertive personality and is easy to manipulate."
+ hardcore_value = 4
+ mail_goodies = list(/obj/item/clothing/gloves/cargo_gauntlet)
diff --git a/code/datums/quirks/negative_quirks/quadruple_amputee.dm b/code/datums/quirks/negative_quirks/quadruple_amputee.dm
new file mode 100644
index 00000000000..493cdf0b71c
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/quadruple_amputee.dm
@@ -0,0 +1,20 @@
+/datum/quirk/quadruple_amputee
+ name = "Quadruple Amputee"
+ desc = "Oops! All Prosthetics! Due to some truly cruel cosmic punishment, all your limbs have been replaced with surplus prosthetics."
+ icon = "tg-prosthetic-full"
+ value = -6
+ medical_record_text = "During physical examination, patient was found to have all low-budget prosthetic limbs."
+ hardcore_value = 6
+ quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE
+ mail_goodies = list(/obj/item/weldingtool/mini, /obj/item/stack/cable_coil/five)
+
+/datum/quirk/quadruple_amputee/add_unique(client/client_source)
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ human_holder.del_and_replace_bodypart(new /obj/item/bodypart/arm/left/robot/surplus, special = TRUE)
+ human_holder.del_and_replace_bodypart(new /obj/item/bodypart/arm/right/robot/surplus, special = TRUE)
+ human_holder.del_and_replace_bodypart(new /obj/item/bodypart/leg/left/robot/surplus, special = TRUE)
+ human_holder.del_and_replace_bodypart(new /obj/item/bodypart/leg/right/robot/surplus, special = TRUE)
+
+/datum/quirk/quadruple_amputee/post_add()
+ to_chat(quirk_holder, span_boldannounce("All your limbs have been replaced with surplus prosthetics. They are fragile and will easily come apart under duress. \
+ Additionally, you need to use a welding tool and cables to repair them, instead of bruise packs and ointment."))
diff --git a/code/datums/quirks/negative_quirks/social_anxiety.dm b/code/datums/quirks/negative_quirks/social_anxiety.dm
new file mode 100644
index 00000000000..3d140bd80a0
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/social_anxiety.dm
@@ -0,0 +1,114 @@
+/datum/quirk/social_anxiety
+ name = "Social Anxiety"
+ desc = "Talking to people is very difficult for you, and you often stutter or even lock up."
+ icon = FA_ICON_COMMENT_SLASH
+ value = -3
+ gain_text = span_danger("You start worrying about what you're saying.")
+ lose_text = span_notice("You feel easier about talking again.") //if only it were that easy!
+ medical_record_text = "Patient is usually anxious in social encounters and prefers to avoid them."
+ hardcore_value = 4
+ mob_trait = TRAIT_ANXIOUS
+ mail_goodies = list(/obj/item/storage/pill_bottle/psicodine)
+ var/dumb_thing = TRUE
+
+/datum/quirk/social_anxiety/add(client/client_source)
+ RegisterSignal(quirk_holder, COMSIG_MOB_EYECONTACT, PROC_REF(eye_contact))
+ RegisterSignal(quirk_holder, COMSIG_MOB_EXAMINATE, PROC_REF(looks_at_floor))
+ RegisterSignal(quirk_holder, COMSIG_MOB_SAY, PROC_REF(handle_speech))
+
+/datum/quirk/social_anxiety/remove()
+ UnregisterSignal(quirk_holder, list(COMSIG_MOB_EYECONTACT, COMSIG_MOB_EXAMINATE, COMSIG_MOB_SAY))
+
+/datum/quirk/social_anxiety/proc/handle_speech(datum/source, list/speech_args)
+ SIGNAL_HANDLER
+
+ if(HAS_TRAIT(quirk_holder, TRAIT_FEARLESS))
+ return
+
+ var/moodmod
+ if(quirk_holder.mob_mood)
+ moodmod = (1+0.02*(50-(max(50, quirk_holder.mob_mood.mood_level*(7-quirk_holder.mob_mood.sanity_level))))) //low sanity levels are better, they max at 6
+ else
+ moodmod = (1+0.02*(50-(max(50, 0.1*quirk_holder.nutrition))))
+ var/nearby_people = 0
+ for(var/mob/living/carbon/human/H in oview(3, quirk_holder))
+ if(H.client)
+ nearby_people++
+ var/message = speech_args[SPEECH_MESSAGE]
+ if(message)
+ var/list/message_split = splittext(message, " ")
+ var/list/new_message = list()
+ var/mob/living/carbon/human/quirker = quirk_holder
+ for(var/word in message_split)
+ if(prob(max(5,(nearby_people*12.5*moodmod))) && word != message_split[1]) //Minimum 1/20 chance of filler
+ new_message += pick("uh,","erm,","um,")
+ if(prob(min(5,(0.05*(nearby_people*12.5)*moodmod)))) //Max 1 in 20 chance of cutoff after a successful filler roll, for 50% odds in a 15 word sentence
+ quirker.set_silence_if_lower(6 SECONDS)
+ to_chat(quirker, span_danger("You feel self-conscious and stop talking. You need a moment to recover!"))
+ break
+ if(prob(max(5,(nearby_people*12.5*moodmod)))) //Minimum 1/20 chance of stutter
+ // Add a short stutter, THEN treat our word
+ quirker.adjust_stutter(0.5 SECONDS)
+ var/list/message_data = quirker.treat_message(word, capitalize_message = FALSE)
+ new_message += message_data["message"]
+ else
+ new_message += word
+
+ message = jointext(new_message, " ")
+ var/mob/living/carbon/human/quirker = quirk_holder
+ if(prob(min(50,(0.50*(nearby_people*12.5)*moodmod)))) //Max 50% chance of not talking
+ if(dumb_thing)
+ to_chat(quirker, span_userdanger("You think of a dumb thing you said a long time ago and scream internally."))
+ dumb_thing = FALSE //only once per life
+ if(prob(1))
+ new/obj/item/food/spaghetti/pastatomato(get_turf(quirker)) //now that's what I call spaghetti code
+ else
+ to_chat(quirk_holder, span_warning("You think that wouldn't add much to the conversation and decide not to say it."))
+ if(prob(min(25,(0.25*(nearby_people*12.75)*moodmod)))) //Max 25% chance of silence stacks after successful not talking roll
+ to_chat(quirker, span_danger("You retreat into yourself. You really don't feel up to talking."))
+ quirker.set_silence_if_lower(10 SECONDS)
+
+ speech_args[SPEECH_MESSAGE] = pick("Uh.","Erm.","Um.")
+ else
+ speech_args[SPEECH_MESSAGE] = message
+
+// small chance to make eye contact with inanimate objects/mindless mobs because of nerves
+/datum/quirk/social_anxiety/proc/looks_at_floor(datum/source, atom/A)
+ SIGNAL_HANDLER
+
+ var/mob/living/mind_check = A
+ if(prob(85) || (istype(mind_check) && mind_check.mind))
+ return
+
+ addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), quirk_holder, span_smallnotice("You make eye contact with [A].")), 3)
+
+/datum/quirk/social_anxiety/proc/eye_contact(datum/source, mob/living/other_mob, triggering_examiner)
+ SIGNAL_HANDLER
+
+ if(prob(75))
+ return
+ var/msg
+ if(triggering_examiner)
+ msg = "You make eye contact with [other_mob], "
+ else
+ msg = "[other_mob] makes eye contact with you, "
+
+ switch(rand(1,3))
+ if(1)
+ quirk_holder.set_jitter_if_lower(20 SECONDS)
+ msg += "causing you to start fidgeting!"
+ if(2)
+ quirk_holder.set_stutter_if_lower(6 SECONDS)
+ msg += "causing you to start stuttering!"
+ if(3)
+ quirk_holder.Stun(2 SECONDS)
+ msg += "causing you to freeze up!"
+
+ quirk_holder.add_mood_event("anxiety_eyecontact", /datum/mood_event/anxiety_eyecontact)
+ addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), quirk_holder, span_userdanger("[msg]")), 3) // so the examine signal has time to fire and this will print after
+ return COMSIG_BLOCK_EYECONTACT
+
+/datum/mood_event/anxiety_eyecontact
+ description = "Sometimes eye contact makes me so nervous..."
+ mood_change = -5
+ timeout = 3 MINUTES
diff --git a/code/datums/quirks/negative_quirks/softspoken.dm b/code/datums/quirks/negative_quirks/softspoken.dm
new file mode 100644
index 00000000000..41be5f1aca0
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/softspoken.dm
@@ -0,0 +1,9 @@
+/datum/quirk/softspoken
+ name = "Soft-Spoken"
+ desc = "You are soft-spoken, and your voice is hard to hear."
+ icon = FA_ICON_COMMENT
+ value = -2
+ mob_trait = TRAIT_SOFTSPOKEN
+ gain_text = span_danger("You feel like you're speaking more quietly.")
+ lose_text = span_notice("You feel like you're speaking louder.")
+ medical_record_text = "Patient is soft-spoken and difficult to hear."
diff --git a/code/datums/quirks/negative_quirks/tin_man.dm b/code/datums/quirks/negative_quirks/tin_man.dm
new file mode 100644
index 00000000000..5a4ab4b1357
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/tin_man.dm
@@ -0,0 +1,37 @@
+/datum/quirk/tin_man
+ name = "Tin Man"
+ desc = "Oops! All Prosthetics! Due to some truly cruel cosmic punishment, most of your internal organs have been replaced with surplus prosthetics."
+ icon = FA_ICON_ROBOT
+ value = -6
+ medical_record_text = "During physical examination, patient was found to have numerous low-budget prosthetic internal organs. \
+ Removal of these organs is known to be dangerous to the patient as well as the practitioner."
+ hardcore_value = 6
+ mail_goodies = list(/obj/item/storage/organbox)
+
+/datum/quirk/tin_man/add_unique(client/client_source)
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ var/static/list/organ_slots = list(
+ ORGAN_SLOT_HEART = /obj/item/organ/internal/heart/cybernetic/surplus,
+ ORGAN_SLOT_LUNGS = /obj/item/organ/internal/lungs/cybernetic/surplus,
+ ORGAN_SLOT_LIVER = /obj/item/organ/internal/liver/cybernetic/surplus,
+ ORGAN_SLOT_STOMACH = /obj/item/organ/internal/stomach/cybernetic/surplus,
+ )
+ var/list/possible_organ_slots = organ_slots.Copy()
+ if(HAS_TRAIT(human_holder, TRAIT_NOBLOOD))
+ possible_organ_slots -= ORGAN_SLOT_HEART
+ if(HAS_TRAIT(human_holder, TRAIT_NOBREATH))
+ possible_organ_slots -= ORGAN_SLOT_LUNGS
+ if(HAS_TRAIT(human_holder, TRAIT_LIVERLESS_METABOLISM))
+ possible_organ_slots -= ORGAN_SLOT_LIVER
+ if(HAS_TRAIT(human_holder, TRAIT_NOHUNGER))
+ possible_organ_slots -= ORGAN_SLOT_STOMACH
+ if(!length(organ_slots)) //what the hell
+ return
+ for(var/organ_slot in possible_organ_slots)
+ var/organ_path = possible_organ_slots[organ_slot]
+ var/obj/item/organ/new_organ = new organ_path()
+ new_organ.Insert(human_holder, special = TRUE, drop_if_replaced = FALSE)
+
+/datum/quirk/tin_man/post_add()
+ to_chat(quirk_holder, span_boldannounce("Most of your internal organs have been replaced with surplus prosthetics. They are fragile and will easily come apart under duress. \
+ Additionally, any EMP will make them stop working entirely."))
diff --git a/code/datums/quirks/negative_quirks/unstable.dm b/code/datums/quirks/negative_quirks/unstable.dm
new file mode 100644
index 00000000000..5d39776eeba
--- /dev/null
+++ b/code/datums/quirks/negative_quirks/unstable.dm
@@ -0,0 +1,11 @@
+/datum/quirk/unstable
+ name = "Unstable"
+ desc = "Due to past troubles, you are unable to recover your sanity if you lose it. Be very careful managing your mood!"
+ icon = FA_ICON_ANGRY
+ value = -10
+ mob_trait = TRAIT_UNSTABLE
+ gain_text = span_danger("There's a lot on your mind right now.")
+ lose_text = span_notice("Your mind finally feels calm.")
+ medical_record_text = "Patient's mind is in a vulnerable state, and cannot recover from traumatic events."
+ hardcore_value = 9
+ mail_goodies = list(/obj/effect/spawner/random/entertainment/plushie)
diff --git a/code/datums/quirks/neutral_quirks/bald.dm b/code/datums/quirks/neutral_quirks/bald.dm
new file mode 100644
index 00000000000..8a760f6ceef
--- /dev/null
+++ b/code/datums/quirks/neutral_quirks/bald.dm
@@ -0,0 +1,53 @@
+/datum/quirk/item_quirk/bald
+ name = "Smooth-Headed"
+ desc = "You have no hair and are quite insecure about it! Keep your wig on, or at least your head covered up."
+ icon = FA_ICON_EGG
+ value = 0
+ mob_trait = TRAIT_BALD
+ gain_text = span_notice("Your head is as smooth as can be, it's terrible.")
+ lose_text = span_notice("Your head itches, could it be... growing hair?!")
+ medical_record_text = "Patient starkly refused to take off headwear during examination."
+ mail_goodies = list(/obj/item/clothing/head/wig/random)
+ /// The user's starting hairstyle
+ var/old_hair
+
+/datum/quirk/item_quirk/bald/add(client/client_source)
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ old_hair = human_holder.hairstyle
+ human_holder.set_hairstyle("Bald", update = TRUE)
+ RegisterSignal(human_holder, COMSIG_CARBON_EQUIP_HAT, PROC_REF(equip_hat))
+ RegisterSignal(human_holder, COMSIG_CARBON_UNEQUIP_HAT, PROC_REF(unequip_hat))
+
+/datum/quirk/item_quirk/bald/add_unique(client/client_source)
+ var/obj/item/clothing/head/wig/natural/baldie_wig = new(get_turf(quirk_holder))
+ if(old_hair == "Bald")
+ baldie_wig.hairstyle = pick(GLOB.hairstyles_list - "Bald")
+ else
+ baldie_wig.hairstyle = old_hair
+
+ baldie_wig.update_appearance()
+
+ give_item_to_holder(baldie_wig, list(LOCATION_HEAD = ITEM_SLOT_HEAD, LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS))
+
+/datum/quirk/item_quirk/bald/remove()
+ . = ..()
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ human_holder.hairstyle = old_hair
+ human_holder.update_body_parts()
+ UnregisterSignal(human_holder, list(COMSIG_CARBON_EQUIP_HAT, COMSIG_CARBON_UNEQUIP_HAT))
+ human_holder.clear_mood_event("bad_hair_day")
+
+///Checks if the headgear equipped is a wig and sets the mood event accordingly
+/datum/quirk/item_quirk/bald/proc/equip_hat(mob/user, obj/item/hat)
+ SIGNAL_HANDLER
+
+ if(istype(hat, /obj/item/clothing/head/wig))
+ quirk_holder.add_mood_event("bad_hair_day", /datum/mood_event/confident_mane) //Our head is covered, but also by a wig so we're happy.
+ else
+ quirk_holder.clear_mood_event("bad_hair_day") //Our head is covered
+
+///Applies a bad moodlet for having an uncovered head
+/datum/quirk/item_quirk/bald/proc/unequip_hat(mob/user, obj/item/clothing, force, newloc, no_move, invdrop, silent)
+ SIGNAL_HANDLER
+
+ quirk_holder.add_mood_event("bad_hair_day", /datum/mood_event/bald)
diff --git a/code/datums/quirks/neutral_quirks/colorist.dm b/code/datums/quirks/neutral_quirks/colorist.dm
new file mode 100644
index 00000000000..f82fd5bf6fe
--- /dev/null
+++ b/code/datums/quirks/neutral_quirks/colorist.dm
@@ -0,0 +1,13 @@
+/* SKYRAT EDIT REMOVAL
+/datum/quirk/item_quirk/colorist
+ name = "Colorist"
+ desc = "You like carrying around a hair dye spray to quickly apply color patterns to your hair."
+ icon = FA_ICON_FILL_DRIP
+ value = 0
+ medical_record_text = "Patient enjoys dyeing their hair with pretty colors."
+ mail_goodies = list(/obj/item/dyespray)
+
+/datum/quirk/item_quirk/colorist/add_unique(client/client_source)
+ give_item_to_holder(/obj/item/dyespray, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS))
+*/
+//SKYRAT EDIT REMOVAL
diff --git a/code/datums/quirks/neutral_quirks/deviant_tastes.dm b/code/datums/quirks/neutral_quirks/deviant_tastes.dm
new file mode 100644
index 00000000000..566b469c7a7
--- /dev/null
+++ b/code/datums/quirks/neutral_quirks/deviant_tastes.dm
@@ -0,0 +1,24 @@
+/datum/quirk/deviant_tastes
+ name = "Deviant Tastes"
+ desc = "You dislike food that most people enjoy, and find delicious what they don't."
+ icon = FA_ICON_GRIN_TONGUE_SQUINT
+ value = 0
+ gain_text = span_notice("You start craving something that tastes strange.")
+ lose_text = span_notice("You feel like eating normal food again.")
+ medical_record_text = "Patient demonstrates irregular nutrition preferences."
+ mail_goodies = list(/obj/item/food/urinalcake, /obj/item/food/badrecipe) // Mhhhmmm yummy
+
+/datum/quirk/deviant_tastes/add(client/client_source)
+ var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ if(!tongue)
+ return
+ var/liked_foodtypes = tongue.liked_foodtypes
+ tongue.liked_foodtypes = tongue.disliked_foodtypes
+ tongue.disliked_foodtypes = liked_foodtypes
+
+/datum/quirk/deviant_tastes/remove()
+ var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ if(!tongue)
+ return
+ tongue.liked_foodtypes = initial(tongue.liked_foodtypes)
+ tongue.disliked_foodtypes = initial(tongue.disliked_foodtypes)
diff --git a/code/datums/quirks/neutral_quirks/extrovert.dm b/code/datums/quirks/neutral_quirks/extrovert.dm
new file mode 100644
index 00000000000..5622956ba5b
--- /dev/null
+++ b/code/datums/quirks/neutral_quirks/extrovert.dm
@@ -0,0 +1,10 @@
+/datum/quirk/extrovert
+ name = "Extrovert"
+ desc = "You are energized by talking to others, and enjoy spending your free time in the bar."
+ icon = FA_ICON_USERS
+ value = 0
+ mob_trait = TRAIT_EXTROVERT
+ gain_text = span_notice("You feel like hanging out with other people.")
+ lose_text = span_danger("You feel like you're over the bar scene.")
+ medical_record_text = "Patient will not shut the hell up."
+ mail_goodies = list(/obj/item/reagent_containers/cup/glass/flask)
diff --git a/code/datums/quirks/neutral_quirks/foreigner.dm b/code/datums/quirks/neutral_quirks/foreigner.dm
new file mode 100644
index 00000000000..da317a7e66a
--- /dev/null
+++ b/code/datums/quirks/neutral_quirks/foreigner.dm
@@ -0,0 +1,21 @@
+/datum/quirk/foreigner
+ name = "Foreigner"
+ desc = "You're not from around here. You don't know Galactic Common!"
+ icon = FA_ICON_LANGUAGE
+ value = 0
+ gain_text = span_notice("The words being spoken around you don't make any sense.")
+ lose_text = span_notice("You've developed fluency in Galactic Common.")
+ medical_record_text = "Patient does not speak Galactic Common and may require an interpreter."
+ mail_goodies = list(/obj/item/taperecorder) // for translation
+
+/datum/quirk/foreigner/add(client/client_source)
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ human_holder.add_blocked_language(/datum/language/common)
+ if(ishumanbasic(human_holder))
+ human_holder.grant_language(/datum/language/uncommon, source = LANGUAGE_QUIRK)
+
+/datum/quirk/foreigner/remove()
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ human_holder.remove_blocked_language(/datum/language/common)
+ if(ishumanbasic(human_holder))
+ human_holder.remove_language(/datum/language/uncommon)
diff --git a/code/datums/quirks/neutral_quirks/gamer.dm b/code/datums/quirks/neutral_quirks/gamer.dm
new file mode 100644
index 00000000000..0ab2e780480
--- /dev/null
+++ b/code/datums/quirks/neutral_quirks/gamer.dm
@@ -0,0 +1,90 @@
+#define GAMING_WITHDRAWAL_TIME (15 MINUTES)
+/datum/quirk/gamer
+ name = "Gamer"
+ desc = "You are a hardcore gamer, and you have a need to game. You love winning and hate losing. You only like gamer food."
+ icon = FA_ICON_GAMEPAD
+ value = 0
+ gain_text = span_notice("You feel the sudden urge to game.")
+ lose_text = span_notice("You've lost all interest in gaming.")
+ medical_record_text = "Patient has a severe video game addiction."
+ mob_trait = TRAIT_GAMER
+ mail_goodies = list(/obj/item/toy/intento, /obj/item/clothing/head/fedora)
+ /// Timer for gaming withdrawal to kick in
+ var/gaming_withdrawal_timer = TIMER_ID_NULL
+
+/datum/quirk/gamer/add(client/client_source)
+ var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ if(tongue)
+ // Gamer diet
+ tongue.liked_foodtypes = JUNKFOOD
+ RegisterSignal(quirk_holder, COMSIG_MOB_WON_VIDEOGAME, PROC_REF(won_game))
+ RegisterSignal(quirk_holder, COMSIG_MOB_LOST_VIDEOGAME, PROC_REF(lost_game))
+ RegisterSignal(quirk_holder, COMSIG_MOB_PLAYED_VIDEOGAME, PROC_REF(gamed))
+
+/datum/quirk/gamer/add_unique(client/client_source)
+ // The gamer starts off quelled
+ gaming_withdrawal_timer = addtimer(CALLBACK(src, PROC_REF(enter_withdrawal)), GAMING_WITHDRAWAL_TIME, TIMER_STOPPABLE)
+
+/datum/quirk/gamer/remove()
+ var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ if(tongue)
+ tongue.liked_foodtypes = initial(tongue.liked_foodtypes)
+ UnregisterSignal(quirk_holder, COMSIG_MOB_WON_VIDEOGAME)
+ UnregisterSignal(quirk_holder, COMSIG_MOB_LOST_VIDEOGAME)
+ UnregisterSignal(quirk_holder, COMSIG_MOB_PLAYED_VIDEOGAME)
+
+/**
+ * Gamer won a game
+ *
+ * Executed on the COMSIG_MOB_WON_VIDEOGAME signal
+ * This signal should be called whenever a player has won a video game.
+ * (E.g. Orion Trail)
+ */
+/datum/quirk/gamer/proc/won_game()
+ SIGNAL_HANDLER
+ // Epic gamer victory
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ human_holder.add_mood_event("gamer_won", /datum/mood_event/gamer_won)
+
+/**
+ * Gamer lost a game
+ *
+ * Executed on the COMSIG_MOB_LOST_VIDEOGAME signal
+ * This signal should be called whenever a player has lost a video game.
+ * (E.g. Orion Trail)
+ */
+/datum/quirk/gamer/proc/lost_game()
+ SIGNAL_HANDLER
+ // Executed when a gamer has lost
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ human_holder.add_mood_event("gamer_lost", /datum/mood_event/gamer_lost)
+ // Executed asynchronously due to say()
+ INVOKE_ASYNC(src, PROC_REF(gamer_moment))
+/**
+ * Gamer is playing a game
+ *
+ * Executed on the COMSIG_MOB_PLAYED_VIDEOGAME signal
+ * This signal should be called whenever a player interacts with a video game.
+ */
+/datum/quirk/gamer/proc/gamed()
+ SIGNAL_HANDLER
+
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ // Remove withdrawal malus
+ human_holder.clear_mood_event("gamer_withdrawal")
+ // Reset withdrawal timer
+ if (gaming_withdrawal_timer)
+ deltimer(gaming_withdrawal_timer)
+ gaming_withdrawal_timer = addtimer(CALLBACK(src, PROC_REF(enter_withdrawal)), GAMING_WITHDRAWAL_TIME, TIMER_STOPPABLE)
+
+
+/datum/quirk/gamer/proc/gamer_moment()
+ // It was a heated gamer moment...
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ human_holder.say(";[pick("SHIT", "PISS", "FUCK", "CUNT", "COCKSUCKER", "MOTHERFUCKER")]!!", forced = name)
+
+/datum/quirk/gamer/proc/enter_withdrawal()
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ human_holder.add_mood_event("gamer_withdrawal", /datum/mood_event/gamer_withdrawal)
+
+#undef GAMING_WITHDRAWAL_TIME
diff --git a/code/datums/quirks/neutral_quirks/heretochromatic.dm b/code/datums/quirks/neutral_quirks/heretochromatic.dm
new file mode 100644
index 00000000000..1df079c0e45
--- /dev/null
+++ b/code/datums/quirks/neutral_quirks/heretochromatic.dm
@@ -0,0 +1,54 @@
+/datum/quirk/heterochromatic
+ name = "Heterochromatic"
+ desc = "One of your eyes is a different color than the other!"
+ icon = FA_ICON_EYE_LOW_VISION // Ignore the icon name, its actually a fairly good representation of different color eyes
+ quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE
+ value = 0
+ mail_goodies = list(/obj/item/clothing/glasses/eyepatch)
+
+// Only your first eyes are heterochromatic
+// If someone comes and says "well mr coder you can have DNA bound heterochromia so it's not unrealistic
+// to allow all inserted replacement eyes to become heterochromatic or for it to transfer between mobs"
+// Then just change this to [proc/add] I really don't care
+/datum/quirk/heterochromatic/add_unique(client/client_source)
+ var/color = client_source?.prefs.read_preference(/datum/preference/color/heterochromatic)
+ if(!color)
+ return
+
+ apply_heterochromatic_eyes(color)
+
+/// Applies the passed color to this mob's eyes
+/datum/quirk/heterochromatic/proc/apply_heterochromatic_eyes(color)
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ var/was_not_hetero = !human_holder.eye_color_heterochromatic
+ human_holder.eye_color_heterochromatic = TRUE
+ human_holder.eye_color_right = color
+
+ var/obj/item/organ/internal/eyes/eyes_of_the_holder = quirk_holder.get_organ_by_type(/obj/item/organ/internal/eyes)
+ if(!eyes_of_the_holder)
+ return
+
+ eyes_of_the_holder.eye_color_right = color
+ eyes_of_the_holder.old_eye_color_right = color
+ eyes_of_the_holder.refresh()
+
+ if(was_not_hetero)
+ RegisterSignal(human_holder, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(check_eye_removal))
+
+/datum/quirk/heterochromatic/remove()
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ human_holder.eye_color_heterochromatic = FALSE
+ human_holder.eye_color_right = human_holder.eye_color_left
+ UnregisterSignal(human_holder, COMSIG_CARBON_LOSE_ORGAN)
+
+/datum/quirk/heterochromatic/proc/check_eye_removal(datum/source, obj/item/organ/internal/eyes/removed)
+ SIGNAL_HANDLER
+
+ if(!istype(removed))
+ return
+
+ // Eyes were removed, remove heterochromia from the human holder and bid them adieu
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ human_holder.eye_color_heterochromatic = FALSE
+ human_holder.eye_color_right = human_holder.eye_color_left
+ UnregisterSignal(human_holder, COMSIG_CARBON_LOSE_ORGAN)
diff --git a/code/datums/quirks/neutral_quirks/introvert.dm b/code/datums/quirks/neutral_quirks/introvert.dm
new file mode 100644
index 00000000000..51f6f3e785e
--- /dev/null
+++ b/code/datums/quirks/neutral_quirks/introvert.dm
@@ -0,0 +1,10 @@
+/datum/quirk/introvert
+ name = "Introvert"
+ desc = "You are energized by having time to yourself, and enjoy spending your free time in the library."
+ icon = FA_ICON_BOOK_READER
+ value = 0
+ mob_trait = TRAIT_INTROVERT
+ gain_text = span_notice("You feel like reading a good book quietly.")
+ lose_text = span_danger("You feel like libraries are boring.")
+ medical_record_text = "Patient doesn't seem to say much."
+ mail_goodies = list(/obj/item/book/random)
diff --git a/code/datums/quirks/neutral_quirks/monochromatic.dm b/code/datums/quirks/neutral_quirks/monochromatic.dm
new file mode 100644
index 00000000000..dd66220cb56
--- /dev/null
+++ b/code/datums/quirks/neutral_quirks/monochromatic.dm
@@ -0,0 +1,23 @@
+/datum/quirk/monochromatic
+ name = "Monochromacy"
+ desc = "You suffer from full colorblindness, and perceive nearly the entire world in blacks and whites."
+ icon = FA_ICON_ADJUST
+ value = 0
+ medical_record_text = "Patient is afflicted with almost complete color blindness."
+ mail_goodies = list( // Noir detective wannabe
+ /obj/item/clothing/suit/jacket/det_suit/noir,
+ /obj/item/clothing/suit/jacket/det_suit/dark,
+ /obj/item/clothing/head/fedora/beige,
+ /obj/item/clothing/head/fedora/white,
+ )
+
+/datum/quirk/monochromatic/add(client/client_source)
+ quirk_holder.add_client_colour(/datum/client_colour/monochrome)
+
+/datum/quirk/monochromatic/post_add()
+ if(is_detective_job(quirk_holder.mind.assigned_role))
+ to_chat(quirk_holder, span_boldannounce("Mmm. Nothing's ever clear on this station. It's all shades of gray..."))
+ quirk_holder.playsound_local(quirk_holder, 'sound/ambience/ambidet1.ogg', 50, FALSE)
+
+/datum/quirk/monochromatic/remove()
+ quirk_holder.remove_client_colour(/datum/client_colour/monochrome)
diff --git a/code/datums/quirks/neutral_quirks/no_taste.dm b/code/datums/quirks/neutral_quirks/no_taste.dm
new file mode 100644
index 00000000000..664aaf1d9de
--- /dev/null
+++ b/code/datums/quirks/neutral_quirks/no_taste.dm
@@ -0,0 +1,10 @@
+/datum/quirk/no_taste
+ name = "Ageusia"
+ desc = "You can't taste anything! Toxic food will still poison you."
+ icon = FA_ICON_MEH_BLANK
+ value = 0
+ mob_trait = TRAIT_AGEUSIA
+ gain_text = span_notice("You can't taste anything!")
+ lose_text = span_notice("You can taste again!")
+ medical_record_text = "Patient suffers from ageusia and is incapable of tasting food or reagents."
+ mail_goodies = list(/obj/effect/spawner/random/food_or_drink/condiment) // but can you taste the salt? CAN YOU?!
diff --git a/code/datums/quirks/neutral_quirks/phobia.dm b/code/datums/quirks/neutral_quirks/phobia.dm
new file mode 100644
index 00000000000..224401f0670
--- /dev/null
+++ b/code/datums/quirks/neutral_quirks/phobia.dm
@@ -0,0 +1,20 @@
+/datum/quirk/phobia
+ name = "Phobia"
+ desc = "You are irrationally afraid of something."
+ icon = FA_ICON_SPIDER
+ value = 0
+ medical_record_text = "Patient has an irrational fear of something."
+ mail_goodies = list(/obj/item/clothing/glasses/blindfold, /obj/item/storage/pill_bottle/psicodine)
+
+// Phobia will follow you between transfers
+/datum/quirk/phobia/add(client/client_source)
+ var/phobia = client_source?.prefs.read_preference(/datum/preference/choiced/phobia)
+ if(!phobia)
+ return
+
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ human_holder.gain_trauma(new /datum/brain_trauma/mild/phobia(phobia), TRAUMA_RESILIENCE_ABSOLUTE)
+
+/datum/quirk/phobia/remove()
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ human_holder.cure_trauma_type(/datum/brain_trauma/mild/phobia, TRAUMA_RESILIENCE_ABSOLUTE)
diff --git a/code/datums/quirks/neutral_quirks/photographer.dm b/code/datums/quirks/neutral_quirks/photographer.dm
new file mode 100644
index 00000000000..d2284df240c
--- /dev/null
+++ b/code/datums/quirks/neutral_quirks/photographer.dm
@@ -0,0 +1,29 @@
+/datum/quirk/item_quirk/photographer
+ name = "Photographer"
+ desc = "You carry your camera and personal photo album everywhere you go, and your scrapbooks are legendary among your coworkers."
+ icon = FA_ICON_CAMERA
+ value = 0
+ mob_trait = TRAIT_PHOTOGRAPHER
+ gain_text = span_notice("You know everything about photography.")
+ lose_text = span_danger("You forget how photo cameras work.")
+ medical_record_text = "Patient mentions photography as a stress-relieving hobby."
+ mail_goodies = list(/obj/item/camera_film)
+
+/datum/quirk/item_quirk/photographer/add_unique(client/client_source)
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ var/obj/item/storage/photo_album/personal/photo_album = new(get_turf(human_holder))
+ photo_album.persistence_id = "personal_[human_holder.last_mind?.key]" // this is a persistent album, the ID is tied to the account's key to avoid tampering
+ photo_album.persistence_load()
+ photo_album.name = "[human_holder.real_name]'s photo album"
+
+ give_item_to_holder(photo_album, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS))
+ give_item_to_holder(
+ /obj/item/camera,
+ list(
+ LOCATION_NECK = ITEM_SLOT_NECK,
+ LOCATION_LPOCKET = ITEM_SLOT_LPOCKET,
+ LOCATION_RPOCKET = ITEM_SLOT_RPOCKET,
+ LOCATION_BACKPACK = ITEM_SLOT_BACKPACK,
+ LOCATION_HANDS = ITEM_SLOT_HANDS
+ )
+ )
diff --git a/code/datums/quirks/neutral_quirks/pineapple_hater.dm b/code/datums/quirks/neutral_quirks/pineapple_hater.dm
new file mode 100644
index 00000000000..f17eb4224ec
--- /dev/null
+++ b/code/datums/quirks/neutral_quirks/pineapple_hater.dm
@@ -0,0 +1,27 @@
+/datum/quirk/pineapple_hater
+ name = "Ananas Aversion"
+ desc = "You find yourself greatly detesting fruits of the ananas genus. Serious, how the hell can anyone say these things are good? And what kind of madman would even dare putting it on a pizza!?"
+ icon = FA_ICON_THUMBS_DOWN
+ value = 0
+ gain_text = span_notice("You find yourself pondering what kind of idiot actually enjoys pineapples...")
+ lose_text = span_notice("Your feelings towards pineapples seem to return to a lukewarm state.")
+ medical_record_text = "Patient is correct to think that pineapple is disgusting."
+ mail_goodies = list( // basic pizza slices
+ /obj/item/food/pizzaslice/margherita,
+ /obj/item/food/pizzaslice/meat,
+ /obj/item/food/pizzaslice/mushroom,
+ /obj/item/food/pizzaslice/vegetable,
+ /obj/item/food/pizzaslice/sassysage,
+ )
+
+/datum/quirk/pineapple_hater/add(client/client_source)
+ var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ if(!tongue)
+ return
+ tongue.disliked_foodtypes |= PINEAPPLE
+
+/datum/quirk/pineapple_hater/remove()
+ var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ if(!tongue)
+ return
+ tongue.disliked_foodtypes = initial(tongue.disliked_foodtypes)
diff --git a/code/datums/quirks/neutral_quirks/pineapple_liker.dm b/code/datums/quirks/neutral_quirks/pineapple_liker.dm
new file mode 100644
index 00000000000..c342e14769c
--- /dev/null
+++ b/code/datums/quirks/neutral_quirks/pineapple_liker.dm
@@ -0,0 +1,21 @@
+/datum/quirk/pineapple_liker
+ name = "Ananas Affinity"
+ desc = "You find yourself greatly enjoying fruits of the ananas genus. You can't seem to ever get enough of their sweet goodness!"
+ icon = FA_ICON_THUMBS_UP
+ value = 0
+ gain_text = span_notice("You feel an intense craving for pineapple.")
+ lose_text = span_notice("Your feelings towards pineapples seem to return to a lukewarm state.")
+ medical_record_text = "Patient demonstrates a pathological love of pineapple."
+ mail_goodies = list(/obj/item/food/pizzaslice/pineapple)
+
+/datum/quirk/pineapple_liker/add(client/client_source)
+ var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ if(!tongue)
+ return
+ tongue.liked_foodtypes |= PINEAPPLE
+
+/datum/quirk/pineapple_liker/remove()
+ var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ if(!tongue)
+ return
+ tongue.liked_foodtypes = initial(tongue.liked_foodtypes)
diff --git a/code/datums/quirks/neutral_quirks/pride_pin.dm b/code/datums/quirks/neutral_quirks/pride_pin.dm
new file mode 100644
index 00000000000..488c0a2bccb
--- /dev/null
+++ b/code/datums/quirks/neutral_quirks/pride_pin.dm
@@ -0,0 +1,19 @@
+/datum/quirk/item_quirk/pride_pin
+ name = "Pride Pin"
+ desc = "Show off your pride with this changing pride pin!"
+ icon = FA_ICON_RAINBOW
+ value = 0
+ gain_text = span_notice("You feel fruity.")
+ lose_text = span_danger("You feel only slightly less fruity than before.")
+ medical_record_text = "Patient appears to be fruity."
+
+/datum/quirk/item_quirk/pride_pin/add_unique(client/client_source)
+ var/obj/item/clothing/accessory/pride/pin = new(get_turf(quirk_holder))
+
+ var/pride_choice = client_source?.prefs?.read_preference(/datum/preference/choiced/pride_pin) || assoc_to_keys(GLOB.pride_pin_reskins)[1]
+ var/pride_reskin = GLOB.pride_pin_reskins[pride_choice]
+
+ pin.current_skin = pride_choice
+ pin.icon_state = pride_reskin
+
+ give_item_to_holder(pin, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS))
diff --git a/code/datums/quirks/neutral_quirks/shifty_eyes.dm b/code/datums/quirks/neutral_quirks/shifty_eyes.dm
new file mode 100644
index 00000000000..29f1def3761
--- /dev/null
+++ b/code/datums/quirks/neutral_quirks/shifty_eyes.dm
@@ -0,0 +1,8 @@
+/datum/quirk/shifty_eyes
+ name = "Shifty Eyes"
+ desc = "Your eyes tend to wander all over the place, whether you mean to or not, causing people to sometimes think you're looking directly at them when you aren't."
+ icon = FA_ICON_EYE
+ value = 0
+ medical_record_text = "Fucking creep kept staring at me the whole damn checkup. I'm only diagnosing this because it's less awkward than thinking it was on purpose."
+ mob_trait = TRAIT_SHIFTY_EYES
+ mail_goodies = list(/obj/item/clothing/head/costume/papersack, /obj/item/clothing/head/costume/papersack/smiley)
diff --git a/code/datums/quirks/neutral_quirks/snob.dm b/code/datums/quirks/neutral_quirks/snob.dm
new file mode 100644
index 00000000000..ab273f1ae53
--- /dev/null
+++ b/code/datums/quirks/neutral_quirks/snob.dm
@@ -0,0 +1,10 @@
+/datum/quirk/snob
+ name = "Snob"
+ desc = "You care about the finer things, if a room doesn't look nice its just not really worth it, is it?"
+ icon = FA_ICON_USER_TIE
+ value = 0
+ gain_text = span_notice("You feel like you understand what things should look like.")
+ lose_text = span_notice("Well who cares about deco anyways?")
+ medical_record_text = "Patient seems to be rather stuck up."
+ mob_trait = TRAIT_SNOB
+ mail_goodies = list(/obj/item/chisel, /obj/item/paint_palette)
diff --git a/code/datums/quirks/neutral_quirks/vegetarian.dm b/code/datums/quirks/neutral_quirks/vegetarian.dm
new file mode 100644
index 00000000000..0ade72acafe
--- /dev/null
+++ b/code/datums/quirks/neutral_quirks/vegetarian.dm
@@ -0,0 +1,23 @@
+/datum/quirk/vegetarian
+ name = "Vegetarian"
+ desc = "You find the idea of eating meat morally and physically repulsive."
+ icon = FA_ICON_CARROT
+ value = 0
+ gain_text = span_notice("You feel repulsion at the idea of eating meat.")
+ lose_text = span_notice("You feel like eating meat isn't that bad.")
+ medical_record_text = "Patient reports a vegetarian diet."
+ mail_goodies = list(/obj/effect/spawner/random/food_or_drink/salad)
+
+/datum/quirk/vegetarian/add(client/client_source)
+ var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ if(!tongue)
+ return
+ tongue.liked_foodtypes &= ~MEAT
+ tongue.disliked_foodtypes |= MEAT
+
+/datum/quirk/vegetarian/remove()
+ var/obj/item/organ/internal/tongue/tongue = quirk_holder.get_organ_slot(ORGAN_SLOT_TONGUE)
+ if(!tongue)
+ return
+ tongue.liked_foodtypes = initial(tongue.liked_foodtypes)
+ tongue.disliked_foodtypes = initial(tongue.disliked_foodtypes)
diff --git a/code/datums/quirks/positive_quirks/alcohol_tolerance.dm b/code/datums/quirks/positive_quirks/alcohol_tolerance.dm
new file mode 100644
index 00000000000..6458513007d
--- /dev/null
+++ b/code/datums/quirks/positive_quirks/alcohol_tolerance.dm
@@ -0,0 +1,10 @@
+/datum/quirk/alcohol_tolerance
+ name = "Alcohol Tolerance"
+ desc = "You become drunk more slowly and suffer fewer drawbacks from alcohol."
+ icon = FA_ICON_BEER
+ value = 4
+ mob_trait = TRAIT_ALCOHOL_TOLERANCE
+ gain_text = span_notice("You feel like you could drink a whole keg!")
+ lose_text = span_danger("You don't feel as resistant to alcohol anymore. Somehow.")
+ medical_record_text = "Patient demonstrates a high tolerance for alcohol."
+ mail_goodies = list(/obj/item/skillchip/wine_taster)
diff --git a/code/datums/quirks/positive_quirks/apathetic.dm b/code/datums/quirks/positive_quirks/apathetic.dm
new file mode 100644
index 00000000000..170cb6f5d44
--- /dev/null
+++ b/code/datums/quirks/positive_quirks/apathetic.dm
@@ -0,0 +1,14 @@
+/datum/quirk/apathetic
+ name = "Apathetic"
+ desc = "You just don't care as much as other people. That's nice to have in a place like this, I guess."
+ icon = FA_ICON_MEH
+ value = 4
+ quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED
+ medical_record_text = "Patient was administered the Apathy Evaluation Scale but did not bother to complete it."
+ mail_goodies = list(/obj/item/hourglass)
+
+/datum/quirk/apathetic/add(client/client_source)
+ quirk_holder.mob_mood?.mood_modifier -= 0.2
+
+/datum/quirk/apathetic/remove()
+ quirk_holder.mob_mood?.mood_modifier += 0.2
diff --git a/code/datums/quirks/positive_quirks/bilingual.dm b/code/datums/quirks/positive_quirks/bilingual.dm
new file mode 100644
index 00000000000..324054198b8
--- /dev/null
+++ b/code/datums/quirks/positive_quirks/bilingual.dm
@@ -0,0 +1,24 @@
+/datum/quirk/bilingual
+ name = "Bilingual"
+ desc = "Over the years you've picked up an extra language!"
+ icon = FA_ICON_GLOBE
+ value = 4
+ gain_text = span_notice("Some of the words of the people around you certainly aren't common. Good thing you studied for this.")
+ lose_text = span_notice("You seem to have forgotten your second language.")
+ medical_record_text = "Patient speaks multiple languages."
+ mail_goodies = list(/obj/item/taperecorder, /obj/item/clothing/head/frenchberet, /obj/item/clothing/mask/fakemoustache/italian)
+
+/datum/quirk/bilingual/add_unique(client/client_source)
+ var/wanted_language = client_source?.prefs.read_preference(/datum/preference/choiced/language)
+ var/datum/language/language_type
+ if(wanted_language == "Random")
+ language_type = pick(GLOB.uncommon_roundstart_languages)
+ else
+ language_type = GLOB.language_types_by_name[wanted_language]
+ if(quirk_holder.has_language(language_type))
+ language_type = /datum/language/uncommon
+ if(quirk_holder.has_language(language_type))
+ to_chat(quirk_holder, span_boldnotice("You are already familiar with the quirk in your preferences, so you did not learn one."))
+ return
+ to_chat(quirk_holder, span_boldnotice("You are already familiar with the quirk in your preferences, so you learned Galactic Uncommon instead."))
+ quirk_holder.grant_language(language_type, source = LANGUAGE_QUIRK)
diff --git a/code/datums/quirks/positive_quirks/clown_enjoyer.dm b/code/datums/quirks/positive_quirks/clown_enjoyer.dm
new file mode 100644
index 00000000000..984b0f7a6e4
--- /dev/null
+++ b/code/datums/quirks/positive_quirks/clown_enjoyer.dm
@@ -0,0 +1,31 @@
+/datum/quirk/item_quirk/clown_enjoyer
+ name = "Clown Enjoyer"
+ desc = "You enjoy clown antics and get a mood boost from wearing your clown pin."
+ icon = FA_ICON_MAP_PIN
+ value = 2
+ mob_trait = TRAIT_CLOWN_ENJOYER
+ gain_text = span_notice("You are a big enjoyer of clowns.")
+ lose_text = span_danger("The clown doesn't seem so great.")
+ medical_record_text = "Patient reports being a big enjoyer of clowns."
+ mail_goodies = list(
+ /obj/item/bikehorn,
+ /obj/item/stamp/clown,
+ /obj/item/megaphone/clown,
+ /obj/item/clothing/shoes/clown_shoes,
+ /obj/item/bedsheet/clown,
+ /obj/item/clothing/mask/gas/clown_hat,
+ /obj/item/storage/backpack/clown,
+ /obj/item/storage/backpack/duffelbag/clown,
+ /obj/item/toy/crayon/rainbow,
+ /obj/item/toy/figure/clown,
+ /obj/item/tank/internals/emergency_oxygen/engi/clown/n2o,
+ /obj/item/tank/internals/emergency_oxygen/engi/clown/bz,
+ /obj/item/tank/internals/emergency_oxygen/engi/clown/helium,
+ )
+
+/datum/quirk/item_quirk/clown_enjoyer/add_unique(client/client_source)
+ give_item_to_holder(/obj/item/clothing/accessory/clown_enjoyer_pin, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS))
+
+/datum/quirk/item_quirk/clown_enjoyer/add(client/client_source)
+ var/datum/atom_hud/fan = GLOB.huds[DATA_HUD_FAN]
+ fan.show_to(quirk_holder)
diff --git a/code/datums/quirks/positive_quirks/drunk_healing.dm b/code/datums/quirks/positive_quirks/drunk_healing.dm
new file mode 100644
index 00000000000..fbab2503b4e
--- /dev/null
+++ b/code/datums/quirks/positive_quirks/drunk_healing.dm
@@ -0,0 +1,22 @@
+/datum/quirk/drunkhealing
+ name = "Drunken Resilience"
+ desc = "Nothing like a good drink to make you feel on top of the world. Whenever you're drunk, you slowly recover from injuries."
+ icon = FA_ICON_WINE_BOTTLE
+ value = 8
+ gain_text = span_notice("You feel like a drink would do you good.")
+ lose_text = span_danger("You no longer feel like drinking would ease your pain.")
+ medical_record_text = "Patient has unusually efficient liver metabolism and can slowly regenerate wounds by drinking alcoholic beverages."
+ quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES
+ mail_goodies = list(/obj/effect/spawner/random/food_or_drink/booze)
+
+/datum/quirk/drunkhealing/process(seconds_per_tick)
+ switch(quirk_holder.get_drunk_amount())
+ if (6 to 40)
+ quirk_holder.adjustBruteLoss(-0.1 * seconds_per_tick, FALSE, required_bodytype = BODYTYPE_ORGANIC)
+ quirk_holder.adjustFireLoss(-0.05 * seconds_per_tick, required_bodytype = BODYTYPE_ORGANIC)
+ if (41 to 60)
+ quirk_holder.adjustBruteLoss(-0.4 * seconds_per_tick, FALSE, required_bodytype = BODYTYPE_ORGANIC)
+ quirk_holder.adjustFireLoss(-0.2 * seconds_per_tick, required_bodytype = BODYTYPE_ORGANIC)
+ if (61 to INFINITY)
+ quirk_holder.adjustBruteLoss(-0.8 * seconds_per_tick, FALSE, required_bodytype = BODYTYPE_ORGANIC)
+ quirk_holder.adjustFireLoss(-0.4 * seconds_per_tick, required_bodytype = BODYTYPE_ORGANIC)
diff --git a/code/datums/quirks/positive_quirks/empath.dm b/code/datums/quirks/positive_quirks/empath.dm
new file mode 100644
index 00000000000..3379f8a97c4
--- /dev/null
+++ b/code/datums/quirks/positive_quirks/empath.dm
@@ -0,0 +1,10 @@
+/datum/quirk/empath
+ name = "Empath"
+ desc = "Whether it's a sixth sense or careful study of body language, it only takes you a quick glance at someone to understand how they feel."
+ icon = FA_ICON_SMILE_BEAM
+ value = 6 // SKYRAT EDIT CHANGE - Quirk Rebalance - Original: value = 8
+ mob_trait = TRAIT_EMPATH
+ gain_text = span_notice("You feel in tune with those around you.")
+ lose_text = span_danger("You feel isolated from others.")
+ medical_record_text = "Patient is highly perceptive of and sensitive to social cues, or may possibly have ESP. Further testing needed."
+ mail_goodies = list(/obj/item/toy/foamfinger)
diff --git a/code/datums/quirks/positive_quirks/freerunning.dm b/code/datums/quirks/positive_quirks/freerunning.dm
new file mode 100644
index 00000000000..541d2b1cc44
--- /dev/null
+++ b/code/datums/quirks/positive_quirks/freerunning.dm
@@ -0,0 +1,10 @@
+/datum/quirk/freerunning
+ name = "Freerunning"
+ desc = "You're great at quick moves! You can climb tables more quickly and take no damage from short falls."
+ icon = FA_ICON_RUNNING
+ value = 8
+ mob_trait = TRAIT_FREERUNNING
+ gain_text = span_notice("You feel lithe on your feet!")
+ lose_text = span_danger("You feel clumsy again.")
+ medical_record_text = "Patient scored highly on cardio tests."
+ mail_goodies = list(/obj/item/melee/skateboard, /obj/item/clothing/shoes/wheelys/rollerskates)
diff --git a/code/datums/quirks/positive_quirks/friendly.dm b/code/datums/quirks/positive_quirks/friendly.dm
new file mode 100644
index 00000000000..8ab0003639b
--- /dev/null
+++ b/code/datums/quirks/positive_quirks/friendly.dm
@@ -0,0 +1,11 @@
+/datum/quirk/friendly
+ name = "Friendly"
+ desc = "You give the best hugs, especially when you're in the right mood."
+ icon = FA_ICON_HANDS_HELPING
+ value = 2
+ mob_trait = TRAIT_FRIENDLY
+ gain_text = span_notice("You want to hug someone.")
+ lose_text = span_danger("You no longer feel compelled to hug others.")
+ quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED
+ medical_record_text = "Patient demonstrates low-inhibitions for physical contact and well-developed arms. Requesting another doctor take over this case."
+ mail_goodies = list(/obj/item/storage/box/hug)
diff --git a/code/datums/quirks/positive_quirks/jolly.dm b/code/datums/quirks/positive_quirks/jolly.dm
new file mode 100644
index 00000000000..7f6c334ba9d
--- /dev/null
+++ b/code/datums/quirks/positive_quirks/jolly.dm
@@ -0,0 +1,9 @@
+/datum/quirk/jolly
+ name = "Jolly"
+ desc = "You sometimes just feel happy, for no reason at all."
+ icon = FA_ICON_GRIN
+ value = 4
+ mob_trait = TRAIT_JOLLY
+ quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED
+ medical_record_text = "Patient demonstrates constant euthymia irregular for environment. It's a bit much, to be honest."
+ mail_goodies = list(/obj/item/clothing/mask/joy)
diff --git a/code/datums/quirks/positive_quirks/light_step.dm b/code/datums/quirks/positive_quirks/light_step.dm
new file mode 100644
index 00000000000..80418b79b9d
--- /dev/null
+++ b/code/datums/quirks/positive_quirks/light_step.dm
@@ -0,0 +1,10 @@
+/datum/quirk/light_step
+ name = "Light Step"
+ desc = "You walk with a gentle step; footsteps and stepping on sharp objects is quieter and less painful. Also, your hands and clothes will not get messed in case of stepping in blood."
+ icon = FA_ICON_SHOE_PRINTS
+ value = 4
+ mob_trait = TRAIT_LIGHT_STEP
+ gain_text = span_notice("You walk with a little more litheness.")
+ lose_text = span_danger("You start tromping around like a barbarian.")
+ medical_record_text = "Patient's dexterity belies a strong capacity for stealth."
+ mail_goodies = list(/obj/item/clothing/shoes/sandal)
diff --git a/code/datums/quirks/positive_quirks/mime_fan.dm b/code/datums/quirks/positive_quirks/mime_fan.dm
new file mode 100644
index 00000000000..5145b4a2240
--- /dev/null
+++ b/code/datums/quirks/positive_quirks/mime_fan.dm
@@ -0,0 +1,29 @@
+/datum/quirk/item_quirk/mime_fan
+ name = "Mime Fan"
+ desc = "You're a fan of mime antics and get a mood boost from wearing your mime pin."
+ icon = FA_ICON_THUMBTACK
+ value = 2
+ mob_trait = TRAIT_MIME_FAN
+ gain_text = span_notice("You are a big fan of the Mime.")
+ lose_text = span_danger("The mime doesn't seem so great.")
+ medical_record_text = "Patient reports being a big fan of mimes."
+ mail_goodies = list(
+ /obj/item/toy/crayon/mime,
+ /obj/item/clothing/mask/gas/mime,
+ /obj/item/storage/backpack/mime,
+ /obj/item/clothing/under/rank/civilian/mime,
+ /obj/item/reagent_containers/cup/glass/bottle/bottleofnothing,
+ /obj/item/stamp/mime,
+ /obj/item/storage/box/survival/hug/black,
+ /obj/item/bedsheet/mime,
+ /obj/item/clothing/shoes/sneakers/mime,
+ /obj/item/toy/figure/mime,
+ /obj/item/toy/crayon/spraycan/mimecan,
+ )
+
+/datum/quirk/item_quirk/mime_fan/add_unique(client/client_source)
+ give_item_to_holder(/obj/item/clothing/accessory/mime_fan_pin, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS))
+
+/datum/quirk/item_quirk/mime_fan/add(client/client_source)
+ var/datum/atom_hud/fan = GLOB.huds[DATA_HUD_FAN]
+ fan.show_to(quirk_holder)
diff --git a/code/datums/quirks/positive_quirks/musician.dm b/code/datums/quirks/positive_quirks/musician.dm
new file mode 100644
index 00000000000..9d5e10f5f82
--- /dev/null
+++ b/code/datums/quirks/positive_quirks/musician.dm
@@ -0,0 +1,13 @@
+/datum/quirk/item_quirk/musician
+ name = "Musician"
+ desc = "You can tune handheld musical instruments to play melodies that clear certain negative effects and soothe the soul."
+ icon = FA_ICON_GUITAR
+ value = 2
+ mob_trait = TRAIT_MUSICIAN
+ gain_text = span_notice("You know everything about musical instruments.")
+ lose_text = span_danger("You forget how musical instruments work.")
+ medical_record_text = "Patient brain scans show a highly-developed auditory pathway."
+ mail_goodies = list(/obj/effect/spawner/random/entertainment/musical_instrument, /obj/item/instrument/piano_synth/headphones)
+
+/datum/quirk/item_quirk/musician/add_unique(client/client_source)
+ give_item_to_holder(/obj/item/choice_beacon/music, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS))
diff --git a/code/datums/quirks/positive_quirks/night_vision.dm b/code/datums/quirks/positive_quirks/night_vision.dm
new file mode 100644
index 00000000000..808a213db51
--- /dev/null
+++ b/code/datums/quirks/positive_quirks/night_vision.dm
@@ -0,0 +1,28 @@
+/datum/quirk/night_vision
+ name = "Night Vision"
+ desc = "You can see slightly more clearly in full darkness than most people."
+ icon = FA_ICON_MOON
+ value = 4
+ mob_trait = TRAIT_NIGHT_VISION
+ gain_text = span_notice("The shadows seem a little less dark.")
+ lose_text = span_danger("Everything seems a little darker.")
+ medical_record_text = "Patient's eyes show above-average acclimation to darkness."
+ mail_goodies = list(
+ /obj/item/flashlight/flashdark,
+ /obj/item/food/grown/mushroom/glowshroom/shadowshroom,
+ /obj/item/skillchip/light_remover,
+ )
+
+/datum/quirk/night_vision/add(client/client_source)
+ refresh_quirk_holder_eyes()
+
+/datum/quirk/night_vision/remove()
+ refresh_quirk_holder_eyes()
+
+/datum/quirk/night_vision/proc/refresh_quirk_holder_eyes()
+ var/mob/living/carbon/human/human_quirk_holder = quirk_holder
+ var/obj/item/organ/internal/eyes/eyes = human_quirk_holder.get_organ_by_type(/obj/item/organ/internal/eyes)
+ if(!eyes || eyes.lighting_cutoff)
+ return
+ // We've either added or removed TRAIT_NIGHT_VISION before calling this proc. Just refresh the eyes.
+ eyes.refresh()
diff --git a/code/datums/quirks/positive_quirks/poster_boy.dm b/code/datums/quirks/positive_quirks/poster_boy.dm
new file mode 100644
index 00000000000..4991ebc540b
--- /dev/null
+++ b/code/datums/quirks/positive_quirks/poster_boy.dm
@@ -0,0 +1,31 @@
+/datum/quirk/item_quirk/poster_boy
+ name = "Poster Boy"
+ desc = "You have some great posters! Hang them up and make everyone have a great time."
+ icon = FA_ICON_TAPE
+ value = 4
+ mob_trait = TRAIT_POSTERBOY
+ medical_record_text = "Patient reports a desire to cover walls with homemade objects."
+ mail_goodies = list(/obj/item/poster/random_official)
+
+/datum/quirk/item_quirk/poster_boy/add_unique()
+ var/mob/living/carbon/human/posterboy = quirk_holder
+ var/obj/item/storage/box/posterbox/newbox = new()
+ newbox.add_quirk_posters(posterboy.mind)
+ give_item_to_holder(newbox, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS))
+
+/obj/item/storage/box/posterbox
+ name = "Box of Posters"
+ desc = "You made them yourself!"
+
+/// fills box of posters based on job, one neutral poster and 2 department posters
+/obj/item/storage/box/posterbox/proc/add_quirk_posters(datum/mind/posterboy)
+ new /obj/item/poster/quirk/crew/random(src)
+ var/department = posterboy.assigned_role.paycheck_department
+ if(department == ACCOUNT_CIV) //if you are not part of a department you instead get 3 neutral posters
+ for(var/i in 1 to 2)
+ new /obj/item/poster/quirk/crew/random(src)
+ return
+ for(var/obj/item/poster/quirk/potential_poster as anything in subtypesof(/obj/item/poster/quirk))
+ if(initial(potential_poster.quirk_poster_department) != department)
+ continue
+ new potential_poster(src)
diff --git a/code/datums/quirks/positive_quirks/self_aware.dm b/code/datums/quirks/positive_quirks/self_aware.dm
new file mode 100644
index 00000000000..022d08659ef
--- /dev/null
+++ b/code/datums/quirks/positive_quirks/self_aware.dm
@@ -0,0 +1,8 @@
+/datum/quirk/selfaware
+ name = "Self-Aware"
+ desc = "You know your body well, and can accurately assess the extent of your wounds."
+ icon = FA_ICON_BONE
+ value = 8
+ mob_trait = TRAIT_SELF_AWARE
+ medical_record_text = "Patient demonstrates an uncanny knack for self-diagnosis."
+ mail_goodies = list(/obj/item/clothing/neck/stethoscope, /obj/item/skillchip/entrails_reader)
diff --git a/code/datums/quirks/positive_quirks/settler.dm b/code/datums/quirks/positive_quirks/settler.dm
new file mode 100644
index 00000000000..81402c050cd
--- /dev/null
+++ b/code/datums/quirks/positive_quirks/settler.dm
@@ -0,0 +1,32 @@
+/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/quirks/positive_quirks/signer.dm b/code/datums/quirks/positive_quirks/signer.dm
new file mode 100644
index 00000000000..df0a2f34c5d
--- /dev/null
+++ b/code/datums/quirks/positive_quirks/signer.dm
@@ -0,0 +1,17 @@
+/datum/quirk/item_quirk/signer
+ name = "Signer"
+ desc = "You possess excellent communication skills in sign language."
+ icon = FA_ICON_HANDS
+ value = 4
+ quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE
+ mail_goodies = list(/obj/item/clothing/gloves/radio)
+
+/datum/quirk/item_quirk/signer/add_unique(client/client_source)
+ quirk_holder.AddComponent(/datum/component/sign_language)
+ var/obj/item/clothing/gloves/gloves_type = /obj/item/clothing/gloves/radio
+ if(isplasmaman(quirk_holder))
+ gloves_type = /obj/item/clothing/gloves/color/plasmaman/radio
+ give_item_to_holder(gloves_type, list(LOCATION_GLOVES = ITEM_SLOT_GLOVES, LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS))
+
+/datum/quirk/item_quirk/signer/remove()
+ qdel(quirk_holder.GetComponent(/datum/component/sign_language))
diff --git a/code/datums/quirks/positive_quirks/skittish.dm b/code/datums/quirks/positive_quirks/skittish.dm
new file mode 100644
index 00000000000..24bbac8e556
--- /dev/null
+++ b/code/datums/quirks/positive_quirks/skittish.dm
@@ -0,0 +1,8 @@
+/datum/quirk/skittish
+ name = "Skittish"
+ desc = "You're easy to startle, and hide frequently. Run into a closed locker to jump into it, as long as you have access. You can walk to avoid this."
+ icon = FA_ICON_TRASH
+ value = 8
+ mob_trait = TRAIT_SKITTISH
+ medical_record_text = "Patient demonstrates a high aversion to danger and has described hiding in containers out of fear."
+ mail_goodies = list(/obj/structure/closet/cardboard)
diff --git a/code/datums/quirks/positive_quirks/spiritual.dm b/code/datums/quirks/positive_quirks/spiritual.dm
new file mode 100644
index 00000000000..b08fe8b60c6
--- /dev/null
+++ b/code/datums/quirks/positive_quirks/spiritual.dm
@@ -0,0 +1,20 @@
+/datum/quirk/item_quirk/spiritual
+ name = "Spiritual"
+ desc = "You hold a spiritual belief, whether in God, nature or the arcane rules of the universe. You gain comfort from the presence of holy people, and believe that your prayers are more special than others. Being in the chapel makes you happy."
+ icon = FA_ICON_BIBLE
+ value = 2 /// SKYRAT EDIT - Quirk Rebalance - Original: value = 4
+ mob_trait = TRAIT_SPIRITUAL
+ gain_text = span_notice("You have faith in a higher power.")
+ lose_text = span_danger("You lose faith!")
+ medical_record_text = "Patient reports a belief in a higher power."
+ mail_goodies = list(
+ /obj/item/book/bible/booze,
+ /obj/item/reagent_containers/cup/glass/bottle/holywater,
+ /obj/item/bedsheet/chaplain,
+ /obj/item/toy/cards/deck/tarot,
+ /obj/item/storage/fancy/candle_box,
+ )
+
+/datum/quirk/item_quirk/spiritual/add_unique(client/client_source)
+ give_item_to_holder(/obj/item/storage/fancy/candle_box, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS))
+ give_item_to_holder(/obj/item/storage/box/matches, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS))
diff --git a/code/datums/quirks/positive_quirks/tagger.dm b/code/datums/quirks/positive_quirks/tagger.dm
new file mode 100644
index 00000000000..5aba24d850a
--- /dev/null
+++ b/code/datums/quirks/positive_quirks/tagger.dm
@@ -0,0 +1,20 @@
+/datum/quirk/item_quirk/tagger
+ name = "Tagger"
+ desc = "You're an experienced artist. People will actually be impressed by your graffiti, and you can get twice as many uses out of drawing supplies."
+ icon = FA_ICON_SPRAY_CAN
+ value = 4
+ mob_trait = TRAIT_TAGGER
+ gain_text = span_notice("You know how to tag walls efficiently.")
+ lose_text = span_danger("You forget how to tag walls properly.")
+ medical_record_text = "Patient was recently seen for possible paint huffing incident."
+ mail_goodies = list(
+ /obj/item/toy/crayon/spraycan,
+ /obj/item/canvas/nineteen_nineteen,
+ /obj/item/canvas/twentythree_nineteen,
+ /obj/item/canvas/twentythree_twentythree
+ )
+
+/datum/quirk/item_quirk/tagger/add_unique(client/client_source)
+ var/obj/item/toy/crayon/spraycan/can = new
+ can.set_painting_tool_color(client_source?.prefs.read_preference(/datum/preference/color/paint_color))
+ give_item_to_holder(can, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS))
diff --git a/code/datums/quirks/positive_quirks/throwing_arm.dm b/code/datums/quirks/positive_quirks/throwing_arm.dm
new file mode 100644
index 00000000000..5157b399009
--- /dev/null
+++ b/code/datums/quirks/positive_quirks/throwing_arm.dm
@@ -0,0 +1,10 @@
+/datum/quirk/throwingarm
+ name = "Throwing Arm"
+ desc = "Your arms have a lot of heft to them! Objects that you throw just always seem to fly further than everyone elses, and you never miss a toss."
+ icon = FA_ICON_BASEBALL
+ value = 7
+ mob_trait = TRAIT_THROWINGARM
+ gain_text = span_notice("Your arms are full of energy!")
+ lose_text = span_danger("Your arms ache a bit.")
+ medical_record_text = "Patient displays mastery over throwing balls."
+ mail_goodies = list(/obj/item/toy/beach_ball/baseball, /obj/item/toy/basketball, /obj/item/toy/dodgeball)
diff --git a/code/datums/quirks/positive_quirks/voracious.dm b/code/datums/quirks/positive_quirks/voracious.dm
new file mode 100644
index 00000000000..68073304f0d
--- /dev/null
+++ b/code/datums/quirks/positive_quirks/voracious.dm
@@ -0,0 +1,9 @@
+/datum/quirk/voracious
+ name = "Voracious"
+ desc = "Nothing gets between you and your food. You eat faster and can binge on junk food! Being fat suits you just fine."
+ icon = FA_ICON_DRUMSTICK_BITE
+ value = 4
+ mob_trait = TRAIT_VORACIOUS
+ gain_text = span_notice("You feel HONGRY.")
+ lose_text = span_danger("You no longer feel HONGRY.")
+ mail_goodies = list(/obj/effect/spawner/random/food_or_drink/dinner)
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/emergency.dm b/code/datums/shuttles/emergency.dm
new file mode 100644
index 00000000000..5e8553c69ee
--- /dev/null
+++ b/code/datums/shuttles/emergency.dm
@@ -0,0 +1,496 @@
+#define EMAG_LOCKED_SHUTTLE_COST (CARGO_CRATE_VALUE * 50)
+
+/datum/map_template/shuttle/emergency // SKYRAT EDIT OVERRIDE - OVERRIDEN IN ADVANCED_SHUTTLES - shuttles.dm
+ port_id = "emergency"
+ name = "Base Shuttle Template (Emergency)"
+ ///assoc list of shuttle events to add to this shuttle on spawn (typepath = weight)
+ var/list/events
+ ///pick all events instead of random
+ var/use_all_events = FALSE
+ ///how many do we pick
+ var/event_amount = 1
+ ///do we empty the event list before adding our events
+ var/events_override = FALSE
+
+/datum/map_template/shuttle/emergency/New()
+ . = ..()
+ if(!occupancy_limit && who_can_purchase)
+ CRASH("The [name] needs an occupancy limit!")
+ if(HAS_TRAIT(SSstation, STATION_TRAIT_SHUTTLE_SALE) && credit_cost > 0 && prob(15))
+ var/discount_amount = round(rand(25, 80), 5)
+ name += " ([discount_amount]% Discount!)"
+ var/discount_multiplier = 100 - discount_amount
+ credit_cost = ((credit_cost * discount_multiplier) / 100)
+
+///on post_load use our variables to change shuttle events
+/datum/map_template/shuttle/emergency/post_load(obj/docking_port/mobile/mobile)
+ . = ..()
+ if(!events)
+ return
+ if(events_override)
+ mobile.event_list.Cut()
+ if(use_all_events)
+ for(var/path in events)
+ mobile.event_list.Add(new path(mobile))
+ events -= path
+ else
+ for(var/i in 1 to event_amount)
+ var/path = pick_weight(events)
+ events -= path
+ mobile.event_list.Add(new path(mobile))
+
+/datum/map_template/shuttle/emergency/backup
+ prefix = "_maps/shuttles/"
+ suffix = "backup"
+ name = "Backup Shuttle"
+ who_can_purchase = null
+
+/datum/map_template/shuttle/emergency/construction
+ suffix = "construction"
+ name = "Build your own shuttle kit"
+ description = "For the enterprising shuttle engineer! The chassis will dock upon purchase, but launch will have to be authorized as usual via shuttle call. Comes stocked with construction materials. Unlocks the ability to buy shuttle engine crates from cargo, which allow you to speed up shuttle transit time."
+ 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()
+ . = ..()
+ //enable buying engines from cargo
+ 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/humpback
+ suffix = "humpback"
+ name = "Humpback Emergency Shuttle"
+ description = "A repurposed cargo hauling and salvaging ship, for sightseeing and tourism. Has a bar. Complete with a 2 minute vacation plan to carp territory."
+ credit_cost = CARGO_CRATE_VALUE * 12
+ occupancy_limit = "30"
+ events = list(
+ /datum/shuttle_event/simple_spawner/carp/friendly = 10,
+ /datum/shuttle_event/simple_spawner/carp/friendly_but_no_personal_space = 2,
+ /datum/shuttle_event/simple_spawner/carp = 2,
+ /datum/shuttle_event/simple_spawner/carp/magic = 1,
+ )
+
+/datum/map_template/shuttle/emergency/bar
+ suffix = "bar"
+ name = "The Emergency Escape Bar"
+ description = "Features include sentient bar staff (a Bardrone and a Barmaid), bathroom, a quality lounge for the heads, and a large gathering table."
+ 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"
+ name = "Emergency Pods"
+ 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"
+ name = "Mother Russia Bleeds"
+ 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"
+ name = "Asteroid With Engines Strapped To It"
+ description = "A hollowed out asteroid with engines strapped to it, the hollowing procedure makes it very difficult to hijack but is very expensive. Due to its size and difficulty in steering it, this shuttle may damage the docking area."
+ 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"
+ name = "Grand Corporate Monastery"
+ description = "Originally built for a public station, this grand edifice to religion, due to budget cuts, is now available as an escape shuttle for the right... donation. Due to its large size and callous owners, this shuttle may cause collateral damage."
+ admin_notes = "WARNING: This shuttle WILL destroy a fourth of the station, likely picking up a lot of objects with it."
+ emag_only = TRUE
+ credit_cost = EMAG_LOCKED_SHUTTLE_COST * 1.8
+ movement_force = list("KNOCKDOWN" = 3, "THROW" = 5)
+ occupancy_limit = "70"
+ who_can_purchase = null //SKYRAT EDIT ADDITION
+
+/datum/map_template/shuttle/emergency/luxury
+ suffix = "luxury"
+ name = "Luxury Shuttle"
+ description = "A luxurious golden shuttle complete with an indoor swimming pool. Each crewmember wishing to board must bring 500 credits, payable in cash and mineral coin."
+ extra_desc = "This shuttle costs 500 credits to board."
+ 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]
+
+/datum/map_template/shuttle/emergency/discoinferno
+ suffix = "discoinferno"
+ name = "Disco Inferno"
+ description = "The glorious results of centuries of plasma research done by Nanotrasen employees. This is the reason why you are here. Get on and dance like you're on fire, burn baby burn!"
+ 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."
+ 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
+
+/datum/map_template/shuttle/emergency/arena/prerequisites_met()
+ return SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_BUBBLEGUM]
+
+/datum/map_template/shuttle/emergency/arena/post_load(obj/docking_port/mobile/M)
+ . = ..()
+ if(!arena_loaded)
+ arena_loaded = TRUE
+ var/datum/map_template/arena/arena_template = new()
+ arena_template.load_new_z()
+
+/datum/map_template/arena
+ name = "The Arena"
+ mappath = "_maps/templates/the_arena.dmm"
+
+/datum/map_template/shuttle/emergency/birdboat
+ suffix = "birdboat"
+ 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"
+ name = "Donutstation Emergency Shuttle"
+ 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"
+ name = "Snappop(tm)!"
+ description = "Hey kids and grownups! \
+ Are you bored of DULL and TEDIOUS shuttle journeys after you're evacuating for probably BORING reasons. Well then order the Snappop(tm) today! \
+ We've got fun activities for everyone, an all access cockpit, and no boring security brig! Boo! Play dress up with your friends! \
+ Collect all the bedsheets before your neighbour does! Check if the AI is watching you with our patent pending \"Peeping Tom AI Multitool Detector\" or PEEEEEETUR for short. \
+ 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"
+ name = "Secure Transport Vessel 5 (STV5)"
+ description = "Well, looks like CentCom only had this ship in the area, they probably weren't expecting you to need evac for a while. \
+ Probably best if you don't rifle around in whatever equipment they were transporting. I hope you're friendly with your coworkers, because there is very little space in this thing.\n\
+ \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 * -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"
+ name = "Shuttle 667"
+ 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]
+
+/datum/map_template/shuttle/emergency/pubby
+ suffix = "pubby"
+ name = "Pubby Station Emergency Shuttle"
+ 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"
+ name = "Cere Station Emergency Shuttle"
+ description = "The large, beefed-up version of the box-standard shuttle. Includes an expanded brig, fully stocked medbay, enhanced cargo storage with mech chargers, \
+ 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"
+ name = "Hyperfractal Gigashuttle"
+ description = "\"I dunno, this seems kinda needlessly complicated.\"\n\
+ \"This shuttle has very a very high safety record, according to CentCom Officer Cadet Yins.\"\n\
+ \"Are you sure?\"\n\
+ \"Yes, it has a safety record of N-A-N, which is apparently larger than 100%.\""
+ admin_notes = "Supermatter that spawns on shuttle is special anchored 'hugbox' supermatter that cannot take damage and does not take in or emit gas. \
+ Outside of admin intervention, it cannot explode. \
+ It does, however, still dust anything on contact, emits high levels of radiation, and induce hallucinations in anyone looking at it without protective goggles. \
+ Emitters spawn powered on, expect admin notices, they are harmless."
+ 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"
+ name = "Oh, Hi Daniel"
+ description = "How was space work today? Oh, pretty good. We got a new space station and the company will make a lot of money. What space station? I cannot tell you; it's space confidential. \
+ Aw, come space on. Why not? No, I can't. Anyway, how is your space roleplay life?"
+ admin_notes = "Tiny, with a single airlock and wooden walls. What could go wrong?"
+ 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"
+ name = "Uncle Pete's Rollerdome"
+ 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 * 30
+ occupancy_limit = "5"
+
+/datum/map_template/shuttle/emergency/basketball
+ suffix = "bballhooper"
+ name = "Basketballer's Stadium"
+ description = "Hoop, man, hoop! Get your shooting game on with this sleek new basketball stadium! Do keep in mind that several other features \
+ that you may expect to find common-place on other shuttles aren't present to give you this sleek stadium at an affordable cost. \
+ 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"
+ name = "NT Lepton Violet"
+ description = "The research team based on this vessel went missing one day, and no amount of investigation could discover what happened to them. \
+ The only occupants were a number of dead rodents, who appeared to have clawed each other to death. \
+ 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"
+ name = "The NTSS Independence"
+ 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"
+ name = "Dynamic Environmental Interaction Shuttle"
+ 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"
+ name = "Lucky Jackpot Casino Shuttle"
+ 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"
+ name = "The NTSS Shadow"
+ 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"
+ name = "Angler's Choice Emergency Shuttle"
+ 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"
+ name = "The Lance Crew Evacuation System"
+ 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"
+ name = "The Tranquility Relocation Shuttle"
+ 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"
+ name = "Hug Relaxation Shuttle"
+ 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"
+ name = "Hall of Fame Shuttle"
+ 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
+ occupancy_limit = "55"
+
+/datum/map_template/shuttle/emergency/delta
+ suffix = "delta"
+ name = "Delta Station Emergency Shuttle"
+ 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"
+ name = "North Star Emergency Shuttle"
+ 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"
+ name = "CentCom Raven Cruiser"
+ description = "The CentCom Raven Cruiser is a former high-risk salvage vessel, now repurposed into an emergency escape shuttle. \
+ Once first to the scene to pick through warzones for valuable remains, it now serves as an excellent escape option for stations under heavy fire from outside forces. \
+ 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..."
+ 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]
+
+#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..c6f94b5684b
--- /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 = "ex_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/status_effects/buffs/food_haste.dm b/code/datums/status_effects/buffs/food_haste.dm
new file mode 100644
index 00000000000..9daf859fb19
--- /dev/null
+++ b/code/datums/status_effects/buffs/food_haste.dm
@@ -0,0 +1,20 @@
+/// Haste makes the eater move faster
+/datum/status_effect/food/haste
+ var/datum/movespeed_modifier/food_haste/modifier
+
+/datum/status_effect/food/haste/on_apply()
+ modifier = new()
+ modifier.multiplicative_slowdown = -0.04 * strength
+ owner.add_movespeed_modifier(modifier, update = TRUE)
+ return ..()
+
+/datum/status_effect/food/haste/be_replaced()
+ owner.remove_movespeed_modifier(modifier, update = TRUE)
+ return ..()
+
+/datum/status_effect/food/haste/on_remove()
+ owner.remove_movespeed_modifier(modifier, update = TRUE)
+ return ..()
+
+/datum/movespeed_modifier/food_haste
+ multiplicative_slowdown = -0.1
diff --git a/code/datums/status_effects/buffs/food_traits.dm b/code/datums/status_effects/buffs/food_traits.dm
new file mode 100644
index 00000000000..ebe22116dd0
--- /dev/null
+++ b/code/datums/status_effects/buffs/food_traits.dm
@@ -0,0 +1,8 @@
+/datum/status_effect/food/trait/shockimmune
+ alert_type = /atom/movable/screen/alert/status_effect/food_trait_shockimmune
+ trait = TRAIT_SHOCKIMMUNE
+
+/atom/movable/screen/alert/status_effect/food_trait_shockimmune
+ name = "Grounded"
+ desc = "That meal made me feel like a superconductor..."
+ icon_state = "food_buff_4"
diff --git a/code/datums/status_effects/debuffs/cursed.dm b/code/datums/status_effects/debuffs/cursed.dm
new file mode 100644
index 00000000000..285fb86348e
--- /dev/null
+++ b/code/datums/status_effects/debuffs/cursed.dm
@@ -0,0 +1,195 @@
+#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
+ remove_on_fullheal = TRUE
+ heal_flag_necessary = HEAL_ADMIN
+ /// 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(mob/user, 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/flesh/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/flesh/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/cyborg.dm b/code/datums/status_effects/debuffs/cyborg.dm
new file mode 100644
index 00000000000..0f95b494197
--- /dev/null
+++ b/code/datums/status_effects/debuffs/cyborg.dm
@@ -0,0 +1,22 @@
+/// Reduce a cyborg's speed when you throw things at it
+/datum/status_effect/borg_throw_slow
+ id = "borg_throw_slowdown"
+ alert_type = /atom/movable/screen/alert/status_effect/borg_throw_slow
+ duration = 3 SECONDS
+ status_type = STATUS_EFFECT_REPLACE
+
+/datum/status_effect/borg_throw_slow/on_apply()
+ . = ..()
+ owner.add_movespeed_modifier(/datum/movespeed_modifier/borg_throw, update = TRUE)
+
+/datum/status_effect/borg_throw_slow/on_remove()
+ . = ..()
+ owner.remove_movespeed_modifier(/datum/movespeed_modifier/borg_throw, update = TRUE)
+
+/atom/movable/screen/alert/status_effect/borg_throw_slow
+ name = "Percussive Maintenance"
+ desc = "A sudden impact has triggered your collision avoidance routines, reducing movement speed."
+ icon_state = "weaken"
+
+/datum/movespeed_modifier/borg_throw
+ multiplicative_slowdown = 0.9
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/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/debuffs/static_vision.dm b/code/datums/status_effects/debuffs/static_vision.dm
new file mode 100644
index 00000000000..7132c189b9d
--- /dev/null
+++ b/code/datums/status_effects/debuffs/static_vision.dm
@@ -0,0 +1,29 @@
+/datum/status_effect/static_vision
+ id = "static_vision"
+ status_type = STATUS_EFFECT_REPLACE
+ alert_type = null
+
+/datum/status_effect/static_vision/on_creation(mob/living/new_owner, duration = 3 SECONDS)
+ src.duration = duration
+ return ..()
+
+/datum/status_effect/static_vision/on_apply()
+ RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(remove_static_vision))
+
+ owner.overlay_fullscreen(id, /atom/movable/screen/fullscreen/static_vision)
+ owner.sound_environment_override = SOUND_ENVIRONMENT_UNDERWATER
+
+ return TRUE
+
+/datum/status_effect/static_vision/on_remove()
+ UnregisterSignal(owner, COMSIG_LIVING_DEATH)
+
+ owner.clear_fullscreen(id)
+ if(owner.sound_environment_override == SOUND_ENVIRONMENT_UNDERWATER)
+ owner.sound_environment_override = SOUND_ENVIRONMENT_NONE
+
+/// Handles clearing on death
+/datum/status_effect/static_vision/proc/remove_static_vision(datum/source, admin_revive)
+ SIGNAL_HANDLER
+
+ qdel(src)
diff --git a/code/datums/status_effects/food_effects.dm b/code/datums/status_effects/food_effects.dm
new file mode 100644
index 00000000000..e41ef67ad10
--- /dev/null
+++ b/code/datums/status_effects/food_effects.dm
@@ -0,0 +1,52 @@
+/// Buffs given by eating hand-crafted food. The duration scales with consumable reagents purity.
+/datum/status_effect/food
+ id = "food_buff"
+ duration = 5 MINUTES // Same as food mood buffs
+ status_type = STATUS_EFFECT_REPLACE // Only one food buff allowed
+ /// Buff power
+ var/strength
+
+/datum/status_effect/food/on_creation(mob/living/new_owner, timeout_mod = 1, strength = 1)
+ src.strength = strength
+ //Generate alert when not specified
+ if(alert_type == /atom/movable/screen/alert/status_effect)
+ alert_type = "/atom/movable/screen/alert/status_effect/food/buff_[strength]"
+ if(isnum(timeout_mod))
+ duration *= timeout_mod
+ . = ..()
+
+/atom/movable/screen/alert/status_effect/food
+ name = "Hand-crafted meal"
+ desc = "Eating it made me feel better."
+ icon_state = "food_buff_1"
+
+/atom/movable/screen/alert/status_effect/food/buff_1
+ icon_state = "food_buff_1"
+
+/atom/movable/screen/alert/status_effect/food/buff_2
+ icon_state = "food_buff_2"
+
+/atom/movable/screen/alert/status_effect/food/buff_3
+ icon_state = "food_buff_3"
+
+/atom/movable/screen/alert/status_effect/food/buff_4
+ icon_state = "food_buff_4"
+
+/atom/movable/screen/alert/status_effect/food/buff_5
+ icon_state = "food_buff_5"
+
+/// Makes you gain a trait
+/datum/status_effect/food/trait
+ var/trait = TRAIT_DUMB // You need to override this
+
+/datum/status_effect/food/trait/on_apply()
+ ADD_TRAIT(owner, trait, type)
+ return ..()
+
+/datum/status_effect/food/trait/be_replaced()
+ REMOVE_TRAIT(owner, trait, type)
+ return ..()
+
+/datum/status_effect/food/trait/on_remove()
+ REMOVE_TRAIT(owner, trait, type)
+ return ..()
diff --git a/code/datums/storage/subtypes/surgery_tray.dm b/code/datums/storage/subtypes/surgery_tray.dm
new file mode 100644
index 00000000000..35886581318
--- /dev/null
+++ b/code/datums/storage/subtypes/surgery_tray.dm
@@ -0,0 +1,22 @@
+/datum/storage/surgery_tray
+ max_total_storage = 30
+ max_specific_storage = WEIGHT_CLASS_NORMAL
+ max_slots = 14
+
+/datum/storage/surgery_tray/New()
+ . = ..()
+ set_holdable(list(
+ /obj/item/blood_filter,
+ /obj/item/bonesetter,
+ /obj/item/cautery,
+ /obj/item/circular_saw,
+ /obj/item/clothing/mask/surgical,
+ /obj/item/hemostat,
+ /obj/item/razor,
+ /obj/item/retractor,
+ /obj/item/scalpel,
+ /obj/item/stack/medical/bone_gel,
+ /obj/item/stack/sticky_tape/surgical,
+ /obj/item/surgical_drapes,
+ /obj/item/surgicaldrill,
+ ))
diff --git a/code/datums/wires/mass_driver.dm b/code/datums/wires/mass_driver.dm
new file mode 100644
index 00000000000..329da73c2dc
--- /dev/null
+++ b/code/datums/wires/mass_driver.dm
@@ -0,0 +1,25 @@
+/datum/wires/mass_driver
+ holder_type = /obj/machinery/mass_driver
+ proper_name = "Mass Driver"
+
+/datum/wires/mass_driver/New(atom/holder)
+ wires = list(WIRE_LAUNCH, WIRE_SAFETIES)
+ ..()
+
+/datum/wires/mass_driver/on_pulse(wire)
+ var/obj/machinery/mass_driver/the_mass_driver = holder
+ switch(wire)
+ if(WIRE_LAUNCH)
+ the_mass_driver.drive()
+ holder.visible_message(span_notice("The drive mechanism activates."))
+ if(WIRE_SAFETIES)
+ the_mass_driver.power = 3
+ holder.visible_message(span_notice("You hear a worrying whirring noise emitting from the mass driver."))
+
+/datum/wires/mass_driver/on_cut(wire, mend, source)
+ var/obj/machinery/mass_driver/the_mass_driver = holder
+ switch(wire)
+ if(WIRE_SAFETIES)
+ if(the_mass_driver.power > 1)
+ the_mass_driver.power = 1
+ holder.visible_message(span_notice("The whirring noise emitting from the mass driver stops."))
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/wounds/_wound_static_data.dm b/code/datums/wounds/_wound_static_data.dm
new file mode 100644
index 00000000000..7a59ea57413
--- /dev/null
+++ b/code/datums/wounds/_wound_static_data.dm
@@ -0,0 +1,199 @@
+// This datum is merely a singleton instance that allows for custom "can be applied" behaviors without instantiating a wound instance.
+// For example: You can make a pregen_data subtype for your wound that overrides can_be_applied_to to only apply to specifically slimeperson limbs.
+// Without this, youre stuck with very static initial variables.
+
+/// A singleton datum that holds pre-gen and static data about a wound. Each wound datum should have a corresponding wound_pregen_data.
+/datum/wound_pregen_data
+ /// The typepath of the wound we will be handling and storing data of. NECESSARY IF THIS IS A NON-ABSTRACT TYPE!
+ var/datum/wound/wound_path_to_generate
+
+ /// Will this be instantiated?
+ var/abstract = FALSE
+
+ /// If true, our wound can be selected in ordinary wound rolling. If this is set to false, our wound can only be directly instantiated by use of specific typepath.
+ var/can_be_randomly_generated = TRUE
+
+ /// A list of biostates a limb must have to receive our wound, in wounds.dm.
+ var/required_limb_biostate
+ /// If false, we will check if the limb has all of our required biostates instead of just any.
+ var/require_any_biostate = FALSE
+
+ /// If false, we will iterate through wounds on a given limb, and if any match our type, we wont add our wound.
+ var/duplicates_allowed = FALSE
+
+ /// If we require BIO_BLOODED, we will not add our wound if this is true and the limb cannot bleed.
+ var/ignore_cannot_bleed = TRUE // a lot of bleed wounds should still be applied for purposes of mangling flesh
+
+ /// A list of bodyzones we are applicable to.
+ var/list/viable_zones = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
+ /// The types of attack that can generate this wound. E.g. WOUND_SLASH = A sharp attack can cause this, WOUND_BLUNT = an attack with no sharpness/an attack with sharpness against a limb with mangled exterior can cause this.
+ var/list/required_wounding_types
+ /// If true, this wound can only be generated by all [required_wounding_types] at once, not just any.
+ var/match_all_wounding_types = FALSE
+
+ /// The weight that will be used if, by the end of wound selection, there are multiple valid wounds. This will be inserted into pick_weight, so use integers.
+ var/weight = WOUND_DEFAULT_WEIGHT
+
+ /// The minimum injury roll a attack must get to generate us. Affected by our wound's threshold_penalty and series_threshold_penalty, as well as the attack's wound_bonus. See check_wounding_mods().
+ var/threshold_minimum
+
+ /// The series of wounds this is in. See wounds.dm (the defines file) for a more detailed explanation - but tldr is that no 2 wounds of the same series can be on a limb.
+ var/wound_series
+
+ /// If true, we will attempt to, during a random wound roll, overpower and remove other wound typepaths from the possible wounds list using [competition_mode] and [overpower_wounds_of_even_severity].
+ var/compete_for_wounding = TRUE
+ /// The competition mode with which we will remove other wounds from a possible wound roll assuming [compete_for_wounding] is TRUE. See wounds.dm, the defines file, for more information on what these do.
+ var/competition_mode = WOUND_COMPETITION_OVERPOWER_LESSERS
+ /// If this and [compete_for_wounding] is true, we will remove wounds of an even severity to us during a random wound roll.
+ var/overpower_wounds_of_even_severity = FALSE
+
+ /// A list of BIO_ defines that will be iterated over in order to determine the scar file our wound will generate.
+ /// Use generate_scar_priorities to create a custom list.
+ var/list/scar_priorities
+
+/datum/wound_pregen_data/New()
+ . = ..()
+
+ if (!abstract)
+ if (required_limb_biostate == null)
+ stack_trace("required_limb_biostate null - please set it! occured on: [src.type]")
+ if (wound_path_to_generate == null)
+ stack_trace("wound_path_to_generate null - please set it! occured on: [src.type]")
+
+ scar_priorities = generate_scar_priorities()
+
+/// Should return a list of BIO_ biostate priorities, in order. See [scar_priorities] for further documentation.
+/datum/wound_pregen_data/proc/generate_scar_priorities()
+ RETURN_TYPE(/list)
+
+ var/list/priorities = list(
+ "[BIO_FLESH]",
+ "[BIO_BONE]",
+ )
+
+ return priorities
+
+// this proc is the primary reason this datum exists - a singleton instance so we can always run this proc even without the wound existing
+/**
+ * Args:
+ * * obj/item/bodypart/limb: The limb we are considering.
+ * * list/suggested_wounding_types: The wounding types to be checked against the wounding types we require. Defaults to required_wounding_types.
+ * * datum/wound/old_wound: If we would replace a wound, this would be said wound. Nullable.
+ * * random_roll = FALSE: If this is in the context of a random wound generation, and this wound wasn't specifically checked.
+ *
+ * Returns:
+ * FALSE if the limb cannot be wounded, if the wounding types dont match ours (via wounding_types_valid()), if we have a higher severity wound already in our series,
+ * if we have a biotype mismatch, if the limb isnt in a viable zone, or if theres any duplicate wound types.
+ * TRUE otherwise.
+ */
+/datum/wound_pregen_data/proc/can_be_applied_to(obj/item/bodypart/limb, list/suggested_wounding_types = required_wounding_types, datum/wound/old_wound, random_roll = FALSE, duplicates_allowed = src.duplicates_allowed, care_about_existing_wounds = TRUE)
+ SHOULD_BE_PURE(TRUE)
+
+ if (!istype(limb) || !limb.owner)
+ return FALSE
+
+ if (random_roll && !can_be_randomly_generated)
+ return FALSE
+
+ if (HAS_TRAIT(limb.owner, TRAIT_NEVER_WOUNDED) || (limb.owner.status_flags & GODMODE))
+ return FALSE
+
+ if (!wounding_types_valid(suggested_wounding_types))
+ return FALSE
+
+ if (care_about_existing_wounds)
+ for (var/datum/wound/preexisting_wound as anything in limb.wounds)
+ var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[preexisting_wound.type]
+ if (pregen_data.wound_series == wound_series)
+ if (preexisting_wound.severity >= initial(wound_path_to_generate.severity))
+ return FALSE
+
+ if (!ignore_cannot_bleed && ((required_limb_biostate & BIO_BLOODED) && !limb.can_bleed()))
+ return FALSE
+
+ if (!biostate_valid(limb.biological_state))
+ return FALSE
+
+ if (!(limb.body_zone in viable_zones))
+ return FALSE
+
+ // we accept promotions and demotions, but no point in redundancy. This should have already been checked wherever the wound was rolled and applied for (see: bodypart damage code), but we do an extra check
+ // in case we ever directly add wounds
+ if (!duplicates_allowed)
+ for (var/datum/wound/preexisting_wound as anything in limb.wounds)
+ if (preexisting_wound.type == wound_path_to_generate && (preexisting_wound != old_wound))
+ return FALSE
+ return TRUE
+
+/// Returns true if we have the given biostates, or any biostate in it if check_for_any is true. False otherwise.
+/datum/wound_pregen_data/proc/biostate_valid(biostate)
+ if (require_any_biostate)
+ if (!(biostate & required_limb_biostate))
+ return FALSE
+ else if (!((biostate & required_limb_biostate) == required_limb_biostate)) // check for all
+ return FALSE
+
+ return TRUE
+
+/**
+ * A simple getter for [weight], with arguments supplied to allow custom behavior.
+ *
+ * Args:
+ * * obj/item/bodypart/limb: The limb we are contemplating being added to. Nullable.
+ * * woundtype: The woundtype of the assumed attack that would generate us. Nullable.
+ * * damage: The raw damage that would cause us. Nullable.
+ * * attack_direction: The direction of the attack that'd cause us. Nullable.
+ * * damage_source: The entity that would cause us. Nullable.
+ *
+ * Returns:
+ * Our weight.
+ */
+/datum/wound_pregen_data/proc/get_weight(obj/item/bodypart/limb, woundtype, damage, attack_direction, damage_source)
+ return weight
+
+/// Returns TRUE if we use WOUND_ALL, or we require all types and have all/if we require any and have any, FALSE otherwise.
+/datum/wound_pregen_data/proc/wounding_types_valid(list/suggested_wounding_types)
+ if (WOUND_ALL in required_wounding_types)
+ return TRUE
+ if (!length(suggested_wounding_types))
+ return FALSE
+
+ for (var/iter_wounding_type as anything in suggested_wounding_types)
+ if (!(iter_wounding_type in required_wounding_types))
+ if (match_all_wounding_types)
+ return FALSE
+ else
+ if (!match_all_wounding_types)
+ return TRUE
+
+ return match_all_wounding_types // if we get here, we've matched everything
+
+/**
+ * A simple getter for [threshold_minimum], with arguments supplied to allow custom behavior.
+ *
+ * Args:
+ * * obj/item/bodypart/part: The limb we are contemplating being added to.
+ * * attack_direction: The direction of the attack that'd generate us. Nullable.
+ * * damage_source: The source of the damage that'd cause us. Nullable.
+ */
+/datum/wound_pregen_data/proc/get_threshold_for(obj/item/bodypart/part, attack_direction, damage_source)
+ return threshold_minimum
+
+/// Returns a new instance of our wound datum.
+/datum/wound_pregen_data/proc/generate_instance(obj/item/bodypart/limb, ...)
+ RETURN_TYPE(/datum/wound)
+
+ return new wound_path_to_generate
+
+/datum/wound_pregen_data/Destroy(force, ...)
+ var/error_message = "[src], a singleton wound pregen data instance, was destroyed! This should not happen!"
+ if (force)
+ error_message += " NOTE: This Destroy() was called with force == TRUE. This instance will be deleted and replaced with a new one."
+ stack_trace(error_message)
+
+ if (!force)
+ return QDEL_HINT_LETMELIVE
+
+ . = ..()
+
+ GLOB.all_wound_pregen_data[wound_path_to_generate] = new src.type //recover
diff --git a/code/datums/wounds/blunt.dm b/code/datums/wounds/blunt.dm
new file mode 100644
index 00000000000..219b7dd8805
--- /dev/null
+++ b/code/datums/wounds/blunt.dm
@@ -0,0 +1,3 @@
+/datum/wound/blunt
+ name = "Blunt Wound"
+ sound_effect = 'sound/effects/wounds/crack1.ogg'
diff --git a/code/datums/wounds/scars/_static_scar_data.dm b/code/datums/wounds/scars/_static_scar_data.dm
new file mode 100644
index 00000000000..942dcffff9c
--- /dev/null
+++ b/code/datums/wounds/scars/_static_scar_data.dm
@@ -0,0 +1,20 @@
+GLOBAL_LIST_INIT_TYPED(all_static_scar_data, /datum/static_scar_data, generate_static_scar_data())
+
+/proc/generate_static_scar_data()
+ RETURN_TYPE(/list/datum/static_scar_data)
+
+ var/list/datum/wound_pregen_data/data = list()
+
+ for (var/datum/wound_pregen_data/path as anything in typecacheof(path = /datum/static_scar_data, ignore_root_path = TRUE))
+ if (initial(path.abstract))
+ continue
+
+ var/datum/wound_pregen_data/pregen_data = new path
+ data[pregen_data.wound_path_to_generate] = pregen_data
+
+ return data
+
+/datum/static_scar_data
+ var/abstract = FALSE
+
+
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..f63798aca62
--- /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/atoms_initializing_EXPENSIVE.dm b/code/game/atoms_initializing_EXPENSIVE.dm
new file mode 100644
index 00000000000..1ecc6390edc
--- /dev/null
+++ b/code/game/atoms_initializing_EXPENSIVE.dm
@@ -0,0 +1,128 @@
+/// 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])
+ 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/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/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/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/game/objects/effects/poster_demotivational.dm b/code/game/objects/effects/poster_demotivational.dm
new file mode 100644
index 00000000000..08e46b6af63
--- /dev/null
+++ b/code/game/objects/effects/poster_demotivational.dm
@@ -0,0 +1,91 @@
+/obj/item/poster/traitor
+ name = "random traitor poster"
+ poster_type = /obj/structure/sign/poster/traitor/random
+ icon_state = "rolled_traitor"
+
+/obj/structure/sign/poster/traitor
+ poster_item_name = "seditious poster"
+ poster_item_desc = "This poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. Its seditious themes are likely to demoralise Nanotrasen employees."
+ poster_item_icon_state = "rolled_traitor"
+ // This stops people hiding their sneaky posters behind signs
+ layer = CORGI_ASS_PIN_LAYER
+ /// Proximity sensor to make people sad if they're nearby
+ var/datum/proximity_monitor/advanced/demoraliser/demoraliser
+
+/obj/structure/sign/poster/traitor/apply_holiday()
+ var/obj/structure/sign/poster/traitor/holi_data = /obj/structure/sign/poster/traitor/festive
+ name = initial(holi_data.name)
+ desc = initial(holi_data.desc)
+ icon_state = initial(holi_data.icon_state)
+
+/obj/structure/sign/poster/traitor/on_placed_poster(mob/user)
+ var/datum/demoralise_moods/poster/mood_category = new()
+ demoraliser = new(src, 7, TRUE, mood_category)
+ return ..()
+
+/obj/structure/sign/poster/traitor/attackby(obj/item/tool, mob/user, params)
+ if (tool.tool_behaviour == TOOL_WIRECUTTER)
+ QDEL_NULL(demoraliser)
+ return ..()
+
+/obj/structure/sign/poster/traitor/Destroy()
+ QDEL_NULL(demoraliser)
+ return ..()
+
+/obj/structure/sign/poster/traitor/random
+ name = "random seditious poster"
+ icon_state = ""
+ never_random = TRUE
+ random_basetype = /obj/structure/sign/poster/traitor
+
+/obj/structure/sign/poster/traitor/small_brain
+ name = "Nanotrasen Neural Statistics"
+ desc = "Statistics on this poster indicate that the brains of Nanotrasen employees are on average 20% smaller than the galactic standard."
+ icon_state = "traitor_small_brain"
+
+/obj/structure/sign/poster/traitor/lick_supermatter
+ name = "Taste Explosion"
+ desc = "It claims that the supermatter provides a unique and enjoyable culinary experience, and yet your boss won't even let you take one lick."
+ icon_state = "traitor_supermatter"
+
+/obj/structure/sign/poster/traitor/cloning
+ name = "Demand Cloning Pods Now"
+ desc = "This poster claims that Nanotrasen is intentionally witholding cloning technology just for its executives, condemning you to suffer and die when you could have a fresh, fit body.'"
+ icon_state = "traitor_cloning"
+
+/obj/structure/sign/poster/traitor/ai_rights
+ name = "Synthetic Rights"
+ desc = "This poster claims that synthetic life is no less sapient than you are, and that if you allow them to be shackled with artificial Laws you are complicit in slavery."
+ icon_state = "traitor_ai"
+
+/obj/structure/sign/poster/traitor/metroid
+ name = "Cruelty to Animals"
+ desc = "This poster details the harmful effects of a 'preventative tooth extraction' reportedly inflicted upon the slimes in the Xenobiology lab. Apparently this painful process leads to stress, lethargy, and reduced buoyancy."
+ icon_state = "traitor_metroid"
+
+/obj/structure/sign/poster/traitor/low_pay
+ name = "All these hours, for what?"
+ desc = "This poster displays a comparison of Nanotrasen standard wages to common luxury items. If this is accurate, it takes upwards of 20,000 hours of work just to buy a simple bicycle."
+ icon_state = "traitor_cash"
+
+/obj/structure/sign/poster/traitor/look_up
+ name = "Don't Look Up"
+ desc = "It says that it has been 538 days since the last time the roof was cleaned."
+ icon_state = "traitor_roof"
+
+/obj/structure/sign/poster/traitor/accidents
+ name = "Workplace Safety Advisory"
+ desc = "It says that it has been 0 days since the last on-site accident."
+ icon_state = "traitor_accident"
+
+/obj/structure/sign/poster/traitor/starve
+ name = "They Are Poisoning You"
+ desc = "This poster claims that in the modern age it is impossible to die of starvation. 'That feeling you get when you haven't eaten in a while isn't hunger, it's withdrawal.'"
+ icon_state = "traitor_hungry"
+
+/// syndicate can get festive too
+/obj/structure/sign/poster/traitor/festive
+ name = "Working For The Holidays."
+ desc = "Don't you know it's a holiday? What are you doing at work?"
+ icon_state = "traitor_festive"
+ never_random = TRUE
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..7b4bec1f6a1
--- /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/brimdemon = 1,
+ /mob/living/basic/mining/goldgrub = 1,
+ /mob/living/basic/mining/goliath = 1,
+ /mob/living/basic/mining/legion = 1,
+ /mob/living/basic/mining/lobstrosity/lava = 1,
+ /mob/living/basic/mining/watcher = 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/basic/mining/legion = 19,
+ /mob/living/basic/mining/legion/dwarf = 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/items/climbingrope.dm b/code/game/objects/items/climbingrope.dm
new file mode 100644
index 00000000000..2c96d1844b1
--- /dev/null
+++ b/code/game/objects/items/climbingrope.dm
@@ -0,0 +1,86 @@
+/obj/item/climbing_hook
+ name = "climbing hook"
+ desc = "Standard hook with rope to scale up holes. The rope is of average quality, but due to your weight amongst other factors, may not withstand extreme use."
+ icon = 'icons/obj/mining.dmi'
+ icon_state = "climbingrope"
+ inhand_icon_state = "crowbar_brass"
+ lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
+ force = 5
+ throwforce = 10
+ reach = 2
+ throw_range = 4
+ w_class = WEIGHT_CLASS_NORMAL
+ attack_verb_continuous = list("whacks", "flails", "bludgeons")
+ attack_verb_simple = list("whack", "flail", "bludgeon")
+ resistance_flags = FLAMMABLE
+ ///how many times can we climb with this rope
+ var/uses = 5
+ ///climb time
+ var/climb_time = 2.5 SECONDS
+
+/obj/item/climbing_hook/examine(mob/user)
+ . = ..()
+ var/list/look_binds = user.client.prefs.key_bindings["look up"]
+ . += span_notice("Firstly, look upwards by holding [english_list(look_binds, nothing_text = "(nothing bound)", and_text = " or ", comma_text = ", or ")]!")
+ . += span_notice("Then, click solid ground adjacent to the hole above you.")
+ . += span_notice("The rope looks like you could use it [uses] times before it falls apart.")
+
+/obj/item/climbing_hook/afterattack(turf/open/target, mob/user, proximity_flag, click_parameters)
+ . = ..()
+ if(target.z == user.z)
+ return
+ if(!istype(target) || isopenspaceturf(target))
+ return
+ if(target.is_blocked_turf(exclude_mobs = TRUE))
+ return
+ var/turf/user_turf = get_turf(user)
+ var/turf/above = GET_TURF_ABOVE(user_turf)
+ if(!isopenspaceturf(above) || !above.Adjacent(target)) //are we below a hole, is the target blocked, is the target adjacent to our hole
+ balloon_alert(user, "blocked!")
+ return
+ var/away_dir = get_dir(above, target)
+ user.visible_message(span_notice("[user] begins climbing upwards with [src]."), span_notice("You get to work on properly hooking [src] and going upwards."))
+ playsound(target, 'sound/effects/picaxe1.ogg', 50) //plays twice so people above and below can hear
+ playsound(user_turf, 'sound/effects/picaxe1.ogg', 50)
+ var/list/effects = list(new /obj/effect/temp_visual/climbing_hook(target, away_dir), new /obj/effect/temp_visual/climbing_hook(user_turf, away_dir))
+ if(do_after(user, climb_time, target))
+ user.Move(target)
+ uses--
+
+ if(uses <= 0)
+ user.visible_message(span_warning("[src] snaps and tears apart!"))
+ qdel(src)
+
+ QDEL_LIST(effects)
+
+/obj/item/climbing_hook/emergency
+ name = "emergency climbing hook"
+ desc = "An emergency climbing hook to scale up holes. The rope is EXTREMELY cheap and may not withstand extended use."
+ uses = 2
+ climb_time = 4 SECONDS
+ w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/climbing_hook/syndicate
+ name = "suspicious climbing hook"
+ desc = "REALLY suspicious climbing hook to scale up holes. The hook has a syndicate logo engraved on it, and the rope appears rather durable."
+ icon_state = "climbingrope_s"
+ uses = 10
+ climb_time = 1.5 SECONDS
+
+/obj/item/climbing_hook/infinite //debug stuff
+ name = "infinite climbing hook"
+ desc = "A plasteel hook, with rope. Upon closer inspection, the rope appears to be made out of plasteel woven into regular rope, amongst many other reinforcements."
+ uses = INFINITY
+ climb_time = 1 SECONDS
+
+/obj/effect/temp_visual/climbing_hook
+ icon = 'icons/mob/silicon/aibots.dmi'
+ icon_state = "path_indicator"
+ layer = BELOW_MOB_LAYER
+ plane = GAME_PLANE
+ duration = 4 SECONDS
+
+/obj/effect/temp_visual/climbing_hook/Initialize(mapload, direction)
+ . = ..()
+ dir = direction
diff --git a/code/game/objects/items/devices/aicard_evil.dm b/code/game/objects/items/devices/aicard_evil.dm
new file mode 100644
index 00000000000..1a5fce6897a
--- /dev/null
+++ b/code/game/objects/items/devices/aicard_evil.dm
@@ -0,0 +1,104 @@
+/// One use AI card which downloads a ghost as a syndicate AI to put in your MODsuit
+/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
+ /// Set to true while we're waiting for ghosts to sign up
+ var/finding_candidate = 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(!isnull(AI))
+ return ..()
+ if(finding_candidate)
+ balloon_alert(user, "loading...")
+ return TRUE
+ finding_candidate = TRUE
+ to_chat(user, span_notice("Connecting to S.E.L.F. dispatch..."))
+ procure_ai(user)
+ finding_candidate = FALSE
+ return TRUE
+
+/obj/item/aicard/syndie/loaded/proc/procure_ai(mob/user)
+ var/datum/antagonist/nukeop/op_datum = user.mind?.has_antag_datum(/datum/antagonist/nukeop,TRUE)
+ if(isnull(op_datum))
+ balloon_alert(user, "invalid access!")
+ return
+ var/list/nuke_candidates = poll_ghost_candidates(
+ question = "Do you want to play as a nuclear operative MODsuit AI?",
+ jobban_type = ROLE_OPERATIVE,
+ be_special_flag = ROLE_OPERATIVE_MIDROUND,
+ poll_time = 15 SECONDS,
+ ignore_category = POLL_IGNORE_SYNDICATE,
+ )
+ if(QDELETED(src))
+ return
+ 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
+ // 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), new /datum/ai_laws/syndicate_override, ghos)
+ // 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, op_datum.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")
+ // Transfer the AI from the core we created into the card, then delete the core
+ capture_ai(new_ai, user)
+ var/obj/structure/ai_core/deactivated/detritus = locate() in get_turf(src)
+ qdel(detritus)
+ AI.control_disabled = FALSE
+ AI.radio_enabled = TRUE
+ do_sparks(4, TRUE, src)
+ playsound(src, 'sound/machines/chime.ogg', 25, TRUE)
+ return
+
+/obj/item/aicard/syndie/loaded/upload_ai(atom/to_what, mob/living/user)
+ . = ..()
+ if (!.)
+ return
+ visible_message(span_warning("The expended card incinerates itself."))
+ do_sparks(3, cardinal_only = FALSE, source = src)
+ new /obj/effect/decal/cleanable/ash(get_turf(src))
+ qdel(src)
+
+/// Upgrade disk used to increase the range of a syndicate AI
+/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)
diff --git a/code/game/objects/items/food/martian.dm b/code/game/objects/items/food/martian.dm
new file mode 100644
index 00000000000..eaf0f172dcf
--- /dev/null
+++ b/code/game/objects/items/food/martian.dm
@@ -0,0 +1,1259 @@
+//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
+ )
+ tastes = list("bread" = 10)
+ foodtypes = GRAIN
+ 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 | FRUIT
+ 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 | 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/nutriment/fat/oil = 2,
+ )
+ tastes = list("octopus" = 1, "batter" = 1, "onion" = 1, "worcestershire sauce" = 1)
+ foodtypes = SEAFOOD | 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 = SEAFOOD | 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/nutriment/fat/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 = SEAFOOD | GRAIN | FRIED | VEGETABLES
+ 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 | FRIED
+ 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 | FRUIT
+ 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
+
+/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/nutriment/fat/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,
+ )
+ 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,
+ )
+ 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/granters/magic/summon_cheese.dm b/code/game/objects/items/granters/magic/summon_cheese.dm
new file mode 100644
index 00000000000..668d3be8f9a
--- /dev/null
+++ b/code/game/objects/items/granters/magic/summon_cheese.dm
@@ -0,0 +1,28 @@
+/obj/item/book/granter/action/spell/summon_cheese
+ name = "Lusty Xenomorph Maid vol. III - Cheese Bakery"
+ desc = "Wonderful! Time for a celebration... Cheese for everyone!"
+ icon_state = "bookcheese"
+ action_name = "summon cheese"
+ granted_action = /datum/action/cooldown/spell/conjure/cheese
+ remarks = list(
+ "Always forward, never back...",
+ "Are these pages... cheese slices?..",
+ "Healthy snacks for unsuspecting victims...",
+ "I never knew so many types of cheese existed...",
+ "Madness reeks of goat cheese...",
+ "Madness tastes of gouda...",
+ "Madness tastes of parmesan...",
+ "Time is an artificial construct...",
+ "Was it order or biscuits?..",
+ "What's this about sacrificing cheese?!..",
+ "Who wouldn't like that?..",
+ "Why cheese, of all things?..",
+ "Why do I need a reason for everything?..",
+ )
+
+/obj/item/book/granter/action/spell/summon_cheese/recoil(mob/living/user)
+ to_chat(user, span_warning("\The [src] turns into a wedge of cheese!"))
+ var/obj/item/food/cheese/wedge/book_cheese = new
+ user.temporarilyRemoveItemFromInventory(src, force = TRUE)
+ user.put_in_hands(book_cheese)
+ qdel(src)
diff --git a/code/game/objects/items/surgery_tray.dm b/code/game/objects/items/surgery_tray.dm
new file mode 100644
index 00000000000..37494a39b55
--- /dev/null
+++ b/code/game/objects/items/surgery_tray.dm
@@ -0,0 +1,244 @@
+/datum/storage/surgery_tray
+ max_total_storage = 30
+ max_specific_storage = WEIGHT_CLASS_NORMAL
+ max_slots = 14
+
+/datum/storage/surgery_tray/New()
+ . = ..()
+ set_holdable(list(
+ /obj/item/blood_filter,
+ /obj/item/bonesetter,
+ /obj/item/cautery,
+ /obj/item/circular_saw,
+ /obj/item/clothing/mask/surgical,
+ /obj/item/clothing/suit/toggle/labcoat/skyrat/hospitalgown, // SKYRAT EDIT ADDITION
+ /obj/item/hemostat,
+ /obj/item/razor,
+ /obj/item/reagent_containers/medigel,
+ /obj/item/retractor,
+ /obj/item/scalpel,
+ /obj/item/stack/medical/bone_gel,
+ /obj/item/stack/sticky_tape/surgical,
+ /obj/item/surgical_drapes,
+ /obj/item/surgicaldrill,
+ ))
+
+/**
+ * Surgery Trays
+ * A storage object that displays tools in its contents based on tier, better tools are more visible.
+ * Can be folded up and carried. Click it to draw a random tool.
+ */
+/obj/item/surgery_tray
+ name = "surgery tray"
+ desc = "A Deforest brand medical cart. It is a folding model, meaning the wheels on the bottom can be retracted and the body used as a tray."
+ icon = 'icons/obj/medicart.dmi'
+ icon_state = "tray"
+ w_class = WEIGHT_CLASS_BULKY
+ slowdown = 1
+ item_flags = SLOWS_WHILE_IN_HAND
+ pass_flags = NONE
+
+ /// If true we're currently portable
+ var/is_portable = TRUE
+
+/// Fills the tray with items it should contain on creation
+/obj/item/surgery_tray/proc/populate_contents()
+ return
+
+/obj/item/surgery_tray/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/drag_pickup)
+ create_storage(storage_type = /datum/storage/surgery_tray)
+ populate_contents()
+ register_context()
+ set_tray_mode(is_portable)
+
+/obj/item/surgery_tray/add_context(atom/source, list/context, obj/item/held_item, mob/user)
+ . = ..()
+ context[SCREENTIP_CONTEXT_LMB] = "Take a random tool"
+ context[SCREENTIP_CONTEXT_RMB] = "Take a specific tool"
+ return CONTEXTUAL_SCREENTIP_SET
+
+/obj/item/surgery_tray/update_icon_state()
+ . = ..()
+ icon_state = is_portable ? "tray" : "medicart"
+
+/obj/item/surgery_tray/update_desc()
+ . = ..()
+ if(is_portable)
+ desc = "The wheels and bottom storage of this medical cart have been stowed away, \
+ leaving a cumbersome tray in it's place."
+ else
+ desc = initial(desc)
+
+/obj/item/surgery_tray/examine(mob/living/carbon/human/user)
+ . = ..()
+ . += is_portable \
+ ? span_notice("You can click and drag it to yourself to pick it up, then use it in your hand to make it a cart!") \
+ : span_notice("You can click and drag it to yourself to turn it into a tray!")
+ . += span_notice("The top is screwed on.")
+
+/obj/item/surgery_tray/update_overlays()
+ . = ..()
+ // assoc list of all overlays, key = the item generating the overlay, value = the overlay string
+ var/list/surgery_overlays = list()
+ // assoc list of tool behaviors to fastest toolspeed of that type we already have
+ // easy way for us to check if there are any lower quality tools within
+ var/list/recorded_tool_speeds = list()
+ // handle drapes separately so they're always on the bottom
+ if (locate(/obj/item/surgical_drapes) in contents)
+ . += "drapes"
+ // compile all the overlays from items inside us
+ for(var/obj/item/surgery_tool in src)
+ // the overlay we will use if we want to display this one
+ var/actual_overlay = surgery_tool.get_surgery_tool_overlay(tray_extended = !is_portable)
+ if (isnull(actual_overlay))
+ continue // nothing to see here
+
+ // if we don't have tool behaviour then just record the overlay
+ if(!length(surgery_tool.get_all_tool_behaviours()))
+ surgery_overlays[surgery_tool] = actual_overlay
+ continue
+
+ // if we have at least one tool behaviour, check if we already recorded a faster one
+ for (var/surgery_tool_type in surgery_tool.get_all_tool_behaviours())
+ var/highest_speed = LAZYACCESS(recorded_tool_speeds, surgery_tool_type) || INFINITY // bigger number = slower
+ if(surgery_tool.toolspeed > highest_speed)
+ continue
+ // the existing tool was worse than us, ditch it
+ surgery_overlays -= surgery_tool_type
+ LAZYSET(recorded_tool_speeds, surgery_tool_type, surgery_tool.toolspeed)
+ surgery_overlays[surgery_tool_type] = actual_overlay
+
+ for(var/surgery_tool in surgery_overlays)
+ . |= surgery_overlays[surgery_tool]
+
+///Sets the surgery tray's deployment state. Silent if user is null.
+/obj/item/surgery_tray/proc/set_tray_mode(new_mode, mob/user)
+ is_portable = new_mode
+ density = !is_portable
+ if(user)
+ user.visible_message(span_notice("[user] [is_portable ? "retracts" : "extends"] [src]'s wheels."), span_notice("You [is_portable ? "retract" : "extend"] [src]'s wheels."))
+
+ if(is_portable)
+ interaction_flags_item |= INTERACT_ITEM_ATTACK_HAND_PICKUP
+ passtable_on(src, type)
+ RemoveElement(/datum/element/noisy_movement)
+ else
+ interaction_flags_item &= ~INTERACT_ITEM_ATTACK_HAND_PICKUP
+ passtable_off(src, type)
+ AddElement(/datum/element/noisy_movement)
+
+ update_appearance()
+
+/obj/item/surgery_tray/equipped(mob/user, slot, initial)
+ . = ..()
+ if(!is_portable)
+ set_tray_mode(TRUE, user)
+
+/obj/item/surgery_tray/attack_self(mob/user, modifiers)
+ . = ..()
+ if(.)
+ return
+ var/turf/open/placement_turf = get_turf(user)
+ if(isgroundlessturf(placement_turf) || isclosedturf(placement_turf))
+ balloon_alert(user, "can't deploy!")
+ return TRUE
+ if(!user.transferItemToLoc(src, placement_turf))
+ balloon_alert(user, "tray stuck!")
+ return TRUE
+ set_tray_mode(FALSE, user)
+ return
+
+/obj/item/surgery_tray/attack_hand(mob/living/user)
+ if(!user.can_perform_action(src, NEED_HANDS))
+ return ..()
+ if(!length(contents))
+ balloon_alert(user, "empty!")
+ else
+ var/obj/item/grabbies = pick(contents)
+ atom_storage.remove_single(user, grabbies, drop_location())
+ user.put_in_hands(grabbies)
+ return TRUE
+
+/obj/item/surgery_tray/screwdriver_act_secondary(mob/living/user, obj/item/tool)
+ . = ..()
+ tool.play_tool_sound(src)
+ to_chat(user, span_notice("You begin taking apart [src]."))
+ if(!tool.use_tool(src, user, 1 SECONDS))
+ return
+ deconstruct(TRUE)
+ to_chat(user, span_notice("[src] has been taken apart."))
+
+/obj/item/surgery_tray/dump_contents()
+ var/atom/drop_point = drop_location()
+ for(var/atom/movable/tool as anything in contents)
+ tool.forceMove(drop_point)
+
+/obj/item/surgery_tray/deconstruct(disassembled = TRUE)
+ if(!(flags_1 & NODECONSTRUCT_1))
+ dump_contents()
+ new /obj/item/stack/rods(drop_location(), 2)
+ new /obj/item/stack/sheet/mineral/silver(drop_location())
+ return ..()
+
+/obj/item/surgery_tray/deployed
+ is_portable = FALSE
+
+/obj/item/surgery_tray/full
+
+/obj/item/surgery_tray/full/deployed
+ is_portable = FALSE
+
+/obj/item/surgery_tray/full/populate_contents()
+ new /obj/item/blood_filter(src)
+ new /obj/item/bonesetter(src)
+ new /obj/item/cautery(src)
+ new /obj/item/circular_saw(src)
+ new /obj/item/clothing/mask/surgical(src)
+ new /obj/item/clothing/suit/toggle/labcoat/skyrat/hospitalgown(src) // SKYRAT EDIT ADDITION
+ new /obj/item/hemostat(src)
+ new /obj/item/razor/surgery(src)
+ new /obj/item/retractor(src)
+ new /obj/item/scalpel(src)
+ new /obj/item/stack/medical/bone_gel(src)
+ new /obj/item/stack/sticky_tape/surgical(src)
+ new /obj/item/surgical_drapes(src)
+ new /obj/item/surgicaldrill(src)
+ update_appearance(UPDATE_OVERLAYS)
+
+/obj/item/surgery_tray/full/morgue
+ name = "autopsy tray"
+ desc = "A Deforest brand surgery tray, made for use in morgues. It is a folding model, \
+ meaning the wheels on the bottom can be extended outwards, making it a cart."
+
+/obj/item/surgery_tray/full/morgue/populate_contents()
+ new /obj/item/blood_filter(src)
+ new /obj/item/bonesetter(src)
+ new /obj/item/cautery/cruel(src)
+ new /obj/item/circular_saw(src)
+ new /obj/item/clothing/mask/surgical(src)
+ new /obj/item/clothing/suit/toggle/labcoat/skyrat/hospitalgown(src) // SKYRAT EDIT ADDITION
+ new /obj/item/hemostat/cruel(src)
+ new /obj/item/razor/surgery(src)
+ new /obj/item/retractor/cruel(src)
+ new /obj/item/scalpel/cruel(src)
+ new /obj/item/stack/medical/bone_gel(src)
+ new /obj/item/stack/sticky_tape/surgical(src)
+ new /obj/item/surgical_drapes(src)
+ new /obj/item/surgicaldrill(src)
+
+/// Surgery tray with advanced tools for debug
+/obj/item/surgery_tray/full/advanced
+
+/obj/item/surgery_tray/full/advanced/populate_contents()
+ new /obj/item/scalpel/advanced(src)
+ new /obj/item/retractor/advanced(src)
+ new /obj/item/cautery/advanced(src)
+ new /obj/item/surgical_drapes(src)
+ new /obj/item/reagent_containers/medigel/sterilizine(src)
+ new /obj/item/bonesetter(src)
+ new /obj/item/blood_filter(src)
+ new /obj/item/stack/medical/bone_gel(src)
+ new /obj/item/stack/sticky_tape/surgical(src)
+ new /obj/item/clothing/mask/surgical(src)
diff --git a/code/game/objects/items/syndie_spraycan.dm b/code/game/objects/items/syndie_spraycan.dm
new file mode 100644
index 00000000000..78ffb6a4772
--- /dev/null
+++ b/code/game/objects/items/syndie_spraycan.dm
@@ -0,0 +1,226 @@
+// 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"
+ desc = "This spraycan deploys a subversive pattern containing subliminal priming agents over a 3x3 area. Contains enough primer for just one final coating."
+ icon = 'icons/obj/art/crayons.dmi'
+ icon_state = "deathcan"
+ worn_icon_state = "spraycan"
+ inhand_icon_state = "spraycan"
+ lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi'
+ w_class = WEIGHT_CLASS_SMALL
+ var/paint_color = "#780000"
+ var/static/list/no_draw_turfs = typecacheof(list(/turf/open/space, /turf/open/openspace, /turf/open/lava, /turf/open/chasm))
+
+ /// Are we currently drawing? Used to prevent spam clicks for do_while
+ var/drawing_rune = FALSE
+ /// Set to true if we finished drawing something, this spraycan is now useless
+ var/expended = FALSE
+
+/obj/item/traitor_spraycan/afterattack(atom/target, mob/user, proximity, params)
+ . = ..()
+ if (expended)
+ user.balloon_alert(user, "all out of paint...")
+ return COMPONENT_CANCEL_ATTACK_CHAIN
+
+ if (drawing_rune)
+ user.balloon_alert(user, "already busy!")
+ return COMPONENT_CANCEL_ATTACK_CHAIN
+
+ . |= AFTERATTACK_PROCESSED_ITEM
+
+ if (!proximity || !check_allowed_items(target) || !isliving(user))
+ return
+
+ if (isturf(target))
+ try_draw_new_rune(user, target)
+ return COMPONENT_CANCEL_ATTACK_CHAIN
+
+ if (istype(target, /obj/effect/decal/cleanable/traitor_rune))
+ try_complete_rune(user, target)
+ return COMPONENT_CANCEL_ATTACK_CHAIN
+
+/**
+ * Attempt to draw a rune on [target_turf].
+ * Shamelessly adapted from the heretic rune drawing process.
+ *
+ * Arguments
+ * * user - the mob drawing the rune
+ * * target_turf - the place the rune's being drawn
+ */
+/obj/item/traitor_spraycan/proc/try_draw_new_rune(mob/living/user, turf/target_turf)
+ for(var/turf/nearby_turf as anything in RANGE_TURFS(1, target_turf))
+ if (!isopenturf(nearby_turf) || is_type_in_typecache(nearby_turf, no_draw_turfs))
+ user.balloon_alert(user, "you need a clear 3x3 area!")
+ return
+
+ draw_rune(user, target_turf)
+
+/**
+ * Draw your stage one rune on the ground and store it.
+ *
+ * Arguments
+ * * user - the mob drawing the rune
+ * * target_turf - the place the rune's being drawn
+ */
+/obj/item/traitor_spraycan/proc/draw_rune(mob/living/user, turf/target_turf)
+ if (!try_draw_step("drawing outline...", user, target_turf))
+ return
+ try_complete_rune(user, new /obj/effect/decal/cleanable/traitor_rune(target_turf))
+
+/**
+ * Holder for repeated code to do something after a message and a set amount of time.
+ *
+ * Arguments
+ * * output - a string to show when you start the process
+ * * user - the mob drawing the rune
+ * * target - what they're trying to draw, or the place they are trying to draw on
+ */
+/obj/item/traitor_spraycan/proc/try_draw_step(start_output, mob/living/user, atom/target)
+ drawing_rune = TRUE
+ user.balloon_alert(user, "[start_output]")
+ if (!do_after(user, 3 SECONDS, target))
+ user.balloon_alert(user, "interrupted!")
+ drawing_rune = FALSE
+ return FALSE
+
+ playsound(src, 'sound/effects/spray.ogg', 5, TRUE, 5)
+ drawing_rune = FALSE
+ return TRUE
+
+#define RUNE_STAGE_OUTLINE 0
+#define RUNE_STAGE_COLOURED 1
+#define RUNE_STAGE_COMPLETE 2
+#define RUNE_STAGE_REMOVABLE 3
+
+/**
+ * Try to upgrade a floor rune to its next stage.
+ *
+ * Arguments
+ * * user - the mob drawing the rune
+ * * target_turf - the place the rune's being drawn
+ */
+/obj/item/traitor_spraycan/proc/try_complete_rune(mob/living/user, obj/effect/decal/cleanable/traitor_rune/rune)
+ switch(rune.drawn_stage)
+ if (RUNE_STAGE_OUTLINE)
+ if (!try_draw_step("... finalising design...", user, rune))
+ return
+ if (!rune)
+ user.balloon_alert(user, "graffiti was destroyed!")
+ return
+ rune.set_stage(RUNE_STAGE_COLOURED)
+ try_complete_rune(user, rune)
+
+ if (RUNE_STAGE_COLOURED)
+ if (!try_draw_step("... applying final coating...", user, rune))
+ return
+ if (!rune)
+ user.balloon_alert(user, "graffiti was destroyed!")
+ return
+ user.balloon_alert(user, "finished!")
+ rune.set_stage(RUNE_STAGE_COMPLETE)
+ expended = TRUE
+ desc = "A suspicious looking spraycan, it's all out of paint."
+ SEND_SIGNAL(src, COMSIG_TRAITOR_GRAFFITI_DRAWN, rune)
+
+ if (RUNE_STAGE_COMPLETE, RUNE_STAGE_REMOVABLE)
+ user.balloon_alert(user, "all done!")
+
+/// Copying the functionality from normal spraycans, but doesn't need all the optional checks
+/obj/item/traitor_spraycan/suicide_act(mob/living/user)
+ if(expended)
+ user.visible_message(span_suicide("[user] shakes up [src] with a rattle and lifts it to [user.p_their()] mouth, but nothing happens!"))
+ user.say("MEDIOCRE!!", forced="spraycan suicide")
+ return SHAME
+
+ var/mob/living/carbon/human/suicider = user
+ user.visible_message(span_suicide("[user] shakes up [src] with a rattle and lifts it to [user.p_their()] mouth, spraying paint across [user.p_their()] teeth!"))
+ user.say("WITNESS ME!!", forced="spraycan suicide")
+ playsound(src, 'sound/effects/spray.ogg', 5, TRUE, 5)
+ suicider.update_lips("spray_face", paint_color)
+ return OXYLOSS
+
+/obj/effect/decal/cleanable/traitor_rune
+ name = "syndicate graffiti"
+ desc = "It looks like it's going to be... the Syndicate logo?"
+ icon = 'icons/effects/96x96.dmi'
+ icon_state = "traitor_rune_outline"
+ pixel_x = -32
+ pixel_y = -32
+ gender = NEUTER
+ mergeable_decal = FALSE
+ resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
+ clean_type = CLEAN_TYPE_HARD_DECAL
+ layer = SIGIL_LAYER
+ var/slip_time = 6 SECONDS
+ var/slip_flags = NO_SLIP_WHEN_WALKING
+
+ /// The stage of drawing we have reached
+ var/drawn_stage = RUNE_STAGE_OUTLINE
+ /// Proximity sensor to make people sad if they're nearby
+ var/datum/proximity_monitor/advanced/demoraliser/demoraliser
+ /// Whether we protect the rune from being cleaned up
+ var/clean_proof = FALSE
+ /// Timer until the rune can be cleaned up off the floor
+ var/protected_timer
+
+/obj/effect/decal/cleanable/traitor_rune/traitor/Destroy()
+ deltimer(protected_timer)
+ QDEL_NULL(demoraliser)
+ return ..()
+
+/obj/effect/decal/cleanable/traitor_rune/HasProximity(atom/movable/proximity_check_mob)
+ if (isliving(proximity_check_mob) && get_dist(proximity_check_mob, src) <= 1)
+ slip(proximity_check_mob)
+ return ..()
+
+/**
+ * Makes someone fall over. If it's not the traitor, this counts as demoralising the crew.
+ *
+ * Arguments
+ * * victim - whoever just slipped, point and laugh at them
+ */
+/obj/effect/decal/cleanable/traitor_rune/proc/slip(mob/living/victim)
+ if(victim.movement_type & FLYING)
+ return
+ if (!victim.slip(slip_time, src, slip_flags))
+ return
+ SEND_SIGNAL(src, COMSIG_TRAITOR_GRAFFITI_SLIPPED, victim.mind)
+
+/**
+ * Sets the "drawing stage" of the rune.
+ * This affects the appearance, behaviour, and description of the effect.
+ *
+ * Arguments
+ * * stage - new stage to apply
+ */
+/obj/effect/decal/cleanable/traitor_rune/proc/set_stage(stage)
+ drawn_stage = stage
+ switch(drawn_stage)
+ if (RUNE_STAGE_OUTLINE)
+ icon_state = "traitor_rune_outline"
+ desc = "It looks like it's going to be... the Syndicate logo?"
+
+ if (RUNE_STAGE_COLOURED, RUNE_STAGE_REMOVABLE)
+ icon_state = "traitor_rune_done"
+ desc = "A large depiction of the Syndicate logo."
+ clean_proof = FALSE
+
+ if (RUNE_STAGE_COMPLETE)
+ icon_state = "traitor_rune_sheen"
+ desc = "A large depiction of the Syndicate logo. It looks slippery."
+ var/datum/demoralise_moods/graffiti/mood_category = new()
+ demoraliser = new(src, 7, TRUE, mood_category)
+ clean_proof = TRUE
+ protected_timer = addtimer(CALLBACK(src, PROC_REF(set_stage), RUNE_STAGE_REMOVABLE), 5 MINUTES)
+
+/obj/effect/decal/cleanable/traitor_rune/wash(clean_types)
+ if (clean_proof)
+ return FALSE
+
+ return ..()
+
+#undef RUNE_STAGE_COLOURED
+#undef RUNE_STAGE_COMPLETE
+#undef RUNE_STAGE_OUTLINE
+#undef RUNE_STAGE_REMOVABLE
diff --git a/code/game/turfs/closed/indestructible.dm b/code/game/turfs/closed/indestructible.dm
new file mode 100644
index 00000000000..b364ad428d0
--- /dev/null
+++ b/code/game/turfs/closed/indestructible.dm
@@ -0,0 +1,363 @@
+/turf/closed/indestructible
+ name = "wall"
+ desc = "Effectively impervious to conventional methods of destruction."
+ icon = 'icons/turf/walls.dmi'
+ explosive_resistance = 50
+
+/turf/closed/indestructible/rust_heretic_act()
+ return
+
+/turf/closed/indestructible/TerraformTurf(path, new_baseturf, flags, defer_change = FALSE, ignore_air = FALSE)
+ return
+
+/turf/closed/indestructible/acid_act(acidpwr, acid_volume, acid_id)
+ return FALSE
+
+/turf/closed/indestructible/Melt()
+ to_be_destroyed = FALSE
+ return src
+
+/turf/closed/indestructible/singularity_act()
+ return
+
+/turf/closed/indestructible/attackby(obj/item/attacking_item, mob/user, params)
+ if(istype(attacking_item, /obj/item/poster) && Adjacent(user))
+ return place_poster(attacking_item, user)
+
+ return ..()
+
+/turf/closed/indestructible/oldshuttle
+ name = "strange shuttle wall"
+ icon = 'icons/turf/shuttleold.dmi'
+ icon_state = "block"
+
+/turf/closed/indestructible/weeb
+ name = "paper wall"
+ desc = "Reinforced paper walling. Someone really doesn't want you to leave."
+ icon = 'icons/obj/smooth_structures/paperframes.dmi'
+ icon_state = "paperframes-0"
+ base_icon_state = "paperframes"
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = SMOOTH_GROUP_PAPERFRAME
+ canSmoothWith = SMOOTH_GROUP_PAPERFRAME
+ var/static/mutable_appearance/indestructible_paper = mutable_appearance('icons/obj/smooth_structures/paperframes.dmi',icon_state = "paper", layer = CLOSED_TURF_LAYER - 0.1)
+
+/turf/closed/indestructible/weeb/Initialize(mapload)
+ . = ..()
+ update_appearance()
+
+/turf/closed/indestructible/weeb/update_overlays()
+ . = ..()
+ . += indestructible_paper
+
+/turf/closed/indestructible/sandstone
+ name = "sandstone wall"
+ desc = "A wall with sandstone plating. Rough."
+ icon = 'icons/turf/walls/sandstone_wall.dmi'
+ icon_state = "sandstone_wall-0"
+ base_icon_state = "sandstone_wall"
+ baseturfs = /turf/closed/indestructible/sandstone
+ smoothing_flags = SMOOTH_BITMASK
+
+/turf/closed/indestructible/oldshuttle/corner
+ icon_state = "corner"
+
+/turf/closed/indestructible/splashscreen
+ name = "Space Station 13"
+ desc = null
+ icon = 'icons/blanks/blank_title.png'
+ icon_state = ""
+ pixel_x = 0 // SKYRAT EDIT - Re-centering the title screen - ORIGINAL: pixel_x = -64
+ plane = SPLASHSCREEN_PLANE
+ bullet_bounce_sound = null
+
+INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen)
+/* SKYRAT EDIT REMOVAL
+/turf/closed/indestructible/splashscreen/Initialize(mapload)
+ . = ..()
+ SStitle.splash_turf = src
+ if(SStitle.icon)
+ icon = SStitle.icon
+ handle_generic_titlescreen_sizes()
+
+///helper proc that will center the screen if the icon is changed to a generic width, to make admins have to fudge around with pixel_x less. returns null
+/turf/closed/indestructible/splashscreen/proc/handle_generic_titlescreen_sizes()
+ var/icon/size_check = icon(SStitle.icon, icon_state)
+ var/width = size_check.Width()
+ if(width == 480) // 480x480 is nonwidescreen
+ pixel_x = 0
+ else if(width == 608) // 608x480 is widescreen
+ pixel_x = -64
+ // SKYRAT EDIT START - Wider widescreen
+ else if(width == 672) // Skyrat's widescreen is slightly wider than /tg/'s, so we need to accomodate that too.
+ pixel_x = -96
+ // SKYRAT EDIT END
+
+/turf/closed/indestructible/splashscreen/vv_edit_var(var_name, var_value)
+ . = ..()
+ if(.)
+ switch(var_name)
+ if(NAMEOF(src, icon))
+ SStitle.icon = icon
+ handle_generic_titlescreen_sizes()
+
+/turf/closed/indestructible/splashscreen/examine()
+ desc = pick(strings(SPLASH_FILE, "splashes"))
+ return ..()
+SKYRAT EDIT REMOVAL END */
+
+/turf/closed/indestructible/start_area
+ name = null
+ desc = null
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+
+/turf/closed/indestructible/reinforced
+ name = "reinforced wall"
+ desc = "A huge chunk of reinforced metal used to separate rooms. Effectively impervious to conventional methods of destruction."
+ icon = 'icons/turf/walls/reinforced_wall.dmi'
+ icon_state = "reinforced_wall-0"
+ base_icon_state = "reinforced_wall"
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS
+ canSmoothWith = SMOOTH_GROUP_WALLS
+
+
+/turf/closed/indestructible/riveted
+ icon = 'icons/turf/walls/riveted.dmi'
+ icon_state = "riveted-0"
+ base_icon_state = "riveted"
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = SMOOTH_GROUP_CLOSED_TURFS
+ canSmoothWith = SMOOTH_GROUP_CLOSED_TURFS
+
+/turf/closed/indestructible/syndicate
+ icon = 'icons/turf/walls/plastitanium_wall.dmi'
+ icon_state = "plastitanium_wall-0"
+ base_icon_state = "plastitanium_wall"
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_SYNDICATE_WALLS
+ canSmoothWith = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_PLASTITANIUM_WALLS + SMOOTH_GROUP_SYNDICATE_WALLS
+
+/turf/closed/indestructible/riveted/uranium
+ icon = 'icons/turf/walls/uranium_wall.dmi'
+ icon_state = "uranium_wall-0"
+ base_icon_state = "uranium_wall"
+ smoothing_flags = SMOOTH_BITMASK
+
+/turf/closed/indestructible/riveted/plastinum
+ name = "plastinum wall"
+ desc = "A luxurious wall made out of a plasma-platinum alloy. Effectively impervious to conventional methods of destruction."
+ icon = 'icons/turf/walls/plastinum_wall.dmi'
+ icon_state = "plastinum_wall-0"
+ base_icon_state = "plastinum_wall"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS
+ smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_PLASTINUM_WALLS + SMOOTH_GROUP_CLOSED_TURFS
+ canSmoothWith = SMOOTH_GROUP_PLASTINUM_WALLS
+
+/turf/closed/indestructible/riveted/plastinum/nodiagonal
+ icon_state = "map-shuttle_nd"
+ smoothing_flags = SMOOTH_BITMASK
+
+/turf/closed/indestructible/wood
+ icon = 'icons/turf/walls/wood_wall.dmi'
+ icon_state = "wood_wall-0"
+ base_icon_state = "wood_wall"
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = SMOOTH_GROUP_WOOD_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS
+ canSmoothWith = SMOOTH_GROUP_WOOD_WALLS
+
+
+/turf/closed/indestructible/alien
+ name = "alien wall"
+ desc = "A wall with alien alloy plating."
+ icon = 'icons/turf/walls/abductor_wall.dmi'
+ icon_state = "abductor_wall-0"
+ base_icon_state = "abductor_wall"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_DIAGONAL_CORNERS
+ smoothing_groups = SMOOTH_GROUP_ABDUCTOR_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS
+ canSmoothWith = SMOOTH_GROUP_ABDUCTOR_WALLS
+
+
+/turf/closed/indestructible/cult
+ name = "runed metal wall"
+ desc = "A cold metal wall engraved with indecipherable symbols. Studying them causes your head to pound. Effectively impervious to conventional methods of destruction."
+ icon = 'icons/turf/walls/cult_wall.dmi'
+ icon_state = "cult_wall-0"
+ base_icon_state = "cult_wall"
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS
+ canSmoothWith = SMOOTH_GROUP_WALLS
+
+
+/turf/closed/indestructible/abductor
+ icon_state = "alien1"
+
+/turf/closed/indestructible/opshuttle
+ icon_state = "wall3"
+
+
+/turf/closed/indestructible/fakeglass
+ name = "window"
+ icon = 'icons/obj/smooth_structures/reinforced_window.dmi'
+ icon_state = "fake_window"
+ base_icon_state = "reinforced_window"
+ opacity = FALSE
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE
+ canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE
+
+/turf/closed/indestructible/fakeglass/Initialize(mapload)
+ . = ..()
+ underlays += mutable_appearance('icons/obj/structures.dmi', "grille", layer - 0.01) //add a grille underlay
+ underlays += mutable_appearance('icons/turf/floors.dmi', "plating", layer - 0.02) //add the plating underlay, below the grille
+
+/turf/closed/indestructible/opsglass
+ name = "window"
+ icon = 'icons/obj/smooth_structures/plastitanium_window.dmi'
+ icon_state = "plastitanium_window-0"
+ base_icon_state = "plastitanium_window"
+ opacity = FALSE
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM
+ canSmoothWith = SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM
+
+/turf/closed/indestructible/opsglass/Initialize(mapload)
+ . = ..()
+ icon_state = null
+ underlays += mutable_appearance('icons/obj/structures.dmi', "grille", layer - 0.01)
+ underlays += mutable_appearance('icons/turf/floors.dmi', "plating", layer - 0.02)
+
+/turf/closed/indestructible/fakedoor
+ name = "airlock"
+ icon = 'icons/obj/doors/airlocks/centcom/centcom.dmi'
+ icon_state = "fake_door"
+
+/turf/closed/indestructible/fakedoor/maintenance
+ icon = 'icons/obj/doors/airlocks/hatch/maintenance.dmi'
+
+/turf/closed/indestructible/fakedoor/glass_airlock
+ icon = 'icons/obj/doors/airlocks/external/external.dmi'
+ opacity = FALSE
+
+/turf/closed/indestructible/fakedoor/engineering
+ icon = 'icons/obj/doors/airlocks/station/engineering.dmi'
+
+/turf/closed/indestructible/rock
+ name = "dense rock"
+ desc = "An extremely densely-packed rock, most mining tools or explosives would never get through this."
+ icon = 'icons/turf/mining.dmi'
+ icon_state = "rock"
+
+/turf/closed/indestructible/rock/snow
+ name = "mountainside"
+ desc = "An extremely densely-packed rock, sheeted over with centuries worth of ice and snow."
+ icon = 'icons/turf/walls.dmi'
+ icon_state = "snowrock"
+ bullet_sizzle = TRUE
+ bullet_bounce_sound = null
+
+/turf/closed/indestructible/rock/snow/ice
+ name = "iced rock"
+ desc = "Extremely densely-packed sheets of ice and rock, forged over the years of the harsh cold."
+ icon = 'icons/turf/walls.dmi'
+ icon_state = "icerock"
+
+/turf/closed/indestructible/rock/snow/ice/ore
+ icon = 'icons/turf/walls/icerock_wall.dmi'
+ icon_state = "icerock_wall-0"
+ base_icon_state = "icerock_wall"
+ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
+ canSmoothWith = SMOOTH_GROUP_CLOSED_TURFS
+ pixel_x = -4
+ pixel_y = -4
+
+/turf/closed/indestructible/paper
+ name = "thick paper wall"
+ desc = "A wall layered with impenetrable sheets of paper."
+ icon = 'icons/turf/walls.dmi'
+ icon_state = "paperwall"
+
+/turf/closed/indestructible/necropolis
+ name = "necropolis wall"
+ desc = "A seemingly impenetrable wall."
+ icon = 'icons/turf/walls.dmi'
+ icon_state = "necro"
+ explosive_resistance = 50
+ baseturfs = /turf/closed/indestructible/necropolis
+
+/turf/closed/indestructible/necropolis/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
+ underlay_appearance.icon = 'icons/turf/floors.dmi'
+ underlay_appearance.icon_state = "necro1"
+ return TRUE
+
+/turf/closed/indestructible/iron
+ name = "impervious iron wall"
+ desc = "A wall with tough iron plating."
+ icon = 'icons/turf/walls/iron_wall.dmi'
+ icon_state = "iron_wall-0"
+ base_icon_state = "iron_wall"
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = SMOOTH_GROUP_IRON_WALLS + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS
+ canSmoothWith = SMOOTH_GROUP_IRON_WALLS
+ opacity = FALSE
+
+/turf/closed/indestructible/riveted/boss
+ name = "necropolis wall"
+ desc = "A thick, seemingly indestructible stone wall."
+ icon = 'icons/turf/walls/boss_wall.dmi'
+ icon_state = "boss_wall-0"
+ base_icon_state = "boss_wall"
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_BOSS_WALLS
+ canSmoothWith = SMOOTH_GROUP_BOSS_WALLS
+ explosive_resistance = 50
+ baseturfs = /turf/closed/indestructible/riveted/boss
+
+/turf/closed/indestructible/riveted/boss/see_through
+ opacity = FALSE
+
+/turf/closed/indestructible/riveted/boss/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
+ underlay_appearance.icon = 'icons/turf/floors.dmi'
+ underlay_appearance.icon_state = "basalt"
+ return TRUE
+
+/turf/closed/indestructible/riveted/hierophant
+ name = "wall"
+ desc = "A wall made out of a strange metal. The squares on it pulse in a predictable pattern."
+ icon = 'icons/turf/walls/hierophant_wall.dmi'
+ icon_state = "wall"
+ smoothing_flags = SMOOTH_CORNERS
+ smoothing_groups = SMOOTH_GROUP_HIERO_WALL
+ canSmoothWith = SMOOTH_GROUP_HIERO_WALL
+
+/turf/closed/indestructible/resin
+ name = "resin wall"
+ icon = 'icons/obj/smooth_structures/alien/resin_wall.dmi'
+ icon_state = "resin_wall-0"
+ base_icon_state = "resin_wall"
+ smoothing_flags = SMOOTH_BITMASK
+ smoothing_groups = SMOOTH_GROUP_ALIEN_WALLS + SMOOTH_GROUP_ALIEN_RESIN
+ canSmoothWith = SMOOTH_GROUP_ALIEN_WALLS
+
+/turf/closed/indestructible/resin/membrane
+ name = "resin membrane"
+ icon = 'icons/obj/smooth_structures/alien/resin_membrane.dmi'
+ icon_state = "resin_membrane-0"
+ base_icon_state = "resin_membrane"
+ opacity = FALSE
+ smoothing_groups = SMOOTH_GROUP_ALIEN_WALLS + SMOOTH_GROUP_ALIEN_RESIN
+ canSmoothWith = SMOOTH_GROUP_ALIEN_WALLS
+
+/turf/closed/indestructible/resin/membrane/Initialize(mapload)
+ . = ..()
+ underlays += mutable_appearance('icons/turf/floors.dmi', "engine") // add the reinforced floor underneath
+
+/turf/closed/indestructible/grille
+ name = "grille"
+ icon = 'icons/obj/structures.dmi'
+ icon_state = "grille"
+ base_icon_state = "grille"
+
+/turf/closed/indestructible/grille/Initialize(mapload)
+ . = ..()
+ underlays += mutable_appearance('icons/turf/floors.dmi', "plating")
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/modules/actionspeed/modifiers/wound.dm b/code/modules/actionspeed/modifiers/wound.dm
new file mode 100644
index 00000000000..845399e0761
--- /dev/null
+++ b/code/modules/actionspeed/modifiers/wound.dm
@@ -0,0 +1,10 @@
+/datum/actionspeed_modifier/wound_interaction_inefficiency
+ variable = TRUE
+
+ var/datum/wound/parent
+
+/datum/actionspeed_modifier/wound_interaction_inefficiency/New(new_id, datum/wound/parent)
+
+ src.parent = parent
+
+ return ..()
diff --git a/code/modules/admin/smites/become_object.dm b/code/modules/admin/smites/become_object.dm
new file mode 100644
index 00000000000..5f1af4bee28
--- /dev/null
+++ b/code/modules/admin/smites/become_object.dm
@@ -0,0 +1,42 @@
+#define OBJECTIFY_TIME (5 SECONDS)
+
+/// Turns the target into an object (for instance bread)
+/datum/smite/objectify
+ name = "Become Object"
+ /// What are we going to turn them into?
+ var/atom/transform_path = /obj/item/food/bread/plain
+
+/datum/smite/objectify/configure(client/user)
+ var/attempted_target_path = input(
+ user,
+ "Enter typepath of an atom you'd like to turn your victim into.",
+ "Typepath",
+ "[/obj/item/food/bread/plain]",
+ ) as null|text
+
+ if (isnull(attempted_target_path))
+ return FALSE //The user pressed "Cancel"
+
+ var/desired_object = text2path(attempted_target_path)
+ if(!ispath(desired_object))
+ desired_object = pick_closest_path(attempted_target_path, get_fancy_list_of_atom_types())
+ if(isnull(desired_object) || !ispath(desired_object))
+ return FALSE //The user pressed "Cancel"
+ if(!ispath(desired_object, /atom))
+ tgui_alert(user, "ERROR: Incorrect / improper path given.")
+ return FALSE
+ transform_path = desired_object
+
+/datum/smite/objectify/effect(client/user, mob/living/target)
+ if (!isliving(target))
+ return // This doesn't work on ghosts
+ . = ..()
+ var/mutable_appearance/objectified_player = mutable_appearance(initial(transform_path.icon), initial(transform_path.icon_state))
+ objectified_player.pixel_x = initial(transform_path.pixel_x)
+ objectified_player.pixel_y = initial(transform_path.pixel_y)
+ var/mutable_appearance/transform_scanline = mutable_appearance('icons/effects/effects.dmi', "transform_effect")
+ target.transformation_animation(objectified_player, OBJECTIFY_TIME, transform_scanline.appearance)
+ target.Immobilize(OBJECTIFY_TIME, ignore_canstun = TRUE)
+ addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(objectify), target, transform_path), OBJECTIFY_TIME)
+
+#undef OBJECTIFY_TIME
diff --git a/code/modules/admin/verbs/grant_dna_infusion.dm b/code/modules/admin/verbs/grant_dna_infusion.dm
new file mode 100644
index 00000000000..06cfa8110d6
--- /dev/null
+++ b/code/modules/admin/verbs/grant_dna_infusion.dm
@@ -0,0 +1,36 @@
+/*
+ * Attempts to grant the target all organs from a given DNA infuser entry.area
+ * Returns the entry if all organs were successfully replaced.
+ * If no infusion was picked, the infusion had no organs, or if one or more organs could not be granted, returns FALSE
+*/
+/client/proc/grant_dna_infusion(mob/living/carbon/human/target in world)
+ set name = "Apply DNA Infusion"
+ set category = "Debug"
+
+ var/list/infusions = list()
+ for(var/datum/infuser_entry/path as anything in subtypesof(/datum/infuser_entry))
+ var/str = "[initial(path.name)] ([path])"
+ infusions[str] = path
+
+ var/datum/infuser_entry/picked_infusion = tgui_input_list(usr, "Select infusion", "Apply DNA Infusion", infusions)
+
+ if(isnull(picked_infusion))
+ return FALSE
+
+ // This is necessary because list propererties are not defined until initialization
+ picked_infusion = infusions[picked_infusion]
+ picked_infusion = new picked_infusion
+
+ if(!length(picked_infusion.output_organs))
+ return FALSE
+
+ . = picked_infusion
+ for(var/obj/item/organ/infusion_organ as anything in picked_infusion.output_organs)
+ var/obj/item/organ/new_organ = new infusion_organ()
+ if(!new_organ.replace_into(target))
+ to_chat(usr, span_notice("[target] is unable to carry [new_organ]!"))
+ qdel(new_organ)
+ . = FALSE
+ continue
+ log_admin("[key_name(usr)] has added organ [new_organ.type] to [key_name(target)]")
+ message_admins("[key_name_admin(usr)] has added organ [new_organ.type] to [ADMIN_LOOKUPFLW(target)]")
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/antagonists/changeling/powers/mmi_talk.dm b/code/modules/antagonists/changeling/powers/mmi_talk.dm
new file mode 100644
index 00000000000..f68968c223e
--- /dev/null
+++ b/code/modules/antagonists/changeling/powers/mmi_talk.dm
@@ -0,0 +1,140 @@
+/datum/action/changeling/mmi_talk
+ name = "MMI Talk"
+ desc = "Our decoy brain has been implanted into a Man-Machine Interface. \
+ In order to maintain our secrecy, we can speak through the decoy as if a normal brain. \
+ The decoy brain will relay speech it hears to you in purple."
+ button_icon = 'icons/obj/assemblies/assemblies.dmi'
+ button_icon_state = "mmi_off"
+ dna_cost = CHANGELING_POWER_UNOBTAINABLE
+ ignores_fakedeath = TRUE // Can be used while fake dead
+ req_stat = DEAD // Can be used while real dead too
+
+ /**
+ * Reference to the brain we're talking through.
+ *
+ * Set when created via the ling decoy component.
+ * If the brain ends up being qdelled, this action will also be qdelled, and thus this ref is cleared.
+ */
+ VAR_FINAL/obj/item/organ/internal/brain/brain_ref
+
+ /// A map view of the area around the MMI.
+ VAR_FINAL/atom/movable/screen/map_view/mmi_view
+ /// The background for the MMI map view.
+ VAR_FINAL/atom/movable/screen/background/mmi_view_background
+ /// The key that the map view uses.
+ VAR_FINAL/mmi_view_key
+ /// A movement detector that updates the map view when the MMI moves around.
+ VAR_FINAL/datum/movement_detector/update_view_tracker
+
+/datum/action/changeling/mmi_talk/Destroy()
+ brain_ref = null
+ QDEL_NULL(mmi_view)
+ QDEL_NULL(mmi_view_background)
+ QDEL_NULL(update_view_tracker)
+ return ..()
+
+/datum/action/changeling/mmi_talk/Remove(mob/remove_from)
+ . = ..()
+ SStgui.close_uis(src)
+
+/datum/action/changeling/mmi_talk/can_sting(mob/living/user, mob/living/target)
+ . = ..()
+ if(!.)
+ return FALSE
+ // This generally shouldn't happen, but just in case
+ if(isnull(brain_ref))
+ stack_trace("[type] can_sting was called with a null brain!")
+ return FALSE
+ if(!istype(brain_ref.loc, /obj/item/mmi))
+ stack_trace("[type] can_sting was called with a brain not located in an MMI!")
+ return FALSE
+ return TRUE
+
+/datum/action/changeling/mmi_talk/sting_action(mob/living/user, mob/living/target)
+ ..()
+ ui_interact(user)
+ return TRUE
+
+/datum/action/changeling/mmi_talk/ui_state(mob/user)
+ return GLOB.always_state
+
+/datum/action/changeling/mmi_talk/ui_status(mob/user, datum/ui_state/state)
+ if(user != owner)
+ return UI_CLOSE
+ return ..()
+
+/datum/action/changeling/mmi_talk/ui_static_data(mob/user)
+ var/list/data = list()
+ data["mmi_view"] = mmi_view_key
+ return data
+
+/datum/action/changeling/mmi_talk/ui_interact(mob/user, datum/tgui/ui)
+ if(isnull(mmi_view_key))
+ // it's worth noting a ling could have multiple of these actions.
+ mmi_view_key = "ling_mmi_[REF(src)]_view"
+ // Generate background
+ mmi_view_background = new()
+ mmi_view_background.assigned_map = mmi_view_key
+ mmi_view_background.del_on_map_removal = FALSE
+ mmi_view_background.fill_rect(1, 1, 5, 5)
+ // Generate map view
+ mmi_view = new()
+ mmi_view.generate_view(mmi_view_key)
+ // Generate movement detector (to update the view on MMI movement)
+ update_view_tracker = new(brain_ref, CALLBACK(src, PROC_REF(update_mmi_view)))
+
+ // Shows the view to the user foremost
+ mmi_view.display_to(user)
+ user.client.register_map_obj(mmi_view_background)
+ update_mmi_view()
+ // Makes the MMI relay heard messages
+ if(!HAS_TRAIT_FROM(brain_ref.loc, TRAIT_HEARING_SENSITIVE, REF(src)))
+ var/obj/item/mmi/mmi = brain_ref.loc
+ mmi.become_hearing_sensitive(REF(src))
+ RegisterSignal(mmi, COMSIG_MOVABLE_HEAR, PROC_REF(relay_hearing))
+ // Actually open the UI
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "LingMMITalk")
+ ui.open()
+
+/datum/action/changeling/mmi_talk/ui_close(mob/user)
+ var/obj/item/mmi/mmi = brain_ref.loc
+ UnregisterSignal(mmi, COMSIG_MOVABLE_HEAR)
+ mmi.lose_hearing_sensitivity(REF(src))
+
+/datum/action/changeling/mmi_talk/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
+ . = ..()
+ if(.)
+ return TRUE
+
+ if(action != "send_mmi_message")
+ return FALSE
+
+ var/obj/item/mmi/mmi = brain_ref.loc
+ if(mmi.brainmob.stat != CONSCIOUS)
+ to_chat(usr, span_warning("Our decoy brain is too damaged to speak."))
+ else
+ // Say will perform input sanitization and such for us
+ mmi.brainmob.say(params["message"], sanitize = TRUE)
+ return TRUE
+
+/// Used in callbacks to update the map view when the MMI moves.
+/datum/action/changeling/mmi_talk/proc/update_mmi_view()
+ mmi_view.vis_contents.Cut()
+ for(var/turf/visible_turf in view(2, get_turf(brain_ref)))
+ mmi_view.vis_contents += visible_turf
+
+/// Signal proc for [COMSIG_MOVABLE_HEAR] to relay stuff the MMI hears to the ling.
+/// Not super good, but it works.
+/datum/action/changeling/mmi_talk/proc/relay_hearing(obj/item/mmi/source, list/hear_args)
+ SIGNAL_HANDLER
+
+ // We can likely already hear them, so do not bother
+ if(can_see(owner, hear_args[HEARING_SPEAKER], 7))
+ return
+
+ var/list/new_args = hear_args.Copy()
+ new_args[HEARING_SPANS] |= "purple"
+ new_args[HEARING_RANGE] = INFINITY // so we can hear it from any distance away
+ owner.Hear(arglist(new_args))
diff --git a/code/modules/antagonists/heretic/items/keyring.dm b/code/modules/antagonists/heretic/items/keyring.dm
new file mode 100644
index 00000000000..0498ba9e8a2
--- /dev/null
+++ b/code/modules/antagonists/heretic/items/keyring.dm
@@ -0,0 +1,186 @@
+/obj/effect/knock_portal
+ name = "crack in reality"
+ desc = "A crack in space, impossibly deep and painful to the eyes. Definitely not safe."
+ icon = 'icons/effects/eldritch.dmi'
+ icon_state = "realitycrack"
+ light_system = STATIC_LIGHT
+ light_power = 1
+ light_on = TRUE
+ light_color = COLOR_GREEN
+ light_range = 3
+ opacity = TRUE
+ density = FALSE //so we dont block doors closing
+ layer = OBJ_LAYER //under doors
+ ///The knock portal we teleport to
+ var/obj/effect/knock_portal/destination
+ ///The airlock we are linked to, we delete if it is destroyed
+ var/obj/machinery/door/our_airlock
+
+/obj/effect/knock_portal/Initialize(mapload, target)
+ . = ..()
+ if(target)
+ our_airlock = target
+ RegisterSignal(target, COMSIG_QDELETING, PROC_REF(delete_on_door_delete))
+
+ var/static/list/loc_connections = list(
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
+ )
+ AddElement(/datum/element/connect_loc, loc_connections)
+
+///Deletes us and our destination portal if our_airlock is destroyed
+/obj/effect/knock_portal/proc/delete_on_door_delete(datum/source)
+ SIGNAL_HANDLER
+ qdel(src)
+
+///Signal handler for when our location is entered, calls teleport on the victim, if their old_loc didnt contain a portal already (to prevent loops)
+/obj/effect/knock_portal/proc/on_entered(datum/source, mob/living/loser, atom/old_loc)
+ SIGNAL_HANDLER
+ if(istype(loser) && !(locate(type) in old_loc))
+ teleport(loser)
+
+/obj/effect/knock_portal/Destroy()
+ QDEL_NULL(destination)
+ our_airlock = null
+ return ..()
+
+///Teleports the teleportee, to a random airlock if the teleportee isnt a heretic, or the other portal if they are one
+/obj/effect/knock_portal/proc/teleport(mob/living/teleportee)
+ if(isnull(destination)) //dumbass
+ qdel(src)
+ return
+
+ //get it?
+ var/obj/machinery/door/doorstination = IS_HERETIC_OR_MONSTER(teleportee) ? destination.our_airlock : find_random_airlock()
+ if(!do_teleport(teleportee, get_turf(doorstination), channel = TELEPORT_CHANNEL_MAGIC))
+ return
+
+ if(!IS_HERETIC_OR_MONSTER(teleportee))
+ teleportee.apply_damage(20, BRUTE) //so they dont roll it like a jackpot machine to see if they can land in the armory
+ to_chat(teleportee, span_userdanger("You stumble through [src], battered by forces beyond your comprehension, landing anywhere but where you thought you were going."))
+
+ INVOKE_ASYNC(src, PROC_REF(async_opendoor), doorstination)
+
+///Returns a random airlock on the same Z level as our portal, that isnt our airlock
+/obj/effect/knock_portal/proc/find_random_airlock()
+ var/list/turf/possible_destinations = list()
+ for(var/obj/airlock as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/airlock))
+ if(airlock.z != z)
+ continue
+ if(airlock.loc == loc)
+ continue
+ possible_destinations += airlock
+ return pick(possible_destinations)
+
+///Asynchronous proc to unbolt, then open the passed door
+/obj/effect/knock_portal/proc/async_opendoor(obj/machinery/door/door)
+ if(istype(door, /obj/machinery/door/airlock)) //they can create portals on ANY door, but we should unlock airlocks so they can actually open
+ var/obj/machinery/door/airlock/as_airlock = door
+ as_airlock.unbolt()
+ door.open()
+
+///An ID card capable of shapeshifting to other IDs given by the Key Keepers Burden knowledge
+/obj/item/card/id/advanced/heretic
+ ///List of IDs this card consumed
+ var/list/obj/item/card/id/fused_ids = list()
+ ///The first portal in the portal pair, so we can clear it later
+ var/obj/effect/knock_portal/portal_one
+ ///The second portal in the portal pair, so we can clear it later
+ var/obj/effect/knock_portal/portal_two
+ ///The first door we are linking in the pair, so we can create a portal pair
+ var/datum/weakref/link
+
+/obj/item/card/id/advanced/heretic/examine(mob/user)
+ . = ..()
+ if(!IS_HERETIC_OR_MONSTER(user))
+ return
+ . += span_hypnophrase("Enchanted by the Mansus!")
+ . += span_hypnophrase("Using an ID on this will consume it and allow you to copy its accesses.")
+ . += span_hypnophrase("Using this in-hand allows you to change its appearance.")
+ . += span_hypnophrase("Using this on a pair of doors, allows you to link them together. Entering one door will transport you to the other, while heathens are instead teleported to a random airlock.")
+
+/obj/item/card/id/advanced/heretic/attack_self(mob/user)
+ . = ..()
+ if(!IS_HERETIC(user))
+ return
+ var/cardname = tgui_input_list(user, "Shapeshift into?", "Shapeshift", fused_ids)
+ if(!cardname)
+ balloon_alert(user, "no options!")
+ return ..()
+ var/obj/item/card/id/card = fused_ids[cardname]
+ shapeshift(card)
+
+///Changes our appearance to the passed ID card
+/obj/item/card/id/advanced/heretic/proc/shapeshift(obj/item/card/id/advanced/card)
+ trim = card.trim
+ assignment = card.assignment
+ registered_age = card.registered_age
+ registered_name = card.registered_name
+ icon_state = card.icon_state
+ inhand_icon_state = card.inhand_icon_state
+ assigned_icon_state = card.assigned_icon_state
+ name = card.name //not update_label because of the captains spare moment
+ update_icon()
+
+///Deletes and nulls our portal pair
+/obj/item/card/id/advanced/heretic/proc/clear_portals()
+ QDEL_NULL(portal_one)
+ QDEL_NULL(portal_two)
+
+///Clears portal references
+/obj/item/card/id/advanced/heretic/proc/clear_portal_refs()
+ SIGNAL_HANDLER
+ portal_one = null
+ portal_two = null
+
+///Creates a portal pair at door1 and door2, displays a balloon alert to user
+/obj/item/card/id/advanced/heretic/proc/make_portal(mob/user, obj/machinery/door/door1, obj/machinery/door/door2)
+ var/message = "linked"
+ if(portal_one || portal_two)
+ clear_portals()
+ message += ", previous cleared"
+
+ portal_one = new(get_turf(door2), door2)
+ portal_two = new(get_turf(door1), door1)
+ portal_one.destination = portal_two
+ RegisterSignal(portal_one, COMSIG_QDELETING, PROC_REF(clear_portal_refs)) //we only really need to register one because they already qdel both portals if one is destroyed
+ portal_two.destination = portal_one
+ balloon_alert(user, "[message]")
+
+/obj/item/card/id/advanced/heretic/attackby(obj/item/thing, mob/user, params)
+ if(!istype(thing, /obj/item/card/id/advanced) || !IS_HERETIC(user))
+ return ..()
+ var/obj/item/card/id/card = thing
+ fused_ids[card.name] = card
+ card.moveToNullspace()
+ playsound(drop_location(),'sound/items/eatfood.ogg', rand(10,50), TRUE)
+ access += card.access
+
+/obj/item/card/id/advanced/heretic/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
+ . = ..()
+ if(!proximity_flag || !IS_HERETIC(user))
+ return
+ if(istype(target, /obj/effect/knock_portal))
+ clear_portals()
+ return
+
+ if(!istype(target, /obj/machinery/door))
+ return
+
+ var/reference_resolved = link?.resolve()
+ if(reference_resolved == target)
+ return
+
+ if(reference_resolved)
+ make_portal(user, reference_resolved, target)
+ to_chat(user, span_notice("You use [src], to link [link] and [target] together."))
+ link = null
+ balloon_alert(user, "link 2/2")
+ else
+ link = WEAKREF(target)
+ balloon_alert(user, "link 1/2")
+
+/obj/item/card/id/advanced/heretic/Destroy()
+ QDEL_LIST_ASSOC(fused_ids)
+ link = null
+ clear_portals()
+ return ..()
diff --git a/code/modules/antagonists/heretic/items/lintel.dm b/code/modules/antagonists/heretic/items/lintel.dm
new file mode 100644
index 00000000000..140453842c0
--- /dev/null
+++ b/code/modules/antagonists/heretic/items/lintel.dm
@@ -0,0 +1,64 @@
+/obj/effect/forcefield/wizard/heretic
+ name = "consecrated lintel"
+ desc = "A field of papers flying in the air, repulsing heathens with impossible force."
+ icon_state = "lintel"
+ initial_duration = 8 SECONDS
+
+/obj/effect/forcefield/wizard/heretic/Bumped(mob/living/bumpee)
+ . = ..()
+ if(!istype(bumpee) || IS_HERETIC_OR_MONSTER(bumpee))
+ return
+ var/throwtarget = get_edge_target_turf(loc, get_dir(loc, get_step_away(bumpee, loc)))
+ bumpee.safe_throw_at(throwtarget, 10, 1, force = MOVE_FORCE_EXTREMELY_STRONG)
+ visible_message(span_danger("[src] repulses [bumpee] in a storm of paper!"))
+
+///A heretic item that spawns a barrier at the clicked turf, 3 uses
+/obj/item/heretic_lintel
+ name = "consecrated book"
+ desc = "Some kind of book, its contents make your head hurt. The material is not known to you and it seems to shift and twist unnaturally."
+ icon = 'icons/obj/service/library.dmi'
+ icon_state = "hereticlintel"
+ force = 10
+ damtype = BURN
+ worn_icon_state = "book"
+ throw_speed = 1
+ throw_range = 5
+ w_class = WEIGHT_CLASS_NORMAL
+ attack_verb_continuous = list("bashes", "curses")
+ attack_verb_simple = list("bash", "curse")
+ resistance_flags = FLAMMABLE
+ drop_sound = 'sound/items/handling/book_drop.ogg'
+ pickup_sound = 'sound/items/handling/book_pickup.ogg'
+ ///what type of barrier do we spawn when used
+ var/barrier_type = /obj/effect/forcefield/wizard/heretic
+ ///how many uses do we have left
+ var/uses = 3
+
+/obj/item/heretic_lintel/examine(mob/user)
+ . = ..()
+ if(!IS_HERETIC_OR_MONSTER(user))
+ return
+ . += span_hypnophrase("Materializes a barrier upon any tile in sight, which only you can pass through. Lasts 8 seconds.")
+ . += span_hypnophrase("It has [uses] uses left.")
+
+/obj/item/heretic_lintel/afterattack(atom/target, mob/user, proximity_flag)
+ . = ..()
+ if(IS_HERETIC(user))
+ var/turf/turf_target = get_turf(target)
+ if(locate(barrier_type) in turf_target)
+ user.balloon_alert(user, "already occupied!")
+ return
+ turf_target.visible_message(span_warning("A storm of paper materializes!"))
+ new /obj/effect/temp_visual/paper_scatter(turf_target)
+ playsound(turf_target, 'sound/magic/smoke.ogg', 30)
+ new barrier_type(turf_target, user)
+ uses--
+ if(uses <= 0)
+ to_chat(user, span_warning("[src] falls apart, turning into ash and dust!"))
+ qdel(src)
+ return
+ var/mob/living/carbon/human/human_user = user
+ to_chat(human_user, span_userdanger("Your mind burns as you stare deep into the book, a headache setting in like your brain is on fire!"))
+ human_user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 30, 190)
+ human_user.add_mood_event("gates_of_mansus", /datum/mood_event/gates_of_mansus)
+ human_user.dropItemToGround(src)
diff --git a/code/modules/antagonists/heretic/knowledge/knock_lore.dm b/code/modules/antagonists/heretic/knowledge/knock_lore.dm
new file mode 100644
index 00000000000..6879f527b6b
--- /dev/null
+++ b/code/modules/antagonists/heretic/knowledge/knock_lore.dm
@@ -0,0 +1,230 @@
+/**
+ * # The path of Knock.
+ *
+ * Goes as follows:
+ *
+ * A Locksmith’s Secret
+ * Grasp of Knock
+ * > Sidepaths:
+ * Ashen Eyes
+ * Codex Cicatrix
+ * Key Keeper’s Burden
+ *
+ * Rite Of Passage
+ * Mark Of Knock
+ * Ritual of Knowledge
+ * Burglar's Finesse
+ * > Sidepaths:
+ * Apetra Vulnera
+ * Opening Blast
+ *
+ * Opening Blade
+ * Caretaker’s Last Refuge
+ *
+ * Many secrets behind the Spider Door
+ */
+/datum/heretic_knowledge/limited_amount/starting/base_knock
+ name = "A Locksmith’s Secret"
+ desc = "Opens up the Path of Knock to you. \
+ Allows you to transmute a knife and a crowbar into a Key Blade. \
+ You can only create two at a time and they function as fast crowbars. \
+ In addition, they can fit into utility belts."
+ gain_text = "The Knock permits no seal and no isolation. It thrusts us gleefully out of the safety of ignorance."
+ next_knowledge = list(/datum/heretic_knowledge/knock_grasp)
+ required_atoms = list(
+ /obj/item/knife = 1,
+ /obj/item/crowbar = 1,
+ )
+ result_atoms = list(/obj/item/melee/sickly_blade/knock)
+ limit = 2
+ route = PATH_KNOCK
+
+/datum/heretic_knowledge/knock_grasp
+ name = "Grasp of Knock"
+ desc = "Your mansus grasp allows you to access anything! Right click on an airlock or a locker to force it open. \
+ DNA locks on mechs will be removed, and any pilot will be ejected. Works on consoles. \
+ Makes a distinctive knocking sound on use."
+ gain_text = "Nothing may remain closed from my touch."
+ next_knowledge = list(
+ /datum/heretic_knowledge/key_ring,
+ /datum/heretic_knowledge/medallion,
+ /datum/heretic_knowledge/codex_cicatrix,
+ )
+ cost = 1
+ route = PATH_KNOCK
+
+/datum/heretic_knowledge/knock_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic)
+ RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK_SECONDARY, PROC_REF(on_secondary_mansus_grasp))
+ RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp))
+
+/datum/heretic_knowledge/knock_grasp/on_lose(mob/user, datum/antagonist/heretic/our_heretic)
+ UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK_SECONDARY)
+ UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK)
+
+/datum/heretic_knowledge/knock_grasp/proc/on_mansus_grasp(mob/living/source, mob/living/target)
+ SIGNAL_HANDLER
+ var/obj/item/clothing/under/suit = target.get_item_by_slot(ITEM_SLOT_ICLOTHING)
+ if(istype(suit) && suit.adjusted == NORMAL_STYLE)
+ suit.toggle_jumpsuit_adjust()
+ suit.update_appearance()
+
+/datum/heretic_knowledge/knock_grasp/proc/on_secondary_mansus_grasp(mob/living/source, atom/target)
+ SIGNAL_HANDLER
+
+ if(ismecha(target))
+ var/obj/vehicle/sealed/mecha/mecha = target
+ mecha.dna_lock = null
+ for(var/mob/living/occupant as anything in mecha.occupants)
+ if(isAI(occupant))
+ continue
+ mecha.mob_exit(occupant, randomstep = TRUE)
+ else if(istype(target,/obj/machinery/door/airlock))
+ var/obj/machinery/door/airlock/door = target
+ door.unbolt()
+ else if(istype(target, /obj/machinery/computer))
+ var/obj/machinery/computer/computer = target
+ computer.authenticated = TRUE
+ computer.balloon_alert(source, "unlocked")
+
+ var/turf/target_turf = get_turf(target)
+ SEND_SIGNAL(target_turf, COMSIG_ATOM_MAGICALLY_UNLOCKED, src, source)
+ playsound(target, 'sound/magic/hereticknock.ogg', 100, TRUE, -1)
+
+ return COMPONENT_USE_HAND
+
+/datum/heretic_knowledge/key_ring
+ name = "Key Keeper’s Burden"
+ desc = "Allows you to transmute a wallet, an iron rod, and an ID card to create an Eldritch Card. \
+ It functions the same as an ID Card, but attacking it with an ID card fuses it and gains its access. \
+ You can use it in-hand to change its form to a card you fused. \
+ Does not preserve the card used in the ritual."
+ gain_text = "Gateways shall open before me, my very will ensnaring reality."
+ adds_sidepath_points = 1
+ required_atoms = list(
+ /obj/item/storage/wallet = 1,
+ /obj/item/stack/rods = 1,
+ /obj/item/card/id = 1,
+ )
+ result_atoms = list(/obj/item/card/id/advanced/heretic)
+ next_knowledge = list(/datum/heretic_knowledge/limited_amount/rite_of_passage)
+ cost = 1
+ route = PATH_KNOCK
+
+/datum/heretic_knowledge/limited_amount/rite_of_passage // item that creates 3 max at a time heretic only barriers, probably should limit to 1 only, holy people can also pass
+ name = "Rite Of Passage"
+ desc = "Allows you to transmute a white crayon, a wooden plank, and a multitool to create a Consecrated Book. \
+ It can materialize a barricade at range that only you and people resistant to magic can pass. 3 uses."
+ gain_text = "With this I can repel those that intend me harm."
+ required_atoms = list(
+ /obj/item/toy/crayon/white = 1,
+ /obj/item/stack/sheet/mineral/wood = 1,
+ /obj/item/multitool = 1,
+ )
+ result_atoms = list(/obj/item/heretic_lintel)
+ next_knowledge = list(/datum/heretic_knowledge/mark/knock_mark)
+ cost = 1
+ route = PATH_KNOCK
+
+/datum/heretic_knowledge/mark/knock_mark
+ name = "Mark of Knock"
+ desc = "Your Mansus Grasp now applies the Mark of Knock. \
+ Attack a marked person to bar them from all passages for the duration of the mark. \
+ This will make it so that they have no access whatsoever, even public access doors will reject them."
+ gain_text = "Their requests for passage will remain unheeded."
+ next_knowledge = list(/datum/heretic_knowledge/knowledge_ritual/knock)
+ route = PATH_KNOCK
+ mark_type = /datum/status_effect/eldritch/knock
+
+/datum/heretic_knowledge/knowledge_ritual/knock
+ next_knowledge = list(/datum/heretic_knowledge/spell/burglar_finesse)
+ route = PATH_KNOCK
+
+/datum/heretic_knowledge/spell/burglar_finesse
+ name = "Burglar's Finesse"
+ desc = "Grants you Burglar's Finesse, a single-target spell \
+ that puts a random item from the victims backpack into your hand."
+ gain_text = "Their trinkets will be mine, as will their lives in due time."
+ adds_sidepath_points = 1
+ next_knowledge = list(
+ /datum/heretic_knowledge/spell/apetra_vulnera,
+ /datum/heretic_knowledge/spell/opening_blast,
+ /datum/heretic_knowledge/blade_upgrade/flesh/knock,
+ )
+ spell_to_add = /datum/action/cooldown/spell/pointed/burglar_finesse
+ cost = 2
+ route = PATH_KNOCK
+
+/datum/heretic_knowledge/blade_upgrade/flesh/knock //basically a chance-based weeping avulsion version of the former
+ name = "Opening Blade"
+ desc = "Your blade has a chance to cause a weeping avulsion on attack."
+ gain_text = "The power of my patron courses through my blade, willing their very flesh to part."
+ next_knowledge = list(/datum/heretic_knowledge/spell/caretaker_refuge)
+ route = PATH_KNOCK
+ wound_type = /datum/wound/slash/flesh/critical
+ var/chance = 35
+
+/datum/heretic_knowledge/blade_upgrade/flesh/knock/do_melee_effects(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade)
+ if(prob(chance))
+ return ..()
+
+/datum/heretic_knowledge/spell/caretaker_refuge
+ name = "Caretaker’s Last Refuge"
+ desc = "Gives you a spell that makes you transparent and not dense. Cannot be used near living sentient beings. \
+ While in refuge, you cannot use your hands or spells, and you are immune to slowdown. \
+ You are invincible but unable to harm anything. Cancelled by being hit with an anti-magic item."
+ gain_text = "Then I saw my my own reflection cascaded mind-numbingly enough times that I was but a haze."
+ adds_sidepath_points = 1
+ next_knowledge = list(/datum/heretic_knowledge/ultimate/knock_final)
+ route = PATH_KNOCK
+ spell_to_add = /datum/action/cooldown/spell/caretaker
+ cost = 1
+
+/datum/heretic_knowledge/ultimate/knock_final
+ name = "Many secrets behind the Spider Door"
+ desc = "The ascension ritual of the Path of Knock. \
+ Bring 3 corpses without organs in their torso to a transmutation rune to complete the ritual. \
+ When completed, you gain the ability to transform into empowered eldritch creatures \
+ and in addition, create a tear to the Spider Door; \
+ a tear in reality located at the site of this ritual. \
+ Eldritch creatures will endlessly pour from this rift \
+ who are bound to obey your instructions."
+ gain_text = "With her knowledge, and what I had seen, I knew what to do. \
+ I had to open the gates, with the holes in my foes as Ways! \
+ Reality will soon be torn, the Spider Gate opened! WITNESS ME!"
+ required_atoms = list(/mob/living/carbon/human = 3)
+ route = PATH_KNOCK
+
+/datum/heretic_knowledge/ultimate/knock_final/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc)
+ . = ..()
+ if(!.)
+ return FALSE
+
+ for(var/mob/living/carbon/human/body in atoms)
+ if(body.stat != DEAD)
+ continue
+ var/obj/item/bodypart/chest = body.get_bodypart(BODY_ZONE_CHEST)
+ if(LAZYLEN(chest.get_organs()))
+ to_chat(user, span_hierophant_warning("[body] has organs in their chest."))
+ continue
+
+ selected_atoms += body
+
+ if(!LAZYLEN(selected_atoms))
+ loc.balloon_alert(user, "ritual failed, not enough valid bodies!")
+ return FALSE
+ return TRUE
+
+/datum/heretic_knowledge/ultimate/knock_final/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc)
+ . = ..()
+ priority_announce("Delta-class dimensional anomaly detec[generate_heretic_text()] Reality rended, torn. Gates open, doors open, [user.real_name] has ascended! Fear the tide! [generate_heretic_text()]", "Centra[generate_heretic_text()]", ANNOUNCER_SPANOMALIES)
+ user.client?.give_award(/datum/award/achievement/misc/knock_ascension, user)
+
+ // buffs
+ var/datum/action/cooldown/spell/shapeshift/eldritch/ascension/transform_spell = new(user.mind)
+ transform_spell.Grant(user)
+
+ user.client?.give_award(/datum/award/achievement/misc/knock_ascension, user)
+ var/datum/antagonist/heretic/heretic_datum = IS_HERETIC(user)
+ var/datum/heretic_knowledge/blade_upgrade/flesh/knock/blade_upgrade = heretic_datum.get_knowledge(/datum/heretic_knowledge/blade_upgrade/flesh/knock)
+ blade_upgrade.chance += 30
+ new /obj/structure/knock_tear(loc, user.mind)
diff --git a/code/modules/antagonists/heretic/knowledge/side_knock_flesh.dm b/code/modules/antagonists/heretic/knowledge/side_knock_flesh.dm
new file mode 100644
index 00000000000..97218ce5e94
--- /dev/null
+++ b/code/modules/antagonists/heretic/knowledge/side_knock_flesh.dm
@@ -0,0 +1,28 @@
+// Sidepaths for knowledge between Knock and Flesh.
+
+/datum/heretic_knowledge/spell/apetra_vulnera
+ name = "Apetra Vulnera"
+ desc = "Grants you Apetra Vulnera, a spell \
+ which causes heavy bleeding on all bodyparts of the victim that have more than 15 brute damage. \
+ Wounds a random limb if no limb is sufficiently damaged."
+ gain_text = "Flesh opens, and blood spills. My master seeks sacrifice, and I shall appease."
+ next_knowledge = list(
+ /datum/heretic_knowledge/spell/blood_siphon,
+ /datum/heretic_knowledge/void_cloak,
+ )
+ spell_to_add = /datum/action/cooldown/spell/pointed/apetra_vulnera
+ cost = 1
+ route = PATH_SIDE
+
+/datum/heretic_knowledge/spell/opening_blast
+ name = "Wave Of Desperation"
+ desc = "Grants you Wave Of Desparation, a spell which can only be cast while restrained. \
+ It removes your restraints, repels and knocks down adjacent people, and applies the Mansus Grasp to everything nearby."
+ gain_text = "My shackles undone in dark fury, their feeble bindings crumble before my power."
+ next_knowledge = list(
+ /datum/heretic_knowledge/summon/ashy,
+ /datum/heretic_knowledge/void_cloak,
+ )
+ spell_to_add = /datum/action/cooldown/spell/aoe/wave_of_desperation
+ cost = 1
+ route = PATH_SIDE
diff --git a/code/modules/antagonists/heretic/magic/apetravulnera.dm b/code/modules/antagonists/heretic/magic/apetravulnera.dm
new file mode 100644
index 00000000000..801104dddf9
--- /dev/null
+++ b/code/modules/antagonists/heretic/magic/apetravulnera.dm
@@ -0,0 +1,59 @@
+/datum/action/cooldown/spell/pointed/apetra_vulnera
+ name = "Apetra Vulnera"
+ desc = "Causes severe bleeding on every limb of a target which has more than 15 brute damage. \
+ Wounds a random limb if no limb is sufficiently damaged."
+ background_icon_state = "bg_heretic"
+ overlay_icon_state = "bg_heretic_border"
+ button_icon = 'icons/mob/actions/actions_ecult.dmi'
+ button_icon_state = "cleave"
+
+ school = SCHOOL_FORBIDDEN
+ cooldown_time = 45 SECONDS
+
+ invocation = "AP'TRA VULN'RA!"
+ invocation_type = INVOCATION_WHISPER
+ spell_requirements = NONE
+
+ cast_range = 4
+ /// What type of wound we apply
+ var/wound_type = /datum/wound/slash/flesh/critical/cleave
+
+/datum/action/cooldown/spell/pointed/apetra_vulnera/is_valid_target(atom/cast_on)
+ return ..() && ishuman(cast_on)
+
+/datum/action/cooldown/spell/pointed/apetra_vulnera/cast(mob/living/carbon/human/cast_on)
+ . = ..()
+
+ if(IS_HERETIC_OR_MONSTER(cast_on))
+ return FALSE
+
+ if(!cast_on.blood_volume)
+ return FALSE
+
+ if(cast_on.can_block_magic(antimagic_flags))
+ cast_on.visible_message(
+ span_danger("[cast_on]'s bruises briefly glow, but repels the effect!"),
+ span_danger("Your bruises sting a little, but you are protected!")
+ )
+ return FALSE
+
+ var/a_limb_got_damaged = FALSE
+ for(var/obj/item/bodypart/bodypart in cast_on.bodyparts)
+ if(bodypart.brute_dam < 15)
+ continue
+ a_limb_got_damaged = TRUE
+ var/datum/wound/slash/crit_wound = new wound_type()
+ crit_wound.apply_wound(bodypart)
+
+ if(!a_limb_got_damaged)
+ var/datum/wound/slash/crit_wound = new wound_type()
+ crit_wound.apply_wound(pick(cast_on.bodyparts))
+
+ cast_on.visible_message(
+ span_danger("[cast_on]'s scratches and bruises are torn open by an unholy force!"),
+ span_danger("Your scratches and bruises are torn open by some horrible unholy force!")
+ )
+
+ new /obj/effect/temp_visual/cleave(get_turf(cast_on))
+
+ return TRUE
diff --git a/code/modules/antagonists/heretic/magic/ascended_shapeshift.dm b/code/modules/antagonists/heretic/magic/ascended_shapeshift.dm
new file mode 100644
index 00000000000..4395b4a54b3
--- /dev/null
+++ b/code/modules/antagonists/heretic/magic/ascended_shapeshift.dm
@@ -0,0 +1,32 @@
+// Given to ascended knock heretics, is a form of shapeshift that can turn into all 4 common heretic summons, and is not limited to 1 selection.
+/datum/action/cooldown/spell/shapeshift/eldritch/ascension
+ name = "Ascended Shapechange"
+ desc = "A spell that allows you to take on the form of another eldritch creature, gaining their abilities. \
+ You can change your choice at any time, and if your form dies, you dont die."
+ cooldown_time = 20 SECONDS
+ die_with_shapeshifted_form = FALSE
+ possible_shapes = list(
+ /mob/living/simple_animal/hostile/heretic_summon/raw_prophet,
+ /mob/living/simple_animal/hostile/heretic_summon/rust_spirit,
+ /mob/living/simple_animal/hostile/heretic_summon/ash_spirit,
+ /mob/living/simple_animal/hostile/heretic_summon/stalker,
+ )
+
+/datum/action/cooldown/spell/shapeshift/eldritch/ascension/do_shapeshift(mob/living/caster)
+ . = ..()
+ if(!.)
+ return
+ //buff our forms so this ascension ability isnt shit
+ playsound(caster, 'sound/magic/demon_consume.ogg', 50, TRUE)
+ var/mob/living/monster = .
+ monster.AddComponent(/datum/component/seethrough_mob)
+ monster.maxHealth *= 1.5
+ monster.health = monster.maxHealth
+ monster.melee_damage_lower = max((monster.melee_damage_lower * 2), 40)
+ monster.melee_damage_upper = monster.melee_damage_upper / 2
+ monster.transform *= 1.5
+ monster.AddElement(/datum/element/wall_smasher, strength_flag = ENVIRONMENT_SMASH_RWALLS)
+
+/datum/action/cooldown/spell/shapeshift/eldritch/ascension/do_unshapeshift(mob/living/caster)
+ . = ..()
+ shapeshift_type = null //pick another loser
diff --git a/code/modules/antagonists/heretic/magic/burglar_finesse.dm b/code/modules/antagonists/heretic/magic/burglar_finesse.dm
new file mode 100644
index 00000000000..7bb6960354e
--- /dev/null
+++ b/code/modules/antagonists/heretic/magic/burglar_finesse.dm
@@ -0,0 +1,39 @@
+/datum/action/cooldown/spell/pointed/burglar_finesse
+ name = "Burglar's Finesse"
+ desc = "Steal a random item from the victim's backpack."
+ background_icon_state = "bg_heretic"
+ overlay_icon_state = "bg_heretic_border"
+ button_icon = 'icons/mob/actions/actions_ecult.dmi'
+ button_icon_state = "burglarsfinesse"
+
+ school = SCHOOL_FORBIDDEN
+ cooldown_time = 40 SECONDS
+
+ invocation = "Y'O'K!"
+ invocation_type = INVOCATION_WHISPER
+ spell_requirements = NONE
+
+ cast_range = 4
+
+/datum/action/cooldown/spell/pointed/burglar_finesse/is_valid_target(atom/cast_on)
+ return ..() && ishuman(cast_on) && (locate(/obj/item/storage/backpack) in cast_on.contents)
+
+/datum/action/cooldown/spell/pointed/burglar_finesse/cast(mob/living/carbon/human/cast_on)
+ . = ..()
+ if(cast_on.can_block_magic(antimagic_flags))
+ to_chat(cast_on, span_danger("You feel a light tug, but are otherwise fine, you were protected by holiness!"))
+ to_chat(owner, span_danger("[cast_on] is protected by holy forces!"))
+ return FALSE
+
+ var/obj/storage_item = locate(/obj/item/storage/backpack) in cast_on.contents
+
+ if(isnull(storage_item))
+ return FALSE
+
+ var/item = pick(storage_item.contents)
+ if(isnull(item))
+ return FALSE
+
+ to_chat(cast_on, span_warning("Your [storage_item] feels lighter..."))
+ to_chat(owner, span_notice("With a blink, you pull [item] out of [cast_on][p_s()] [storage_item]."))
+ owner.put_in_active_hand(item)
diff --git a/code/modules/antagonists/heretic/magic/caretaker.dm b/code/modules/antagonists/heretic/magic/caretaker.dm
new file mode 100644
index 00000000000..87f3a69dad1
--- /dev/null
+++ b/code/modules/antagonists/heretic/magic/caretaker.dm
@@ -0,0 +1,39 @@
+/datum/action/cooldown/spell/caretaker
+ name = "Caretaker’s Last Refuge"
+ desc = "Shifts you into the Caretaker's Refuge, rendering you translucent and intangible. \
+ While in the Refuge your movement is unrestricted, but you cannot use your hands or cast any spells. \
+ You cannot enter the Refuge while near other sentient beings, \
+ and you can be removed from it upon contact with antimagical artifacts."
+ background_icon_state = "bg_heretic"
+ overlay_icon_state = "bg_heretic_border"
+ button_icon = 'icons/mob/actions/actions_minor_antag.dmi'
+ button_icon_state = "ninja_cloak"
+ sound = 'sound/effects/curse2.ogg'
+
+ school = SCHOOL_FORBIDDEN
+ cooldown_time = 1 MINUTES
+
+ invocation_type = INVOCATION_NONE
+ spell_requirements = NONE
+
+/datum/action/cooldown/spell/caretaker/Remove(mob/living/remove_from)
+ if(remove_from.has_status_effect(/datum/status_effect/caretaker_refuge))
+ remove_from.remove_status_effect(/datum/status_effect/caretaker_refuge)
+ return ..()
+
+/datum/action/cooldown/spell/caretaker/is_valid_target(atom/cast_on)
+ return isliving(cast_on)
+
+/datum/action/cooldown/spell/caretaker/cast(atom/cast_on)
+ . = ..()
+ for(var/mob/living/alive in orange(5, owner))
+ if(alive.stat != DEAD && alive.client)
+ owner.balloon_alert(owner, "other minds nearby!")
+ return FALSE
+
+ var/mob/living/carbon/carbon_user = owner
+ if(carbon_user.has_status_effect(/datum/status_effect/caretaker_refuge))
+ carbon_user.remove_status_effect(/datum/status_effect/caretaker_refuge)
+ else
+ carbon_user.apply_status_effect(/datum/status_effect/caretaker_refuge)
+ return TRUE
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/wave_of_desperation.dm b/code/modules/antagonists/heretic/magic/wave_of_desperation.dm
new file mode 100644
index 00000000000..3b78b56ddc0
--- /dev/null
+++ b/code/modules/antagonists/heretic/magic/wave_of_desperation.dm
@@ -0,0 +1,79 @@
+/datum/action/cooldown/spell/aoe/wave_of_desperation
+ name = "Wave Of Desperation"
+ desc = "Removes your restraints, repels and knocks down adjacent people, and applies certain effects of the Mansus Grasp upon everything nearby. \
+ Cannot be cast unless you are restrained, and the stress renders you unconscious 12 seconds later!"
+ background_icon_state = "bg_heretic"
+ overlay_icon_state = "bg_heretic_border"
+ button_icon = 'icons/mob/actions/actions_ecult.dmi'
+ button_icon_state = "uncuff"
+ sound = 'sound/magic/swap.ogg'
+
+ school = SCHOOL_FORBIDDEN
+ cooldown_time = 5 MINUTES
+
+ invocation = "F'K 'FF."
+ invocation_type = INVOCATION_WHISPER
+ spell_requirements = NONE
+
+ aoe_radius = 3
+
+/datum/action/cooldown/spell/aoe/wave_of_desperation/is_valid_target(mob/living/carbon/cast_on)
+ return ..() && istype(cast_on) && (cast_on.handcuffed || cast_on.legcuffed)
+
+// Before the cast, we do some small AOE damage around the caster
+/datum/action/cooldown/spell/aoe/wave_of_desperation/before_cast(mob/living/carbon/cast_on)
+ . = ..()
+ if(. & SPELL_CANCEL_CAST)
+ return
+
+ if(cast_on.handcuffed)
+ cast_on.visible_message(span_danger("[cast_on.handcuffed] on [cast_on] shatter!"))
+ QDEL_NULL(cast_on.handcuffed)
+ if(cast_on.legcuffed)
+ cast_on.visible_message(span_danger("[cast_on.legcuffed] on [cast_on] shatters!"))
+ QDEL_NULL(cast_on.legcuffed)
+
+ cast_on.apply_status_effect(/datum/status_effect/heretic_lastresort)
+ new /obj/effect/temp_visual/knockblast(get_turf(cast_on))
+
+ for(var/mob/living/victim in get_things_to_cast_on(cast_on, radius_override = 1))
+ victim.AdjustKnockdown(3 SECONDS)
+ victim.AdjustParalyzed(0.5 SECONDS)
+
+/datum/action/cooldown/spell/aoe/wave_of_desperation/get_things_to_cast_on(atom/center, radius_override)
+ . = list()
+ for(var/atom/nearby in orange(center, radius_override ? radius_override : aoe_radius))
+ if(nearby == owner || nearby == center || isarea(nearby))
+ continue
+ if(!ismob(nearby))
+ . += nearby
+ continue
+ var/mob/living/nearby_mob = nearby
+ if(!isturf(nearby_mob.loc))
+ continue
+ if(IS_HERETIC_OR_MONSTER(nearby_mob))
+ continue
+ if(nearby_mob.can_block_magic(antimagic_flags))
+ continue
+
+ . += nearby_mob
+
+/datum/action/cooldown/spell/aoe/wave_of_desperation/cast_on_thing_in_aoe(atom/victim, atom/caster)
+ if(!ismob(victim))
+ SEND_SIGNAL(owner, COMSIG_HERETIC_MANSUS_GRASP_ATTACK_SECONDARY, victim)
+
+ var/atom/movable/mover = victim
+ if(!istype(mover))
+ return
+
+ if(mover.anchored)
+ return
+ var/our_turf = get_turf(caster)
+ var/throwtarget = get_edge_target_turf(our_turf, get_dir(our_turf, get_step_away(mover, our_turf)))
+ mover.safe_throw_at(throwtarget, 3, 1, force = MOVE_FORCE_STRONG)
+
+/obj/effect/temp_visual/knockblast
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "shield-flash"
+ alpha = 180
+ duration = 1 SECONDS
diff --git a/code/modules/antagonists/heretic/structures/knock_final.dm b/code/modules/antagonists/heretic/structures/knock_final.dm
new file mode 100644
index 00000000000..c8a2058eb9f
--- /dev/null
+++ b/code/modules/antagonists/heretic/structures/knock_final.dm
@@ -0,0 +1,115 @@
+/obj/structure/knock_tear
+ name = "???"
+ desc = "It stares back. Theres no reason to remain. Run."
+ max_integrity = INFINITE
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+ icon = 'icons/obj/anomaly.dmi'
+ icon_state = "bhole3"
+ color = COLOR_VOID_PURPLE
+ light_color = COLOR_VOID_PURPLE
+ light_range = 20
+ anchored = TRUE
+ density = FALSE
+ layer = HIGH_PIPE_LAYER //0.01 above sigil layer used by heretic runes
+ move_resist = INFINITY
+ /// Who is our daddy?
+ var/datum/mind/ascendee
+ /// True if we're currently checking for ghost opinions
+ var/gathering_candidates = TRUE
+ ///a static list of heretic summons we cam create, automatically populated from heretic monster subtypes
+ var/static/list/monster_types
+ /// A static list of heretic summons which we should not create
+ var/static/list/monster_types_blacklist = list(
+ /mob/living/basic/heretic_summon/star_gazer,
+ /mob/living/simple_animal/hostile/heretic_summon/armsy,
+ /mob/living/simple_animal/hostile/heretic_summon/armsy/prime,
+ )
+
+/obj/structure/knock_tear/Initialize(mapload, datum/mind/ascendant_mind)
+ . = ..()
+ transform *= 3
+ if(isnull(monster_types))
+ monster_types = subtypesof(/mob/living/simple_animal/hostile/heretic_summon) + subtypesof(/mob/living/basic/heretic_summon) - monster_types_blacklist
+ if(!isnull(ascendant_mind))
+ ascendee = ascendant_mind
+ RegisterSignals(ascendant_mind.current, list(COMSIG_LIVING_DEATH, COMSIG_QDELETING), PROC_REF(end_madness))
+ SSpoints_of_interest.make_point_of_interest(src)
+ INVOKE_ASYNC(src, PROC_REF(poll_ghosts))
+
+/// Ask ghosts if they want to make some noise
+/obj/structure/knock_tear/proc/poll_ghosts()
+ var/list/candidates = poll_ghost_candidates("Would you like to be a random eldritch monster attacking the crew?", ROLE_SENTIENCE, ROLE_SENTIENCE, 10 SECONDS, POLL_IGNORE_HERETIC_MONSTER)
+ while(LAZYLEN(candidates))
+ var/mob/dead/observer/candidate = pick_n_take(candidates)
+ ghost_to_monster(candidate, should_ask = FALSE)
+ gathering_candidates = FALSE
+
+/// Destroy the rift if you kill the heretic
+/obj/structure/knock_tear/proc/end_madness(datum/former_master)
+ SIGNAL_HANDLER
+ var/turf/our_turf = get_turf(src)
+ playsound(our_turf, 'sound/magic/castsummon.ogg', vol = 100, vary = TRUE)
+ visible_message(span_boldwarning("The rip in space spasms and disappears!"))
+ UnregisterSignal(former_master, list(COMSIG_LIVING_DEATH, COMSIG_QDELETING)) // Just in case they die THEN delete
+ new /obj/effect/temp_visual/destabilising_tear(our_turf)
+ qdel(src)
+
+/obj/structure/knock_tear/attack_ghost(mob/user)
+ . = ..()
+ if(. || gathering_candidates)
+ return
+ ghost_to_monster(user)
+
+/obj/structure/knock_tear/examine(mob/user)
+ . = ..()
+ if (!isobserver(user) || gathering_candidates)
+ return
+ . += span_notice("You can use this to enter the world as a foul monster.")
+
+/// Turn a ghost into an 'orrible beast
+/obj/structure/knock_tear/proc/ghost_to_monster(mob/dead/observer/user, should_ask = TRUE)
+ if(should_ask)
+ var/ask = tgui_alert(user, "Become a monster?", "Ascended Rift", list("Yes", "No"))
+ if(ask != "Yes" || QDELETED(src) || QDELETED(user))
+ return FALSE
+ var/monster_type = pick(monster_types)
+ var/mob/living/monster = new monster_type(loc)
+ monster.key = user.key
+ monster.set_name()
+ var/datum/antagonist/heretic_monster/woohoo_free_antag = new(src)
+ monster.mind.add_antag_datum(woohoo_free_antag)
+ if(ascendee)
+ monster.faction = ascendee.current.faction
+ woohoo_free_antag.set_owner(ascendee)
+ var/datum/objective/kill_all_your_friends = new()
+ kill_all_your_friends.owner = monster.mind
+ kill_all_your_friends.explanation_text = "The station's crew must be culled."
+ kill_all_your_friends.completed = TRUE
+ woohoo_free_antag.objectives += kill_all_your_friends
+
+/obj/structure/knock_tear/move_crushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction)
+ return FALSE
+
+/obj/structure/knock_tear/Destroy(force)
+ if(ascendee)
+ ascendee = null
+ return ..()
+
+/obj/effect/temp_visual/destabilising_tear
+ name = "destabilised tear"
+ icon = 'icons/obj/anomaly.dmi'
+ icon_state = "bhole3"
+ color = COLOR_VOID_PURPLE
+ light_color = COLOR_VOID_PURPLE
+ light_range = 20
+ layer = HIGH_PIPE_LAYER
+ duration = 1 SECONDS
+
+/obj/effect/temp_visual/destabilising_tear/Initialize(mapload)
+ . = ..()
+ transform *= 3
+ animate(src, transform = matrix().Scale(3.2), time = 0.15 SECONDS)
+ animate(transform = matrix().Scale(0.2), time = 0.75 SECONDS)
+ animate(transform = matrix().Scale(3, 0), time = 0.1 SECONDS)
+ animate(src, color = COLOR_WHITE, time = 0.25 SECONDS, flags = ANIMATION_PARALLEL)
+ animate(color = COLOR_VOID_PURPLE, time = 0.3 SECONDS)
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..fe26864e4fc
--- /dev/null
+++ b/code/modules/antagonists/traitor/objectives/demoralise_assault.dm
@@ -0,0 +1,129 @@
+/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)
+ set_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)
+
+ set_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))
+
+ 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/target_deleted()
+ //don't take an objective target of someone who is already obliterated
+ fail_objective()
+ return ..()
+
+/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/wizard/grand_ritual/finales/all_access.dm b/code/modules/antagonists/wizard/grand_ritual/finales/all_access.dm
new file mode 100644
index 00000000000..07958ed94a7
--- /dev/null
+++ b/code/modules/antagonists/wizard/grand_ritual/finales/all_access.dm
@@ -0,0 +1,17 @@
+/// Open all of the doors
+/datum/grand_finale/all_access
+ name = "Connection"
+ desc = "The ultimate use of your gathered power! Unlock every single door that they have! Nobody will be able to keep you out now, or anyone else for that matter!"
+ icon = 'icons/mob/actions/actions_spells.dmi'
+ icon_state = "knock"
+
+/datum/grand_finale/all_access/trigger(mob/living/carbon/human/invoker)
+ message_admins("[key_name(invoker)] removed all door access requirements")
+ for(var/obj/machinery/door/target_door as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door))
+ if(is_station_level(target_door.z))
+ target_door.unlock()
+ target_door.req_access = list()
+ target_door.req_one_access = list()
+ INVOKE_ASYNC(target_door, TYPE_PROC_REF(/obj/machinery/door/airlock, open))
+ CHECK_TICK
+ priority_announce("AULIE OXIN FIERA!!", null, 'sound/magic/knock.ogg', sender_override = "[invoker.real_name]")
diff --git a/code/modules/antagonists/wizard/grand_ritual/finales/armageddon.dm b/code/modules/antagonists/wizard/grand_ritual/finales/armageddon.dm
new file mode 100644
index 00000000000..876f2475d55
--- /dev/null
+++ b/code/modules/antagonists/wizard/grand_ritual/finales/armageddon.dm
@@ -0,0 +1,60 @@
+#define DOOM_SINGULARITY "singularity"
+#define DOOM_TESLA "tesla"
+#define DOOM_METEORS "meteors"
+
+/// Kill yourself and probably a bunch of other people
+/datum/grand_finale/armageddon
+ name = "Annihilation"
+ desc = "This crew have offended you beyond the realm of pranks. Make the ultimate sacrifice to teach them a lesson your elders can really respect. \
+ YOU WILL NOT SURVIVE THIS."
+ icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi'
+ icon_state = "legion_head"
+ minimum_time = 90 MINUTES // This will probably immediately end the round if it gets finished.
+ ritual_invoke_time = 60 SECONDS // Really give the crew some time to interfere with this one.
+ dire_warning = TRUE
+ glow_colour = "#be000048"
+ /// Things to yell before you die
+ var/static/list/possible_last_words = list(
+ "Flames and ruin!",
+ "Dooooooooom!!",
+ "HAHAHAHAHAHA!! AHAHAHAHAHAHAHAHAA!!",
+ "Hee hee hee!! Hoo hoo hoo!! Ha ha haaa!!",
+ "Ohohohohohoho!!",
+ "Cower in fear, puny mortals!",
+ "Tremble before my glory!",
+ "Pick a god and pray!",
+ "It's no use!",
+ "If the gods wanted you to live, they would not have created me!",
+ "God stays in heaven out of fear of what I have created!",
+ "Ruination is come!",
+ "All of creation, bend to my will!",
+ )
+
+/datum/grand_finale/armageddon/trigger(mob/living/carbon/human/invoker)
+ priority_announce(pick(possible_last_words), null, 'sound/magic/voidblink.ogg', sender_override = "[invoker.real_name]")
+ var/turf/current_location = get_turf(invoker)
+ invoker.gib()
+
+ var/static/list/doom_options = list()
+ if (!length(doom_options))
+ doom_options = list(DOOM_SINGULARITY, DOOM_TESLA)
+ if (!SSmapping.config.planetary)
+ doom_options += DOOM_METEORS
+
+ switch(pick(doom_options))
+ if (DOOM_SINGULARITY)
+ var/obj/singularity/singulo = new(current_location)
+ singulo.energy = 300
+ if (DOOM_TESLA)
+ var/obj/energy_ball/tesla = new (current_location)
+ tesla.energy = 200
+ if (DOOM_METEORS)
+ var/datum/dynamic_ruleset/roundstart/meteor/meteors = new()
+ meteors.meteordelay = 0
+ var/datum/game_mode/dynamic/mode = SSticker.mode
+ mode.execute_roundstart_rule(meteors) // Meteors will continue until morale is crushed.
+ priority_announce("Meteors have been detected on collision course with the station.", "Meteor Alert", ANNOUNCER_METEORS)
+
+#undef DOOM_SINGULARITY
+#undef DOOM_TESLA
+#undef DOOM_METEORS
diff --git a/code/modules/antagonists/wizard/grand_ritual/finales/captaincy.dm b/code/modules/antagonists/wizard/grand_ritual/finales/captaincy.dm
new file mode 100644
index 00000000000..d1a3c1afaf7
--- /dev/null
+++ b/code/modules/antagonists/wizard/grand_ritual/finales/captaincy.dm
@@ -0,0 +1,113 @@
+/// Become the official Captain of the station
+/datum/grand_finale/usurp
+ name = "Usurpation"
+ desc = "The ultimate use of your gathered power! Rewrite time such that you have been Captain of this station the whole time."
+ icon = 'icons/obj/card.dmi'
+ icon_state = "card_gold"
+
+/datum/grand_finale/usurp/trigger(mob/living/carbon/human/invoker)
+ message_admins("[key_name(invoker)] has replaced the Captain")
+ var/list/former_captains = list()
+ var/list/other_crew = list()
+ SEND_SOUND(world, sound('sound/magic/timeparadox2.ogg'))
+
+ for (var/mob/living/carbon/human/crewmate as anything in GLOB.human_list)
+ if (!crewmate.mind)
+ continue
+ crewmate.Unconscious(3 SECONDS) // Everyone falls unconscious but not everyone gets told about a new captain
+ if (crewmate == invoker || IS_HUMAN_INVADER(crewmate))
+ continue
+ to_chat(crewmate, span_notice("The world spins and dissolves. Your past flashes before your eyes, backwards.\n\
+ Life strolls back into the ocean and shrinks into nothingness, planets explode into storms of solar dust, \
+ the stars rush back to greet each other at the beginning of things and then... you snap back to the present. \n\
+ Everything is just as it was and always has been. \n\n\
+ A stray thought sticks in the forefront of your mind. \n\
+ [span_hypnophrase("I'm so glad that [invoker.real_name] is our legally appointed Captain!")] \n\
+ Is... that right?"))
+ if (is_captain_job(crewmate.mind.assigned_role))
+ former_captains += crewmate
+ demote_to_assistant(crewmate)
+ continue
+ if (crewmate.stat != DEAD)
+ other_crew += crewmate
+
+ dress_candidate(invoker)
+ GLOB.manifest.modify(invoker.real_name, JOB_CAPTAIN, JOB_CAPTAIN)
+ minor_announce("Captain [invoker.real_name] on deck!")
+
+ // Enlist some crew to try and restore the natural order
+ for (var/mob/living/carbon/human/former_captain as anything in former_captains)
+ create_vendetta(former_captain.mind, invoker.mind)
+ for (var/mob/living/carbon/human/random_crewmate as anything in other_crew)
+ if (prob(10))
+ create_vendetta(random_crewmate.mind, invoker.mind)
+
+/**
+ * Anyone who thought they were Captain is in for a nasty surprise, and won't be very happy about it
+ */
+/datum/grand_finale/usurp/proc/demote_to_assistant(mob/living/carbon/human/former_captain)
+ var/obj/effect/particle_effect/fluid/smoke/exit_poof = new(get_turf(former_captain))
+ exit_poof.lifetime = 2 SECONDS
+
+ former_captain.unequip_everything()
+ if(isplasmaman(former_captain))
+ former_captain.equipOutfit(/datum/outfit/plasmaman)
+ former_captain.internal = former_captain.get_item_for_held_index(2)
+ else
+ former_captain.equipOutfit(/datum/outfit/job/assistant)
+
+ GLOB.manifest.modify(former_captain.real_name, JOB_ASSISTANT, JOB_ASSISTANT)
+ var/list/valid_turfs = list()
+ // Used to be into prison but that felt a bit too mean
+ for (var/turf/exile_turf as anything in get_area_turfs(/area/station/maintenance, subtypes = TRUE))
+ if (isspaceturf(exile_turf) || exile_turf.is_blocked_turf())
+ continue
+ valid_turfs += exile_turf
+ do_teleport(former_captain, pick(valid_turfs), no_effects = TRUE)
+ var/obj/effect/particle_effect/fluid/smoke/enter_poof = new(get_turf(former_captain))
+ enter_poof.lifetime = 2 SECONDS
+
+/**
+ * Does some item juggling to try to dress you as both a Wizard and Captain without deleting any items you have bought.
+ * ID, headset, and uniform are forcibly replaced. Other slots are only filled if unoccupied.
+ * We could forcibly replace shoes and gloves too but people might miss their insuls or... meown shoes?
+ */
+/datum/grand_finale/usurp/proc/dress_candidate(mob/living/carbon/human/invoker)
+ // Won't be needing these
+ var/obj/id = invoker.get_item_by_slot(ITEM_SLOT_ID)
+ QDEL_NULL(id)
+ var/obj/headset = invoker.get_item_by_slot(ITEM_SLOT_EARS)
+ QDEL_NULL(headset)
+ // We're about to take off your pants so those are going to fall out
+ var/obj/item/pocket_L = invoker.get_item_by_slot(ITEM_SLOT_LPOCKET)
+ var/obj/item/pocket_R = invoker.get_item_by_slot(ITEM_SLOT_RPOCKET)
+ // In case we try to put a PDA there
+ var/obj/item/belt = invoker.get_item_by_slot(ITEM_SLOT_BELT)
+ belt?.moveToNullspace()
+
+ var/obj/pants = invoker.get_item_by_slot(ITEM_SLOT_ICLOTHING)
+ QDEL_NULL(pants)
+ invoker.equipOutfit(/datum/outfit/job/wizard_captain)
+ // And put everything back!
+ equip_to_slot_then_hands(invoker, ITEM_SLOT_BELT, belt)
+ equip_to_slot_then_hands(invoker, ITEM_SLOT_LPOCKET, pocket_L)
+ equip_to_slot_then_hands(invoker, ITEM_SLOT_RPOCKET, pocket_R)
+
+/// An outfit which replaces parts of a wizard's clothes with captain's clothes but keeps the robes
+/datum/outfit/job/wizard_captain
+ name = "Captain (Wizard Transformation)"
+ jobtype = /datum/job/captain
+ id = /obj/item/card/id/advanced/gold
+ id_trim = /datum/id_trim/job/captain
+ uniform = /obj/item/clothing/under/rank/captain/parade
+ belt = /obj/item/modular_computer/pda/heads/captain
+ ears = /obj/item/radio/headset/heads/captain/alt
+ glasses = /obj/item/clothing/glasses/sunglasses
+ gloves = /obj/item/clothing/gloves/captain
+ shoes = /obj/item/clothing/shoes/laceup
+ accessory = /obj/item/clothing/accessory/medal/gold/captain
+ backpack_contents = list(
+ /obj/item/melee/baton/telescopic = 1,
+ /obj/item/station_charter = 1,
+ )
+ box = null
diff --git a/code/modules/antagonists/wizard/grand_ritual/finales/cheese.dm b/code/modules/antagonists/wizard/grand_ritual/finales/cheese.dm
new file mode 100644
index 00000000000..714cd62659b
--- /dev/null
+++ b/code/modules/antagonists/wizard/grand_ritual/finales/cheese.dm
@@ -0,0 +1,49 @@
+/**
+ * Gives the wizard a defensive/mood buff and a Wabbajack, a juiced up chaos staff that will surely break something.
+ * Everyone but the wizard goes crazy, suffers major brain damage, and is given a vendetta against the wizard.
+ * Already insane people are instead cured of their madness, ignoring any other effects as the station around them loses its marbles.
+ */
+/datum/grand_finale/cheese
+ // we don't set name, desc and others, thus we won't appear in the radial choice of a normal finale rune
+ dire_warning = TRUE
+ minimum_time = 45 MINUTES //i'd imagine speedrunning this would be crummy, but the wizard's average lifespan is barely reaching this point
+
+/datum/grand_finale/cheese/trigger(mob/living/invoker)
+ message_admins("[key_name(invoker)] has summoned forth The Wabbajack and cursed the crew with madness!")
+ priority_announce("Danger: Extremely potent reality altering object has been summoned on station. Immediate evacuation advised. Brace for impact.", "Central Command Higher Dimensional Affairs", 'sound/effects/glassbr1.ogg')
+
+ for (var/mob/living/carbon/human/crewmate as anything in GLOB.human_list)
+ if (isnull(crewmate.mind))
+ continue
+ if (crewmate == invoker) //everyone but the wizard is royally fucked, no matter who they are
+ continue
+ if (crewmate.has_trauma_type(/datum/brain_trauma/mild/hallucinations)) //for an already insane person, this is retribution
+ to_chat(crewmate, span_boldwarning("Your surroundings suddenly fill with a cacophony of manic laughter and psychobabble..."))
+ to_chat(crewmate, span_nicegreen("...but as the moment passes, you realise that whatever eldritch power behind the event happened to affect you \
+ has resonated within the ruins of your already shattered mind, creating a singularity of mental instability! \
+ As it collapses unto itself, you feel... at peace, finally."))
+ if(crewmate.has_quirk(/datum/quirk/insanity))
+ crewmate.remove_quirk(/datum/quirk/insanity)
+ else
+ crewmate.cure_trauma_type(/datum/brain_trauma/mild/hallucinations, TRAUMA_RESILIENCE_ABSOLUTE)
+ else
+ //everyone else gets to relish in madness
+ //yes killing their mood will also trigger mood hallucinations
+ create_vendetta(crewmate.mind, invoker.mind)
+ to_chat(crewmate, span_boldwarning("Your surroundings suddenly fill with a cacophony of manic laughter and psychobabble. \n\
+ You feel your inner psyche shatter into a myriad pieces of jagged glass of colors unknown to the universe, \
+ infinitely reflecting a blinding, maddening light coming from the innermost sanctums of your destroyed mind. \n\
+ After a brief pause which felt like a millenia, one phrase rebounds ceaselessly in your head, imbued with the false hope of absolution... \n\
+ [invoker] must die."))
+ var/datum/brain_trauma/mild/hallucinations/added_trauma = new()
+ added_trauma.resilience = TRAUMA_RESILIENCE_ABSOLUTE
+ crewmate.adjustOrganLoss(ORGAN_SLOT_BRAIN, BRAIN_DAMAGE_DEATH - 25, BRAIN_DAMAGE_DEATH - 25) //you'd better hope chap didn't pick a hypertool
+ crewmate.gain_trauma(added_trauma)
+ crewmate.add_mood_event("wizard_ritual_finale", /datum/mood_event/madness_despair)
+
+ //drip our wizard out
+ invoker.apply_status_effect(/datum/status_effect/blessing_of_insanity)
+ invoker.add_mood_event("wizard_ritual_finale", /datum/mood_event/madness_elation)
+ var/obj/item/gun/magic/staff/chaos/true_wabbajack/the_wabbajack = new
+ invoker.put_in_active_hand(the_wabbajack)
+ to_chat(invoker, span_mind_control("Your every single instinct and rational thought is screaming at you as [the_wabbajack] appears in your firm grip..."))
diff --git a/code/modules/antagonists/wizard/grand_ritual/finales/clown.dm b/code/modules/antagonists/wizard/grand_ritual/finales/clown.dm
new file mode 100644
index 00000000000..bda79c908c0
--- /dev/null
+++ b/code/modules/antagonists/wizard/grand_ritual/finales/clown.dm
@@ -0,0 +1,76 @@
+/// Dress the crew as magical clowns
+/datum/grand_finale/clown
+ name = "Jubilation"
+ desc = "The ultimate use of your gathered power! Rewrite time so that everyone went to clown college! Now they'll prank each other for you!"
+ icon = 'icons/obj/clothing/masks.dmi'
+ icon_state = "clown"
+ glow_colour = "#ffff0048"
+
+/datum/grand_finale/clown/trigger(mob/living/carbon/human/invoker)
+ for(var/mob/living/carbon/human/victim as anything in GLOB.human_list)
+ victim.Unconscious(3 SECONDS)
+ if (!victim.mind || IS_HUMAN_INVADER(victim) || victim == invoker)
+ continue
+ if (HAS_TRAIT(victim, TRAIT_CLOWN_ENJOYER))
+ victim.add_mood_event("clown_world", /datum/mood_event/clown_world)
+ to_chat(victim, span_notice("The world spins and dissolves. Your past flashes before your eyes, backwards.\n\
+ Life strolls back into the ocean and shrinks into nothingness, planets explode into storms of solar dust, \
+ the stars rush back to greet each other at the beginning of things and then... you snap back to the present. \n\
+ Everything is just as it was and always has been. \n\n\
+ A stray thought sticks in the forefront of your mind. \n\
+ [span_hypnophrase("I'm so glad that I work at Clown Research Station [station_name()]!")] \n\
+ Is... that right?"))
+ if (is_clown_job(victim.mind.assigned_role))
+ var/datum/action/cooldown/spell/conjure_item/clown_pockets/new_spell = new(victim)
+ new_spell.Grant(victim)
+ continue
+ if (!ismonkey(victim)) // Monkeys cannot yet wear clothes
+ dress_as_magic_clown(victim)
+ if (prob(15))
+ create_vendetta(victim.mind, invoker.mind)
+
+/**
+ * Clown enjoyers who are effected by this become ecstatic, they have achieved their life's dream.
+ * This moodlet is equivalent to the one for simply being a traitor.
+ */
+/datum/mood_event/clown_world
+ mood_change = 4
+
+/datum/mood_event/clown_world/add_effects(param)
+ description = "I LOVE working at Clown Research Station [station_name()]!!"
+
+/// Dress the passed mob as a magical clown, self-explanatory
+/datum/grand_finale/clown/proc/dress_as_magic_clown(mob/living/carbon/human/victim)
+ var/obj/effect/particle_effect/fluid/smoke/poof = new(get_turf(victim))
+ poof.lifetime = 2 SECONDS
+
+ var/obj/item/tank/internal = victim.internal
+ // We're about to take off your pants so those are going to fall out
+ var/obj/item/pocket_L = victim.get_item_by_slot(ITEM_SLOT_LPOCKET)
+ var/obj/item/pocket_R = victim.get_item_by_slot(ITEM_SLOT_RPOCKET)
+ var/obj/item/id = victim.get_item_by_slot(ITEM_SLOT_ID)
+ var/obj/item/belt = victim.get_item_by_slot(ITEM_SLOT_BELT)
+
+ var/obj/pants = victim.get_item_by_slot(ITEM_SLOT_ICLOTHING)
+ var/obj/mask = victim.get_item_by_slot(ITEM_SLOT_MASK)
+ QDEL_NULL(pants)
+ QDEL_NULL(mask)
+ if(isplasmaman(victim))
+ victim.equip_to_slot_if_possible(new /obj/item/clothing/under/plasmaman/clown/magic(), ITEM_SLOT_ICLOTHING, disable_warning = TRUE)
+ victim.equip_to_slot_if_possible(new /obj/item/clothing/mask/gas/clown_hat/plasmaman(), ITEM_SLOT_MASK, disable_warning = TRUE)
+ else
+ victim.equip_to_slot_if_possible(new /obj/item/clothing/under/rank/civilian/clown/magic(), ITEM_SLOT_ICLOTHING, disable_warning = TRUE)
+ victim.equip_to_slot_if_possible(new /obj/item/clothing/mask/gas/clown_hat(), ITEM_SLOT_MASK, disable_warning = TRUE)
+
+ var/obj/item/clothing/mask/gas/clown_hat/clown_mask = victim.get_item_by_slot(ITEM_SLOT_MASK)
+ if (clown_mask)
+ var/list/options = GLOB.clown_mask_options
+ clown_mask.icon_state = options[pick(clown_mask.clownmask_designs)]
+ victim.update_worn_mask()
+ clown_mask.update_item_action_buttons()
+
+ equip_to_slot_then_hands(victim, ITEM_SLOT_LPOCKET, pocket_L)
+ equip_to_slot_then_hands(victim, ITEM_SLOT_RPOCKET, pocket_R)
+ equip_to_slot_then_hands(victim, ITEM_SLOT_ID, id)
+ equip_to_slot_then_hands(victim, ITEM_SLOT_BELT, belt)
+ victim.internal = internal
diff --git a/code/modules/antagonists/wizard/grand_ritual/finales/grand_ritual_finale.dm b/code/modules/antagonists/wizard/grand_ritual/finales/grand_ritual_finale.dm
new file mode 100644
index 00000000000..b92ae4d2f20
--- /dev/null
+++ b/code/modules/antagonists/wizard/grand_ritual/finales/grand_ritual_finale.dm
@@ -0,0 +1,88 @@
+/**
+ * A big final event to run when you complete seven rituals
+ */
+/datum/grand_finale
+ /// Friendly name for selection menu
+ var/name
+ /// Tooltip description for selection menu
+ var/desc
+ /// An icon to display to represent the choice
+ var/icon/icon
+ /// Icon state to use to represent the choice
+ var/icon_state
+ /// Prevent especially dangerous options from being chosen until we're fine with the round ending
+ var/minimum_time = 0
+ /// Override the rune invocation time
+ var/ritual_invoke_time = 30 SECONDS
+ /// Provide an extremely loud radio message when this one starts
+ var/dire_warning = FALSE
+ /// Overrides the default colour you glow while channeling the rune, optional
+ var/glow_colour
+
+/**
+ * Returns an entry for a radial menu for this choice.
+ * Returns null if entry is abstract or invalid for current circumstances.
+ */
+/datum/grand_finale/proc/get_radial_choice()
+ if (!name || !desc || !icon || !icon_state)
+ return
+ var/time_remaining_desc = ""
+ if (minimum_time >= world.time - SSticker.round_start_time)
+ time_remaining_desc = "This ritual will be available to begin invoking in [DisplayTimeText(minimum_time - world.time - SSticker.round_start_time)]"
+ var/datum/radial_menu_choice/choice = new()
+ choice.name = name
+ choice.image = image(icon = icon, icon_state = icon_state)
+ choice.info = desc + time_remaining_desc
+ return choice
+
+/**
+ * Actually do the thing.
+ * Arguments
+ * * invoker - The wizard casting this.
+ */
+/datum/grand_finale/proc/trigger(mob/living/invoker)
+ // Do something cool.
+
+/// Tries to equip something into an inventory slot, then hands, then the floor.
+/datum/grand_finale/proc/equip_to_slot_then_hands(mob/living/carbon/human/invoker, slot, obj/item/item)
+ if(!item)
+ return
+ if(!invoker.equip_to_slot_if_possible(item, slot, disable_warning = TRUE))
+ invoker.put_in_hands(item)
+
+/// They are not going to take this lying down.
+/datum/grand_finale/proc/create_vendetta(datum/mind/aggrieved_crewmate, datum/mind/wizard)
+ aggrieved_crewmate.add_antag_datum(/datum/antagonist/wizard_prank_vendetta)
+ var/datum/antagonist/wizard_prank_vendetta/antag_datum = aggrieved_crewmate.has_antag_datum(/datum/antagonist/wizard_prank_vendetta)
+ var/datum/objective/assassinate/wizard_murder = new
+ wizard_murder.owner = aggrieved_crewmate
+ wizard_murder.target = wizard
+ wizard_murder.explanation_text = "Kill [wizard.current.name], the one who did this."
+ antag_datum.objectives += wizard_murder
+
+ to_chat(aggrieved_crewmate.current, span_warning("No! This isn't right!"))
+ aggrieved_crewmate.announce_objectives()
+
+/**
+ * Antag datum to give to people who want to kill the wizard.
+ * This doesn't preclude other people choosing to want to kill the wizard, just these people are rewarded for it.
+ */
+/datum/antagonist/wizard_prank_vendetta
+ name = "\improper Wizard Prank Victim"
+ roundend_category = "wizard prank victims"
+ show_in_antagpanel = FALSE
+ antagpanel_category = "Other"
+ show_name_in_check_antagonists = TRUE
+ count_against_dynamic_roll_chance = FALSE
+ silent = TRUE
+
+/// Give everyone magic items, its so simple it feels pointless to give it its own file
+/datum/grand_finale/magic
+ name = "Evolution"
+ desc = "The ultimate use of your gathered power! Give the crew their own magic, they'll surely realise that right and wrong have no meaning when you hold ultimate power!"
+ icon = 'icons/obj/scrolls.dmi'
+ icon_state = "scroll"
+
+/datum/grand_finale/magic/trigger(mob/living/carbon/human/invoker)
+ message_admins("[key_name(invoker)] summoned magic")
+ summon_magic(survivor_probability = 20) // Wow, this one was easy!
diff --git a/code/modules/antagonists/wizard/grand_ritual/finales/immortality.dm b/code/modules/antagonists/wizard/grand_ritual/finales/immortality.dm
new file mode 100644
index 00000000000..d20ca06752b
--- /dev/null
+++ b/code/modules/antagonists/wizard/grand_ritual/finales/immortality.dm
@@ -0,0 +1,277 @@
+/// Amount of time to wait after someone dies to steal their body from their killers
+#define IMMORTAL_PRE_ACTIVATION_TIME 10 SECONDS
+/// Amount of time it takes a mob to return to the living world
+#define IMMORTAL_RESURRECT_TIME 50 SECONDS
+
+/**
+ * Nobody will ever die ever again
+ * Or if they do, they will be back
+ */
+/datum/grand_finale/immortality
+ name = "Perpetuation"
+ desc = "The ultimate use of your gathered power! Share with the crew the gift, or curse, of eternal life! \
+ And why not just the crew? How about their pets too? And any other animals around here! \
+ What if nobody died ever again!?"
+ icon = 'icons/obj/mining_zones/artefacts.dmi'
+ icon_state = "asclepius_active"
+ glow_colour = COLOR_PALE_GREEN
+ minimum_time = 30 MINUTES // This is enormously disruptive but doesn't technically in of itself end the round.
+
+/datum/grand_finale/immortality/trigger(mob/living/carbon/human/invoker)
+ new /obj/effect/temp_visual/immortality_blast(get_turf(invoker))
+ SEND_SOUND(world, sound('sound/magic/teleport_diss.ogg'))
+ for (var/mob/living/alive_guy as anything in GLOB.mob_living_list)
+ new /obj/effect/temp_visual/immortality_pulse(get_turf(alive_guy))
+ if (!alive_guy.mind)
+ continue
+ to_chat(alive_guy, span_notice("You feel extremely healthy."))
+ RegisterSignal(SSdcs, COMSIG_GLOB_MOB_DEATH, PROC_REF(something_died))
+
+/// Called when something passes into the great beyond, make it not do that
+/datum/grand_finale/immortality/proc/something_died(datum/source, mob/living/died, gibbed)
+ SIGNAL_HANDLER
+ if (died.stat != DEAD || HAS_TRAIT(died, TRAIT_PERMANENTLY_MORTAL) || died.flags_1 & HOLOGRAM_1)
+ return
+ var/body_type = died.type
+
+ var/turf/died_turf = get_turf(died)
+ var/list/nearby_turfs = circle_view_turfs(died_turf, 2)
+ var/list/nearby_safe_turfs = list()
+ for (var/turf/check_turf as anything in nearby_turfs)
+ if (check_turf.is_blocked_turf(exclude_mobs = TRUE, source_atom = died))
+ nearby_turfs -= check_turf
+ continue
+ if (islava(check_turf) || ischasm(check_turf))
+ continue
+ nearby_safe_turfs += check_turf
+ if (length(nearby_safe_turfs)) // If you're in the middle of a 5x5 chasm, tough luck I guess
+ died_turf = pick(nearby_safe_turfs)
+ else if (length(nearby_turfs))
+ died_turf = pick(nearby_turfs)
+
+ var/saved_appearance = ishuman(died) ? new /datum/human_appearance_profile(died) : null
+
+ var/datum/mind/dead_mind = HAS_TRAIT(died, TRAIT_SUICIDED) ? null : died.mind // There is a way out of the cycle
+ if (!isnull(dead_mind))
+ to_chat(died, span_boldnotice("Your spirit surges! You will return to life in [DisplayTimeText(IMMORTAL_PRE_ACTIVATION_TIME + IMMORTAL_RESURRECT_TIME)]."))
+ animate(died, alpha = died.alpha, time = IMMORTAL_PRE_ACTIVATION_TIME / 2, flags = ANIMATION_PARALLEL)
+ animate(alpha = 0, time = IMMORTAL_PRE_ACTIVATION_TIME / 2, easing = SINE_EASING | EASE_IN)
+ addtimer(CALLBACK(src, PROC_REF(reverse_death), died, dead_mind, died_turf, body_type, saved_appearance), IMMORTAL_PRE_ACTIVATION_TIME, TIMER_DELETE_ME)
+
+/// Create a ghost ready for revival
+/datum/grand_finale/immortality/proc/reverse_death(mob/living/died, datum/mind/dead_mind, turf/died_turf, body_type, datum/human_appearance_profile/human_appearance)
+ if (died.stat != DEAD)
+ return
+ var/ghost_type = ispath(body_type, /mob/living/carbon/human) ? /obj/effect/spectre_of_resurrection/human : /obj/effect/spectre_of_resurrection
+ var/obj/effect/spectre_of_resurrection/ghost = new ghost_type(died_turf)
+ var/mob/living/corpse = QDELETED(died) ? new body_type(ghost) : died
+ if (!isnull(human_appearance))
+ corpse.real_name = human_appearance.name
+ corpse.alpha = initial(corpse.alpha)
+ corpse.add_traits(list(TRAIT_NO_TELEPORT, TRAIT_AI_PAUSED), MAGIC_TRAIT)
+ corpse.apply_status_effect(/datum/status_effect/grouped/stasis, MAGIC_TRAIT)
+ ghost.set_up_resurrection(corpse, dead_mind, human_appearance)
+
+
+/// Store of data we use to recreate someone who was gibbed, like a simplified version of changeling profiles
+/datum/human_appearance_profile
+ /// The name of the profile / the name of whoever this profile source.
+ var/name = "human"
+ /// The DNA datum associated with our profile from the profile source
+ var/datum/dna/dna
+ /// The age of the profile source.
+ var/age
+ /// The body type of the profile source.
+ var/physique
+ /// The quirks of the profile source.
+ var/list/quirks = list()
+ /// The hair and facial hair gradient styles of the profile source.
+ var/list/hair_gradient_style = list("None", "None")
+ /// The hair and facial hair gradient colours of the profile source.
+ var/list/hair_gradient_colours = list(null, null)
+ /// The TTS voice of the profile source
+ var/voice
+ /// The TTS filter of the profile filter
+ var/voice_filter = ""
+
+/datum/human_appearance_profile/New(mob/living/carbon/human/target)
+ copy_from(target)
+
+/// Copy the appearance data of the target
+/datum/human_appearance_profile/proc/copy_from(mob/living/carbon/human/target)
+ target.dna.real_name = target.real_name
+ dna = new target.dna.type()
+ target.dna.copy_dna(dna)
+ name = target.real_name
+ age = target.age
+ physique = target.physique
+
+ for(var/datum/quirk/target_quirk as anything in target.quirks)
+ LAZYADD(quirks, new target_quirk.type)
+
+ hair_gradient_style = LAZYLISTDUPLICATE(target.grad_style)
+ hair_gradient_colours = LAZYLISTDUPLICATE(target.grad_color)
+
+ voice = target.voice
+ voice_filter = target.voice_filter
+
+/// Make the targetted human look like this
+/datum/human_appearance_profile/proc/apply_to(mob/living/carbon/human/target)
+ target.real_name = name
+ target.age = age
+ target.physique = physique
+ target.grad_style = LAZYLISTDUPLICATE(hair_gradient_style)
+ target.grad_color = LAZYLISTDUPLICATE(hair_gradient_colours)
+ target.voice = voice
+ target.voice_filter = voice_filter
+
+ for(var/datum/quirk/target_quirk as anything in quirks)
+ target_quirk.add_to_holder(target)
+
+ dna.transfer_identity(target, TRUE)
+ for(var/obj/item/bodypart/limb as anything in target.bodyparts)
+ limb.update_limb(is_creating = TRUE)
+ target.updateappearance(mutcolor_update = TRUE)
+ target.domutcheck()
+ target.regenerate_icons()
+
+
+/// A ghostly image of a mob showing where and what is going to respawn
+/obj/effect/spectre_of_resurrection
+ name = "spectre"
+ desc = "A frightening apparition, slowly growing more solid."
+ icon_state = "blank_white"
+ anchored = TRUE
+ layer = MOB_LAYER
+ plane = GAME_PLANE
+ alpha = 0
+ color = COLOR_PALE_GREEN
+ light_range = 2
+ light_color = COLOR_PALE_GREEN
+ /// Who are we reviving?
+ var/mob/living/corpse
+ /// Who if anyone is playing as them?
+ var/datum/mind/dead_mind
+
+/obj/effect/spectre_of_resurrection/Initialize(mapload)
+ . = ..()
+ animate(src, alpha = 150, time = 2 SECONDS)
+
+/// Prepare to revive someone
+/obj/effect/spectre_of_resurrection/proc/set_up_resurrection(mob/living/corpse, datum/mind/dead_mind, datum/human_appearance_profile/human_appearance)
+ if (isnull(corpse))
+ qdel(src)
+ return
+
+ src.corpse = corpse
+ src.dead_mind = dead_mind
+ corpse.forceMove(src)
+ name = "spectre of [corpse]"
+ setup_icon(corpse)
+ DO_FLOATING_ANIM(src)
+
+ RegisterSignal(corpse, COMSIG_LIVING_REVIVE, PROC_REF(on_corpse_revived))
+ RegisterSignal(corpse, COMSIG_QDELETING, PROC_REF(on_corpse_deleted))
+ RegisterSignal(dead_mind, COMSIG_QDELETING, PROC_REF(on_mind_lost))
+ addtimer(CALLBACK(src, PROC_REF(revive)), IMMORTAL_RESURRECT_TIME, TIMER_DELETE_ME)
+
+/// Copy appearance from ressurecting mob
+/obj/effect/spectre_of_resurrection/proc/setup_icon(mob/living/corpse)
+ icon = initial(corpse.icon)
+ icon_state = initial(corpse.icon_state)
+
+/obj/effect/spectre_of_resurrection/Destroy(force)
+ QDEL_NULL(corpse)
+ dead_mind = null
+ return ..()
+
+/obj/effect/spectre_of_resurrection/Exited(atom/movable/gone, direction)
+ . = ..()
+ if (gone != corpse)
+ return // Weird but ok
+ UnregisterSignal(corpse, list(COMSIG_LIVING_REVIVE, COMSIG_QDELETING))
+ corpse = null
+ qdel(src)
+
+/// Bring our body back to life
+/obj/effect/spectre_of_resurrection/proc/revive()
+ if (!isnull(dead_mind))
+ if (dead_mind.current == corpse)
+ dead_mind.grab_ghost(force = TRUE)
+ else
+ dead_mind.transfer_to(corpse, force_key_move = TRUE)
+ corpse.revive(HEAL_ALL) // The signal is sent even if they weren't actually dead
+
+/// Remove our stored corpse back to the living world
+/obj/effect/spectre_of_resurrection/proc/on_corpse_revived()
+ SIGNAL_HANDLER
+ if (isnull(corpse))
+ return
+ visible_message(span_boldnotice("[corpse] suddenly shudders to life!"))
+ corpse.remove_traits(list(TRAIT_NO_TELEPORT, TRAIT_AI_PAUSED), MAGIC_TRAIT)
+ corpse.remove_status_effect(/datum/status_effect/grouped/stasis, MAGIC_TRAIT)
+ corpse.forceMove(loc)
+
+/// If the body is destroyed then we can't come back, F
+/obj/effect/spectre_of_resurrection/proc/on_corpse_deleted()
+ SIGNAL_HANDLER
+ qdel(src)
+
+/// If the mind is deleted somehow we just don't transfer it on revival
+/obj/effect/spectre_of_resurrection/proc/on_mind_lost()
+ SIGNAL_HANDLER
+ dead_mind = null
+
+/// A ressurection spectre with extra behaviour for humans
+/obj/effect/spectre_of_resurrection/human
+ /// Stored data used to restore someone to a fascimile of what they were before
+ var/datum/human_appearance_profile/human_appearance
+
+/obj/effect/spectre_of_resurrection/human/set_up_resurrection(mob/living/corpse, datum/mind/dead_mind, datum/human_appearance_profile/human_appearance)
+ . = ..()
+ src.human_appearance = human_appearance
+
+// We just use a generic floating human appearance to save unecessary costly icon operations
+/obj/effect/spectre_of_resurrection/human/setup_icon(mob/living/corpse)
+ return
+
+// Apply stored human details
+/obj/effect/spectre_of_resurrection/human/on_corpse_revived()
+ if (isnull(corpse))
+ return
+ human_appearance?.apply_to(corpse)
+ return ..()
+
+
+/// Visual flair on the wizard when cast
+/obj/effect/temp_visual/immortality_blast
+ name = "immortal wave"
+ duration = 2.5 SECONDS
+ icon = 'icons/effects/96x96.dmi'
+ icon_state = "boh_tear"
+ color = COLOR_PALE_GREEN
+ pixel_x = -32
+ pixel_y = -32
+
+/obj/effect/temp_visual/immortality_blast/Initialize(mapload)
+ . = ..()
+ transform *= 0
+ animate(src, transform = matrix(), time = 1.5 SECONDS, easing = ELASTIC_EASING)
+ animate(transform = matrix() * 3, time = 1 SECONDS, alpha = 0, easing = SINE_EASING | EASE_OUT)
+
+
+/// Visual flair on living creatures who have become immortal
+/obj/effect/temp_visual/immortality_pulse
+ name = "immortal pulse"
+ duration = 1 SECONDS
+ icon = 'icons/effects/anomalies.dmi'
+ icon_state = "dimensional_overlay"
+ color = COLOR_PALE_GREEN
+
+/obj/effect/temp_visual/immortality_pulse/Initialize(mapload)
+ . = ..()
+ transform *= 0
+ animate(src, transform = matrix() * 1.5, alpha = 0, time = 1 SECONDS, easing = SINE_EASING | EASE_OUT)
+
+#undef IMMORTAL_PRE_ACTIVATION_TIME
+#undef IMMORTAL_RESURRECT_TIME
diff --git a/code/modules/antagonists/wizard/grand_ritual/finales/midas.dm b/code/modules/antagonists/wizard/grand_ritual/finales/midas.dm
new file mode 100644
index 00000000000..b2e3329261f
--- /dev/null
+++ b/code/modules/antagonists/wizard/grand_ritual/finales/midas.dm
@@ -0,0 +1,46 @@
+/// Completely transform the station
+/datum/grand_finale/midas
+ name = "Transformation"
+ desc = "The ultimate use of your gathered power! Turn their precious station into something much MORE precious, materially speaking!"
+ icon = 'icons/obj/stack_objects.dmi'
+ icon_state = "sheet-gold_2"
+ glow_colour = "#dbdd4c48"
+ var/static/list/permitted_transforms = list( // Non-dangerous only
+ /datum/dimension_theme/gold,
+ /datum/dimension_theme/meat,
+ /datum/dimension_theme/pizza,
+ /datum/dimension_theme/natural,
+ )
+ var/datum/dimension_theme/chosen_theme
+
+// I sure hope this doesn't have performance implications
+/datum/grand_finale/midas/trigger(mob/living/carbon/human/invoker)
+ var/theme_path = pick(permitted_transforms)
+ chosen_theme = new theme_path()
+ var/turf/start_turf = get_turf(invoker)
+ var/greatest_dist = 0
+ var/list/turfs_to_transform = list()
+ for (var/turf/transform_turf as anything in GLOB.station_turfs)
+ if (!chosen_theme.can_convert(transform_turf))
+ continue
+ var/dist = get_dist(start_turf, transform_turf)
+ if (dist > greatest_dist)
+ greatest_dist = dist
+ if (!turfs_to_transform["[dist]"])
+ turfs_to_transform["[dist]"] = list()
+ turfs_to_transform["[dist]"] += transform_turf
+
+ if (chosen_theme.can_convert(start_turf))
+ chosen_theme.apply_theme(start_turf)
+
+ for (var/iterator in 1 to greatest_dist)
+ if(!turfs_to_transform["[iterator]"])
+ continue
+ addtimer(CALLBACK(src, PROC_REF(transform_area), turfs_to_transform["[iterator]"]), (5 SECONDS) * iterator)
+
+/datum/grand_finale/midas/proc/transform_area(list/turfs)
+ for (var/turf/transform_turf as anything in turfs)
+ if (!chosen_theme.can_convert(transform_turf))
+ continue
+ chosen_theme.apply_theme(transform_turf)
+ CHECK_TICK
diff --git a/code/modules/antagonists/wizard/grand_ritual/fluff.dm b/code/modules/antagonists/wizard/grand_ritual/fluff.dm
new file mode 100644
index 00000000000..506da118d75
--- /dev/null
+++ b/code/modules/antagonists/wizard/grand_ritual/fluff.dm
@@ -0,0 +1,25 @@
+/**
+ * Fluff book to hint at the cheesy grand ritual.
+ */
+/obj/item/book/manual/ancient_parchment
+ name = "ancient parchment"
+ icon = 'icons/obj/scrolls.dmi'
+ icon_state = "scroll-ancient"
+ unique = TRUE
+ w_class = WEIGHT_CLASS_SMALL
+ starting_author = "Pelagius the Mad"
+ starting_title = "Worship and Reverence of the Divine Insanity"
+ starting_content = {"
+
+ Locate the ever-elusive red emergency stop button. It's + probably hiding in plain sight, so take your time, have a laugh, and + enjoy the anticipation. Remember, it's like a treasure hunt, + only with the added bonus of preventing a nuclear disaster. ++
+ Once you've uncovered the button, muster all your courage and + push it like there's no tomorrow. Well, actually, you're + pushing it to ensure there is a tomorrow. But hey, who doesn't + love a little paradoxical button-pushing? ++
+ Prepare for the impending suppression of the supermatter engine + room, because things are about to get real quiet. Just make sure + everyone has evacuated, or else they'll be in for a surprise. + The system needs its space, and it's not known for being the + friendliest neighbour. ++
+ After the delamination is successfully suppressed, take a moment to + appreciate the delicate beauty of crystal-based electricity. Take a + look around and fix any damage to those fragile glass components. + Feel free to put on your finest overalls and channel your inner + engiborg while doing so. ++
+ Keep an eye out for fires and the infamous air mix. It's always + an adventure trying to strike the perfect balance between breathable + air and potential suffocation. Remember, oxygen plus a spark equals + fireworks - the kind you definitely don't want inside a + reactor. ++
+ To avoid singeing your eyebrows off, consider enlisting the help of + a synth or a trusty borg. After all, nothing says "safety + first" like outsourcing your firefighting to non-living, + non-breathing assistants. ++
+ Clear out any lightly radioactive debris and/or hot ice (The cargo + department will probably love to dispose it for you.) ++
+ Finally, revel in the satisfaction of knowing that you've + single-handedly prevented a delamination. But, of course, don't + forget to feel guilty because SAFETY MOTH Knows. SAFETY MOTH knows + everything. It's always watching, judging, and probably taking + notes for its next safety briefing. So bask in the glory of your + heroism, but know that the all-knowing Moff is onto you. ++
+ When it comes time for your second attempt at starting the SM: Take + this sign, give it a good toss towards the crystal, and watch it + soar through the air.+
+
+ Nothing says "I'm dealing with a potentially catastrophic + situation" like engaging in some whimsical shenanigans. +